syncmlfw/ds/hostserver/dshostserverbase/src/Nsmldshostsession.cpp
changeset 0 b497e44ab2fc
child 12 9e9792ae22e3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/ds/hostserver/dshostserverbase/src/Nsmldshostsession.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,1894 @@
+/*
+* 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:  Session for DS host server.
+*
+*/
+
+
+// ------------------------------------------------------------------------------------------------
+// Includes
+// ------------------------------------------------------------------------------------------------
+
+#include <s32mem.h>
+#include <implementationinformation.h>
+#include <ecom.h>
+#include <badesca.h>
+#include <nsmldebug.h>
+#include <SmlDataFormat.h>
+
+#include "NSmlAdapterLog.h"
+#include "nsmldshostconstants.h"
+#include "Nsmldshostserver.h"
+#include "Nsmldshostsession.h"
+#include "nsmldsdpinformation.h"
+#include "Nsmldsdataproviderarray.h"
+
+#ifdef __HOST_SERVER_MTEST__
+#include "../../stif/DSHostServerTest/src/fakedataprovider.cpp"
+#else
+#include <nsmlchangefinder.h>	//for CNSmlDataItemUidSet
+#endif
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::TMemPtr::WriteStreamLC
+// ------------------------------------------------------------------------------------------------
+RWriteStream& CNSmlDSHostSession::TMemPtr::WriteStreamLC() const
+    {
+    RMemWriteStream* writeStream = new ( ELeave ) RMemWriteStream( Ptr(), Size() );
+    CleanupStack::PushL( TCleanupItem ( CleanupWriteStream, writeStream ) );
+    return *writeStream;
+    }
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::TMemPtr::StreamBufferLC
+// ------------------------------------------------------------------------------------------------   
+CNSmlDSHostSession::TMemPtr::TStreamBuffers* 
+	CNSmlDSHostSession::TMemPtr::StreamBufferLC() const
+	{
+	TStreamBuffers* cleanup = new ( ELeave ) TStreamBuffers;
+	CleanupStack::PushL( TCleanupItem ( CleanupStreamBuffer, cleanup ) );
+	cleanup->iBuffer = CBufFlat::NewL( 64 );
+	cleanup->iWrite = new ( ELeave ) RBufWriteStream( *cleanup->iBuffer );
+	cleanup->iRead = new ( ELeave ) RBufReadStream( *cleanup->iBuffer );
+	return cleanup;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::TMemPtr::ReadStreamLC
+// ------------------------------------------------------------------------------------------------
+RReadStream& CNSmlDSHostSession::TMemPtr::ReadStreamLC() const
+    {
+    RMemReadStream* readStream = new ( ELeave ) RMemReadStream( Ptr(), iChunk.Size() );
+    CleanupStack::PushL( TCleanupItem ( CleanupReadStream, readStream ) );
+    return *readStream;
+    }
+    
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::TMemPtr::AdjustChunkIfNeededL
+// ------------------------------------------------------------------------------------------------    
+void CNSmlDSHostSession::TMemPtr::AdjustChunkIfNeededL( TInt iNeededSize )
+	{
+	if ( Size() < iNeededSize )
+		{
+		User::LeaveIfError( Adjust(iNeededSize) );
+		}
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::TMemPtr::CleanupWriteStream
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSHostSession::TMemPtr::CleanupWriteStream( TAny* aP )
+	{
+	RMemWriteStream* writeStream = reinterpret_cast<RMemWriteStream*>( aP );
+	writeStream->Close();
+	delete writeStream;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::TMemPtr::CleanupReadStream
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSHostSession::TMemPtr::CleanupReadStream( TAny* aP )
+	{
+	RMemReadStream* readStream = reinterpret_cast<RMemReadStream*>( aP );
+	readStream->Close();
+	delete readStream;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::TMemPtr::CleanupStreamBuffer
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSHostSession::TMemPtr::CleanupStreamBuffer( TAny* aP )
+	{
+	TStreamBuffers* cleanup = reinterpret_cast<TStreamBuffers*>( aP );
+	
+	if ( cleanup->iWrite )
+		{
+		cleanup->iWrite->Close();
+		delete cleanup->iWrite;
+		}
+		
+	if ( cleanup->iRead )
+		{
+		cleanup->iRead->Close();
+		delete cleanup->iRead;
+		}
+	
+	delete cleanup->iBuffer;
+	delete cleanup;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::TMemPtr::CancelAdjust
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::TMemPtr::CancelAdjust( TAny* aP )
+	{
+	if ( aP )
+		{
+		TMemPtr* memptr = reinterpret_cast<TMemPtr*>( aP );
+		memptr->Adjust( KNSmlDSHostChunkMinSize );
+		}
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::CNSmlServerDSHostItem::NewLC
+// ------------------------------------------------------------------------------------------------
+CNSmlDSHostSession::CNSmlServerDSHostItem* CNSmlDSHostSession::CNSmlServerDSHostItem::NewLC()
+	{
+	CNSmlServerDSHostItem* self = new ( ELeave ) CNSmlServerDSHostItem();
+	CleanupStack::PushL( self );
+	self->ConstructL();
+	return self;
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::NewL
+// ------------------------------------------------------------------------------------------------
+CNSmlDSHostSession* CNSmlDSHostSession::NewL( CNSmlDSHostServer& aServer )
+	{
+	_DBG_FILE( "CNSmlDSHostSession::NewL(): begin" );
+	CNSmlDSHostSession* self= new ( ELeave ) CNSmlDSHostSession( aServer );
+	CleanupStack::PushL( self );
+	self->ConstructL();
+	CleanupStack::Pop(); // self
+	_DBG_FILE( "CNSmlDSHostSession::NewL(): end" );
+	return self;
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::~CNSmlDSHostSession
+// ------------------------------------------------------------------------------------------------
+CNSmlDSHostSession::~CNSmlDSHostSession()
+	{
+	_DBG_FILE( "CNSmlDSHostSession::~CNSmlDSHostSession(): begin" );
+    iMemPtr.iChunk.Close();
+    iDataProviders.ResetAndDestroy();
+    iStringPool.Close();
+    REComSession::FinalClose();
+    iServer.DecSessionCount();
+	_DBG_FILE( "CNSmlDSHostSession::~CNSmlDSHostSession(): end" );
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::ServiceL
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSHostSession::ServiceL( const RMessage2& aMessage )
+	{
+	_DBG_FILE( "CNSmlDSHostSession::ServiceL(): begin" );
+    TBool completeRequest( ETrue );
+	TRAPD( err, DispatchMessageL( aMessage, completeRequest ) );
+
+    if ( completeRequest && !aMessage.IsNull() )
+        {
+        aMessage.Complete( err );
+        }
+	DBG_FILE_CODE( err, _S8( "CNSmlDSHostSession::ServiceL() returned" ) );
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::DispatchMessageL
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSHostSession::DispatchMessageL( const RMessage2& aMessage, TBool& aCompleteRequest )
+	{
+	_DBG_FILE( "CNSmlDSHostSession::DispatchMessageL(): begin" );
+    aCompleteRequest = ETrue;
+
+	switch( aMessage.Function() )
+        {
+	    case ENSmlDPOpen:
+	    	_DBG_FILE("CreateDataProvidersL"); 
+	        CreateDataProvidersL( aMessage );
+	        break;
+	    case ENSmlDPOpenExcept:
+	        _DBG_FILE("CreateDataProvidersExceptL"); 
+	        CreateDataProvidersExceptL( aMessage );
+	        break;
+	    case ENSmlDPInformation:
+	    	_DBG_FILE("DPInformation"); 
+	    	DPInformationL( aMessage );
+	    	break;
+		case ENSmlHandleChunk:
+			_DBG_FILE("HandleChunk"); 
+			HandleChunk( aMessage );
+	        break;
+		case ENSmlDPSupportsOperation:
+			_DBG_FILE("SupportsOperationL"); 
+	        SupportsOperationL( aMessage );
+	        break;
+		case ENSmlDPStoreFormat:
+			_DBG_FILE("StoreFormatL"); 
+	        StoreFormatL( aMessage );
+	        break;
+		case ENSmlDPlListStores:
+	        _DBG_FILE("ListStoresL"); 
+	        ListStoresL( aMessage );
+	        break;
+		case ENSmlDPDefaultStore:
+	        _DBG_FILE("DefaultStoreL"); 
+	        DefaultStoreL( aMessage );
+	        break;
+	    case ENSmlServerFilters:
+	    	_DBG_FILE("SupportedServerFiltersL"); 
+	        SupportedServerFiltersL( aMessage );
+	        break;
+        case ENSmlUpdateServerFilters:
+        	_DBG_FILE("CheckServerFiltersL");
+        	CheckServerFiltersL( aMessage );
+        	break;
+        case ENSmlCheckSupportedServerFilters:
+        	_DBG_FILE("CheckSupportedServerFiltersL");
+        	CheckSupportedServerFiltersL( aMessage );
+        	break;
+        case ENSmlFilters:
+        	_DBG_FILE("GetFiltersL");
+        	GetFiltersL( aMessage );
+        	break;
+		case ENSmlDSOpen:
+	        _DBG_FILE("OpenL"); 
+	        OpenL( aMessage ); aCompleteRequest = EFalse;
+	        break;
+		case ENSmlDSCancelRequest:
+	        _DBG_FILE("CancelRequestL"); 
+	        CancelRequestL( aMessage );
+	        break;
+		case ENSmlDSBeginTransaction:
+	        _DBG_FILE("BeginTransactionL"); 
+	        BeginTransactionL( aMessage );
+	        break;
+		case ENSmlDSCommitTransaction:
+	        _DBG_FILE("CommitTransactionL"); 
+	        CommitTransactionL( aMessage ); aCompleteRequest = EFalse;
+	        break;
+		case ENSmlDSRevertTransaction:
+	        _DBG_FILE("RevertTransactionL"); 
+	        RevertTransactionL( aMessage ); aCompleteRequest = EFalse;
+	        break;
+		case ENSmlDSBeginBatch:
+	        _DBG_FILE("BeginBatchL"); 
+	        BeginBatchL( aMessage );
+	        break;
+		case ENSmlDSCommitBatch:
+	        _DBG_FILE("CommitBatchL"); 
+	        CommitBatchL( aMessage ); aCompleteRequest = EFalse;
+	        break;
+		case ENSmlDSCancelBatch:
+	        _DBG_FILE("CancelBatchL"); 
+	        CancelBatchL( aMessage );
+	        break;
+		case ENSmlDSSetDataStoreFormat:
+	        _DBG_FILE("SetRemoteDataStoreFormatL"); 
+	        SetRemoteDataStoreFormatL( aMessage );
+	        break;
+		case ENSmlDSRemoteMaxObjSize:
+	        _DBG_FILE("SetRemoteMaxObjectSizeL"); 
+	        SetRemoteMaxObjectSizeL( aMessage );
+	        break;
+		case ENSmlMaxObjSize:
+	        _DBG_FILE("MaxObjectSizeL"); 
+	        MaxObjectSizeL( aMessage );
+	        break;
+		case ENSmlItemOpen:
+	        _DBG_FILE("OpenItemL"); 
+	        OpenItemL( aMessage ); aCompleteRequest = EFalse;
+	        break;
+		case ENSmlItemCreate:
+	        _DBG_FILE("CreateItemL"); 
+	        CreateItemL( aMessage ); aCompleteRequest = EFalse;
+	        break;
+		case ENSmlItemReplace:
+	        _DBG_FILE("ReplaceItemL"); 
+	        ReplaceItemL( aMessage ); aCompleteRequest = EFalse;
+	        break;
+		case ENSmlItemRead:
+	        _DBG_FILE("ReadItemL"); 
+	        ReadItemL( aMessage );
+	        break;
+		case ENSmlItemWrite:
+	        _DBG_FILE("WriteItemL"); 
+	        WriteItemL( aMessage );
+	        break;
+		case ENSmlItemCommit:
+	        _DBG_FILE("CommitItemL"); 
+	        CommitItemL( aMessage ); aCompleteRequest = EFalse;
+	        break;
+		case ENSmlItemClose:
+	        _DBG_FILE("CloseItemL"); 
+	        CloseItemL( aMessage );
+	        break;
+		case ENSmlItemMove:
+	        _DBG_FILE("MoveItemL"); 
+	        MoveItemL( aMessage ); aCompleteRequest = EFalse;
+	        break;
+		case ENSmlItemDelete:
+	        _DBG_FILE("DeleteItemL"); 
+	        DeleteItemL( aMessage ); aCompleteRequest = EFalse;
+	        break;
+		case ENSmlItemSoftDelete:
+	        _DBG_FILE("SoftDeleteItemL"); 
+	        SoftDeleteItemL( aMessage ); aCompleteRequest = EFalse;
+	        break;
+		case ENSmlItemDeleteAll:
+	        _DBG_FILE("DeleteAllItemsL"); 
+	        DeleteAllItemsL( aMessage ); aCompleteRequest = EFalse;
+	        break;
+		case ENSmlDSSyncHistory:
+	        _DBG_FILE("HasSyncHistoryL"); 
+	        HasSyncHistoryL( aMessage );
+	        break;
+		case ENSmlDSItemsAdded:
+	        _DBG_FILE("AddedItemsL"); 
+	        AddedItemsL( aMessage );
+	        break;
+		case ENSmlDSItemsDeleted:
+	        _DBG_FILE("DeletedItemsL"); 
+	        DeletedItemsL( aMessage );
+	        break;
+		case ENSmlDSItemsSofDeleted:
+	        _DBG_FILE("SoftDeleteItemsL"); 
+	        SoftDeleteItemsL( aMessage );
+	        break;
+		case ENSmlDSItemsModified:
+	        _DBG_FILE("ModifiedItemsL"); 
+	        ModifiedItemsL( aMessage );
+	        break;
+		case ENSmlDSItemsMoved:
+	        _DBG_FILE("MovedItemsL"); 
+	        MovedItemsL( aMessage );
+	        break;
+	    case ENSmlDSItemsAll:
+	    	_DBG_FILE("AllItems"); 
+	    	AllItemsL( aMessage ); aCompleteRequest = EFalse;
+	    	break;
+		case ENSmlDSResetChangeInfo:
+	        _DBG_FILE("ResetChangeInfoL"); 
+	        ResetChangeInfoL( aMessage ); aCompleteRequest = EFalse;
+	        break;
+		case ENSmlDSCommitChanges:
+	        _DBG_FILE("CommitChangesL"); 
+	        CommitChangesL( aMessage ); aCompleteRequest = EFalse;
+	        break;
+		case ENSmlDSCommitAllChanges:
+	        _DBG_FILE("CommitAllChangesL"); 
+	        CommitAllChangesL( aMessage ); aCompleteRequest = EFalse;
+	        break;
+        case ENSmlDSUpdateServerId:
+        	_DBG_FILE("Update server id"); 
+        	UpdateServerIdL( aMessage );
+        	break;
+		default:
+			_DBG_FILE("Unknown function"); 
+			PanicClient( aMessage, KErrNotSupported );
+        }
+	_DBG_FILE( "CNSmlDSHostSession::DispatchMessageL(): end" );
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::CNSmlDSHostSession
+// ------------------------------------------------------------------------------------------------
+CNSmlDSHostSession::CNSmlDSHostSession( CNSmlDSHostServer& aServer ) : 
+    iServer( aServer )
+	{
+	_DBG_FILE( "CNSmlDSHostSession::CNSmlDSHostSession(): begin" );
+	iServer.IncSessionCount();
+	_DBG_FILE( "CNSmlDSHostSession::CNSmlDSHostSession(): end" );
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::ConstructL
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSHostSession::ConstructL()
+	{
+	_DBG_FILE( "CNSmlDSHostSession::ConstructL(): begin" );
+    iStringPool.OpenL();
+	_DBG_FILE( "CNSmlDSHostSession::ConstructL(): end" );
+	}
+	
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::HandleChunk
+// 
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSHostSession::HandleChunk( const RMessage2& aMessage )
+	{
+	iMemPtr.iChunk.Close();
+	const TInt error = iMemPtr.iChunk.Open(aMessage, 0, EFalse);
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::CreateDataProvidersL
+// Creates Data Providers.
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSHostSession::CreateDataProvidersL( const RMessage2& /*aMessage*/ )
+	{
+	
+	RArray<TInt> results;
+    CleanupClosePushL( results );
+    
+    TMemPtr& ptr( MemPtrL() );
+    RReadStream& readStream = ptr.ReadStreamLC();
+    const TUint uidCount ( readStream.ReadInt32L() ) ;
+
+    for( TUint i = 0; i < uidCount; i++ )
+        {
+        TSmlDataProviderId id;
+        TPckg<TSmlDataProviderId> dpid( id );
+        readStream.ReadL( dpid );
+        TRAPD( err, CreateDataProviderL( dpid() ) );
+        results.AppendL( err );
+        }
+    CleanupStack::PopAndDestroy(); //readStream
+
+    //to chunk
+    ptr.AdjustChunkIfNeededL( sizeof( TInt32 ) * ( results.Count() + 1 ) );
+    RWriteStream& writeStream = ptr.WriteStreamLC();
+    writeStream.WriteInt32L( results.Count() );
+
+    for( TInt j = 0; j < results.Count(); j++ )
+        {
+        writeStream.WriteInt32L( results[j] );
+        }
+    writeStream.CommitL();
+    CleanupStack::PopAndDestroy(2); //writeStream, results
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::CreateDataProvidersExceptL
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSHostSession::CreateDataProvidersExceptL( const RMessage2& /*aMessage*/ )
+    {
+    iDataProviders.ResetAndDestroy();
+    
+    RArray<TSmlDataProviderId> results;
+    CleanupClosePushL( results );
+
+    TMemPtr& ptr( MemPtrL() );
+    RReadStream& readStream = ptr.ReadStreamLC();
+    
+    //copying except uids to array.
+    const TInt exceptIdCount ( readStream.ReadInt32L() );
+    	
+    RArray<TSmlDataProviderId> exceptIds( Max<TInt>( 2, exceptIdCount ) );
+    CleanupClosePushL( exceptIds );
+    
+    for ( TInt i = 0; i < exceptIdCount; i++ )
+    	{
+    	TSmlDataProviderId id;
+    	TPckg<TSmlDataProviderId> dpid( id );
+        readStream.ReadL( dpid );
+        exceptIds.AppendL( dpid() );
+    	}
+
+	TUid DsUid = { KNSmlDSInterfaceUid };
+	RImplInfoPtrArray implArray;
+    CleanupStack::PushL( PtrArrCleanupItemRArr( 
+			CImplementationInformation, &implArray ) );
+	REComSession::ListImplementationsL( DsUid, implArray );
+	
+    for( TInt i = 0; i < implArray.Count(); i++ )
+        {
+        CImplementationInformation* implInfo = implArray[i];
+        TSmlDataProviderId uid = implInfo->ImplementationUid().iUid;
+
+        if ( exceptIds.Find( uid ) == KErrNotFound )
+            {
+            TRAPD( err, CreateDataProviderL( uid ) );
+            if ( err == KErrNone )
+                {
+                results.AppendL( uid );
+                }
+            }
+        }
+        
+    CleanupStack::PopAndDestroy(3); //implArray, exceptIds, readStream
+
+    //to chunk
+    TStreamBuffers* sb = ptr.StreamBufferLC();
+    sb->iWrite->WriteInt32L( results.Count() );
+
+    for( TInt j = 0; j < results.Count(); j++ )
+        {
+        TPckgC<TSmlDataProviderId> dpid( results[j] );
+        sb->iWrite->WriteL( dpid );
+        }
+    StreamBufferToChunkL( ptr, sb );
+	
+    CleanupStack::PopAndDestroy(2); //sb, results
+    }
+    
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::CreateDataProviderL
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSHostSession::CreateDataProviderL( TSmlDataProviderId aId )
+    {
+    CSmlDataProvider* dp = CSmlDataProvider::NewL( aId );
+    CleanupStack::PushL( dp );
+    TInt ret = iDataProviders.InsertL( dp );
+    if ( ret == KErrNone )
+        {
+        CleanupStack::Pop( dp );    
+        }
+    else
+        {
+        CleanupStack::PopAndDestroy( dp );
+        }
+    }
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::DPInformationL
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSHostSession::DPInformationL( const RMessage2& aMessage )
+	{
+	TSmlDataProviderId id( aMessage.Int0() );
+	CSmlDataProvider* dp = DataProviderL( id );
+	CNSmlDPInformation* dpi = CNSmlDPInformation::NewLC();
+	TMemPtr& ptr( MemPtrL() );
+	
+	const CSmlDataStoreFormat& storeFormat = dp->StoreFormatL();
+	dpi->SetId( id );
+	
+	CDesC8Array* mimetypes = new ( ELeave ) CDesC8ArrayFlat( storeFormat.MimeFormatCount() );
+	CleanupStack::PushL( mimetypes );
+	CDesC8Array* mimevers = new ( ELeave ) CDesC8ArrayFlat( storeFormat.MimeFormatCount() );
+	CleanupStack::PushL( mimevers );
+	
+	for ( TInt i = 0; i < storeFormat.MimeFormatCount(); i++ )
+		{
+		const CSmlMimeFormat& mf = storeFormat.MimeFormat(i);
+		mimetypes->AppendL( mf.MimeType().DesC() );
+		mimevers->AppendL( mf.MimeVersion().DesC() );
+		}
+	
+	dpi->SetMimeTypesL( mimetypes );
+	dpi->SetMimeVersL( mimevers );
+	
+	CleanupStack::Pop( 2 ); //mimetypes, mimevers
+	
+	if ( storeFormat.IsSupported( CSmlDataStoreFormat::EOptionHierarchial ) )
+		{
+		dpi->SetProtocolVersion( ESmlVersion1_2 );
+		}
+	else
+		{
+		dpi->SetProtocolVersion( ESmlVersion1_1_2 );
+		}
+	
+	TUid DsUid = { KNSmlDSInterfaceUid };
+	RImplInfoPtrArray implArray;
+    CleanupStack::PushL( PtrArrCleanupItemRArr( 
+			CImplementationInformation, &implArray ) );
+	REComSession::ListImplementationsL( DsUid, implArray );
+	
+    for( TInt i = 0; i < implArray.Count(); i++ )
+        {
+        CImplementationInformation* implInfo = implArray[i];
+        if ( id == implInfo->ImplementationUid().iUid )
+        	{
+        	TVersion version( implInfo->Version(), 0, 0 );
+        	dpi->SetVersion( version );
+        	dpi->SetDisplayNameL( implInfo->DisplayName() );
+        	}
+        }
+        
+    CleanupStack::PopAndDestroy(); //implArray
+    TStreamBuffers* sb = ptr.StreamBufferLC();
+    dpi->ExternalizeL( *sb->iWrite );
+    StreamBufferToChunkL( ptr, sb );
+	CleanupStack::PopAndDestroy( 2 ); //sb, dpi
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::SupportsOperationL
+// Asks if Data Provider supports some operation.
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSHostSession::SupportsOperationL( const RMessage2& aMessage )
+	{
+    CSmlDataProvider* dp = DataProviderL( aMessage.Int0() );
+    TMemPtr& ptr( MemPtrL() );
+    TInt32 tmp(0);
+    TPckg<TInt32> uidpck( tmp );
+    ptr.CopyTo( uidpck );
+    TUid uid( TUid::Uid( uidpck() ) );
+    TBool retVal( dp->SupportsOperation( uid ) );
+    TPckgC<TBool> respck( retVal );
+    aMessage.WriteL( 2, respck );
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::StoreFormatL
+// Creates Data Store format of Data Provider.
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSHostSession::StoreFormatL( const RMessage2& aMessage )
+	{
+    CSmlDataProvider* dp = DataProviderL( aMessage.Int0() );
+    TMemPtr& destPtr( MemPtrL() );
+    
+    TStreamBuffers* sb = destPtr.StreamBufferLC();
+    const CSmlDataStoreFormat& dsf = dp->StoreFormatL();
+    dsf.ExternalizeL( *sb->iWrite );
+    StreamBufferToChunkL( destPtr, sb );
+    
+    CleanupStack::PopAndDestroy(); //sb
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::ListStoresL
+// Creates list of Data Store names of Data Provider.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::ListStoresL( const RMessage2& aMessage )
+	{
+    CSmlDataProvider* dp = DataProviderL( aMessage.Int0() );
+    CDesCArray* stores = dp->ListStoresLC();
+
+    TMemPtr& destPtr( MemPtrL() );
+    TInt size( sizeof( TInt32 ) );
+    
+    if ( stores )
+    	{
+	    for ( TInt i = 0; i < stores->Count(); i++ )
+	        {
+	        size += ( *stores )[i].Size() + sizeof( TInt32 );
+	        }
+    	}
+    	
+    destPtr.AdjustChunkIfNeededL( size );
+	RWriteStream& wStream = destPtr.WriteStreamLC();
+	
+	if ( stores )
+		{
+		wStream.WriteInt32L( stores->Count() );
+	    for ( TInt i = 0; i < stores->Count(); i++ )
+	        {
+	        wStream.WriteInt32L( ( *stores )[i].Length() );
+	        wStream << ( *stores )[i];
+	        }
+    	}
+    else
+    	{
+    	wStream.WriteInt32L( 0 );
+    	}
+
+	wStream.CommitL();
+    CleanupStack::PopAndDestroy(2); //wStream, stores
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::DefaultStoreL
+// Creates default name for Data Store of Data Provider.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::DefaultStoreL( const RMessage2& aMessage )
+	{
+    CSmlDataProvider* dp = DataProviderL( aMessage.Int0() );
+    const TDesC& defStore = dp->DefaultStoreL();
+    TMemPtr& dest( MemPtrL() );
+    dest.AdjustChunkIfNeededL( defStore.Size() + sizeof( TInt32 ) + 2 );
+    RWriteStream& wStream = dest.WriteStreamLC();
+    wStream.WriteInt32L( defStore.Length() );
+    wStream << defStore;
+    wStream.CommitL();
+    CleanupStack::PopAndDestroy(); //wStream
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::SupportedServerFiltersL
+// This method returns the set of filters that can be used to send to the Sync Partner.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::SupportedServerFiltersL( const RMessage2& aMessage )
+	{
+    CSmlDataProvider* dp = DataProviderL( aMessage.Int0() );
+    
+    TBool suppOp( dp->SupportsOperation( KUidSmlSupportsUserSelectableMatchType ) );
+    TSyncMLFilterMatchType matchType( ESyncMLMatchDisabled );
+    if ( suppOp )
+    	{
+    	matchType = ESyncMLMatchNotSelected;
+    	}
+    	
+    TPckgC<TSyncMLFilterMatchType> matchTypePckg( matchType );
+    aMessage.WriteL( 2, matchTypePckg );
+    
+    const RPointerArray<CSyncMLFilter>& filters = dp->SupportedServerFiltersL();
+    
+    TMemPtr& dest( MemPtrL() );
+    TStreamBuffers* sb = dest.StreamBufferLC();
+    ExternalizeFiltersL( *sb->iWrite, filters );
+    StreamBufferToChunkL( dest, sb );
+    
+    CleanupStack::PopAndDestroy(); //sb
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::CheckServerFiltersL
+// This method updates dynamic filters up-to-date
+// ------------------------------------------------------------------------------------------------		
+void CNSmlDSHostSession::CheckServerFiltersL( const RMessage2& aMessage )
+	{
+	CSmlDataProvider* dp = DataProviderL( aMessage.Int0() );
+	
+	RPointerArray<CSyncMLFilter> *filters = new ( ELeave ) RPointerArray<CSyncMLFilter>();
+	CleanupRPtrArrayPushL( filters );
+	
+	TMemPtr& memptr( MemPtrL() );
+    RReadStream& rStream = memptr.ReadStreamLC();
+    TSyncMLFilterChangeInfo changeInfo( static_cast<TSyncMLFilterChangeInfo>( rStream.ReadInt32L() ) );
+    
+    InternalizeFiltersL( rStream, *filters );
+    CleanupStack::PopAndDestroy(); //rStream
+    
+    dp->CheckServerFiltersL( *filters, changeInfo );
+    
+    TStreamBuffers* sb = memptr.StreamBufferLC();
+    sb->iWrite->WriteInt32L( changeInfo );
+    ExternalizeFiltersL( *sb->iWrite, *filters );
+    StreamBufferToChunkL( memptr, sb );
+
+    CleanupStack::PopAndDestroy(2); //sb, filters
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::CheckSupportedServerFiltersL
+// Calls CSmlDataProvider::CheckSupportedServerFiltersL.
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSHostSession::CheckSupportedServerFiltersL( const RMessage2& aMessage )
+	{
+	CSmlDataProvider* dp = DataProviderL( aMessage.Int0() );
+	
+	RPointerArray<CSyncMLFilter> *filters = new ( ELeave ) RPointerArray<CSyncMLFilter>();
+	CleanupRPtrArrayPushL( filters );
+	
+	TMemPtr& memptr( MemPtrL() );
+    RReadStream& rStream = memptr.ReadStreamLC();
+    TSyncMLFilterChangeInfo changeInfo( static_cast<TSyncMLFilterChangeInfo>( rStream.ReadInt32L() ) );
+    CSmlDataStoreFormat* dataStoreFormat = CSmlDataStoreFormat::NewLC( iStringPool, rStream );
+    InternalizeFiltersL( rStream, *filters );
+    
+    dp->CheckSupportedServerFiltersL(*dataStoreFormat, *filters, changeInfo );    
+    CleanupStack::PopAndDestroy(2); //rStream, dataStoreFormat
+    
+    TStreamBuffers* sb = memptr.StreamBufferLC();
+    sb->iWrite->WriteInt32L( changeInfo );
+    ExternalizeFiltersL( *sb->iWrite, *filters );
+    StreamBufferToChunkL( memptr, sb );
+
+    CleanupStack::PopAndDestroy(2); //sb, filters
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::GetFiltersL
+// This method updates dynamic filters up-to-date
+// ------------------------------------------------------------------------------------------------		
+void CNSmlDSHostSession::GetFiltersL( const RMessage2& aMessage )
+	{
+	CSmlDataProvider* dp = DataProviderL( aMessage.Int0() );
+	
+	HBufC* storename = DataStoreNameLC( aMessage );
+	
+	RPointerArray<CSyncMLFilter>* filters = new ( ELeave ) RPointerArray<CSyncMLFilter>();
+	CleanupRPtrArrayPushL( filters );
+	
+	TMemPtr& memptr( MemPtrL() );
+    RReadStream& rStream ( memptr.ReadStreamLC() );
+    TSyncMLFilterMatchType matchType ( static_cast<TSyncMLFilterMatchType>( rStream.ReadInt32L() ) );
+    InternalizeFiltersL( rStream, *filters );
+    
+    TBuf<64> recordMimeType;
+    
+    TSyncMLFilterType filterType( ESyncMLTypeInclusive );
+    HBufC* query = dp->GenerateRecordFilterQueryLC( *filters, matchType, recordMimeType, filterType, *storename );
+    
+    RPointerArray<CSmlDataProperty> properties;
+    CleanupStack::PushL( PtrArrCleanupItemRArr( 
+			CSmlDataProperty, &properties ) );
+			
+	TBuf<64> fieldMimeType;
+    
+    dp->GenerateFieldFilterQueryL( *filters, fieldMimeType, properties, *storename );
+    
+    TStreamBuffers* sb = memptr.StreamBufferLC();
+    sb->iWrite->WriteInt32L( filterType );
+    if ( query )
+    	{
+    	sb->iWrite->WriteInt32L( query->Length() );
+    	(*sb->iWrite) << *query;
+    	}
+    else
+    	{
+    	sb->iWrite->WriteInt32L( 0 );
+    	(*sb->iWrite) << KNullDesC;
+    	}
+    
+    sb->iWrite->WriteInt32L( recordMimeType.Length() );
+    (*sb->iWrite) << recordMimeType;
+    sb->iWrite->WriteInt32L( fieldMimeType.Length() );
+    (*sb->iWrite) << fieldMimeType;
+    
+    sb->iWrite->WriteInt32L( properties.Count() );
+    for ( TInt i = 0; i < properties.Count(); i++ )
+    	{
+    	properties[i]->ExternalizeL( *sb->iWrite );
+    	}
+
+	StreamBufferToChunkL( memptr, sb );
+    
+    CleanupStack::PopAndDestroy(6); //sb, properties, query, rStream, filters, storename
+	
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::OpenL
+// Opens the data store specified by aStoreName.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::OpenL( const RMessage2& aMessage )
+    {
+    if ( HasDataStoreL( aMessage ) )
+    	{
+    	User::Leave( KErrAlreadyExists );
+    	}
+    
+    CNSmlDSAsyncCallBackForOpen* p = new ( ELeave ) CNSmlDSAsyncCallBackForOpen( 
+    	this, aMessage, OpenFinishedL );
+    CleanupStack::PushL( p );
+    
+    p->iDpi = DataProviderItemL( aMessage.Int0() );
+    CSmlDataProvider* dp = p->iDpi->iDataprovider;
+    TMemPtr& memptr( MemPtrL() );
+    RReadStream& rStream = memptr.ReadStreamLC();
+    
+    //server id
+    TInt tempLength = rStream.ReadUint32L();
+	p->iServerId = HBufC::NewL( rStream, tempLength );
+	
+	//remotedb
+	tempLength = rStream.ReadUint32L();
+	p->iRemoteDB = HBufC::NewL( rStream, tempLength );
+	
+	CleanupStack::PopAndDestroy(); //rStream
+    
+    //Localdb same as storename 
+    HBufC* storeName = DataStoreNameLC( aMessage );
+    
+    CNSmlAdapterLog* adpLog = CNSmlAdapterLog::NewL();
+    CleanupStack::PushL( adpLog );
+    
+    adpLog->SetAdapterLogKeyL( dp->Identifier(), *storeName, *p->iServerId, *p->iRemoteDB );
+    CSmlDataStore* ds = dp->NewStoreInstanceLC();
+    p->iDSItem = iDataProviders.InsertL( p->iDpi, ds, storeName );
+    p->iDSItem->iAdpLog = adpLog;
+    CleanupStack::Pop( 3 ); //ds, adpLog, storeName. iDataProviders takes the ownership
+    
+    p->CallDSAsyncLC().OpenL( *storeName, *adpLog, p->iStatus );
+    
+    CleanupStack::Pop( 2 ); //CallDSAsyncLC, p
+    }
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::OpenFinished
+// called when OpenL request is finished.
+// Note! when aOperation is CNSmlDSAsyncCallBack::ECanceled or CNSmlDSAsyncCallBack::EFree, 
+// aDSAO->iDSItem might be NULL.
+// ------------------------------------------------------------------------------------------------	
+TInt CNSmlDSHostSession::OpenFinishedL( CNSmlDSAsyncCallBack* aDSAO, TCallBackOperation aOperation )
+    {
+    CNSmlDSAsyncCallBackForOpen* p = static_cast<CNSmlDSAsyncCallBackForOpen*> ( aDSAO );
+    TInt err( aDSAO->iStatus.Int() );
+    
+    switch( aOperation )
+    	{
+		case CNSmlDSAsyncCallBack::EFinished:
+			if ( err == KErrNone )
+				{
+				aDSAO->iDSItem->SetOpened();
+				}
+			else
+				{
+				//calling recursively
+				OpenFinishedL( aDSAO, CNSmlDSAsyncCallBack::ECanceled );
+				}
+	    	break;
+	    case CNSmlDSAsyncCallBack::ECanceled:
+	    	iDataProviders.Remove( p->iDpi, 
+	    		p->iDSItem ); //aDSAO->iDSItem might be NULL, but remove checks that.
+	    	err = KErrNone;
+	    	break;
+	    case CNSmlDSAsyncCallBack::EFree:
+			delete p->iServerId;
+			p->iServerId = NULL;
+			delete p->iRemoteDB;
+			p->iRemoteDB = NULL;
+			
+	    	aDSAO->iPtr = NULL;
+	    	break;
+		default:
+			User::Leave( KErrUnknown );
+    	};
+
+    return err;
+    }
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::CancelRequest
+// Cancel the current asynchronous request.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::CancelRequestL( const RMessage2& aMessage )
+	{
+    TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
+    CNSmlDSAsyncRequestHandler* dsao = dsi->iDSAO;
+    //Note! it is possible, that after deleting dsao, 
+    //dsi may not exist anymore.
+    dsi = NULL;
+    
+    if ( dsao )
+        {
+    	delete dsao;
+    	dsao = NULL;
+        }
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::BeginTransaction
+// Starts the transaction mode.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::BeginTransactionL( const RMessage2& aMessage )
+	{
+    TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
+
+    CSmlDataStore* ds = dsi->iDataStore;
+    ds->BeginTransactionL();
+    dsi->iHostMode = ENSmlTransactionMode;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::CommitTransaction
+// Method will be called at the end of a successful transaction.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::CommitTransactionL( const RMessage2& aMessage )
+	{
+    TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
+   
+    CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( this, dsi, aMessage );
+    CleanupStack::PushL( dsao );
+    dsao->CallDSAsyncLC().CommitTransactionL( dsao->iStatus );
+    dsi->iHostMode = ENSmlNormalMode;
+    CleanupStack::Pop( 2 ); //CallDSAsyncLC(), dsao
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::RevertTransaction
+// Method will be called to abort an ongoing transaction.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::RevertTransactionL( const RMessage2& aMessage )
+	{
+    TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
+    
+    CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( this, dsi, aMessage );
+    CleanupStack::PushL( dsao );
+    dsao->CallDSAsyncLC().RevertTransaction( dsao->iStatus );
+    dsi->iHostMode = ENSmlNormalMode;
+    CleanupStack::Pop( 2 ); //CallDSAsyncLC(), dsao
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::BeginBatch
+// Starts the batch mode.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::BeginBatchL( const RMessage2& aMessage )
+	{
+    TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
+
+    RBatchItemUidArray* biua= new ( ELeave ) RBatchItemUidArray();
+    CleanupRPtrArrayPushL( biua );
+    CSmlDataStore* ds = dsi->iDataStore;
+    ds->BeginBatchL();
+    dsi->iHostMode = ENSmlBatchMode;
+    dsi->iBatchItemUids = biua;
+    CleanupStack::Pop( biua );
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::CommitBatchL
+// Method will be called at the end of the batch mode.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::CommitBatchL( const RMessage2& aMessage )
+	{
+    TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
+   
+    RArray<TInt>* resultArray = new ( ELeave ) RArray<TInt>;
+    CleanupStack::PushL( resultArray );
+    CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( 
+    	this, dsi, aMessage, CommitBatchRequestFinishedL, resultArray );
+    CleanupStack::Pop( resultArray ); //dsao takes ownership
+    
+    CleanupStack::PushL( dsao );
+    dsao->CallDSAsyncLC().CommitBatchL( *resultArray, dsao->iStatus );
+    CleanupStack::Pop( 2 ); //CallDSAsyncLC(), dsao
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::CommitBatchRequestFinished
+// Called when commitBatchL request is finished
+// ------------------------------------------------------------------------------------------------	
+TInt CNSmlDSHostSession::CommitBatchRequestFinishedL( CNSmlDSAsyncCallBack* aDSAO, 
+	TCallBackOperation aOperation )
+    {
+    TInt status ( aDSAO->iStatus.Int() );
+    TNSmlDSDataStoreElement* dsi = aDSAO->iDSItem;
+    RArray<TInt>* resultArray = reinterpret_cast<RArray<TInt>*>( aDSAO->iPtr );
+    
+    switch( aOperation )
+    	{
+		case CNSmlDSAsyncCallBack::EFinished:
+			dsi->iHostMode = ENSmlNormalMode;
+			if ( status == KErrNone )
+				{
+		        TMemPtr& dest( MemPtrL() );
+		        TStreamBuffers* sb = dest.StreamBufferLC();
+		        
+		        // write results
+				sb->iWrite->WriteInt32L( resultArray->Count() );
+				for ( TInt i = 0; i < resultArray->Count(); i++ )
+					{
+					sb->iWrite->WriteInt32L( ( *resultArray )[i] );
+					}
+				// write uids that are added.
+				if ( dsi->iBatchItemUids )
+					{
+					sb->iWrite->WriteInt32L( dsi->iBatchItemUids->Count() );
+					for ( TInt i = 0; i < dsi->iBatchItemUids->Count(); i++ )
+						{
+						TPckgC<TSmlDbItemUid> uid( *( *dsi->iBatchItemUids )[i] );
+						sb->iWrite->WriteL( uid );
+						}
+					}
+				else
+					{
+					sb->iWrite->WriteInt32L( 0 );
+					}
+				StreamBufferToChunkL( dest, sb );
+				CleanupStack::PopAndDestroy(); //sb
+		        status = aDSAO->iStatus.Int();
+				}
+	    	break;
+	    case CNSmlDSAsyncCallBack::ECanceled:
+	    	break;
+	    case CNSmlDSAsyncCallBack::EFree:
+	    	dsi->FreeBatchItemArray();
+	    	resultArray->Close();
+	    	delete resultArray;
+	    	aDSAO->iPtr = NULL;
+	    	break;
+		default:
+			User::Leave( KErrUnknown );
+    	}
+
+    return status;
+    }
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::CancelBatchL
+// Method will be called to abort an ongoing batch mode.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::CancelBatchL( const RMessage2& aMessage )
+	{
+    TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
+
+    CSmlDataStore* ds = dsi->iDataStore;
+    ds->CancelBatch();
+    dsi->iHostMode = ENSmlNormalMode;
+    dsi->FreeBatchItemArray();
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::SetRemoteDataStoreFormatL
+// Sets the Sync Partner Data Format.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::SetRemoteDataStoreFormatL( const RMessage2& aMessage )
+	{
+	TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
+    CSmlDataStore* ds = dsi->iDataStore;
+    TMemPtr& ptr( MemPtrL() );
+    RReadStream& readStream = ptr.ReadStreamLC();
+
+    CSmlDataStoreFormat* serverDataStoreFormat = CSmlDataStoreFormat::NewLC( iStringPool, readStream );
+    ds->SetRemoteStoreFormatL( *serverDataStoreFormat );
+    dsi->setStoreFormat( serverDataStoreFormat );
+    CleanupStack::Pop(); //serverDataStoreFormat
+    CleanupStack::PopAndDestroy(); //readStream
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::SetRemoteMaxObjectSizeL
+// Sets the SyncML server Sync Partner maximum object size.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::SetRemoteMaxObjectSizeL( const RMessage2& aMessage )
+	{
+    CSmlDataStore* ds = DataStoreL( aMessage );
+    
+    TMemPtr& ptr( MemPtrL() );
+    TInt tmp(0);
+    TPckg<TInt> maxObjectSize( tmp );
+    ptr.CopyTo( maxObjectSize );
+    ds->SetRemoteMaxObjectSize( maxObjectSize() );
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::MaxObjectSizeL
+// Gets the Data Store maximum object size which is reported to the SyncML partner.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::MaxObjectSizeL( const RMessage2& aMessage )
+	{
+    CSmlDataStore* ds = DataStoreL( aMessage );
+
+    TInt maxObjectSize = ds->MaxObjectSize();
+    TPckgC<TInt> pck( maxObjectSize );
+    aMessage.WriteL( 2, pck );
+	}	
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::OpenItemL
+// Opens item at Data Store.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::OpenItemL( const RMessage2& aMessage )
+    {
+    TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
+    CNSmlServerDSHostItem* dshi = DataStoreItemParamsLC();
+    
+    CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( 
+    	this, dsi, aMessage, OpenItemRequestFinishedL, dshi );
+    CleanupStack::Pop( dshi ); //dsao takes ownership
+    CleanupStack::PushL( dsao );
+    
+    dsao->CallDSAsyncLC().OpenItemL( 
+    	dshi->Uid(), dshi->FieldChange(), dshi->Size(), dshi->ParentUid(), 
+    	dshi->iMimeTypePtr, dshi->iMimeVerPtr, 
+    	dsao->iStatus );
+  
+    CleanupStack::Pop(2); //CallDSAsyncLC(), dsao
+    }
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::OpenItemRequestFinishedL
+//Called when OpenItemL request is finished.
+// ------------------------------------------------------------------------------------------------
+TInt CNSmlDSHostSession::OpenItemRequestFinishedL( CNSmlDSAsyncCallBack* aDSAO, 
+	TCallBackOperation aOperation )
+    {
+    TInt status( aDSAO->iStatus.Int() );
+    CNSmlServerDSHostItem* dshi = reinterpret_cast<CNSmlServerDSHostItem*>( aDSAO->iPtr );
+    
+    switch( aOperation )
+    	{
+		case CNSmlDSAsyncCallBack::EFinished:
+			if ( status == KErrNone )
+				{
+				dshi->SetMimeTypeL( dshi->iMimeTypePtr );
+	    		dshi->SetMimeVerL( dshi->iMimeVerPtr );
+	    		WriteDataStoreItemParamsL( dshi );
+				}
+	    	break;
+	    case CNSmlDSAsyncCallBack::ECanceled:
+	    	status = KErrNone;
+	    	break;
+	    case CNSmlDSAsyncCallBack::EFree:
+	    	delete dshi;
+	    	aDSAO->iPtr = NULL;
+	    	break;
+		default:
+			User::Leave( KErrUnknown );
+    	}
+
+    return status;
+    }
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::DataStoreItemParamsLC
+// ------------------------------------------------------------------------------------------------
+CNSmlDSHostSession::CNSmlServerDSHostItem* CNSmlDSHostSession::DataStoreItemParamsLC()
+    {
+    CNSmlServerDSHostItem* dshi = CNSmlServerDSHostItem::NewLC();
+    TMemPtr& ptr( MemPtrL() );
+    RReadStream& mrs = ptr.ReadStreamLC();
+    
+    dshi->InternalizeL( mrs );
+    
+    CleanupStack::PopAndDestroy(); //mrs
+    return dshi;
+    }
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::WriteDataStoreItemParamsL
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSHostSession::WriteDataStoreItemParamsL( CNSmlDSHostItem* dshi )
+    {
+    TMemPtr& ptr( MemPtrL() );
+    RWriteStream& mws = ptr.WriteStreamLC();
+    dshi->ExternalizeL( mws );
+    mws.CommitL();
+    CleanupStack::PopAndDestroy(); //mws
+    }
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::CreateItemL
+// Creates new item to Data Store.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::CreateItemL( const RMessage2& aMessage )
+    {
+    TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
+    CNSmlServerDSHostItem* dshi = DataStoreItemParamsLC();
+    CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( 
+    	this, dsi, aMessage, CreateItemRequestFinishedL, dshi );
+    CleanupStack::Pop( dshi ); //dsao takes ownership
+    CleanupStack::PushL( dsao );
+    
+    TSmlDbItemUid* uid = NULL;
+
+    if ( dsi->iHostMode == ENSmlBatchMode )
+        {
+        uid = new ( ELeave ) TSmlDbItemUid();
+        CleanupStack::PushL( uid );
+        dsi->iBatchItemUids->AppendL( uid );
+        CleanupStack::Pop( uid );
+        }
+    else{
+        uid = &dsi->iCreatedUid;
+        }
+        
+    *uid = dshi->Uid();
+    dshi->iCreateItemUid = uid;
+
+    dsao->CallDSAsyncLC().CreateItemL(
+    	*uid, dshi->Size(), dshi->ParentUid(), *dshi->MimeType(), 
+    	*dshi->MimeVer(), dsao->iStatus );
+    	
+    CleanupStack::Pop( 2 ); //CallDSAsyncLC(), dsao
+    }
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::CreateItemRequestFinishedL
+// Called when CreateItemL request is finished.
+// ------------------------------------------------------------------------------------------------
+TInt CNSmlDSHostSession::CreateItemRequestFinishedL( CNSmlDSAsyncCallBack* aDSAO, 
+	TCallBackOperation aOperation )
+    {
+    TInt status( aDSAO->iStatus.Int() );
+    CNSmlServerDSHostItem* dshi = reinterpret_cast<CNSmlServerDSHostItem*>( aDSAO->iPtr );
+    
+    switch( aOperation )
+    	{
+		case CNSmlDSAsyncCallBack::EFinished:
+			if ( status == KErrNone )
+				{
+				dshi->SetUid( *dshi->iCreateItemUid );
+				WriteDataStoreItemParamsL( dshi );
+				}
+	    	break;
+	    case CNSmlDSAsyncCallBack::ECanceled:
+	    	status = KErrNone;
+	    	break;
+	    case CNSmlDSAsyncCallBack::EFree:
+	    	delete dshi;
+	    	aDSAO->iPtr = NULL;
+	    	break;
+		default:
+			User::Leave( KErrUnknown );
+    	};
+
+    return status;
+    }
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::ReplaceItemL
+// Replaces old item at Data Store.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::ReplaceItemL( const RMessage2& aMessage )
+    {
+    TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
+    CNSmlDSHostItem* dshi = DataStoreItemParamsLC();
+    CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( this, dsi, aMessage );
+    CleanupStack::PushL( dsao );
+    dsao->CallDSAsyncLC().ReplaceItemL( 
+    	dshi->Uid(), dshi->Size(), dshi->ParentUid(), dshi->FieldChange(), dsao->iStatus );
+    CleanupStack::Pop( 2 ); //CallDSAsyncLC(), dsao
+    CleanupStack::PopAndDestroy(); //dshi
+    }
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::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.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::ReadItemL( const RMessage2& aMessage )
+	{
+    CSmlDataStore* ds = DataStoreL( aMessage );
+    TMemPtr& mem( MemPtrL() );
+    TInt32 sizeBytes(0);
+    
+    TPckg<TInt32> bytesToRead( sizeBytes );
+    mem.CopyTo( bytesToRead );
+    
+    TInt chunkSize( mem.Size() - sizeof( TInt ) );
+    
+    if ( sizeBytes >  chunkSize )
+    	{
+    	sizeBytes = chunkSize;
+    	}
+    
+    TPtr8 ptr( mem.Mid( sizeof( TInt ), sizeBytes ) );
+    ds->ReadItemL( ptr );
+    
+    TPckgC<TInt32> ReadBytes( ptr.Size() );
+    mem.Des().Copy( ReadBytes );
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::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.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::WriteItemL( const RMessage2& aMessage )
+	{
+    CSmlDataStore* ds = DataStoreL( aMessage );
+    TMemPtr& mem( MemPtrL() );
+    
+    TInt32 tmp(0);
+    TPckg<TInt32> bytesToWrite( tmp );
+    mem.CopyTo( bytesToWrite );
+    
+    TPtr8 ptr( mem.Mid( 4, bytesToWrite() ) );
+    ptr.SetLength( ptr.MaxLength() );
+    
+    ds->WriteItemL( ptr );
+    
+    TPckgC<TInt32> bytesWritten( ptr.Size() );
+    mem.Des().Copy( bytesWritten );
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::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.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::CommitItemL( const RMessage2& aMessage )
+	{
+    TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
+
+    CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( 
+    	this, dsi, aMessage, CommitItemRequestFinishedL );
+    CleanupStack::PushL( dsao );
+    dsao->CallDSAsyncLC().CommitItemL( dsao->iStatus );
+    CleanupStack::Pop(2); //CallDSAsyncLC, dsao
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::CommitItemRequestFinishedL
+// Called when CommitItemL request is finished.
+// ------------------------------------------------------------------------------------------------
+TInt CNSmlDSHostSession::CommitItemRequestFinishedL( CNSmlDSAsyncCallBack* aDSAO, 
+	TCallBackOperation aOperation )
+    {
+    TInt status( aDSAO->iStatus.Int() );
+    
+    switch( aOperation )
+    	{
+		case CNSmlDSAsyncCallBack::EFinished:
+			if ( status == KErrNone )
+				{
+				TNSmlDSDataStoreElement* dsi = aDSAO->iDSItem;
+
+	    		if ( dsi->iHostMode != ENSmlBatchMode )
+	    	    	{
+	        		TSmlDbItemUid uid = dsi->iCreatedUid;
+	        		TPckgC<TSmlDbItemUid> pck( uid );
+	        		aDSAO->iMessage.WriteL( 2, pck );
+		        	}
+				}
+	    	break;
+	    case CNSmlDSAsyncCallBack::ECanceled:
+	    	status = KErrNone;
+	    	break;
+	    case CNSmlDSAsyncCallBack::EFree:
+	    	break;
+		default:
+			User::Leave( KErrUnknown );
+    	}
+
+    return status;
+    }
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::CloseItem
+// Closes opened item.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::CloseItemL( const RMessage2& aMessage )
+	{
+    DataStoreL( aMessage )->CloseItem();
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::MoveItemL
+// Moves item to new location.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::MoveItemL( const RMessage2& aMessage )
+	{
+    TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );    
+    
+    CNSmlDSHostItem* dshi = DataStoreItemParamsLC();
+    CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( this, dsi, aMessage );
+    CleanupStack::PushL( dsao );
+    dsao->CallDSAsyncLC().MoveItemL( dshi->Uid(), dshi->ParentUid(), dsao->iStatus );
+    CleanupStack::Pop(2); //CallDSAsyncLC(), dsao
+    CleanupStack::PopAndDestroy(); //dshi
+	}
+		
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::DeleteItemL
+// Deletes one item at Data Store permanently.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::DeleteItemL( const RMessage2& aMessage )
+	{
+    TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
+    
+    CNSmlDSHostItem* dshi = DataStoreItemParamsLC();
+    CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( this, dsi, aMessage );
+    CleanupStack::PushL( dsao );
+    dsao->CallDSAsyncLC().DeleteItemL( dshi->Uid(), dsao->iStatus );
+    CleanupStack::Pop(2); //CallDSAsyncLC(), dsao
+    CleanupStack::PopAndDestroy(); //dshi
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::SoftDeleteItemL
+// Soft deletes one item at Data Store.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::SoftDeleteItemL( const RMessage2& aMessage )
+	{
+    TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
+    
+    CNSmlDSHostItem* dshi = DataStoreItemParamsLC();
+    CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( this, dsi, aMessage );
+    CleanupStack::PushL( dsao );
+    dsao->CallDSAsyncLC().SoftDeleteItemL( dshi->Uid(), dsao->iStatus );
+    CleanupStack::Pop(2); //CallDSAsyncLC(), dsao
+    CleanupStack::PopAndDestroy(); //dshi
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::DeleteAllItemsL
+// Deletes all items at Data Store permanently.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::DeleteAllItemsL( const RMessage2& aMessage )
+	{
+    TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
+    CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( this, dsi, aMessage );
+    CleanupStack::PushL( dsao );
+    dsao->CallDSAsyncLC().DeleteAllItemsL( dsao->iStatus );
+    CleanupStack::Pop(2); //CallDSAsyncLC(), dsao
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::HasSyncHistoryL
+// Checks if the Data Store has sync history. If not then slow sync is proposed to Sync Partner.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::HasSyncHistoryL( const RMessage2& aMessage )
+	{
+    CSmlDataStore* ds = DataStoreL( aMessage );
+    TPckgC<TBool> pck( TBool( ds->HasSyncHistory() ) );
+    aMessage.WriteL( 2, pck );
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::AddedItemsL
+// The Data Provider returns UIDs of items that are added after previous synchronization.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::AddedItemsL( const RMessage2& aMessage )
+	{
+    CSmlDataStore* ds = DataStoreL( aMessage );
+    
+    const MSmlDataItemUidSet& dius = ds->AddedItems();
+    RNSmlDbItemModificationSet dbims;
+    CleanupClosePushL( dbims );
+    
+    dbims.AddGroupL( dius, TNSmlDbItemModification::ENSmlDbItemAdd );
+    
+    TMemPtr& dest( MemPtrL() );
+    dest.AdjustChunkIfNeededL( dbims.StreamSize() );
+    RWriteStream& wStream = dest.WriteStreamLC();
+	dbims.ExternalizeL( wStream );
+	wStream.CommitL();
+	CleanupStack::PopAndDestroy(2); //wStream, dbims
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::DeletedItemsL
+// The Data Provider returns UIDs of items that are deleted after previous synchronization.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::DeletedItemsL( const RMessage2& aMessage )
+	{
+    CSmlDataStore* ds = DataStoreL( aMessage );
+    
+    const MSmlDataItemUidSet& dius = ds->DeletedItems();
+    RNSmlDbItemModificationSet dbims;
+    CleanupClosePushL( dbims );
+    
+    dbims.AddGroupL( dius, TNSmlDbItemModification::ENSmlDbItemDelete );
+    
+    TMemPtr& dest( MemPtrL() );
+    dest.AdjustChunkIfNeededL( dbims.StreamSize() );
+    RWriteStream& wStream = dest.WriteStreamLC();
+	dbims.ExternalizeL( wStream );
+	wStream.CommitL();
+	CleanupStack::PopAndDestroy(2); //wStream, dbims
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::SoftDeleteItemsL
+// The Data Provider returns UIDs of items that are soft deleted after previous synchronization.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::SoftDeleteItemsL( const RMessage2& aMessage )
+	{
+    CSmlDataStore* ds = DataStoreL( aMessage );
+    
+    const MSmlDataItemUidSet& dius = ds->SoftDeletedItems();
+    RNSmlDbItemModificationSet dbims;
+    CleanupClosePushL( dbims );
+    
+    dbims.AddGroupL( dius, TNSmlDbItemModification::ENSmlDbItemSoftDelete );
+    
+    TMemPtr& dest( MemPtrL() );
+    dest.AdjustChunkIfNeededL( dbims.StreamSize() );
+    RWriteStream& wStream = dest.WriteStreamLC();
+	dbims.ExternalizeL( wStream );
+	wStream.CommitL();
+	CleanupStack::PopAndDestroy(2); //wStream, dbims
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::ModifiedItemsL
+// The Data Provider returns UIDs of items that are modified after previous synchronization.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::ModifiedItemsL( const RMessage2& aMessage )
+	{
+    CSmlDataStore* ds = DataStoreL( aMessage );
+    
+    const MSmlDataItemUidSet& dius = ds->ModifiedItems();
+    RNSmlDbItemModificationSet dbims;
+    CleanupClosePushL( dbims );
+    
+    dbims.AddGroupL( dius, TNSmlDbItemModification::ENSmlDbItemModify );
+    
+    TMemPtr& dest( MemPtrL() );
+    dest.AdjustChunkIfNeededL( dbims.StreamSize() );
+    RWriteStream& wStream = dest.WriteStreamLC();
+	dbims.ExternalizeL( wStream );
+	wStream.CommitL();
+	CleanupStack::PopAndDestroy(2); //wStream, dbims
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::MovedItemsL
+// The Data Provider returns UIDs of items that are moved after previous synchronization.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::MovedItemsL( const RMessage2& aMessage )
+	{
+    CSmlDataStore* ds = DataStoreL( aMessage );
+    
+    const MSmlDataItemUidSet& dius = ds->MovedItems();
+    RNSmlDbItemModificationSet dbims;
+    CleanupClosePushL( dbims );
+    
+    dbims.AddGroupL( dius, TNSmlDbItemModification::ENSmlDbItemMove );
+    
+    TMemPtr& dest( MemPtrL() );
+    dest.AdjustChunkIfNeededL( dbims.StreamSize() );
+    RWriteStream& wStream = dest.WriteStreamLC();
+	dbims.ExternalizeL( wStream );
+	wStream.CommitL();
+	CleanupStack::PopAndDestroy(2); //wStream, dbims
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::AllItemsL
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::AllItemsL( const RMessage2& aMessage )
+	{
+	TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
+	
+    CNSmlDSChangedItemsFetcher* dsao = CNSmlDSChangedItemsFetcher::NewLC( 
+    	this, dsi, aMessage, AllItemsRequestFinishedL );
+    dsao->FetchAllChangedItemsL();
+    CleanupStack::Pop(); //dsao
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::AllItemsRequestFinished
+// Called when AllItems request is finished.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::AllItemsRequestFinishedL( CNSmlDSChangedItemsFetcher* aDSAO )
+	{
+	TMemPtr& dest( MemPtrL() );
+	const RNSmlDbItemModificationSet* mods = aDSAO->ChangedItems();
+	dest.AdjustChunkIfNeededL( mods->StreamSize() );
+	RWriteStream& wStream = dest.WriteStreamLC();
+	mods->ExternalizeL( wStream );
+	wStream.CommitL();
+	CleanupStack::PopAndDestroy(); //wStream
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::ResetChangeInfoL
+// Reset change info from the Data Provider. 
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::ResetChangeInfoL( const RMessage2& aMessage )
+	{
+    TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
+
+    CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( this, dsi, aMessage );
+    CleanupStack::PushL( dsao );
+    dsao->CallDSAsyncLC().ResetChangeInfoL( dsao->iStatus );
+    CleanupStack::Pop(2); //CallDSAsyncLC(), dsao
+	}
+		
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::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.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::CommitChangesL( const RMessage2& aMessage )
+	{
+    TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
+    
+    CNSmlDataItemUidSet* dius = new ( ELeave ) CNSmlDataItemUidSet();
+    CleanupStack::PushL( dius );
+    TMemPtr& ptr( MemPtrL() );
+    RReadStream& readStream = ptr.ReadStreamLC();
+    dius->InternalizeL( readStream );
+    CleanupStack::PopAndDestroy(); //readStream
+    
+    CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( 
+    	this, dsi, aMessage, CommitChangesRequestFinishedL, dius );
+    CleanupStack::Pop( dius ); //dsao takes the ownership.
+    CleanupStack::PushL( dsao );
+    dsao->CallDSAsyncLC().CommitChangeInfoL( dsao->iStatus, *dius );
+    CleanupStack::Pop(2); //CallDSAsyncLC(), dsao
+	}
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::CommitItemRequestFinishedL
+// This method is called after CommitChangesL request is finished.
+// ------------------------------------------------------------------------------------------------	
+TInt CNSmlDSHostSession::CommitChangesRequestFinishedL( CNSmlDSAsyncCallBack* aDSAO, 
+	TCallBackOperation aOperation )
+	{
+	TInt status( aDSAO->iStatus.Int() );
+	CNSmlDataItemUidSet* dius = reinterpret_cast<CNSmlDataItemUidSet*>( aDSAO->iPtr );
+    
+    switch( aOperation )
+    	{
+		case CNSmlDSAsyncCallBack::EFinished:
+	    	break;
+	    case CNSmlDSAsyncCallBack::ECanceled:
+	    	status = KErrNone;
+	    	break;
+	    case CNSmlDSAsyncCallBack::EFree:
+	    	delete dius;
+	    	aDSAO->iPtr = NULL;
+	    	break;
+		default:
+			User::Leave( KErrUnknown );
+    	}
+
+    return status;
+	
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::CommitAllChangesL
+// This method is called after some changes are synchronized to Sync Partner. This method is used if
+// all changes were synchronized correctly.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::CommitAllChangesL( const RMessage2& aMessage )
+	{
+    TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
+    CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( this, dsi, aMessage );
+    CleanupStack::PushL( dsao );
+    dsao->CallDSAsyncLC().CommitChangeInfoL( dsao->iStatus );
+    CleanupStack::Pop(2); //CallDSAsyncLC(), dsao
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::UpdateServerIdL
+// Updates server id to adapter log.
+// ------------------------------------------------------------------------------------------------		
+void CNSmlDSHostSession::UpdateServerIdL( const RMessage2& /*aMessage*/ )
+	{
+	TMemPtr& ptr( MemPtrL() );
+    RReadStream& readStream = ptr.ReadStreamLC();
+    
+	HBufC* oldServerId = HBufC::NewLC( readStream, readStream.ReadUint32L() );
+	HBufC* newValue = HBufC::NewLC( readStream, readStream.ReadUint32L() );
+	
+	CNSmlAdapterLog* adpLog = CNSmlAdapterLog::NewLC();
+	
+	adpLog->SetServerIdL( *oldServerId, *newValue );
+	
+	CleanupStack::PopAndDestroy( 4 ); //adpLog, newValue, oldServerId, readStream
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::DataProviderL
+// ------------------------------------------------------------------------------------------------
+CSmlDataProvider* CNSmlDSHostSession::DataProviderL( TSmlDataProviderId aId )
+    {
+    CSmlDataProvider* dp = iDataProviders.DataProvider( aId );
+    if ( !dp )
+        {
+        User::Leave( ENSmlDSHostServerErrDPNotCreated );
+        }
+    return dp;
+    }
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::DataProviderItemL
+// ------------------------------------------------------------------------------------------------
+TNSmlDSDataProviderElement* CNSmlDSHostSession::DataProviderItemL( TSmlDataProviderId aId )
+    {
+    TNSmlDSDataProviderElement* dpi = iDataProviders.DataProviderElement( aId );
+    if ( !dpi )
+        {
+        User::Leave( ENSmlDSHostServerErrDPNotCreated );
+        }
+    return dpi;
+    }
+    
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::DataStoreL
+// ------------------------------------------------------------------------------------------------
+CSmlDataStore* CNSmlDSHostSession::DataStoreL( const RMessage2& aMessage )
+    {
+    TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
+    return dsi->iDataStore;
+    }
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::DataStoreItemL
+// ------------------------------------------------------------------------------------------------
+TNSmlDSDataStoreElement* CNSmlDSHostSession::DataStoreItemL( const RMessage2& aMessage )
+    {
+    HBufC* storeName = DataStoreNameLC( aMessage );
+    TNSmlDSDataStoreElement* dsi = iDataProviders.DataStoreElement( 
+        iDataProviders.DataProviderElement( aMessage.Int0() ), *storeName );
+    
+    if ( !dsi )
+        {
+        User::Leave( ENSmlDSHostServerErrDSNotOpened );
+        }
+
+    CleanupStack::PopAndDestroy(); //storeName
+
+    return dsi;
+    }
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::HasDataStoreL
+// ------------------------------------------------------------------------------------------------    
+TBool CNSmlDSHostSession::HasDataStoreL( const RMessage2& aMessage )
+	{
+	HBufC* storeName = DataStoreNameLC( aMessage );
+    TNSmlDSDataStoreElement* dsi = iDataProviders.DataStoreElement( 
+        iDataProviders.DataProviderElement( aMessage.Int0() ), *storeName );
+        
+    CleanupStack::PopAndDestroy(); //storeName
+    return ( dsi != NULL );
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::DataStoreNameLC
+// ------------------------------------------------------------------------------------------------
+HBufC* CNSmlDSHostSession::DataStoreNameLC( const RMessage2& aMessage )
+    {
+    TInt desLength = aMessage.GetDesLength( 1 );
+    if ( desLength < 0 )
+        {
+        //if desLength negative, contains system-wide error code.
+        User::Leave( desLength );
+        }
+    HBufC* storeName = HBufC::NewLC( desLength );
+    TPtr store( storeName->Des() );
+    aMessage.ReadL( 1, store );
+    return storeName;
+    }
+    
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::InternalizeFiltersL
+// Read filters from stream.
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSHostSession::InternalizeFiltersL( RReadStream& aStream, RPointerArray<CSyncMLFilter>& aFilters )
+	{
+	
+	TInt count( aStream.ReadInt32L() );
+	
+	for ( TInt i = 0; i < count; i++ )
+		{
+		CSyncMLFilter* filter = CSyncMLFilter::NewLC( aStream );
+		aFilters.AppendL( filter );
+		CleanupStack::Pop(); // filter
+		}
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::ExternalizeFiltersL
+// Write filters to stream.
+// ------------------------------------------------------------------------------------------------	
+void CNSmlDSHostSession::ExternalizeFiltersL( RWriteStream& aStream, const RPointerArray<CSyncMLFilter>& aFilters )
+	{
+	TInt count( aFilters.Count() );
+	aStream.WriteInt32L( count );
+	for ( TInt i(0); i < count; i++ )
+		{
+		aFilters[i]->ExternalizeL( aStream );
+		}
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::PanicClient
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSHostSession::PanicClient( const RMessage2& aMessage, TInt aReason ) const
+	{
+	_DBG_FILE( "CNSmlDSHostSession::PanicClient(): begin " );
+	aMessage.Panic( _L( "CNSmlDSHostSession" ), aReason );
+	_DBG_FILE( "CNSmlDSHostSession::PanicClient(): end" );
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::MemPtrL
+// ------------------------------------------------------------------------------------------------
+CNSmlDSHostSession::TMemPtr& CNSmlDSHostSession::MemPtrL()
+    {
+    if ( iMemPtr.iChunk.Handle() == 0 || !iMemPtr.iChunk.IsWritable() )
+    	{
+    	User::Leave( KErrBadHandle );
+    	}
+    return iMemPtr;
+    }
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostSession::StreamBufferToChunkL
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSHostSession::StreamBufferToChunkL( TMemPtr& aMemPtr, TStreamBuffers* aSb )
+	{
+	aSb->iWrite->CommitL();
+	aMemPtr.AdjustChunkIfNeededL( aSb->iBuffer->Size() );
+	RWriteStream& wStream = aMemPtr.WriteStreamLC();
+	wStream.WriteL( *aSb->iRead );
+	wStream.CommitL();
+	CleanupStack::PopAndDestroy(); //wStream
+	}
+
+// End of File