// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
//

#if !defined(__MSVIPC_H__)
#define __MSVIPC_H__

#if !defined(__E32BASE_H__)
#include <e32base.h>
#endif

#if !defined(__MSVSTD_H__)
#include <msvstd.h>
#endif

#if !defined(__MSVSEARCHSORTQUERY_H__)
#include <msvsearchsortquery.h>
#endif

//
const TInt KMsvNullOperation=0;
const TInt KMsvFirstOperation=1;

//
const TInt KMsvSessionBufferLength=0x1000;
const TInt KMsvProgressBufferLength=256;

struct TMsvIdWithSortField;

// ***** NOTE!!!!! TMsvPackedChangeNotification::UnpackL() MUST be	****
// ***** updated when adding new types								*****
/**
@internalComponent
@released
*/
enum TMsvServerChangeNotificationType 
	{
	EMsvNullNotification=-1,
	EMsvEntriesNoChange=0,
	EMsvEntriesCreated=1,
	EMsvEntriesChanged=2,
	EMsvEntriesDeleted=3,
	EMsvEntriesMoved=4,
	EMsvMtmGroupInstalled=5,
	EMsvMtmGroupDeInstalled=6,
	EMsvStoreDeleted=7,  
	EMsvCloseSession=8,
	EMsvIndexLoaded=9,
	EMsvIndexFailedToLoad=10,
	EMsvMediaChanged=12, // Note: I assume the following four follow each other in order
	EMsvMediaUnavailable=13,
	EMsvMediaAvailable=14,
	EMsvMediaIncorrect=15,
#if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT)
	EMsvMessageStoreNotSupported=16,
	EMsvMessageStoreCorrupt=17,	
	EMsvRefreshMessageView=18,
	EMsvDiskNotAvailable=19,
	EMsvUnableToProcessDiskNotification=20
#endif
	};


//**********************************
// TMsvPackedEntry
//**********************************
//
// Packs a TMsvEntry and the two associated descriptors into a buffer for
// sending across IPC. Also unpacks the data into a TMsvEntry and two heap 
// descriptors
//
//
class TMsvEntry;

class TMsvPackedEntry
/**
@internalComponent
@released
*/
	{
public:
	IMPORT_C TMsvPackedEntry(HBufC8*& aBuffer);
	IMPORT_C TInt PackEntry(const TMsvEntry& aEntry);
	IMPORT_C void UnpackEntry(TMsvEntry& aEntry);
private:
	HBufC8*& iBuffer;
	};


//**********************************
// TMsvPackedEntryArray
//**********************************
//
// Packs 1+ TMsvEntry's and the associated descriptors into a buffer for
// sending across IPC. Also unpacks the data into a TMsvEntry and two heap 
// descriptors using indexed access
//
//

class TMsvPackedEntryArray
/**
@internalComponent
@released
*/
	{
public:
	IMPORT_C TMsvPackedEntryArray(HBufC8*& aBuffer, TInt aCount=0);
	IMPORT_C TInt PackEntry(const TMsvEntry& aEntry);
	IMPORT_C TInt UnpackEntry(TInt aEntryIndex, TMsvEntry& aEntry);
	IMPORT_C void Reset();
private:
	TInt FindEntryInArray(TInt aIndex);
private:
	TInt	iIndex;
	TInt	iCount;
	const TUint8* iPos;
	HBufC8*& iBuffer;
	};


//**********************************
// TMsvChildrenDetails
//**********************************
//
// Contains the information about the number of children of an entry and how many
// have been sent in the main buffer
//

class TMsvChildrenDetails
/**
@internalComponent
@released
*/
	{
public:
	IMPORT_C TMsvChildrenDetails();
public:
	TMsvId	iParentId;
	TInt	iTotalNumberChildren;
	TInt	iNumberChildrenInArray;
	TInt	iLastEntryInArray;
	};


//**********************************
// TMsvLocalOperationProgress
//**********************************
//
// Contains the information about a local operation
//

class TMsvLocalOperationProgress
/** Encapsulates progress information returned by a local operation. A local operation 
is a CMsvOperation-derived object returned by a function that affects only 
local entries. For example, such a function would be a CMsvEntry::ChangeL() 
call on a local entry. You can check if the operation is local from CMsvOperation::Mtm(): 
a local operation returns a value of KUidMsvLocalServiceMtm. 

Progress information is obtained, in a packaged format, by calling CMsvOperation::ProgressL(). 
Understanding the TMsvLocalOperationProgress structure enables an application 
to use that information for a local operation.  
@publishedAll
@released
*/
	{
public:
/** Defines the possible values for the type of operation progress report. 
@publishedAll
@released
*/
	enum TLocalOperation
						{	
	/** Default value for new TMsvLocalOperationProgress */
							ELocalNone=0,
	/** Move operation */
							ELocalMove,
	/** Delete operation */
							ELocalDelete,
	/** Copy operation */
							ELocalCopy,
	/** Create operation */
							ELocalNew,
	/** Change operation */
							ELocalChanged
							};
public:
	IMPORT_C TMsvLocalOperationProgress();
public:
	/** The type of operation on which the progress is reporting */
	TLocalOperation iType;
	/** The number of entries on which the operation was or will be attempted */
	TInt iTotalNumberOfEntries;
	/** The number of entries on which the operation has been successful */
	TInt iNumberCompleted;	
	/** The number of entries on which the operation has failed */
	TInt iNumberFailed;	
	/** The number of entries on which the operation has yet to be attempted */
	TInt iNumberRemaining;	
	/** The error code for the latest failed operation */
	TInt iError;
	/** This contains different information for different operation types:
	
	1. copying a single entry: ID of the new entry
	
	2. moving an entry: ID of the entry moved
	
	3. copying or moving multiple entries: ID of the first entry in the selection */
	TMsvId	iId;
	};

//**********************************
// TMsvServerOperationProgress
//**********************************
/** Encapsulates progress information returned by a non-MTM specific Message Server 
operation. 

You can check if an operation has this type of progress information by calling 
CMsvOperation::Mtm(): a suitable operation returns a value of KUidMsvServerMtm. 

Progress information is obtained, in a packaged format, by calling CMsvOperation::ProgressL(). 
Understanding the TMsvServerOperationProgress class enables an application 
to use that information for a Message Server operation. 

@see TMsvLocalOperationProgress 
@see CMsvSession::CopyStoreL() 
@see CMsvSession::DeleteStoreL()
@publishedAll
@released
*/

class TMsvServerOperationProgress
	{
public:

	enum TMsvServerOperationType 
		{ 
		/** No operation in progress. */
		EMsvNoOperation = 0, 
		/** Change drive operation in progress.
	
		@see CMsvSession::ChangeDriveL() */
		EMsvChangeDriveOperation
		
		,
 		/** Copy Store operation in progress.
 		@see CMsvSession::CopyStoreL() */
 		EMsvCopyOperation,
 		
 		/** Delete Store operation in progress.
 		@see CMsvSession::DeleteStoreL() */
 		EMsvDeleteOperation
 		
 				
 		 };
	//
public:
	IMPORT_C TMsvServerOperationProgress();
	TMsvServerOperationProgress(TMsvServerOperationType aType);
	//
public:
	/** The type of operation in progress. */
	TMsvServerOperationType iOperationType;
	};

		
//**********************************
// TMsvIndexProgress
//**********************************

class TMsvIndexProgress
/** Provides details of index loading progress. 

@see TMsvIndexLoadProgress 
@publishedAll
@released
*/
	{
public:
	IMPORT_C TMsvIndexProgress();
	//
public:
	/** Total number of entries in the index. */
	TInt iTotal;
	/** Number of entries created so far. */
	TInt iCompleted;
	/** Number of entries remaining. */
	TInt iRemaining;
	/** ID of entry last created. */
	TMsvId iId;
	};


//**********************************
// TMsvIndexLoadProgress
//**********************************

class TMsvIndexLoadProgress : public TMsvServerOperationProgress
/** Progress information for an operation controlling the Message Server loading 
its index. 

Such an operation can occur when the Message Server changes drive.

@see CMsvOperation
@see CMsvSession::ChangeDriveL() 
@publishedAll
@released
*/
	{
public:
	/** States for the index loading process. 
@publishedAll
@released
*/
	enum TIndexState 
		{
		/** Index loading has not begun. */
		EIndexNotLoaded = 0, 
		/** Index loading is in progress. */
		EIndexLoading, 
		/** Index is being built. */
		EIndexRebuilding, 
		/** Index loading is complete. */
		EIndexComplete};
	//
public:
	IMPORT_C TMsvIndexLoadProgress();
	//
public:
	/** Stores any errors that prevented the index being loaded. */
	TInt iError;
	/** Current state of the index loading process. */
	TIndexState iState;
	/** Details of the index loading progress. */
	TMsvIndexProgress iIndex;
	};



//**********************************
// TMsvCopyProgress
//**********************************

/** Progress information for the copy operation. 

@see CMsvOperation
@see CMsvSession::CopyStoreL() 
@publishedAll
@released
*/
class TMsvCopyProgress : public TMsvServerOperationProgress
	{
public:
/** States for the copy operation. 
@publishedAll
@released
*/
	enum TCopyState 
		{
		/** Operation not yet started */
		ENotYetStarted = 0,
		/** Mail Store is being locked */
		ELock, 
		/** Initialising Copy operation */
		EInitCopy,
		/** Mail Store is being copied */
		ECopyStore, 
		/** Mail Store is being unlocked. */
		EUnlock,
		/** Operation completed */
		ECompleted
		};
		
	/** Stores any errors that the operation encountered. */
	TInt iError;
	TInt iTotal;      // Total number of items to be copied
	TInt iCurrent;    // Current item number being copied
 	TCopyState iState;
	
public:
    IMPORT_C TMsvCopyProgress();
	};


//**********************************
// TMsvDeleteProgress
//**********************************

/** Progress information for the delete operation.
 
@see CMsvOperation
@see CMsvSession::DeleteStoreL() 
@publishedAll
@released
*/
class TMsvDeleteProgress : public TMsvServerOperationProgress
	{
public:
/** States for the delete operation. 
@publishedAll
@released
*/
	enum TDeleteState 
		{
		/** Operation not yet started */
		ENotYetStarted = 0,
		/** Mail Store is being deleted */
		EDeleteStore, 
		/** Operation is complete */
		ECompleted
		};
		
	/** Stores any errors that the operation encountered. */
	TInt iError;
	TDeleteState iState;
	
public:
    IMPORT_C TMsvDeleteProgress();
	};



//**********************************
// TMsvPackedOperation
//**********************************
//
// Packs an operation, the selection, and some associated parameters (TInt) into the
// IPC buffer
//
//

class TMsvPackedOperation
/**
@internalComponent
@released
*/
	{
public:
	IMPORT_C TMsvPackedOperation(HBufC8*& aBuffer);
	IMPORT_C TInt Pack(const CMsvEntrySelection& aSelection, TInt aParameter1=0, TInt aParameter2=0);
	IMPORT_C void UnpackL(CMsvEntrySelection& aSelection, TInt& aParameter1, TInt& aParameter2);
private:
	HBufC8*& iBuffer;
	};


//**********************************
// TMsvPackedChangeNotification
//**********************************
//
// Packs the CMsvEntrySelection of index entries that have been changed, and also 
// the integer describing the type of change. There is a limit of KMsvPackedChangeLimit
// top the number of entry ids that can be sent at one time
//
//

typedef TBuf8<128> TMsvNotifBuffer;

class TMsvPackedChangeNotification
/**
@internalComponent
@released
*/
	{
public:
	enum {	KMsvChangeNotificationNumberOfTInts=4,
			KMsvPackedChangeLimit=28, // 32-KMsvChangeNotificationNumberOfTInts
			}; 
public:
	IMPORT_C TMsvPackedChangeNotification(TMsvNotifBuffer& aBuffer);
	inline void Pack(TMsvServerChangeNotificationType aChangeType, const CMsvEntrySelection& aSelection, TInt aParameter1, TInt aParameter2);
	IMPORT_C void Pack(TMsvServerChangeNotificationType aChangeType, const CMsvEntrySelection& aSelection, TInt aParameter1, TInt aParameter2, TInt aStartIndex, TInt aFinishIndex);
	IMPORT_C void Pack(TMsvServerChangeNotificationType aChangeType, TMsvId aId, TInt aParameter1, TInt aParameter2);
	IMPORT_C void UnpackL(TMsvServerChangeNotificationType& aChangeType, CMsvEntrySelection& aSelection, TInt& aParameter1, TInt& aParameter2);
private:
	TMsvNotifBuffer& iBuffer;
	};

//**********************************
// TMsvPackedEntryFilter
//**********************************

class TMsvPackedEntryFilter
/**
@internalComponent
@released
*/
	{
public:
	TMsvPackedEntryFilter(HBufC8*& aBuffer);
	TInt PackFilter(const CMsvEntryFilter& aFilter);
	void UnpackFilter(CMsvEntryFilter& aFilter);
private:
	HBufC8*& iBuffer;
	};

/**
Packs TMsvSearchSortQuery object into a buffer for sending across IPC. 
Also unpacks the buffer to TMsvSearchSortQuery
@internalComponent
@released
*/
class TMsvPackQuery
	{
public:
	IMPORT_C TMsvPackQuery(HBufC8*& aBuffer);
	IMPORT_C TInt PackQuery(const CMsvSearchSortQuery* aQuery);
	IMPORT_C void UnpackQuery(CMsvSearchSortQuery* aQuery);
private:
	TInt DoPackQuery(const TUint8*& aPtrStart, const TUint8* aPtrEnd, const CMsvSearchSortQuery* aQuery);
	void DoUnpackQuery(TUint8*& aPtr, CMsvSearchSortQuery* aQuery);
private:
	HBufC8*& iBuffer;
	};


/**
Packs RArray of TMsvId into a buffer for sending across IPC. 
Also unpacks the TMsvId's to RArray
@internalComponent
@released
*/
class TMsvPackedIdOperation
	{
public:
	IMPORT_C TMsvPackedIdOperation(HBufC8*& aBuffer);
	IMPORT_C TInt Pack(const RArray<TMsvId>& aId);
	IMPORT_C void UnpackL(RArray<TMsvId>& aId);
private:
	HBufC8*& iBuffer;
	};

/**
Packs RArray of TMsvId with Sort field into a buffer for sending across IPC. 
Also unpacks the TMsvId and Sort filed to RArray
@internalComponent
@released
*/
class TMsvPackedIdAndMessagePart
	{
public:
	IMPORT_C TMsvPackedIdAndMessagePart();
	IMPORT_C TInt Size(const RArray<TMsvIdWithSortField>& aData);
	IMPORT_C void ExternalizeL(RWriteStream& aWriteStream, RArray<TMsvIdWithSortField>& aData) const;
	IMPORT_C void InternalizeL(RReadStream& aReadStream, RArray<TMsvIdWithSortField>& aData);
	};


#if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT)
/**
@internalComponent
@released
*/
class TMsvPackedDriveIdOperation
	{
public:
	IMPORT_C TMsvPackedDriveIdOperation(HBufC8*& aBuffer);
	IMPORT_C TInt Pack(const RArray<TDriveNumber>& aDriveNumber);
	IMPORT_C void UnpackL(RArray<TDriveNumber>& aDriveNumber);
private:
	HBufC8*& iBuffer;
	};
#endif		// #if (defined SYMBIAN_MSGS_ENHANCED_REMOVABLE_MEDIA_SUPPORT)



#if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB)

/**
 * Pack unpack the header structure from a buffer
 * @internalComponent
 * @released
 */
class TMsvPackedHeaderStructure
	{
public:
	IMPORT_C TMsvPackedHeaderStructure(HBufC8*& aBuffer);
	IMPORT_C TInt Pack(const RPointerArray<CFieldPair>& aFieldDetails);
	IMPORT_C void UnpackL(RPointerArray<CFieldPair>& aFieldDetails);
private:
	HBufC8*& iBuffer;
	};


/**
 * Pack unpack the header data from a buffer
 * @internalComponent
 * @released
 */
class TMsvPackedHeaderData
	{
public:
	IMPORT_C TMsvPackedHeaderData(HBufC8*& aBuffer);
	IMPORT_C TInt Pack(const RPointerArray<CHeaderFields>& aFieldDetails);
	IMPORT_C void UnpackL(RPointerArray<CHeaderFields>& aFieldDetails);
private:
	HBufC8*& iBuffer;
	};

#endif		// #if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB)
#include <msvipc.inl>

#endif

