diff -r 000000000000 -r b497e44ab2fc syncmlfw/ds/hostserver/dshostclient/inc/nsmldshostclientsession.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/syncmlfw/ds/hostserver/dshostclient/inc/nsmldshostclientsession.h Thu Dec 17 09:07:52 2009 +0200 @@ -0,0 +1,577 @@ +/* +* Copyright (c) 2005 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: Client module of DS Host Servers +* +*/ + + +#ifndef __NSMLDSHOSTCLIENTSESSION_H__ +#define __NSMLDSHOSTCLIENTSESSION_H__ + +// ------------------------------------------------------------------------------------------------ +// Includes +// ------------------------------------------------------------------------------------------------ +#include +#include +#include +#include +#include +#include + +// ------------------------------------------------------------------------------------------------ +// Class forwards +// ------------------------------------------------------------------------------------------------ +struct TNSmlFilterCapData; +class CNSmlFilter; +class RSmlFilter; +class RSmlFilterDef; +class CNSmlDbCaps; +struct TNSmlDPInformation; +class RNSmlDbItemModificationSet; + +// ------------------------------------------------------------------------------------------------ +// client for DS Host Servers. +// +// @lib nsmldshostclient.lib +// ------------------------------------------------------------------------------------------------ +class RNSmlDSHostClient : public RSessionBase + { + enum TNSmlDSItemState + { + ENSmlClosed, + ENSmlItemCreating, + ENSmlItemUpdating + }; +private: + // ------------------------------------------------------------------------------------------------ + // Buffer + dynamic streams for that buffer. + // + // @lib nsmldshostserver.lib + // ------------------------------------------------------------------------------------------------ + struct TStreamBuffers + { + CBufBase* iBuffer; + RWriteStream* iWrite; + RReadStream* iRead; + }; +public: + /** + * Connects client to Host Server. + * @param aServerName. The name of server. + * @param aVersion. The version of server. + * @return TInt. KErrNone or one of the system wide error codes. + */ + TInt Connect( const TDesC& aServerName, const TVersion& aVersion ); + + /** + * Closes connection between client and Host Server. + */ + void Close(); + + /** + * Creates chunk that is used to transfer data between client and server. + * @return TInt. KErrNone or one of the system wide error codes. + */ + TInt CreateChunk() const; + + /** + * Sends Chunk handle to SyncML DS Host Servers. + * @return TInt. KErrNone or one of the system wide error codes. + */ + TInt SendChunkHandle() const; + + /** + * Creates Data Providers. + * @param aIds. The array of IDs of Data Providers. + * @param aResultArray. The result for each Data Provider. KErrNone or one of the system wide error codes. + * Order of results must be same as IDs of Data Providers. + */ + void CreateDataProvidersL( const RArray& aIds, RArray& aResultArray ); + + /** + * Creates all possible Data Providers. + * @param aIds. At return the array of IDs of Data Providers. + * @param aExceptIds. Those Data Providers are not created. + */ + void CreateAllDataProvidersL( RArray& aIds, const RArray& aExceptIds ); + + /** + * fetches information on data provider + * The caller has the responsibility to free all the memory reserved for returned struct. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + * @return TNSmlDPInformation*. Struct filled with fetched information. + */ + TNSmlDPInformation* DataProviderInformationL( const TSmlDataProviderId aId, TInt& aResultCode ) const; + + /** + * Asks if Data Provider supports some operation. + * @param aOpId. The ID of Operation. + * @param aId. The ID of Data Provider. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + * @return TBool, ETrue if operation is supported and EFalse if not. + */ + TBool SupportsOperationL( TUid aOpId, const TSmlDataProviderId aId, TInt& aResultCode ) const; + + /** + * Creates Data Store format of Data Provider. + * @param aDataStoreFormat. At return the datastore format of the Data Provider. + * @param aId. The ID of Data Provider. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + * @return CNSmlDbCaps*. + */ + CNSmlDbCaps* StoreFormatL( const TSmlDataProviderId aId, TInt& aResultCode ); + + /** + * Creates list of Data Store names of Data Provider. + * @param aNameList. returns the names of datastores that the Data Provider can open. + * @param aId. The ID of Data Provider. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void ListStoresL( CDesCArray* aNameList, const TSmlDataProviderId aId, TInt& aResultCode ); + + /** + * Creates default name for Data Store of Data Provider. + * @param aId. The ID of Data Provider. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + * @return HBufC* that includes default Data Store name. + */ + HBufC* DefaultStoreL( const TSmlDataProviderId aId, TInt& aResultCode ) const; + + /** + * This method returns the set of filters that can be used to send to the Sync Partner. + * @param aId. The ID of Data Provider. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + * @return RPointerArray*. Array, that includes filter. + */ + RPointerArray* SupportedServerFiltersL( const TSmlDataProviderId aId, TSyncMLFilterMatchType& aMatchType, TSyncMLFilterChangeInfo& aChangeInfo, TInt& aResultCode ) const; + + /** + * This method updates dynamic filters up-to-date. + * @param aFilters. The array that includes filters + * @param aChangeInfo. The change information about changes that data provider did + * @param aId. The ID of Data Provider. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void CheckServerFiltersL( const TSmlDataProviderId aId, RPointerArray& aFilters, TSyncMLFilterChangeInfo& aChangeInfo, TInt& aResultCode ) const; + + /** + * This method checks what filters are supported by server. + * @param aServerDataStoreFormat. The store format of Sync Partner. + * @param aFilterInfoArr. Array of filter information + * @param aFilters. The array that includes filters + * @param aChangeInfo. The change information about changes that data provider did + * @param aId. The ID of Data Provider. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void CheckSupportedServerFiltersL( const TSmlDataProviderId aId, const CNSmlDbCaps& aServerDataStoreFormat, const CArrayFix& aFilterInfoArr, RPointerArray& aFilters, TSyncMLFilterChangeInfo& aChangeInfo, TInt& aResultCode ) const; + + /** + * Get Filters. + * @param aId. The ID of Data Provider. + * @param aFilterArray. The filters to be used for the query generation + * @param aFilter. Results + * @param aMatchType. The filter match type to be used + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void GetFilterL( const TSmlDataProviderId aId, const TDesC& aStoreName, const RPointerArray& aFilterArray, CNSmlFilter*& aFilter, TSyncMLFilterMatchType aMatchType, TInt& aResultCode ); + + /** + * Opens the data store specified by aStoreName asynchronously. + * @param aContext. Identifies the specific synchronisation relationship to use. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void OpenL( const TSmlDataProviderId aId, const TDesC& aStoreName, const TDesC& aServerId, const TDesC& aRemoteDB, TInt& aResultCode ) const; + + /** + * Cancel the current asynchronous request. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void CancelRequest( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const; + + /** + * Starts the transaction mode. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void BeginTransaction( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ); + + /** + * Method will be called at the end of a successful transaction. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void CommitTransaction( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ); + + /** + * Method will be called to abort an ongoing transaction. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void RevertTransaction( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ); + + /** + * Starts the batch mode. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void BeginBatch( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ); + + /** + * Method will be called at the end of the batch mode. + * @param aResultArray is used to store result for each operation + * (in the order they were submitted) during batch. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void CommitBatchL( RArray& aResultArray, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ); + + /** + * Method will be called to abort an ongoing batch mode. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void CancelBatch( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ); + + /** + * Sets the SyncML server (SyncPartner) Data Format + * @param aServerDataStoreFormat. The data store format of Sync Partner. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void SetRemoteDataStoreFormatL( const CNSmlDbCaps& aServerDataStoreFormat, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ); + + /** + * Sets the SyncML server (SyncPartner) Data Format + * @param aServerMaxObjectSize. The maximum object size of Sync Partner. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void SetRemoteMaxObjectSizeL( TInt aServerMaxObjectSize, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const; + + /** + * Gets the maximum object size of Data Store which is reported to the SyncML partner. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + * @return TInt. The maximum object size of Data Store. + */ + TInt MaxObjectSize( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const; + + /** + * Opens item at Data Store. + * @param aUid. The UID of item. + * @param aFieldChange. Data Provider change to ETrue if there is only some field changes at item. + * @param aSize. The Data Provider puts the size of item to this parameter. + * @param aParent. Data Provider puts the UID of parent of item to this parameter. + * @param aMimeType. Data Provider puts the mime type of item to this parameter. + * @param aMimeVer. Data Provider puts the mime version of item to this parameter. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void OpenItemL( TSmlDbItemUid aUid, TBool& aFieldChange, TInt& aSize, TSmlDbItemUid& aParent, HBufC8*& aMimeType, HBufC8*& aMimeVer, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const; + + /** + * Creates new item to Data Store. + * @param aUid. The Data Provider puts the UID of new item to this parameter. It can be also put just after commit method. + * @param aSize. The size of new item. + * @param aParent. The UID of parent of new item. + * @param aMimeType. The mime type of new item. + * @param aMimeVer. The mime version of new item. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void CreateItemL( TSmlDbItemUid& aUid, TInt aSize, TSmlDbItemUid aParent, const TDesC8& aMimeType, const TDesC8& aMimeVer, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ); + + /** + * Replaces old item at Data Store. + * @param aUid. The UID of item. If item is added to the Data Store then The Data Provider + * puts the UID of new item to this parameter. It can be also put just after commit method. + * @param aSize. The size of item. + * @param aParent. The UID of parent of item. + * @param aFieldChange. If this is true then replace is only partial, + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void ReplaceItemL( TSmlDbItemUid aUid, TInt aSize, TSmlDbItemUid aParent, TBool aFieldChange, TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ); + + /** + * Reads data from item at Data Store. Item must be opened before this method can be called. + * This method is called until aBuffer is not used totally or method leaves with KErrEof. + * @param aBuffer. The Data Provider puts readed data to this parameter, + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void ReadItemL( TDes8& aBuffer, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const; + + /** + * Writes data to item to Data Provider. CreateItemL or ReplaceItemL method must be called before + * this method can be called. This method is called until all data to current item is written. + * @param aData. The data that is written to item at Data Store, + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void WriteItemL( const TDesC8& aData, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ); + + /** + * After item is written to Data Provider it can be saved to the Data Store. + * This method can be called just after WriteItemL method. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void CommitItem( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ); + + /** + * Closes opened item. + * This method can be called just if some item is open. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void CloseItem( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ); + + /** + * Moves item to new location. + * @param aUid. The UID of item. + * @param aNewParent. The UID of new parent of item. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void MoveItemL( TSmlDbItemUid aUid, TSmlDbItemUid aNewParent, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ); + + /** + * Deletes one item at Data Store permanently. + * @param aUid. The UID of item. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void DeleteItemL( TSmlDbItemUid aUid, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const; + + /** + * Soft deletes one item at Data Store. + * @param aUid. The UID of item. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void SoftDeleteItemL( TSmlDbItemUid aUid, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const; + + /** + * Deletes all items at Data Store permanently. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void DeleteAllItems( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const; + + /** + * Checks if the Data Store has sync history. If not then slow sync is proposed to Sync Partner. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + * @return TBool. ETrue, if Data Store has sync history, EFalse otherwise. + */ + TBool HasSyncHistory( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const; + + /** + * The Data Provider returns UIDs of items that are added after previous synchronization. + * If the Data Provider uses hierarchical synchronization then added folders must be placed + * first (from root to leaves) to UID set and finally items. + * @param aUidSet. The set of added items. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void AddedItemsL( RNSmlDbItemModificationSet& aUidSet, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const; + + /** + * The Data Provider returns UIDs of items that are deleted after previous synchronization. + * If the Data Provider uses hierarchical synchronization then deleted items must be placed + * first to UID set and folders after items (from leaves to root). + * @param aUidSet. The set of deleted items. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void DeletedItemsL( RNSmlDbItemModificationSet& aUidSet, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const; + + /** + * The Data Provider returns UIDs of items that are soft deleted after previous synchronization. + * If the Data Provider uses hierarchical synchronization then soft deleted items must be placed + * first to UID set and folders after items (from leaves to root). + * @param aUidSet. The set of soft deleted items. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void SoftDeleteItemsL( RNSmlDbItemModificationSet& aUidSet, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const; + + /** + * The Data Provider returns UIDs of items that are modified after previous synchronization. + * If the Data Provider uses hierarchical synchronization then modified folders must be placed + * first (from root to leaves) to UID set and finally items. + * @param aUidSet. The set of modified items. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void ModifiedItemsL( RNSmlDbItemModificationSet& aUidSet, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const; + + /** + * The Data Provider returns UIDs of items that are moved after previous synchronization. + * If the Data Provider uses hierarchical synchronization then moved folders must be placed + * first (from root to leaves) to UID set and finally items. + * @param aUidSet. The set of moved items. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void MovedItemsL( RNSmlDbItemModificationSet& aUidSet, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const; + + /** + * The Data Provider returns UIDs of items that are added, deleted, modified, softdeleted or moved after previous synchronization. + * @param aUidSet. The set of items. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void AllItemsL( RNSmlDbItemModificationSet& aUidSet, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const; + + /** + * Reset change info from the Data Provider. The following synchronization will be slow sync. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void ResetChangeInfo( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const; + + /** + * This method is called after some changes are synchronized to Sync Partner. If some changes + * were synchronized correctly then those UIDs are included to aItems. + * @param aItems. The UIDs of items that were correctly synchronized to Sync Partner. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void CommitChangeInfoL( const MSmlDataItemUidSet& aItems, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ); + + /** + * This method is called after some changes are synchronized to Sync Partner. This method is used if + * all changes were synchronized correctly. + * @param aId. The ID of Data Provider. + * @param aStoreName. The name of the data store that is used. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void CommitChangeInfo( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const; + + /** + * Replaces the give old server ID with new one. + * @param aOldServerId Old remote server ID. + * @param aNewValue New remote server ID. + * @param aResultCode. The result of method. KErrNone if everything goes correctly. + */ + void UpdateServerIdL( TDesC& aOldServerId, TDesC& aNewValue, TInt& aResultCode ); + +private: + /** + * Starts Host Server. + * @param aServerExeName. The name of server. + * @return TInt. KErrNone or one of the system wide error codes. + */ + TInt LaunchServer( const TDesC& aServerName ) const; + + /** + * write stream with dynamic buffer. + * @return RWriteStream&. write stream to memory. + */ + TStreamBuffers* StreamBufferLC() const; + + /** + * handles clean up of stream buffer. + * @param aP. read stream. + */ + static void CleanupStreamBuffer( TAny* aP ); + + /** + * Ensures that chunk has at least required size or max size of reserved memory. + * @param aRequiredSize. required size. + * + */ + void AdjustChunkLC( TInt aRequiredSize ) const; + + /** + * Adjusts memory so that at least needed size is reserved. + * @param iNeededSize. Memory needed for chunk in bytes. + */ + void AdjustChunkIfNeededLC( TInt iNeededSize ) const; + + /** + * restores chunk memory. + * @param aP. pointer to TMemPtr + */ + static void CancelAdjust( TAny* aP ); + + /** + * internalizes filters from stream + * @param aStream. source stream + * @param aFilters. filters read from stream. + */ + void InternalizeFiltersL( RReadStream& aStream, RPointerArray& aFilters ) const; + + /** + * externalizes filters to stream + * @param aStream. target stream + * @param aFilters. filters to write. + */ + void ExternalizeFiltersL( RWriteStream& aStream, const RPointerArray& aFilters ) const; + + /** + * creates filter from chunk + * @param aFilter. filter created + */ + void GetFilterFromChunkL( CNSmlFilter*& aFilter ); + + void AddFilterPropertiesL( const RPointerArray& properties, CNSmlFilter& aFilter ) const; + +private: + + mutable RChunk iChunk; // Handle to chunk that is used to transfer data between client and server. + RPointerArray iAddedUidsBuffer; // Added Uids are transferred back to client after Commit. + TSmlDbItemUid* iAddedUidBuffer; // Buffer for normal add command. + TInt iMode; // Normal, Batch or Transaction. + TNSmlDSItemState iItemState; + }; + +#endif + +// End of File