williamr@2: // Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@2: // under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members williamr@2: // which accompanies this distribution, and is available williamr@2: // at the URL "http://www.symbianfoundation.org/legal/licencesv10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@2: // williamr@2: williamr@2: #if !defined(__OFFOP_H__) williamr@2: #define __OFFOP_H__ williamr@2: williamr@2: #if !defined (__MSVIDS_H__) williamr@2: #include williamr@2: #endif williamr@2: williamr@2: #if !defined (__MSVUIDS_H__) williamr@2: #include williamr@2: #endif williamr@2: williamr@2: #if !defined(__MSVSTORE_H__) williamr@2: #include williamr@2: #endif williamr@2: williamr@2: #include williamr@2: williamr@2: const TInt KCurrentOfflineOperationArrayVersion = 2; williamr@2: _LIT(KImcmPanic, "IMCM"); williamr@2: williamr@2: class CMsvEntry; williamr@2: williamr@2: /////////////////////////////////////////////////////////////////////////////// williamr@2: // CImOffLineOperation container for cached off line operation, to be performed williamr@2: // on next connection to remote server. williamr@2: class CImOffLineOperation : public CBase williamr@2: /** williamr@2: @internalTechnology williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: enum TOffLineOpType williamr@2: { williamr@2: EOffLineOpNone = 0x0000, williamr@2: // williamr@2: EOffLineOpCopyToLocal = 0x0001, williamr@2: EOffLineOpCopyFromLocal, williamr@2: EOffLineOpCopyWithinService, williamr@2: // williamr@2: EOffLineOpMoveToLocal = 0x0010, williamr@2: EOffLineOpMoveFromLocal, williamr@2: EOffLineOpMoveWithinService, williamr@2: // williamr@2: EOffLineOpDelete = 0x0020, williamr@2: // williamr@2: EOffLineOpChange = 0x0030, williamr@2: EOffLineOpCreate, williamr@2: // williamr@2: EOffLineOpMtmSpecific = 0x0100, williamr@2: }; williamr@2: williamr@2: public: // Constructor of a null operation williamr@2: IMPORT_C CImOffLineOperation(); williamr@2: IMPORT_C ~CImOffLineOperation(); williamr@2: public: // Set this operation to a specific type. williamr@2: inline void SetCopyToLocal(TMsvId aMessageId, TMsvId aTargetFolderId); williamr@2: inline void SetCopyFromLocal(TMsvId aMessageId, TMsvId aTargetFolderId); williamr@2: inline void SetCopyWithinService(TMsvId aMessageId, TMsvId aTargetFolderId); williamr@2: // williamr@2: inline void SetMoveToLocal(TMsvId aMessageId, TMsvId aTargetFolderId); williamr@2: inline void SetMoveFromLocal(TMsvId aMessageId, TMsvId aTargetFolderId); williamr@2: inline void SetMoveWithinService(TMsvId aMessageId, TMsvId aTargetFolderId); williamr@2: williamr@2: inline void SetDelete(TMsvId aMessageId); williamr@2: inline void SetChange(TMsvId aMessageId); williamr@2: inline void SetCreate(TMsvId aMessageId); williamr@2: IMPORT_C void SetMtmSpecificCommandL(TMsvId aMessageId, TMsvId aTargetFolderId, TInt aMtmFunctionId, const TDesC8& aParameters); williamr@2: public: // Access to parameters of operation williamr@2: inline TOffLineOpType OpType()const ; williamr@2: inline TMsvId MessageId()const ; williamr@2: inline TMsvId TargetMessageId()const ; williamr@2: inline TInt MtmFunctionId() const ; williamr@2: inline TPtrC8 MtmParameters() const ; williamr@2: williamr@2: public: williamr@2: IMPORT_C void DetachMtmParameters() ; williamr@2: // Need this detach because the copy constructor will not be called when appending this class to an array! williamr@2: IMPORT_C void DeleteBuffer(); williamr@2: // Need this because destructor will not be called when item is removed from an array williamr@2: public: williamr@2: IMPORT_C TBool Equals(const CImOffLineOperation& aOperation) const; williamr@2: IMPORT_C void CopyL(const CImOffLineOperation& aOperation); williamr@2: // Copy-constructor that can leave williamr@2: public: williamr@2: IMPORT_C void ExternalizeL( RMsvWriteStream& aWriteStream ) const; williamr@2: IMPORT_C void InternalizeL( RMsvReadStream& aReadStream ); williamr@2: public: williamr@2: IMPORT_C int operator ==(const CImOffLineOperation& otherOperation) const; williamr@2: private: williamr@2: IMPORT_C void SetOperation(TOffLineOpType aOpType, TMsvId aMessageId, TMsvId aTargetFolderId, TInt aMtmFunctionId, HBufC8* aParameters); williamr@2: IMPORT_C void SetOperation(TOffLineOpType aOpType, TMsvId aMessageId, TMsvId aTargetFolderId); williamr@2: private: williamr@2: TOffLineOpType iOpType; williamr@2: TMsvId iMessageId; williamr@2: TMsvId iTargetMessageId; williamr@2: TInt iMtmFunctionId; williamr@2: HBufC8* iMtmParameters; // Mtm-specifics williamr@2: }; williamr@2: williamr@2: /////////////////////////////////////////////////////////////////////////////// williamr@2: // MOffLineOperationArray : generic mixin for accessing arrays of Off line operations. williamr@2: class MImOffLineOperationArray williamr@2: /** williamr@2: @internalTechnology williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: virtual TInt CountOperations() const = 0; williamr@2: virtual const CImOffLineOperation& Operation(TInt aIndex) const = 0; williamr@2: virtual void AppendOperationL(const CImOffLineOperation& aOperation) = 0; williamr@2: virtual void Delete(TInt aIndex) = 0; williamr@2: }; williamr@2: williamr@2: /////////////////////////////////////////////////////////////////////////////// williamr@2: // CImOffLineArrayStore : storing and restoring MImOffLineOperationArray williamr@2: // derived classes williamr@2: class CImOffLineArrayStore : public CBase williamr@2: /** williamr@2: @internalTechnology williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: inline CImOffLineArrayStore(MImOffLineOperationArray& aArray); williamr@2: inline void SetVersion(TUint16 aVersion); williamr@2: inline TUint16 Version(); williamr@2: IMPORT_C void StoreL(CMsvStore& aMsvStore) const; williamr@2: IMPORT_C void RestoreL(const CMsvStore& aMessageStore ); williamr@2: IMPORT_C void ExternalizeL(RMsvWriteStream& aWriteStream) const; williamr@2: IMPORT_C void InternalizeL(RMsvReadStream& aReadStream); williamr@2: private: williamr@2: TUint16 iVersion; williamr@2: MImOffLineOperationArray* iArray; williamr@2: }; williamr@2: williamr@2: /////////////////////////////////////////////////////////////////////////////// williamr@2: // CImOffLineOperationArray : implementation of MImOffLineOperationArray williamr@2: class CImOffLineOperationArray : public CBase, public MImOffLineOperationArray williamr@2: /** williamr@2: @internalTechnology williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: IMPORT_C static CImOffLineOperationArray* NewL(); williamr@2: IMPORT_C virtual ~CImOffLineOperationArray(); williamr@2: public: // derived from MImOffLineOperationArray williamr@2: TInt CountOperations() const; williamr@2: const CImOffLineOperation& Operation(TInt aIndex) const; williamr@2: void AppendOperationL(const CImOffLineOperation& aOperation); williamr@2: void Delete(TInt aIndex); williamr@2: public: // Not derived from MImOffLineOperationArray williamr@2: IMPORT_C void InsertOperationL(CImOffLineOperation& aOperation, TInt aPosition); williamr@2: protected: williamr@2: CImOffLineOperationArray(); williamr@2: IMPORT_C void ConstructL(); williamr@2: protected: williamr@2: CArrayFixFlat *iArray; williamr@2: }; williamr@2: williamr@2: williamr@2: class TQueuedOperation williamr@2: /** williamr@2: @internalComponent williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: IMPORT_C static TQueuedOperation* NewL(TMsvId aFolderId,TInt aOperationIndex, const CImOffLineOperation& aStoredOperation); williamr@2: IMPORT_C TQueuedOperation(); williamr@2: IMPORT_C TBool operator!=(const TQueuedOperation& aOp); williamr@2: inline TMsvId FolderId() const; williamr@2: inline TInt OperationIndex() const; williamr@2: inline CImOffLineOperation& Operation() ; williamr@2: IMPORT_C void CopyL(const TQueuedOperation& aOperation); williamr@2: private: williamr@2: TQueuedOperation(TMsvId aFolderId,TInt aOperationIndex); williamr@2: private: williamr@2: TMsvId iFolderId; williamr@2: TInt iOperationIndex; williamr@2: CImOffLineOperation iStoredOperation; williamr@2: }; williamr@2: williamr@2: class CImQueuedList : public CBase, public MImOffLineOperationArray williamr@2: /** williamr@2: @internalComponent williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: IMPORT_C static CImQueuedList* NewL(); williamr@2: IMPORT_C virtual ~CImQueuedList() ; williamr@2: IMPORT_C void SetFolder(TMsvId aFolderId); williamr@2: IMPORT_C void ResetLineCounter(); williamr@2: IMPORT_C TQueuedOperation& operator[](TInt anIndex); williamr@2: IMPORT_C void Delete(TInt aIndex); williamr@2: IMPORT_C void Reset(); williamr@2: IMPORT_C void AppendL(TQueuedOperation& aOperation); williamr@2: public: // From MOffLineOperationArrayStore williamr@2: IMPORT_C virtual TInt CountOperations() const; williamr@2: IMPORT_C virtual const CImOffLineOperation& Operation(TInt aIndex) const; williamr@2: IMPORT_C virtual void AppendOperationL(const CImOffLineOperation& aOperation); williamr@2: private: williamr@2: CImQueuedList() ; williamr@2: private: williamr@2: TMsvId iFolderId; williamr@2: TInt iLine; williamr@2: CArrayFixFlat *iArray; williamr@2: }; williamr@2: williamr@2: class MImUndoOffLineOperation williamr@2: /** williamr@2: @internalTechnology williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: virtual void UndoOffLineChangesL(const CImOffLineOperation& aDeleted, TMsvId aFolderId) = 0; williamr@2: }; williamr@2: williamr@2: class CImOperationQueueList : public CBase williamr@2: /** williamr@2: @internalComponent williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: IMPORT_C static CImOperationQueueList* NewL(CMsvEntry& aServiceEntry, MImUndoOffLineOperation *aImUndoOffLineOperation); williamr@2: // Create new list of queued operations for service entry aServiceEntry is set to. williamr@2: IMPORT_C ~CImOperationQueueList(); williamr@2: inline const TInt Count() const; williamr@2: // Current number of queued operations in list williamr@2: inline TQueuedOperation& operator[](TInt anIndex); williamr@2: // Access to array of queued operations. williamr@2: IMPORT_C void DeleteL(TInt aLine); williamr@2: // Remove operation from list of queued operations locally. williamr@2: IMPORT_C void ExpungeDeletedOperationsL(); williamr@2: // Enforce removal of queued operations from the stores of the folders. williamr@2: protected: williamr@2: void ConstructL(); williamr@2: CImOperationQueueList(CMsvEntry& aServiceEntry,MImUndoOffLineOperation *aImUndoOffLineOperation); williamr@2: void RestoreQueuedListL(CImQueuedList &/*aList*/); williamr@2: void StoreQueuedListL(CImQueuedList &/*aList*/); williamr@2: void ProcessFoldersL(); williamr@2: private: williamr@2: CImQueuedList *iQueuedList; williamr@2: CImQueuedList *iDeletedList; williamr@2: CMsvEntry* iServiceEntry; williamr@2: TMsvId iServiceId; williamr@2: MImUndoOffLineOperation *iUndoOffline; williamr@2: }; williamr@2: williamr@2: #include williamr@2: williamr@2: #endif