syncmlfw/ds/hostserver/dshostclient/src/nsmldshostclient.cpp
changeset 0 b497e44ab2fc
--- /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 <s32mem.h>
+#include <SmlDataProvider.h>
+
+#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<TSmlDataProviderId>& aIds, RArray<TInt>& aResultArray )
+	{
+	RArray<TSmlDataProviderId> tempIdsArray;
+	CleanupClosePushL( tempIdsArray );
+	RArray<TInt> 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<TSmlDataProviderId>& 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<TSmlDataProviderId> 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<CSyncMLFilter>* CNSmlDSHostClient::SupportedServerFiltersL( const TSmlDataProviderId aId, 
+	TSyncMLFilterMatchType& aMatchType, TSyncMLFilterChangeInfo& aChangeInfo, TInt& aResultCode ) const
+	{
+	RPointerArray<CSyncMLFilter>* 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<CSyncMLFilter>& 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<TNSmlFilterCapData>& aFilterInfoArr, 
+	RPointerArray<CSyncMLFilter>& 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<CSyncMLFilter>& 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<TInt>& 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