diff -r 000000000000 -r b497e44ab2fc syncmlfw/ds/hostserver/dshostclient/src/nsmldshostclient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/syncmlfw/ds/hostserver/dshostclient/src/nsmldshostclient.cpp Thu Dec 17 09:07:52 2009 +0200 @@ -0,0 +1,1164 @@ +/* +* 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 +* +*/ + + +// ------------------------------------------------------------------------------------------------ +// Includes +// ------------------------------------------------------------------------------------------------ +#include +#include + +#include "nsmldshostclient.h" +#include "nsmldshostconstants.h" + +#ifdef __USE_FAKE_CLIENT__ +#include "fakeclient.cpp" +#else + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient - public methods +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::NewL +// Creates new instance of CNSmlDSHostClient based class. +// ------------------------------------------------------------------------------------------------ +EXPORT_C CNSmlDSHostClient* CNSmlDSHostClient::NewL() + { + CNSmlDSHostClient* self = NewLC(); + CleanupStack::Pop(); + return self; + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::NewLC +// Creates new instance of CNSmlDSHostClient based class. +// ------------------------------------------------------------------------------------------------ +EXPORT_C CNSmlDSHostClient* CNSmlDSHostClient::NewLC() + { + CNSmlDSHostClient* self = new (ELeave) CNSmlDSHostClient(); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::~CNSmlDSHostClient +// C++ Destructor. +// ------------------------------------------------------------------------------------------------ +EXPORT_C CNSmlDSHostClient::~CNSmlDSHostClient() + { + iClient1.Close(); + iClient2.Close(); + iDataProviders1.Close(); + iDataProviders2.Close(); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::CreateDataProvidersL +// Creates Data Providers. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::CreateDataProvidersL( const RArray& aIds, RArray& aResultArray ) + { + RArray tempIdsArray; + CleanupClosePushL( tempIdsArray ); + RArray tempResultArray; + CleanupClosePushL( tempResultArray ); + + // Find Data Providers from Host Server 2 + iClient2.CreateDataProvidersL( aIds, aResultArray ); + if ( aIds.Count() != aResultArray.Count() ) + { + User::Leave( KErrUnknown ); + } + for ( TInt i = 0; i < aIds.Count(); i++ ) + { + if ( aResultArray[ i ] != KErrNone ) + { + tempIdsArray.AppendL( aIds[ i ] ); + } + else + { + // Add succesfully loaded Data Providers to client array + iDataProviders2.AppendL( aIds[ i ] ); + } + } + + // Find Data Providers from Host Server 1 + if ( tempIdsArray.Count() > 0) + { + iClient1.CreateDataProvidersL( tempIdsArray, tempResultArray ); + if ( tempIdsArray.Count() != tempResultArray.Count() ) + { + User::Leave( KErrUnknown ); + } + for ( TInt j = 0; j < tempIdsArray.Count(); j++ ) + { + for ( TInt k = 0; k < aIds.Count(); k++ ) + { + if ( aIds[ k ] == tempIdsArray[ j ] ) + { + aResultArray[ k ] = tempResultArray[ j ]; + } + } + if ( tempResultArray[ j ] == KErrNone ) + { + // Add succesfully loaded Data Providers to client array + iDataProviders1.AppendL( tempIdsArray[ j ] ); + } + } + } + CleanupStack::PopAndDestroy(2); //tempResultArray, tempIdsArray + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::CreateAllDataProvidersL +// Creates all possible Data Providers. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::CreateAllDataProvidersL( RArray& aIds ) + { + // Find Data Providers from Host server 2 + // Find Data Providers from Host server 1 except those Data Providers that were found from + // previous server + RArray tmpArray; + CleanupClosePushL( tmpArray ); + + iClient2.CreateAllDataProvidersL( aIds, tmpArray ); + iDataProviders2.Reset(); + + for ( TInt i = 0; i < aIds.Count(); i++ ) + { + iDataProviders2.AppendL( aIds[ i ] ); + } + + iClient1.CreateAllDataProvidersL( tmpArray, aIds ); + iDataProviders1.Reset(); + + for ( TInt i = 0; i < tmpArray.Count(); i++ ) + { + iDataProviders1.AppendL( tmpArray[i] ); + aIds.AppendL( tmpArray[i] ); + } + + CleanupStack::PopAndDestroy(); //tmpArray + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::DataProviderInformationL +// +// ------------------------------------------------------------------------------------------------ +EXPORT_C TNSmlDPInformation* CNSmlDSHostClient::DataProviderInformationL( const TSmlDataProviderId aId, TInt& aResultCode ) const + { + TNSmlDPInformation* ret = NULL; + + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + ret = iClient1.DataProviderInformationL( aId, aResultCode ); + break; + case ( ENSmlHostServer2 ): + ret = iClient2.DataProviderInformationL( aId, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + return ret; + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::SupportsOperationL +// Asks if Data Provider supports some operation. +// ------------------------------------------------------------------------------------------------ +EXPORT_C TBool CNSmlDSHostClient::SupportsOperationL( TUid aOpId, TSmlDataProviderId aId, TInt& aResultCode ) const + { + TBool ret( EFalse ); + + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + ret = iClient1.SupportsOperationL( aOpId, aId, aResultCode ); + break; + case ( ENSmlHostServer2 ): + ret = iClient2.SupportsOperationL( aOpId, aId, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + return ret; + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::StoreFormatL +// Creates Data Store format of Data Provider. +// ------------------------------------------------------------------------------------------------ +EXPORT_C CNSmlDbCaps* CNSmlDSHostClient::StoreFormatL( const TSmlDataProviderId aId, TInt& aResultCode ) + { + CNSmlDbCaps* ret = NULL; + + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + ret = iClient1.StoreFormatL( aId, aResultCode ); + break; + case ( ENSmlHostServer2 ): + ret = iClient2.StoreFormatL( aId, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + return ret; + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::ListStoresL +// Creates list of Data Store names of Data Provider. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::ListStoresL( CDesCArray* aNameList, const TSmlDataProviderId aId, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.ListStoresL( aNameList, aId, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.ListStoresL( aNameList, aId, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::DefaultStoreL +// Creates default name for Data Store of Data Provider. +// ------------------------------------------------------------------------------------------------ +EXPORT_C HBufC* CNSmlDSHostClient::DefaultStoreL( const TSmlDataProviderId aId, TInt& aResultCode ) + { + HBufC* ret = NULL; + + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + ret = iClient1.DefaultStoreL( aId, aResultCode ); + break; + case ( ENSmlHostServer2 ): + ret = iClient2.DefaultStoreL( aId, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + return ret; + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::SupportedServerFiltersL +// This method returns the set of filters that can be used to send to the Sync Partner. +// ------------------------------------------------------------------------------------------------ +EXPORT_C RPointerArray* CNSmlDSHostClient::SupportedServerFiltersL( const TSmlDataProviderId aId, + TSyncMLFilterMatchType& aMatchType, TSyncMLFilterChangeInfo& aChangeInfo, TInt& aResultCode ) const + { + RPointerArray* result = NULL; + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + result = iClient1.SupportedServerFiltersL( aId, aMatchType, aChangeInfo, aResultCode ); + break; + case ( ENSmlHostServer2 ): + result = iClient2.SupportedServerFiltersL( aId, aMatchType, aChangeInfo, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + + aResultCode = HostErrorConversion( aResultCode ); + + return result; + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::CheckServerFiltersL +// This method updates dynamic filters up-to-date. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::CheckServerFiltersL( const TSmlDataProviderId aId, RPointerArray& aFilters, TSyncMLFilterChangeInfo& aChangeInfo, TInt& aResultCode ) const + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.CheckServerFiltersL( aId, aFilters, aChangeInfo, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.CheckServerFiltersL( aId, aFilters, aChangeInfo, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::CheckSupportedServerFiltersL +// This method returns the set of filters that can be used to send to the Sync Partner. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::CheckSupportedServerFiltersL( const TSmlDataProviderId aId, + const CNSmlDbCaps& aServerDataStoreFormat, const CArrayFix& aFilterInfoArr, + RPointerArray& aFilters, TSyncMLFilterChangeInfo& aChangeInfo, TInt& aResultCode ) const + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.CheckSupportedServerFiltersL( aId, aServerDataStoreFormat, aFilterInfoArr, aFilters, aChangeInfo, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.CheckSupportedServerFiltersL( aId, aServerDataStoreFormat, aFilterInfoArr, aFilters, aChangeInfo, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::GetFilterL +// Get Filters. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::GetFilterL( const TSmlDataProviderId aId, const TDesC& aStoreName, + const RPointerArray& aFilterArray, CNSmlFilter*& aFilter, + TSyncMLFilterMatchType aMatchType, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.GetFilterL( aId, aStoreName, aFilterArray, aFilter, aMatchType, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.GetFilterL( aId, aStoreName, aFilterArray, aFilter, aMatchType, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::OpenL +// Opens the data store specified by aStoreName asynchronously. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::OpenL( const TSmlDataProviderId aId, const TDesC& aStoreName, const TDesC& aServerId, const TDesC& aRemoteDB, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.OpenL( aId, aStoreName, aServerId, aRemoteDB, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.OpenL( aId, aStoreName, aServerId, aRemoteDB, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::CancelRequestL +// Cancel the current asynchronous request. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::CancelRequestL( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.CancelRequest( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.CancelRequest( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::BeginTransactionL +// Starts the transaction mode. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::BeginTransactionL( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.BeginTransaction( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.BeginTransaction( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::CommitTransactionL +// Method will be called at the end of a successful transaction. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::CommitTransactionL( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.CommitTransaction( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.CommitTransaction( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::RevertTransactionL +// Method will be called to abort an ongoing transaction. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::RevertTransactionL( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.RevertTransaction( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.RevertTransaction( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::BeginBatchL +// Starts the batch mode. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::BeginBatchL( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.BeginBatch( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.BeginBatch( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::CommitBatchL +// Method will be called at the end of the batch mode. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::CommitBatchL( RArray& aResultArray, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.CommitBatchL( aResultArray, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.CommitBatchL( aResultArray, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::CancelBatchL +// Method will be called to abort an ongoing batch mode. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::CancelBatchL( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.CancelBatch( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.CancelBatch( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::SetRemoteDataStoreFormatL +// Sets the Sync Partner Data Format. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::SetRemoteDataStoreFormatL( const CNSmlDbCaps& aServerDataStoreFormat, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.SetRemoteDataStoreFormatL( aServerDataStoreFormat, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.SetRemoteDataStoreFormatL( aServerDataStoreFormat, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::SetRemoteMaxObjectSizeL +// Sets the SyncML server Sync Partner maximum object size. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::SetRemoteMaxObjectSizeL( TInt aServerMaxObjectSize, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.SetRemoteMaxObjectSizeL( aServerMaxObjectSize, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.SetRemoteMaxObjectSizeL( aServerMaxObjectSize, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::MaxObjectSizeL +// Gets the Data Store maximum object size which is reported to the SyncML partner. +// ------------------------------------------------------------------------------------------------ +EXPORT_C TInt CNSmlDSHostClient::MaxObjectSizeL( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const + { + TInt ret(0); + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + ret = iClient1.MaxObjectSize( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + ret = iClient2.MaxObjectSize( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + + aResultCode = HostErrorConversion( aResultCode ); + return ret; + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::OpenItemL +// Opens item at Data Store. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::OpenItemL( TSmlDbItemUid aUid, TBool& aFieldChange, TInt& aSize, TSmlDbItemUid& aParent, HBufC8*& aMimeType, HBufC8*& aMimeVer, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.OpenItemL( aUid, aFieldChange, aSize, aParent, aMimeType, aMimeVer, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.OpenItemL( aUid, aFieldChange, aSize, aParent, aMimeType, aMimeVer, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::CreateItemL +// Creates new item to Data Store. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::CreateItemL( TSmlDbItemUid& aUid, TInt aSize, TSmlDbItemUid aParent, const TDesC8& aMimeType, const TDesC8& aMimeVer, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.CreateItemL( aUid, aSize, aParent, aMimeType, aMimeVer, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.CreateItemL( aUid, aSize, aParent, aMimeType, aMimeVer, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::ReplaceItemL +// Replaces old item at Data Store. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::ReplaceItemL( TSmlDbItemUid aUid, TInt aSize, TSmlDbItemUid aParent, TBool aFieldChange, TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.ReplaceItemL( aUid, aSize, aParent, aFieldChange, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.ReplaceItemL( aUid, aSize, aParent, aFieldChange, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::ReadItemL +// 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. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::ReadItemL( TDes8& aBuffer, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.ReadItemL( aBuffer, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.ReadItemL( aBuffer, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::WriteItemL +// 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. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::WriteItemL( const TDesC8& aData, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.WriteItemL( aData, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.WriteItemL( aData, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::CommitItemL +// After item is written to Data Provider it can be saved to the Data Store. +// This method can be called just after WriteItemL method. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::CommitItemL( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.CommitItem( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.CommitItem( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::CloseItemL +// Closes opened item. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::CloseItemL( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.CloseItem( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.CloseItem( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::MoveItemL +// Moves item to new location. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::MoveItemL( TSmlDbItemUid aUid, TSmlDbItemUid aNewParent, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.MoveItemL( aUid, aNewParent, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.MoveItemL( aUid, aNewParent, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::DeleteItemL +// Deletes one item at Data Store permanently. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::DeleteItemL( TSmlDbItemUid aUid, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.DeleteItemL( aUid, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.DeleteItemL( aUid, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::SoftDeleteItemL +// Soft deletes one item at Data Store. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::SoftDeleteItemL( TSmlDbItemUid aUid, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.SoftDeleteItemL( aUid, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.SoftDeleteItemL( aUid, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::DeleteAllItemsL +// Deletes all items at Data Store permanently. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::DeleteAllItemsL( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.DeleteAllItems( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.DeleteAllItems( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::HasSyncHistoryL +// Checks if the Data Store has sync history. If not then slow sync is proposed to Sync Partner. +// ------------------------------------------------------------------------------------------------ +EXPORT_C TBool CNSmlDSHostClient::HasSyncHistoryL( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const + { + TBool ret( EFalse ); + + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + ret = iClient1.HasSyncHistory( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + ret = iClient2.HasSyncHistory( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + return ret; + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::AddedItemsL +// 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. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::AddedItemsL( RNSmlDbItemModificationSet& aUidSet, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.AddedItemsL( aUidSet, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.AddedItemsL( aUidSet, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::DeletedItemsL +// 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). +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::DeletedItemsL( RNSmlDbItemModificationSet& aUidSet, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.DeletedItemsL( aUidSet, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.DeletedItemsL( aUidSet, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::SoftDeleteItemsL +// 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). +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::SoftDeleteItemsL( RNSmlDbItemModificationSet& aUidSet, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.SoftDeleteItemsL( aUidSet, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.SoftDeleteItemsL( aUidSet, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::ModifiedItemsL +// 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. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::ModifiedItemsL( RNSmlDbItemModificationSet& aUidSet, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.ModifiedItemsL( aUidSet, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.ModifiedItemsL( aUidSet, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::MovedItemsL +// 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. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::MovedItemsL( RNSmlDbItemModificationSet& aUidSet, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.MovedItemsL( aUidSet, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.MovedItemsL( aUidSet, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::AllItemsL +// The Data Provider returns UIDs of items that are added, deleted, modified, softdeleted +// or moved after previous synchronization. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::AllItemsL( RNSmlDbItemModificationSet& aUidSet, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.AllItemsL( aUidSet, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.AllItemsL( aUidSet, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::ResetChangeInfoL +// Reset change info from the Data Provider. The result of this method is that the Data Provider +// sends just ADD commands to Sync Partner. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::ResetChangeInfoL( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.ResetChangeInfo( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.ResetChangeInfo( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::CommitChangeInfoL +// 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. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::CommitChangeInfoL( const MSmlDataItemUidSet& aItems, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.CommitChangeInfoL( aItems, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.CommitChangeInfoL( aItems, aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::CommitChangeInfoL +// This method is called after some changes are synchronized to Sync Partner. This method is used if +// all changes were synchronized correctly. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::CommitChangeInfoL( const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) + { + switch( SessionForDataProvider( aId ) ) + { + case ( ENSmlHostServer1 ): + iClient1.CommitChangeInfo( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServer2 ): + iClient2.CommitChangeInfo( aId, aStoreName, aResultCode ); + break; + case ( ENSmlHostServerEnd ): + default: + User::Leave( KErrNotFound ); + } + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::UpdateServerIdL +// Replaces the give old server ID with new one. +// ------------------------------------------------------------------------------------------------ +EXPORT_C void CNSmlDSHostClient::UpdateServerIdL( TDesC& aOldServerId, TDesC& aNewValue, TInt& aResultCode ) + { + iClient1.UpdateServerIdL( aOldServerId, aNewValue, aResultCode ); + iClient2.UpdateServerIdL( aOldServerId, aNewValue, aResultCode ); + aResultCode = HostErrorConversion( aResultCode ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient - private methods +// ------------------------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::CNSmlDSHostClient +// C++ constructor. +// ------------------------------------------------------------------------------------------------ +CNSmlDSHostClient::CNSmlDSHostClient() + { + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::ConstrucL +// ConstrucL +// ------------------------------------------------------------------------------------------------ +void CNSmlDSHostClient::ConstructL() + { + TVersion DSHostServerVersion( KNSmlDSHostServerVersionMajor, + KNSmlDSHostServerVersionMinor, KNSmlDSHostServerVersionBuild ); + + User::LeaveIfError( iClient1.Connect( KNSmlDSHostServer1Name, DSHostServerVersion ) ); + User::LeaveIfError( iClient2.Connect( KNSmlDSHostServer2Name, DSHostServerVersion ) ); + User::LeaveIfError( iClient1.CreateChunk() ); + User::LeaveIfError( iClient1.SendChunkHandle() ); + User::LeaveIfError( iClient2.CreateChunk() ); + User::LeaveIfError( iClient2.SendChunkHandle() ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::SessionForDataProvider +// Return session to correct server that has current Data Provider. +// ------------------------------------------------------------------------------------------------ +TInt CNSmlDSHostClient::SessionForDataProvider( const TSmlDataProviderId aId ) const + { + for ( TInt i = 0; i < iDataProviders1.Count(); i++ ) + { + if ( iDataProviders1[i] == aId ) + { + return ENSmlHostServer1; + } + } + for ( TInt i = 0; i < iDataProviders2.Count(); i++ ) + { + if ( iDataProviders2[i] == aId ) + { + return ENSmlHostServer2; + } + } + return ENSmlHostServerEnd; + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDSHostClient::HostErrorConversion +// ------------------------------------------------------------------------------------------------ +TInt CNSmlDSHostClient::HostErrorConversion( TInt aStatusFromHost ) + { + TInt ret ( aStatusFromHost ); + + // in module tests no conversion. +#ifndef __HOST_SERVER_MTEST__ + switch( aStatusFromHost ) + { + case ENSmlDSHostServerErrNone: + ret = KErrNone; + break; + case ENSmlDSHostServerErrDPNotCreated: + ret = KErrNotFound; + break; + case ENSmlDSHostServerErrDSNotOpened: + ret = KErrNotFound; + break; + case ENSmlDSHostServerErrAsynchCallOutstanding: + ret = KErrServerBusy; + break; + default: + ret = aStatusFromHost; + } +#endif + return ret; + } + +#endif // __USE_FAKE_CLIENT__ + +// End of File