messagingfw/msgsrvnstore/server/src/MSVIPC.CPP
author hgs
Wed, 03 Nov 2010 22:41:46 +0530
changeset 62 db3f5fa34ec7
permissions -rw-r--r--
201044_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     1
// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     2
// All rights reserved.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     7
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     8
// Initial Contributors:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    10
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    11
// Contributors:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    12
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    13
// Description:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    14
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    15
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    16
#include <s32std.h>
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    17
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    18
#include "MSVIPC.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    19
#include "MSVIDS.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    20
#include "MSVPANIC.H"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    21
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    22
#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    23
#include "msvsearchsortconstants.h"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    24
#include "msvconsts.h"
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    25
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    26
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    27
GLDEF_C void DoUnpackEntry(TUint8*& aPtr, TMsvEntry& aEntry)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    28
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    29
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    30
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    31
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    32
	// get the entry from the start of the buffer
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    33
	const TMsvEntry* pEntry = (TMsvEntry*) aPtr;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    34
	aEntry = *pEntry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    35
	aPtr = Align4(aPtr + sizeof(TMsvEntry));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    36
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    37
	const TText* textPtr = (TText*)aPtr;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    38
	TInt length=aEntry.iDescription.Length();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    39
	aEntry.iDescription.Set(textPtr, length);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    40
	textPtr = Align4(textPtr + length);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    41
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    42
	length=aEntry.iDetails.Length();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    43
	aEntry.iDetails.Set(textPtr, length);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    44
	textPtr = Align4(textPtr + length);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    45
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    46
	aPtr = (TUint8*) textPtr;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    47
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    48
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    49
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    50
GLDEF_C TInt DoPackEntry(const TUint8*& aPtrStart, const TUint8* aPtrEnd, const TMsvEntry& aEntry)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    51
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    52
// Packs an entry into the memory area defined by the two pointers.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    53
// Fails with KErrOverflow if the packed entry is too large
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    54
// aPtrStart is always returned pointing to the end of the packed entry (even if too large)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    55
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    56
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    57
	// make sure the entry can fit into the memory area defined by the two pointers
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    58
	TInt sizeEntry = Align4(sizeof(TMsvEntry));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    59
	TInt sizeString1 = Align4(aEntry.iDescription.Size());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    60
	TInt sizeString2 = Align4(aEntry.iDetails.Size());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    61
	TInt size =  sizeEntry + sizeString1 + sizeString2;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    62
	if ((aPtrStart + size)>aPtrEnd)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    63
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    64
		aPtrStart += size;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    65
		return KErrOverflow;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    66
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    67
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    68
	// copy the entry and descriptors into the memory area
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    69
	Mem::Copy((void*)aPtrStart, &aEntry, sizeof(TMsvEntry));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    70
	aPtrStart += sizeEntry;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    71
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    72
	Mem::Copy((void*)aPtrStart, aEntry.iDescription.Ptr(), aEntry.iDescription.Size());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    73
	aPtrStart += sizeString1;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    74
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    75
	Mem::Copy((void*)aPtrStart, aEntry.iDetails.Ptr(), aEntry.iDetails.Size());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    76
	aPtrStart += sizeString2;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    77
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    78
	return KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    79
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    80
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    81
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    82
GLDEF_C void DoUnpackFilter(TUint8*& aPtr, CMsvEntryFilter& aFilter)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    83
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    84
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    85
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    86
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    87
	// get the entry from the start of the buffer
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    88
	const CMsvEntryFilter* pFilter = (CMsvEntryFilter*) aPtr;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    89
	Mem::Copy(&aFilter, pFilter, sizeof(CMsvEntryFilter));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    90
	aPtr = Align4(aPtr + sizeof(CMsvEntryFilter));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    91
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    92
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    93
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    94
GLDEF_C TInt DoPackFilter(const TUint8*& aPtrStart, const TUint8* aPtrEnd, const CMsvEntryFilter& aFilter)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    95
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    96
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    97
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    98
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
    99
	// make sure the entry can fit into the memory area defined by the two pointers
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   100
	TInt size = Align4(sizeof(CMsvEntryFilter));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   101
	if ((aPtrStart + size)>aPtrEnd)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   102
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   103
		aPtrStart += size;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   104
		return KErrOverflow;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   105
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   106
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   107
	// copy the filter into the memory area
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   108
	Mem::Copy((void*)aPtrStart, &aFilter, sizeof(CMsvEntryFilter));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   109
	aPtrStart += size;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   110
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   111
	return KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   112
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   113
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   114
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   115
// TMsvPackedEntry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   116
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   117
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   118
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   119
EXPORT_C TMsvPackedEntry::TMsvPackedEntry(HBufC8*& aBuffer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   120
: iBuffer(aBuffer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   121
	{}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   122
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   123
EXPORT_C TInt TMsvPackedEntry::PackEntry(const TMsvEntry& aEntry)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   124
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   125
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   126
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   127
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   128
	// find the start and end of the buffer
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   129
	const TUint8* pS = iBuffer->Ptr();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   130
	const TUint8* pE = PtrAdd(pS, iBuffer->Des().MaxSize());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   131
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   132
	TInt error = DoPackEntry(pS, pE, aEntry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   133
	if (error==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   134
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   135
		// update the length of the buffer
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   136
		iBuffer->Des().SetLength(pS-iBuffer->Ptr());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   137
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   138
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   139
	return error;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   140
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   141
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   142
EXPORT_C void TMsvPackedEntry::UnpackEntry(TMsvEntry& aEntry)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   143
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   144
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   145
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   146
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   147
#if defined(_DEBUG)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   148
	// check that the buffer contain a valid package
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   149
	const TMsvEntry* dEntry = (TMsvEntry*) iBuffer->Ptr();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   150
	const TUint8* dPos = PtrAdd(iBuffer->Ptr(), Align4(sizeof(TMsvEntry)) + Align4(dEntry->iDescription.Size()) + Align4(dEntry->iDetails.Size()));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   151
	__ASSERT_DEBUG(dPos <= PtrAdd(iBuffer->Ptr(), iBuffer->Des().MaxLength()), PanicServer(EMsvEntryOverrunBuffer));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   152
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   153
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   154
	TUint8* pS = CONST_CAST(TUint8*, iBuffer->Ptr());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   155
	DoUnpackEntry(pS, aEntry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   156
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   157
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   158
TInt TMsvPackedEntry::PackEntryAndService(const TMsvEntry& aEntry, const TMsvId& aServiceId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   159
    {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   160
    // find the start and end of the buffer
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   161
    const TUint8* pS = iBuffer->Ptr();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   162
    const TUint8* pE = PtrAdd(pS, iBuffer->Des().MaxSize());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   163
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   164
    TInt error = DoPackEntry(pS, pE, aEntry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   165
    if (error==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   166
        {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   167
        TInt sizeDes = Align4(sizeof(TMsvId));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   168
        if ((pS + sizeDes)>pE)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   169
            {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   170
            return KErrOverflow;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   171
            }            
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   172
        // copy the entry and descriptors into the memory area
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   173
        Mem::Copy((void*)pS, &aServiceId, sizeof(TMsvId));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   174
        pS += sizeDes;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   175
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   176
        // update the length of the buffer
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   177
        iBuffer->Des().SetLength(pS-iBuffer->Ptr());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   178
        }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   179
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   180
    return error;    
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   181
    }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   182
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   183
void TMsvPackedEntry::UnpackEntryAndService(TMsvEntry& aEntry, TMsvId& aServiceId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   184
    {
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   185
#if defined(_DEBUG)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   186
    // check that the buffer contain a valid package
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   187
    const TMsvEntry* dEntry = (TMsvEntry*) iBuffer->Ptr();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   188
    const TUint8* dPos = PtrAdd(iBuffer->Ptr(), Align4(sizeof(TMsvEntry)) + Align4(dEntry->iDescription.Size()) + Align4(dEntry->iDetails.Size()) + Align4(sizeof(TMsvId)) );
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   189
    __ASSERT_DEBUG(dPos <= PtrAdd(iBuffer->Ptr(), iBuffer->Des().MaxLength()), PanicServer(EMsvEntryOverrunBuffer));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   190
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   191
    
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   192
    TUint8* pS = CONST_CAST(TUint8*, iBuffer->Ptr());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   193
    DoUnpackEntry(pS, aEntry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   194
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   195
    // get the service id from the current position in the buffer
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   196
    const TMsvId* pServiceId = (TMsvId*)pS;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   197
    aServiceId = *pServiceId;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   198
    pS = Align4(pS + sizeof(TMsvId));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   199
    }
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   200
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   201
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   202
// TMsvPackedEntryArray
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   203
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   204
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   205
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   206
EXPORT_C TMsvPackedEntryArray::TMsvPackedEntryArray(HBufC8*& aBuffer, TInt aCount)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   207
: iIndex(0), iCount(aCount), iBuffer(aBuffer) 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   208
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   209
	iPos = iBuffer->Ptr();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   210
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   211
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   212
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   213
EXPORT_C void TMsvPackedEntryArray::Reset()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   214
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   215
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   216
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   217
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   218
	iBuffer->Des().SetLength(0);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   219
	iPos  = iBuffer->Ptr();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   220
	iIndex=0;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   221
	iCount=0;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   222
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   223
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   224
EXPORT_C TInt TMsvPackedEntryArray::PackEntry(const TMsvEntry& aEntry)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   225
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   226
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   227
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   228
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   229
	const TUint8* pS = iPos;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   230
	const TUint8* pE = PtrAdd(iBuffer->Ptr(), iBuffer->Des().MaxSize());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   231
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   232
	TInt error = DoPackEntry(pS, pE, aEntry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   233
	if (error==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   234
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   235
		// update the length of the buffer and the position for the next entry
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   236
		iBuffer->Des().SetLength(pS-iBuffer->Ptr());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   237
		iPos = pS;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   238
		iIndex++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   239
		iCount++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   240
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   241
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   242
	return error;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   243
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   244
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   245
EXPORT_C TInt TMsvPackedEntryArray::UnpackEntry(TInt aIndex, TMsvEntry& aEntry)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   246
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   247
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   248
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   249
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   250
	TInt error=KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   251
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   252
	if (iIndex!=aIndex)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   253
		error = FindEntryInArray(aIndex);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   254
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   255
	if (error==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   256
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   257
		TUint8* pS=CONST_CAST(TUint8*, iPos);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   258
		DoUnpackEntry(pS, aEntry);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   259
		iPos=pS;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   260
		iIndex++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   261
		}	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   262
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   263
	return error;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   264
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   265
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   266
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   267
TInt TMsvPackedEntryArray::FindEntryInArray(TInt aIndex)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   268
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   269
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   270
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   271
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   272
	if (aIndex>=iCount)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   273
		return KErrNotFound;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   274
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   275
	if (iIndex>aIndex)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   276
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   277
		// have to reset to the start of the buffer
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   278
		iPos = iBuffer->Ptr();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   279
		iIndex=0;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   280
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   281
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   282
	while (iIndex!=aIndex)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   283
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   284
		const TMsvEntry* pEntry = (TMsvEntry*) iPos;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   285
		iPos += Align4(sizeof(TMsvEntry)) + Align4(pEntry->iDescription.Size()) + Align4(pEntry->iDetails.Size());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   286
		iIndex++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   287
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   288
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   289
	__ASSERT_DEBUG(iPos < PtrAdd(iBuffer->Ptr(), iBuffer->Des().MaxLength()), PanicServer(EMsvPointerOverrunBuffer));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   290
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   291
	return KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   292
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   293
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   294
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   295
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   296
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   297
// TMsvMoveCopyDetails
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   298
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   299
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   300
EXPORT_C TMsvLocalOperationProgress::TMsvLocalOperationProgress()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   301
: iType(ELocalNone), iTotalNumberOfEntries(0), iNumberCompleted(0), iNumberFailed(0), iNumberRemaining(0), iError(KErrNone), iId(KMsvNullIndexEntryId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   302
/** Initialises the new object to suitable zero or null values. */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   303
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   304
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   305
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   306
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   307
// TMsvServerOperationProgress
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   308
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   309
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   310
EXPORT_C TMsvServerOperationProgress::TMsvServerOperationProgress()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   311
: iOperationType(EMsvNoOperation)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   312
/** Default constructor.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   313
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   314
Sets iOperationType to EMsvNoOperation. */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   315
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   316
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   317
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   318
TMsvServerOperationProgress::TMsvServerOperationProgress(TMsvServerOperationType aType)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   319
: iOperationType(aType)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   320
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   321
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   322
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   323
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   324
// TMsvIndexProgress
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   325
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   326
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   327
EXPORT_C TMsvIndexProgress::TMsvIndexProgress()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   328
: iTotal(0), iCompleted(0), iRemaining(0), iId(KMsvNullIndexEntryId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   329
/** Default constructor.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   330
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   331
Data members are intialised to 0 or KMsvNullIndexEntryId as appropriate. */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   332
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   333
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   334
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   335
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   336
// TMsvIndexLoadProgress
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   337
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   338
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   339
EXPORT_C TMsvIndexLoadProgress::TMsvIndexLoadProgress()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   340
: TMsvServerOperationProgress(EMsvChangeDriveOperation), iError(KErrNone), iState(EIndexNotLoaded)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   341
/** Default constructor.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   342
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   343
iOperationType is set to EMsvChangeDriveOperation; iError is set to KErrNone; 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   344
iState is set to EIndexNotLoaded. */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   345
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   346
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   347
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   348
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   349
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   350
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   351
// TMsvCopyProgress
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   352
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   353
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   354
/** Default constructor.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   355
iOperationType is set to EMsvCopyOperation; iError is set to KErrNone; 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   356
iState is set to ENotYetStarted. */  
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   357
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   358
EXPORT_C TMsvCopyProgress::TMsvCopyProgress()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   359
: TMsvServerOperationProgress(EMsvCopyOperation), iError(KErrNone), iState(ENotYetStarted)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   360
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   361
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   362
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   363
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   364
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   365
// TMsvDeleteProgress
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   366
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   367
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   368
/** Default constructor.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   369
iOperationType is set to EMsvDeleteOperation; iError is set to KErrNone; 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   370
iState is set to ENotYetStarted. */
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   371
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   372
EXPORT_C TMsvDeleteProgress::TMsvDeleteProgress()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   373
: TMsvServerOperationProgress(EMsvDeleteOperation), iError(KErrNone), iState(ENotYetStarted)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   374
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   375
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   376
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   377
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   378
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   379
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   380
// TMsvChildrenDetails
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   381
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   382
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   383
EXPORT_C TMsvChildrenDetails::TMsvChildrenDetails()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   384
: iParentId(KMsvNullIndexEntryId), iTotalNumberChildren(0), iNumberChildrenInArray(0), iLastEntryInArray(0)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   385
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   386
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   387
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   388
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   389
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   390
// TMsvPackedOperation
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   391
//**********************************
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   392
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   393
EXPORT_C TMsvPackedOperation::TMsvPackedOperation(HBufC8*& aBuffer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   394
: iBuffer(aBuffer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   395
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   396
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   397
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   398
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   399
EXPORT_C TInt TMsvPackedOperation::Pack(const CMsvEntrySelection& aSelection, TInt aParameter1, TInt aParameter2)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   400
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   401
	// check the buffer is large enough
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   402
	TInt requiredSize = (aSelection.Count()+3)*4;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   403
	if (requiredSize>iBuffer->Des().MaxSize())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   404
		return KErrOverflow;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   405
	// set the buffer with correct length
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   406
	iBuffer->Des().SetLength(requiredSize);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   407
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   408
	TInt* ptr = (TInt*) CONST_CAST(TUint8*, iBuffer->Ptr());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   409
	*ptr++ = aSelection.Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   410
	for (TInt count=0; count<aSelection.Count(); count++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   411
		*ptr++ = aSelection.At(count);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   412
	*ptr++ = aParameter1;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   413
	*ptr++ = aParameter2;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   414
	return KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   415
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   416
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   417
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   418
EXPORT_C void TMsvPackedOperation::UnpackL(CMsvEntrySelection& aSelection, TInt& aParameter1, TInt& aParameter2)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   419
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   420
	__ASSERT_DEBUG(aSelection.Count()==0, PanicServer(EMsvOperationUnpackSelectionNotEmpty));	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   421
	TInt* ptr = (TInt*) CONST_CAST(TUint8*, iBuffer->Ptr());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   422
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   423
	TInt count = *ptr++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   424
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   425
	TInt bufSize = iBuffer->Des().Length();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   426
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   427
	// This length is calculated on the basis of length set in TMsvPackedOperation::Pack above.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   428
	TInt len = (count+3)*4; 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   429
	if(bufSize == len)	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   430
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   431
		while (count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   432
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   433
			aSelection.AppendL(*ptr++);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   434
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   435
		aParameter1 = *ptr++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   436
		aParameter2 = *ptr++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   437
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   438
	else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   439
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   440
		User::Leave(KErrArgument);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   441
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   442
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   443
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   444
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   445
EXPORT_C TMsvPackedChangeNotification::TMsvPackedChangeNotification(TMsvNotifBuffer& aBuffer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   446
: iBuffer(aBuffer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   447
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   448
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   449
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   450
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   451
EXPORT_C void TMsvPackedChangeNotification::Pack(TMsvServerChangeNotificationType aChangeType, const CMsvEntrySelection& aSelection, TInt aParameter1, TInt aParameter2, TInt aStartIndex, TInt aFinishIndex)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   452
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   453
// Packs the aStartIndex->aFinishIndex (inc) into the buffer
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   454
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   455
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   456
	__ASSERT_DEBUG(aFinishIndex-aStartIndex+1<=KMsvPackedChangeLimit, PanicServer(EMsvChangeSelectionTooLarge));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   457
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   458
	// set the buffer with correct length
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   459
	TInt requiredSize = (aFinishIndex-aStartIndex+1+KMsvChangeNotificationNumberOfTInts)*4;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   460
	iBuffer.SetLength(requiredSize);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   461
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   462
	TInt* ptr = (TInt*) CONST_CAST(TUint8*, iBuffer.Ptr());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   463
	*ptr++ = aChangeType;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   464
	*ptr++ = aParameter1;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   465
	*ptr++ = aParameter2;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   466
	*ptr++ = aFinishIndex - aStartIndex + 1;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   467
	for (TInt count=aStartIndex; count<=aFinishIndex; count++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   468
		*ptr++ = aSelection.At(count);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   469
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   470
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   471
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   472
EXPORT_C void TMsvPackedChangeNotification::Pack(TMsvServerChangeNotificationType aChangeType, TMsvId aId, TInt aParameter1, TInt aParameter2)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   473
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   474
// Packs a single id
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   475
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   476
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   477
	// set the buffer with correct length
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   478
	TInt requiredSize = (1+KMsvChangeNotificationNumberOfTInts)*4;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   479
	iBuffer.SetLength(requiredSize);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   480
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   481
	TInt* ptr = (TInt*) CONST_CAST(TUint8*, iBuffer.Ptr());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   482
	*ptr++ = aChangeType;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   483
	*ptr++ = aParameter1;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   484
	*ptr++ = aParameter2;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   485
	*ptr++ = 1;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   486
	*ptr++ = aId;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   487
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   488
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   489
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   490
EXPORT_C void TMsvPackedChangeNotification::UnpackL(TMsvServerChangeNotificationType& aChangeType, CMsvEntrySelection& aSelection, TInt& aParameter1, TInt& aParameter2)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   491
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   492
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   493
//
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   494
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   495
	__ASSERT_DEBUG(aSelection.Count()==0, PanicServer(EMsvChangedUnpackSelectionNotEmpty));	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   496
	TInt* ptr = (TInt*) CONST_CAST(TUint8*, iBuffer.Ptr());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   497
	switch (*ptr++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   498
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   499
		case 1:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   500
			aChangeType = EMsvEntriesCreated;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   501
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   502
		case 2:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   503
			aChangeType = EMsvEntriesChanged;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   504
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   505
		case 3:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   506
			aChangeType = EMsvEntriesDeleted;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   507
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   508
		case 4:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   509
			aChangeType = EMsvEntriesMoved;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   510
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   511
		case 5:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   512
			aChangeType = EMsvMtmGroupInstalled;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   513
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   514
		case 6:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   515
			aChangeType = EMsvMtmGroupDeInstalled;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   516
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   517
		case 8:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   518
			aChangeType = EMsvCloseSession;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   519
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   520
		case 9:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   521
			aChangeType = EMsvIndexLoaded;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   522
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   523
		case 10:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   524
			aChangeType = EMsvIndexFailedToLoad;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   525
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   526
		case 12:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   527
			aChangeType = EMsvMediaChanged;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   528
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   529
		case 13:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   530
			aChangeType = EMsvMediaUnavailable;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   531
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   532
		case 14:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   533
			aChangeType = EMsvMediaAvailable;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   534
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   535
		case 15:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   536
			aChangeType = EMsvMediaIncorrect;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   537
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   538
#if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   539
		case 16:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   540
			aChangeType = EMsvMessageStoreNotSupported;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   541
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   542
		case 17:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   543
			aChangeType = EMsvMessageStoreCorrupt;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   544
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   545
		case 18:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   546
			aChangeType = EMsvRefreshMessageView;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   547
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   548
		case 19:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   549
			aChangeType = EMsvDiskNotAvailable;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   550
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   551
		case 20:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   552
			aChangeType = EMsvUnableToProcessDiskNotification;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   553
			break;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   554
#endif	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   555
		default:
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   556
			__ASSERT_DEBUG(EFalse, PanicServer(EMsvUnknownChangeType));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   557
			aChangeType = EMsvEntriesNoChange;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   558
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   559
	aParameter1 = *ptr++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   560
	aParameter2 = *ptr++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   561
	TInt count = *ptr++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   562
	while (count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   563
		aSelection.AppendL(*ptr++);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   564
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   565
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   566
TMsvPackedEntryFilter::TMsvPackedEntryFilter(HBufC8*& aBuffer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   567
: iBuffer(aBuffer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   568
	{}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   569
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   570
TInt TMsvPackedEntryFilter::PackFilter(const CMsvEntryFilter& aFilter)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   571
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   572
	// find the start and end of the buffer
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   573
	const TUint8* pS = iBuffer->Ptr();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   574
	const TUint8* pE = PtrAdd(pS, iBuffer->Des().MaxSize());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   575
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   576
	TInt error = DoPackFilter(pS, pE, aFilter);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   577
	if (error==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   578
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   579
		// update the length of the buffer
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   580
		iBuffer->Des().SetLength(pS-iBuffer->Ptr());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   581
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   582
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   583
	return error;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   584
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   585
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   586
void TMsvPackedEntryFilter::UnpackFilter(CMsvEntryFilter& aFilter)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   587
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   588
#if defined(_DEBUG)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   589
	// check that the buffer contain a valid package
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   590
	const TUint8* dPos = PtrAdd(iBuffer->Ptr(), Align4(sizeof(CMsvEntryFilter)));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   591
	__ASSERT_DEBUG(dPos <= PtrAdd(iBuffer->Ptr(), iBuffer->Des().MaxLength()), PanicServer(EMsvEntryOverrunBuffer));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   592
#endif	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   593
	TUint8* pS = CONST_CAST(TUint8*, iBuffer->Ptr());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   594
	DoUnpackFilter(pS, aFilter);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   595
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   596
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   597
/**
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   598
Constructor for TMsvPackQuery.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   599
@internalComponent
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   600
@released
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   601
@param aBuffer: buffer for packing
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   602
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   603
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   604
EXPORT_C TMsvPackQuery::TMsvPackQuery(HBufC8*& aBuffer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   605
: iBuffer(aBuffer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   606
	{}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   607
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   608
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   609
TInt TMsvPackQuery::DoPackQuery(const TUint8*& aPtrStart, const TUint8* aPtrEnd, const CMsvSearchSortQuery* aQuery)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   610
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   611
	//size of class - sizeof(iQueryTable pointer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   612
	TInt sizeOfClass = Align4(sizeof(CMsvSearchSortQuery) - sizeof(TInt));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   613
	TInt sizeQueryTable = Align4(sizeof(TMsvQueryTable) * KMaxLevelOfSearchAndSort);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   614
	TInt size = sizeOfClass + sizeQueryTable;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   615
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   616
	if ((aPtrStart + size)>aPtrEnd)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   617
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   618
		aPtrStart += size;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   619
		return KErrOverflow;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   620
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   621
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   622
	// copy the entry and descriptors into the memory area
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   623
	Mem::Copy((void*)aPtrStart, aQuery, sizeOfClass);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   624
	aPtrStart += sizeOfClass;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   625
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   626
	Mem::Copy((void*)aPtrStart, aQuery->iQueryTable, sizeQueryTable);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   627
	aPtrStart += sizeQueryTable;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   628
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   629
	return KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   630
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   631
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   632
/**
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   633
Packs TMsvSearchSortQuery object into a buffer for sending across IPC. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   634
@internalComponent
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   635
@released
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   636
@param aQuery: TMsvSearchSortQuery object needs to pack.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   637
@return: reurn KErrNone if successful else KErrOverflow.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   638
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   639
EXPORT_C TInt TMsvPackQuery::PackQuery(const CMsvSearchSortQuery* aQuery)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   640
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   641
	// find the start and end of the buffer
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   642
	const TUint8* pS = iBuffer->Ptr();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   643
	const TUint8* pE = PtrAdd(pS, iBuffer->Des().MaxSize());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   644
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   645
	TInt error = DoPackQuery(pS, pE, aQuery);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   646
	if (error==KErrNone)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   647
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   648
		// update the length of the buffer
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   649
		iBuffer->Des().SetLength(pS-iBuffer->Ptr());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   650
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   651
	return error;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   652
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   653
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   654
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   655
void TMsvPackQuery::DoUnpackQuery(TUint8*& aPtr, CMsvSearchSortQuery* aQuery)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   656
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   657
	//size of class - sizeof(iQueryTable pointer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   658
	TInt sizeOfClass = Align4(sizeof(CMsvSearchSortQuery) - sizeof(TInt));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   659
	TInt sizeQueryTable = Align4(sizeof(TMsvQueryTable) * KMaxLevelOfSearchAndSort);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   660
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   661
	Mem::Copy((void*)aQuery, aPtr, sizeOfClass);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   662
	aPtr += sizeOfClass;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   663
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   664
	Mem::Copy((void*)aQuery->iQueryTable, aPtr, sizeQueryTable);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   665
	aPtr += sizeQueryTable;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   666
	}	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   667
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   668
/**
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   669
Unpacks the data to a aQuery.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   670
@internalComponent
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   671
@released
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   672
@param aQuery: Unpacked TMsvSearchSortQuery object.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   673
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   674
EXPORT_C void TMsvPackQuery::UnpackQuery(CMsvSearchSortQuery* aQuery)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   675
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   676
#if defined(_DEBUG)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   677
	// check that the buffer contain a valid package
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   678
	const TUint8* dPos = PtrAdd(iBuffer->Ptr(), Align4(sizeof(CMsvSearchSortQuery)));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   679
	__ASSERT_DEBUG(dPos <= PtrAdd(iBuffer->Ptr(), iBuffer->Des().MaxLength()), PanicServer(EMsvEntryOverrunBuffer));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   680
#endif
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   681
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   682
	TUint8* pS = CONST_CAST(TUint8*, iBuffer->Ptr());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   683
	DoUnpackQuery(pS, aQuery);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   684
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   685
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   686
/**
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   687
Constructor for TMsvPackedIdOperation.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   688
@internalComponent
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   689
@released
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   690
@param aBuffer: buffer for packing
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   691
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   692
EXPORT_C TMsvPackedIdOperation::TMsvPackedIdOperation(HBufC8*& aBuffer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   693
: iBuffer(aBuffer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   694
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   695
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   696
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   697
/**
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   698
Packs RArray of TMsvId and count value into a buffer for sending across IPC. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   699
@internalComponent
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   700
@released
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   701
@param aId: RArray of TMsvIds needs to pack.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   702
@return: reurn KErrNone if successful else KErrOverflow.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   703
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   704
EXPORT_C TInt TMsvPackedIdOperation::Pack(const RArray<TMsvId>& aId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   705
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   706
	//place for TMsvId's and count
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   707
	TInt requiredSize = (aId.Count() + 1) * 4;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   708
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   709
	// check the buffer is large enough
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   710
	if (requiredSize > iBuffer->Des().MaxSize())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   711
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   712
		return KErrOverflow;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   713
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   714
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   715
	// set the buffer with correct length
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   716
	iBuffer->Des().SetLength(requiredSize);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   717
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   718
	TInt* ptr = (TInt*) CONST_CAST(TUint8*, iBuffer->Ptr());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   719
	//number of TMsvId's
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   720
	*ptr++ = aId.Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   721
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   722
	//copy TMsvId's to buffer 	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   723
	for (TInt count=0; count<aId.Count(); count++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   724
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   725
		*ptr++ = aId[count];
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   726
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   727
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   728
	return KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   729
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   730
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   731
/**
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   732
Unpacks the data in buffer to a RArray.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   733
@internalComponent
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   734
@released
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   735
@param aId: Unpacked RArray of TMsvIds.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   736
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   737
EXPORT_C void TMsvPackedIdOperation::UnpackL(RArray<TMsvId>& aId)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   738
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   739
	__ASSERT_DEBUG(aId.Count()==0, PanicServer(EMsvOperationUnpackSelectionNotEmpty));	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   740
	TInt* ptr = (TInt*) CONST_CAST(TUint8*, iBuffer->Ptr());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   741
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   742
	//unpack the count
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   743
	TInt count = *ptr++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   744
	//unpack TMsvId's to RArray
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   745
	while (count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   746
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   747
		aId.AppendL(*ptr++);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   748
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   749
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   750
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   751
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   752
/**
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   753
Constructor for TMsvPackedIdAndMessagePart.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   754
@internalComponent
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   755
@released
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   756
*/
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   757
EXPORT_C TMsvPackedIdAndMessagePart::TMsvPackedIdAndMessagePart()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   758
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   759
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   760
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   761
/**
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   762
Size() will returns size of the data occupied by TMsvIdWithSortField.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   763
@internalComponent
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   764
@released
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   765
@param aData: RArray of TMsvIdWithSortField.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   766
*/	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   767
EXPORT_C TInt TMsvPackedIdAndMessagePart::Size(const RArray<TMsvIdWithSortField>& aData)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   768
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   769
	// number of TMsvId's in RArray
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   770
	TInt count = aData.Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   771
	TInt size = 0;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   772
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   773
	// to hold counter value
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   774
	size += sizeof(TInt);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   775
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   776
	// calculate length of RArray<TMsvId + SortFiled>
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   777
	for(TInt index = 0; index < count; index++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   778
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   779
		size += sizeof(TMsvId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   780
		size += aData[index].iContentMessagePart.Length();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   781
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   782
	return size;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   783
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   784
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   785
/**
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   786
Packs or Externalize the RArray of TMsvIdWithSortField into a aWriteStream for sending across IPC. 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   787
@internalComponent
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   788
@released
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   789
@param aWriteStream: aData will be written to aWriteStream.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   790
@param aData: RArray of TMsvIdWithSortField
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   791
*/	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   792
EXPORT_C void TMsvPackedIdAndMessagePart::ExternalizeL(RWriteStream& aWriteStream, RArray<TMsvIdWithSortField>& aData) const
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   793
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   794
	TInt count = aData.Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   795
	aWriteStream.WriteInt32L(count);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   796
  	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   797
  	for(TInt index=0; index < count; ++index)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   798
 		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   799
 		aWriteStream.WriteInt32L(aData[index].iMessageId);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   800
 		aWriteStream << aData[index].iContentMessagePart;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   801
 		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   802
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   803
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   804
/**
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   805
Unpacks or Internalize aReadStream buffer to RArray of TMsvIdWithSortField.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   806
@internalComponent
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   807
@released
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   808
@param aReadStream: aReadStream data will be unpacked to TMsvIdWithSortField of aData.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   809
@param aData: RArray of TMsvIdWithSortField
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   810
*/	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   811
EXPORT_C void TMsvPackedIdAndMessagePart::InternalizeL(RReadStream& aReadStream, RArray<TMsvIdWithSortField>& aData)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   812
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   813
	TInt count =  aReadStream.ReadInt32L();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   814
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   815
	TMsvIdWithSortField tmsvidAndmessagepart;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   816
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   817
	for(TInt index=0; index < count; ++index)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   818
 		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   819
 		tmsvidAndmessagepart.iMessageId = aReadStream.ReadInt32L();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   820
 		aReadStream >> tmsvidAndmessagepart.iContentMessagePart;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   821
 		aData.AppendL(tmsvidAndmessagepart);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   822
 		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   823
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   824
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   825
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   826
#if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   827
EXPORT_C TMsvPackedDriveIdOperation::TMsvPackedDriveIdOperation(HBufC8*& aBuffer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   828
: iBuffer(aBuffer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   829
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   830
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   831
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   832
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   833
EXPORT_C void TMsvPackedDriveIdOperation::UnpackL(RArray<TDriveNumber>& aDriveNumber)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   834
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   835
	TInt* ptr = (TInt*) CONST_CAST(TUint8*, iBuffer->Ptr());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   836
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   837
	// Unpack the count.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   838
	TInt count = *ptr++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   839
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   840
	// Append TDriveNumber
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   841
	while (count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   842
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   843
		aDriveNumber.AppendL((TDriveNumber)*ptr++);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   844
		}	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   845
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   846
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   847
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   848
EXPORT_C TInt TMsvPackedDriveIdOperation::Pack(const RArray<TDriveNumber>& aDriveNumber)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   849
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   850
	// place for TMsvId's and count
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   851
	TInt requiredSize = (aDriveNumber.Count() + 1) * 4;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   852
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   853
	// check the buffer is large enough
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   854
	if (requiredSize > iBuffer->Des().MaxSize())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   855
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   856
		return KErrOverflow;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   857
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   858
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   859
	// set the buffer with correct length
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   860
	iBuffer->Des().SetLength(requiredSize);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   861
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   862
	TInt* ptr = (TInt*) CONST_CAST(TUint8*, iBuffer->Ptr());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   863
	//number of TMsvId's
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   864
	*ptr++ = aDriveNumber.Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   865
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   866
	//copy TMsvId's to buffer 	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   867
	for (TInt count=0; count<aDriveNumber.Count(); count++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   868
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   869
		*ptr++ = aDriveNumber[count];
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   870
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   871
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   872
	return KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   873
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   874
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   875
#endif		// #if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   876
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   877
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   878
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   879
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   880
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   881
#if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   882
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   883
/**
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   884
 * TMsvPackedHeaderStructure()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   885
 * 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   886
 * TMsvPackedHeaderStructure Constructor.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   887
 *
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   888
 * @param HBufC8*&
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   889
 * @return None.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   890
 * @leave None.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   891
 */	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   892
EXPORT_C TMsvPackedHeaderStructure::TMsvPackedHeaderStructure(HBufC8*& aBuffer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   893
: iBuffer(aBuffer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   894
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   895
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   896
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   897
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   898
/**
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   899
 * UnpackL()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   900
 * 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   901
 * Unpacks the buffer to fill header structure.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   902
 *
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   903
 * @param RPointerArray<CFieldPair>&: Header Structure.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   904
 * @return None.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   905
 * @leave KErrNoMemory
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   906
 */	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   907
EXPORT_C void TMsvPackedHeaderStructure::UnpackL(RPointerArray<CFieldPair>& aFieldDetails)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   908
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   909
	TInt* ptr = (TInt*) CONST_CAST(TUint8*, iBuffer->Ptr());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   910
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   911
	// Unpack the count.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   912
	TInt count = *ptr++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   913
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   914
	TInt size = 0;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   915
	TPtrC16 ptrBuf;	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   916
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   917
	while (count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   918
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   919
		CFieldPair* fieldPair = new(ELeave) CFieldPair();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   920
		CleanupStack::PushL(fieldPair);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   921
		size = *ptr++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   922
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   923
		const TText* textPtr = (TText*)ptr;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   924
		ptrBuf.Set(textPtr, (size/2));			// ptrBuf is 16 bits.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   925
		ptr += Align4(size)/sizeof(TInt);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   926
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   927
		fieldPair->iFieldName = ptrBuf.AllocL();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   928
		fieldPair->iFieldType = (EFieldType) *ptr++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   929
		aFieldDetails.AppendL(fieldPair);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   930
		CleanupStack::Pop();			// fieldPair
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   931
		}	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   932
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   933
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   934
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   935
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   936
/**
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   937
 * Pack()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   938
 * 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   939
 * Packs the header structure to a buffer.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   940
 *
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   941
 * @param RPointerArray<CFieldPair>&: Header Structure.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   942
 * @return TInt: KErrOverflow, if buffer does not have sufficient memory.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   943
 */		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   944
EXPORT_C TInt TMsvPackedHeaderStructure::Pack(const RPointerArray<CFieldPair>& aFieldDetails)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   945
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   946
	TInt count = aFieldDetails.Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   947
	TInt requiredSize = 0;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   948
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   949
	// Calculate the size of the data to be written.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   950
	for(TInt index=0; index<count; index++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   951
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   952
		CFieldPair* fieldPair = aFieldDetails[index]; 	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   953
		requiredSize += Align4(fieldPair->iFieldName->Des().Size());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   954
		requiredSize += 8;		// 4 bytes for EFieldType and 4 bytes for size of iFieldName
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   955
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   956
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   957
	// 4 bytes are needed to store the array count.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   958
	requiredSize += 4;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   959
	if(requiredSize > iBuffer->Des().MaxSize())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   960
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   961
		return KErrOverflow;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   962
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   963
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   964
	// Set the buffer with correct length
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   965
	iBuffer->Des().SetLength(requiredSize);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   966
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   967
	// Start writing to the buffer.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   968
	TInt* ptr = (TInt*) CONST_CAST(TUint8*, iBuffer->Ptr());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   969
	*ptr++ = count;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   970
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   971
	for(TInt index=0; index<count; index++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   972
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   973
		CFieldPair* fieldPair = aFieldDetails[index];
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   974
		TInt size = fieldPair->iFieldName->Des().Size();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   975
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   976
		*ptr++ = size;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   977
		Mem::Copy((void*)ptr, fieldPair->iFieldName->Des().Ptr(), size);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   978
		ptr += (Align4(size))/sizeof(TInt);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   979
		*ptr++ = (TInt)(fieldPair->iFieldType);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   980
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   981
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   982
	// place for TMsvId's and count
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   983
	return KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   984
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   985
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   986
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   987
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   988
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   989
/**
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   990
 * TMsvPackedHeaderData()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   991
 * 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   992
 * TMsvPackedHeaderData Constructor.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   993
 *
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   994
 * @param HBufC8*&
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   995
 * @return None.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   996
 * @leave None.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   997
 */	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   998
EXPORT_C TMsvPackedHeaderData::TMsvPackedHeaderData(HBufC8*& aBuffer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
   999
: iBuffer(aBuffer)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1000
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1001
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1002
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1003
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1004
/**
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1005
 * UnpackL()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1006
 * 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1007
 * Unpacks the buffer to fill header data structure.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1008
 *
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1009
 * @param RPointerArray<CHeaderFields>&: Header Structure.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1010
 * @return None.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1011
 * @leave KErrNoMemory
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1012
 */		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1013
EXPORT_C void TMsvPackedHeaderData::UnpackL(RPointerArray<CHeaderFields>& aFieldDetails)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1014
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1015
	aFieldDetails.ResetAndDestroy();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1016
	TInt* ptr = (TInt*) CONST_CAST(TUint8*, iBuffer->Ptr());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1017
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1018
	// Unpack the count.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1019
	TInt count = *ptr++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1020
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1021
	TPtrC16 ptrBuf;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1022
	while (count--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1023
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1024
		CHeaderFields* headerRow = new(ELeave) CHeaderFields();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1025
		CleanupStack::PushL(headerRow);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1026
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1027
		headerRow->iUid = TUid::Uid(*ptr++);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1028
		TInt colCount = *ptr++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1029
		while(colCount--)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1030
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1031
			CFieldPair* fieldObj = new(ELeave) CFieldPair();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1032
			CleanupStack::PushL(fieldObj);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1033
			
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1034
			if(EIntegerField == (EFieldType)*ptr++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1035
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1036
				TUint32 rVal = *ptr++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1037
				fieldObj->iFieldNumValue = rVal;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1038
				TUint64 lVal = (*ptr++);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1039
				lVal = lVal << 32;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1040
				fieldObj->iFieldNumValue |= lVal;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1041
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1042
			else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1043
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1044
				TInt size = *ptr++;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1045
				const TText* textPtr = (TText*)ptr;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1046
				ptrBuf.Set(textPtr, (size/2));
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1047
				ptr += Align4(size)/sizeof(TInt);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1048
				
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1049
				fieldObj->iFieldTextValue = ptrBuf.AllocL();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1050
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1051
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1052
			headerRow->iFieldPairList.AppendL(fieldObj);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1053
			CleanupStack::Pop(fieldObj);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1054
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1055
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1056
		aFieldDetails.AppendL(headerRow);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1057
		CleanupStack::Pop(headerRow);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1058
		}	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1059
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1060
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1061
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1062
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1063
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1064
/**
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1065
 * Pack()
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1066
 * 
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1067
 * Packs the header data to a buffer.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1068
 *
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1069
 * @param RPointerArray<CHeaderFields>&: Header Data.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1070
 * @return TInt: KErrOverflow, if buffer does not have sufficient memory.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1071
 */		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1072
EXPORT_C TInt TMsvPackedHeaderData::Pack(const RPointerArray<CHeaderFields>& aFieldDetails)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1073
	{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1074
	TInt count = aFieldDetails.Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1075
	TInt requiredSize = 0;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1076
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1077
	// Calculate the size of the data to be written.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1078
	for(TInt headerRow=0; headerRow<count; headerRow++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1079
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1080
		RPointerArray<CFieldPair>& fieldPairList = aFieldDetails[headerRow]->iFieldPairList;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1081
		for(TInt fieldIndex=0; fieldIndex<fieldPairList.Count(); fieldIndex++)	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1082
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1083
			requiredSize += 4;			// Store the data type.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1084
			// If it is a text field
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1085
			if(fieldPairList[fieldIndex]->iFieldTextValue)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1086
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1087
				requiredSize += 4; 		// 4 bytes to store size of iFieldTextValue
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1088
				requiredSize += Align4(fieldPairList[fieldIndex]->iFieldTextValue->Des().Size());				
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1089
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1090
			else	// For Int or date field.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1091
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1092
				requiredSize += sizeof(TInt64);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1093
				}				
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1094
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1095
		requiredSize += 8;		// 4 bytes for TUid, 4 bytes for size of iFieldPairList
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1096
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1097
	requiredSize += 4; 			// 4 bytes are needed to store the array count. (count)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1098
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1099
	if(requiredSize > iBuffer->Des().MaxSize())
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1100
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1101
		return KErrOverflow;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1102
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1103
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1104
	// Set the buffer with correct length
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1105
	iBuffer->Des().SetLength(requiredSize);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1106
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1107
	// Start writing to the buffer.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1108
	TInt* ptr = (TInt*) CONST_CAST(TUint8*, iBuffer->Ptr());
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1109
	*ptr++ = count;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1110
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1111
	for(TInt headerRow=0; headerRow<count; headerRow++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1112
		{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1113
		// For each header row...
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1114
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1115
		// Store UID of the row.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1116
		*ptr++ = aFieldDetails[headerRow]->iUid.iUid;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1117
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1118
		// Store field list.
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1119
		RPointerArray<CFieldPair>& fieldPairList = aFieldDetails[headerRow]->iFieldPairList;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1120
		*ptr++ = fieldPairList.Count();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1121
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1122
		for(TInt fieldIndex=0; fieldIndex<fieldPairList.Count(); fieldIndex++)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1123
			{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1124
			CFieldPair* fieldPair = fieldPairList[fieldIndex];
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1125
			if(fieldPair->iFieldTextValue)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1126
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1127
				// Data type
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1128
				*ptr++ = ETextField;				
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1129
				// Data Size
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1130
				TInt textSize = fieldPair->iFieldTextValue->Des().Size();
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1131
				*ptr++ = textSize;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1132
				// Data
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1133
				Mem::Copy((void*)ptr, fieldPair->iFieldTextValue->Des().Ptr(), textSize);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1134
				ptr += Align4(textSize)/sizeof(TInt);
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1135
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1136
			else
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1137
				{
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1138
				// Data type
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1139
				*ptr++ = EIntegerField;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1140
				// Data (64 bits)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1141
				TUint64 maskVal = KMaxTUint32;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1142
				*ptr++ = (fieldPair->iFieldNumValue) & maskVal;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1143
				maskVal = ~maskVal;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1144
				*ptr++ = (fieldPair->iFieldNumValue & maskVal) >> 32;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1145
				}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1146
			}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1147
		}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1148
		
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1149
	return KErrNone;
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1150
	}
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1151
	
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1152
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1153
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1154
#endif		// #if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB)
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1155
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1156
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1157
db3f5fa34ec7 201044_02
hgs
parents:
diff changeset
  1158