syncmlfw/ds/hostserver/dshostserverbase/src/Nsmldshostsession.cpp
changeset 0 b497e44ab2fc
child 12 9e9792ae22e3
equal deleted inserted replaced
-1:000000000000 0:b497e44ab2fc
       
     1 /*
       
     2 * Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Session for DS host server.
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // ------------------------------------------------------------------------------------------------
       
    20 // Includes
       
    21 // ------------------------------------------------------------------------------------------------
       
    22 
       
    23 #include <s32mem.h>
       
    24 #include <implementationinformation.h>
       
    25 #include <ecom.h>
       
    26 #include <badesca.h>
       
    27 #include <nsmldebug.h>
       
    28 #include <SmlDataFormat.h>
       
    29 
       
    30 #include "NSmlAdapterLog.h"
       
    31 #include "nsmldshostconstants.h"
       
    32 #include "Nsmldshostserver.h"
       
    33 #include "Nsmldshostsession.h"
       
    34 #include "nsmldsdpinformation.h"
       
    35 #include "Nsmldsdataproviderarray.h"
       
    36 
       
    37 #ifdef __HOST_SERVER_MTEST__
       
    38 #include "../../stif/DSHostServerTest/src/fakedataprovider.cpp"
       
    39 #else
       
    40 #include <nsmlchangefinder.h>	//for CNSmlDataItemUidSet
       
    41 #endif
       
    42 
       
    43 // ------------------------------------------------------------------------------------------------
       
    44 // CNSmlDSHostSession::TMemPtr::WriteStreamLC
       
    45 // ------------------------------------------------------------------------------------------------
       
    46 RWriteStream& CNSmlDSHostSession::TMemPtr::WriteStreamLC() const
       
    47     {
       
    48     RMemWriteStream* writeStream = new ( ELeave ) RMemWriteStream( Ptr(), Size() );
       
    49     CleanupStack::PushL( TCleanupItem ( CleanupWriteStream, writeStream ) );
       
    50     return *writeStream;
       
    51     }
       
    52 
       
    53 // ------------------------------------------------------------------------------------------------
       
    54 // CNSmlDSHostSession::TMemPtr::StreamBufferLC
       
    55 // ------------------------------------------------------------------------------------------------   
       
    56 CNSmlDSHostSession::TMemPtr::TStreamBuffers* 
       
    57 	CNSmlDSHostSession::TMemPtr::StreamBufferLC() const
       
    58 	{
       
    59 	TStreamBuffers* cleanup = new ( ELeave ) TStreamBuffers;
       
    60 	CleanupStack::PushL( TCleanupItem ( CleanupStreamBuffer, cleanup ) );
       
    61 	cleanup->iBuffer = CBufFlat::NewL( 64 );
       
    62 	cleanup->iWrite = new ( ELeave ) RBufWriteStream( *cleanup->iBuffer );
       
    63 	cleanup->iRead = new ( ELeave ) RBufReadStream( *cleanup->iBuffer );
       
    64 	return cleanup;
       
    65 	}
       
    66 
       
    67 // ------------------------------------------------------------------------------------------------
       
    68 // CNSmlDSHostSession::TMemPtr::ReadStreamLC
       
    69 // ------------------------------------------------------------------------------------------------
       
    70 RReadStream& CNSmlDSHostSession::TMemPtr::ReadStreamLC() const
       
    71     {
       
    72     RMemReadStream* readStream = new ( ELeave ) RMemReadStream( Ptr(), iChunk.Size() );
       
    73     CleanupStack::PushL( TCleanupItem ( CleanupReadStream, readStream ) );
       
    74     return *readStream;
       
    75     }
       
    76     
       
    77 // ------------------------------------------------------------------------------------------------
       
    78 // CNSmlDSHostSession::TMemPtr::AdjustChunkIfNeededL
       
    79 // ------------------------------------------------------------------------------------------------    
       
    80 void CNSmlDSHostSession::TMemPtr::AdjustChunkIfNeededL( TInt iNeededSize )
       
    81 	{
       
    82 	if ( Size() < iNeededSize )
       
    83 		{
       
    84 		User::LeaveIfError( Adjust(iNeededSize) );
       
    85 		}
       
    86 	}
       
    87 
       
    88 // ------------------------------------------------------------------------------------------------
       
    89 // CNSmlDSHostSession::TMemPtr::CleanupWriteStream
       
    90 // ------------------------------------------------------------------------------------------------
       
    91 void CNSmlDSHostSession::TMemPtr::CleanupWriteStream( TAny* aP )
       
    92 	{
       
    93 	RMemWriteStream* writeStream = reinterpret_cast<RMemWriteStream*>( aP );
       
    94 	writeStream->Close();
       
    95 	delete writeStream;
       
    96 	}
       
    97 
       
    98 // ------------------------------------------------------------------------------------------------
       
    99 // CNSmlDSHostSession::TMemPtr::CleanupReadStream
       
   100 // ------------------------------------------------------------------------------------------------
       
   101 void CNSmlDSHostSession::TMemPtr::CleanupReadStream( TAny* aP )
       
   102 	{
       
   103 	RMemReadStream* readStream = reinterpret_cast<RMemReadStream*>( aP );
       
   104 	readStream->Close();
       
   105 	delete readStream;
       
   106 	}
       
   107 
       
   108 // ------------------------------------------------------------------------------------------------
       
   109 // CNSmlDSHostSession::TMemPtr::CleanupStreamBuffer
       
   110 // ------------------------------------------------------------------------------------------------
       
   111 void CNSmlDSHostSession::TMemPtr::CleanupStreamBuffer( TAny* aP )
       
   112 	{
       
   113 	TStreamBuffers* cleanup = reinterpret_cast<TStreamBuffers*>( aP );
       
   114 	
       
   115 	if ( cleanup->iWrite )
       
   116 		{
       
   117 		cleanup->iWrite->Close();
       
   118 		delete cleanup->iWrite;
       
   119 		}
       
   120 		
       
   121 	if ( cleanup->iRead )
       
   122 		{
       
   123 		cleanup->iRead->Close();
       
   124 		delete cleanup->iRead;
       
   125 		}
       
   126 	
       
   127 	delete cleanup->iBuffer;
       
   128 	delete cleanup;
       
   129 	}
       
   130 
       
   131 // ------------------------------------------------------------------------------------------------
       
   132 // CNSmlDSHostSession::TMemPtr::CancelAdjust
       
   133 // ------------------------------------------------------------------------------------------------	
       
   134 void CNSmlDSHostSession::TMemPtr::CancelAdjust( TAny* aP )
       
   135 	{
       
   136 	if ( aP )
       
   137 		{
       
   138 		TMemPtr* memptr = reinterpret_cast<TMemPtr*>( aP );
       
   139 		memptr->Adjust( KNSmlDSHostChunkMinSize );
       
   140 		}
       
   141 	}
       
   142 	
       
   143 // ------------------------------------------------------------------------------------------------
       
   144 // CNSmlDSHostSession::CNSmlServerDSHostItem::NewLC
       
   145 // ------------------------------------------------------------------------------------------------
       
   146 CNSmlDSHostSession::CNSmlServerDSHostItem* CNSmlDSHostSession::CNSmlServerDSHostItem::NewLC()
       
   147 	{
       
   148 	CNSmlServerDSHostItem* self = new ( ELeave ) CNSmlServerDSHostItem();
       
   149 	CleanupStack::PushL( self );
       
   150 	self->ConstructL();
       
   151 	return self;
       
   152 	}
       
   153 	
       
   154 // ------------------------------------------------------------------------------------------------
       
   155 // CNSmlDSHostSession::NewL
       
   156 // ------------------------------------------------------------------------------------------------
       
   157 CNSmlDSHostSession* CNSmlDSHostSession::NewL( CNSmlDSHostServer& aServer )
       
   158 	{
       
   159 	_DBG_FILE( "CNSmlDSHostSession::NewL(): begin" );
       
   160 	CNSmlDSHostSession* self= new ( ELeave ) CNSmlDSHostSession( aServer );
       
   161 	CleanupStack::PushL( self );
       
   162 	self->ConstructL();
       
   163 	CleanupStack::Pop(); // self
       
   164 	_DBG_FILE( "CNSmlDSHostSession::NewL(): end" );
       
   165 	return self;
       
   166 	}
       
   167 	
       
   168 // ------------------------------------------------------------------------------------------------
       
   169 // CNSmlDSHostSession::~CNSmlDSHostSession
       
   170 // ------------------------------------------------------------------------------------------------
       
   171 CNSmlDSHostSession::~CNSmlDSHostSession()
       
   172 	{
       
   173 	_DBG_FILE( "CNSmlDSHostSession::~CNSmlDSHostSession(): begin" );
       
   174     iMemPtr.iChunk.Close();
       
   175     iDataProviders.ResetAndDestroy();
       
   176     iStringPool.Close();
       
   177     REComSession::FinalClose();
       
   178     iServer.DecSessionCount();
       
   179 	_DBG_FILE( "CNSmlDSHostSession::~CNSmlDSHostSession(): end" );
       
   180 	}
       
   181 
       
   182 // ------------------------------------------------------------------------------------------------
       
   183 // CNSmlDSHostSession::ServiceL
       
   184 // ------------------------------------------------------------------------------------------------
       
   185 void CNSmlDSHostSession::ServiceL( const RMessage2& aMessage )
       
   186 	{
       
   187 	_DBG_FILE( "CNSmlDSHostSession::ServiceL(): begin" );
       
   188     TBool completeRequest( ETrue );
       
   189 	TRAPD( err, DispatchMessageL( aMessage, completeRequest ) );
       
   190 
       
   191     if ( completeRequest && !aMessage.IsNull() )
       
   192         {
       
   193         aMessage.Complete( err );
       
   194         }
       
   195 	DBG_FILE_CODE( err, _S8( "CNSmlDSHostSession::ServiceL() returned" ) );
       
   196 	}
       
   197 
       
   198 // ------------------------------------------------------------------------------------------------
       
   199 // CNSmlDSHostSession::DispatchMessageL
       
   200 // ------------------------------------------------------------------------------------------------
       
   201 void CNSmlDSHostSession::DispatchMessageL( const RMessage2& aMessage, TBool& aCompleteRequest )
       
   202 	{
       
   203 	_DBG_FILE( "CNSmlDSHostSession::DispatchMessageL(): begin" );
       
   204     aCompleteRequest = ETrue;
       
   205 
       
   206 	switch( aMessage.Function() )
       
   207         {
       
   208 	    case ENSmlDPOpen:
       
   209 	    	_DBG_FILE("CreateDataProvidersL"); 
       
   210 	        CreateDataProvidersL( aMessage );
       
   211 	        break;
       
   212 	    case ENSmlDPOpenExcept:
       
   213 	        _DBG_FILE("CreateDataProvidersExceptL"); 
       
   214 	        CreateDataProvidersExceptL( aMessage );
       
   215 	        break;
       
   216 	    case ENSmlDPInformation:
       
   217 	    	_DBG_FILE("DPInformation"); 
       
   218 	    	DPInformationL( aMessage );
       
   219 	    	break;
       
   220 		case ENSmlHandleChunk:
       
   221 			_DBG_FILE("HandleChunk"); 
       
   222 			HandleChunk( aMessage );
       
   223 	        break;
       
   224 		case ENSmlDPSupportsOperation:
       
   225 			_DBG_FILE("SupportsOperationL"); 
       
   226 	        SupportsOperationL( aMessage );
       
   227 	        break;
       
   228 		case ENSmlDPStoreFormat:
       
   229 			_DBG_FILE("StoreFormatL"); 
       
   230 	        StoreFormatL( aMessage );
       
   231 	        break;
       
   232 		case ENSmlDPlListStores:
       
   233 	        _DBG_FILE("ListStoresL"); 
       
   234 	        ListStoresL( aMessage );
       
   235 	        break;
       
   236 		case ENSmlDPDefaultStore:
       
   237 	        _DBG_FILE("DefaultStoreL"); 
       
   238 	        DefaultStoreL( aMessage );
       
   239 	        break;
       
   240 	    case ENSmlServerFilters:
       
   241 	    	_DBG_FILE("SupportedServerFiltersL"); 
       
   242 	        SupportedServerFiltersL( aMessage );
       
   243 	        break;
       
   244         case ENSmlUpdateServerFilters:
       
   245         	_DBG_FILE("CheckServerFiltersL");
       
   246         	CheckServerFiltersL( aMessage );
       
   247         	break;
       
   248         case ENSmlCheckSupportedServerFilters:
       
   249         	_DBG_FILE("CheckSupportedServerFiltersL");
       
   250         	CheckSupportedServerFiltersL( aMessage );
       
   251         	break;
       
   252         case ENSmlFilters:
       
   253         	_DBG_FILE("GetFiltersL");
       
   254         	GetFiltersL( aMessage );
       
   255         	break;
       
   256 		case ENSmlDSOpen:
       
   257 	        _DBG_FILE("OpenL"); 
       
   258 	        OpenL( aMessage ); aCompleteRequest = EFalse;
       
   259 	        break;
       
   260 		case ENSmlDSCancelRequest:
       
   261 	        _DBG_FILE("CancelRequestL"); 
       
   262 	        CancelRequestL( aMessage );
       
   263 	        break;
       
   264 		case ENSmlDSBeginTransaction:
       
   265 	        _DBG_FILE("BeginTransactionL"); 
       
   266 	        BeginTransactionL( aMessage );
       
   267 	        break;
       
   268 		case ENSmlDSCommitTransaction:
       
   269 	        _DBG_FILE("CommitTransactionL"); 
       
   270 	        CommitTransactionL( aMessage ); aCompleteRequest = EFalse;
       
   271 	        break;
       
   272 		case ENSmlDSRevertTransaction:
       
   273 	        _DBG_FILE("RevertTransactionL"); 
       
   274 	        RevertTransactionL( aMessage ); aCompleteRequest = EFalse;
       
   275 	        break;
       
   276 		case ENSmlDSBeginBatch:
       
   277 	        _DBG_FILE("BeginBatchL"); 
       
   278 	        BeginBatchL( aMessage );
       
   279 	        break;
       
   280 		case ENSmlDSCommitBatch:
       
   281 	        _DBG_FILE("CommitBatchL"); 
       
   282 	        CommitBatchL( aMessage ); aCompleteRequest = EFalse;
       
   283 	        break;
       
   284 		case ENSmlDSCancelBatch:
       
   285 	        _DBG_FILE("CancelBatchL"); 
       
   286 	        CancelBatchL( aMessage );
       
   287 	        break;
       
   288 		case ENSmlDSSetDataStoreFormat:
       
   289 	        _DBG_FILE("SetRemoteDataStoreFormatL"); 
       
   290 	        SetRemoteDataStoreFormatL( aMessage );
       
   291 	        break;
       
   292 		case ENSmlDSRemoteMaxObjSize:
       
   293 	        _DBG_FILE("SetRemoteMaxObjectSizeL"); 
       
   294 	        SetRemoteMaxObjectSizeL( aMessage );
       
   295 	        break;
       
   296 		case ENSmlMaxObjSize:
       
   297 	        _DBG_FILE("MaxObjectSizeL"); 
       
   298 	        MaxObjectSizeL( aMessage );
       
   299 	        break;
       
   300 		case ENSmlItemOpen:
       
   301 	        _DBG_FILE("OpenItemL"); 
       
   302 	        OpenItemL( aMessage ); aCompleteRequest = EFalse;
       
   303 	        break;
       
   304 		case ENSmlItemCreate:
       
   305 	        _DBG_FILE("CreateItemL"); 
       
   306 	        CreateItemL( aMessage ); aCompleteRequest = EFalse;
       
   307 	        break;
       
   308 		case ENSmlItemReplace:
       
   309 	        _DBG_FILE("ReplaceItemL"); 
       
   310 	        ReplaceItemL( aMessage ); aCompleteRequest = EFalse;
       
   311 	        break;
       
   312 		case ENSmlItemRead:
       
   313 	        _DBG_FILE("ReadItemL"); 
       
   314 	        ReadItemL( aMessage );
       
   315 	        break;
       
   316 		case ENSmlItemWrite:
       
   317 	        _DBG_FILE("WriteItemL"); 
       
   318 	        WriteItemL( aMessage );
       
   319 	        break;
       
   320 		case ENSmlItemCommit:
       
   321 	        _DBG_FILE("CommitItemL"); 
       
   322 	        CommitItemL( aMessage ); aCompleteRequest = EFalse;
       
   323 	        break;
       
   324 		case ENSmlItemClose:
       
   325 	        _DBG_FILE("CloseItemL"); 
       
   326 	        CloseItemL( aMessage );
       
   327 	        break;
       
   328 		case ENSmlItemMove:
       
   329 	        _DBG_FILE("MoveItemL"); 
       
   330 	        MoveItemL( aMessage ); aCompleteRequest = EFalse;
       
   331 	        break;
       
   332 		case ENSmlItemDelete:
       
   333 	        _DBG_FILE("DeleteItemL"); 
       
   334 	        DeleteItemL( aMessage ); aCompleteRequest = EFalse;
       
   335 	        break;
       
   336 		case ENSmlItemSoftDelete:
       
   337 	        _DBG_FILE("SoftDeleteItemL"); 
       
   338 	        SoftDeleteItemL( aMessage ); aCompleteRequest = EFalse;
       
   339 	        break;
       
   340 		case ENSmlItemDeleteAll:
       
   341 	        _DBG_FILE("DeleteAllItemsL"); 
       
   342 	        DeleteAllItemsL( aMessage ); aCompleteRequest = EFalse;
       
   343 	        break;
       
   344 		case ENSmlDSSyncHistory:
       
   345 	        _DBG_FILE("HasSyncHistoryL"); 
       
   346 	        HasSyncHistoryL( aMessage );
       
   347 	        break;
       
   348 		case ENSmlDSItemsAdded:
       
   349 	        _DBG_FILE("AddedItemsL"); 
       
   350 	        AddedItemsL( aMessage );
       
   351 	        break;
       
   352 		case ENSmlDSItemsDeleted:
       
   353 	        _DBG_FILE("DeletedItemsL"); 
       
   354 	        DeletedItemsL( aMessage );
       
   355 	        break;
       
   356 		case ENSmlDSItemsSofDeleted:
       
   357 	        _DBG_FILE("SoftDeleteItemsL"); 
       
   358 	        SoftDeleteItemsL( aMessage );
       
   359 	        break;
       
   360 		case ENSmlDSItemsModified:
       
   361 	        _DBG_FILE("ModifiedItemsL"); 
       
   362 	        ModifiedItemsL( aMessage );
       
   363 	        break;
       
   364 		case ENSmlDSItemsMoved:
       
   365 	        _DBG_FILE("MovedItemsL"); 
       
   366 	        MovedItemsL( aMessage );
       
   367 	        break;
       
   368 	    case ENSmlDSItemsAll:
       
   369 	    	_DBG_FILE("AllItems"); 
       
   370 	    	AllItemsL( aMessage ); aCompleteRequest = EFalse;
       
   371 	    	break;
       
   372 		case ENSmlDSResetChangeInfo:
       
   373 	        _DBG_FILE("ResetChangeInfoL"); 
       
   374 	        ResetChangeInfoL( aMessage ); aCompleteRequest = EFalse;
       
   375 	        break;
       
   376 		case ENSmlDSCommitChanges:
       
   377 	        _DBG_FILE("CommitChangesL"); 
       
   378 	        CommitChangesL( aMessage ); aCompleteRequest = EFalse;
       
   379 	        break;
       
   380 		case ENSmlDSCommitAllChanges:
       
   381 	        _DBG_FILE("CommitAllChangesL"); 
       
   382 	        CommitAllChangesL( aMessage ); aCompleteRequest = EFalse;
       
   383 	        break;
       
   384         case ENSmlDSUpdateServerId:
       
   385         	_DBG_FILE("Update server id"); 
       
   386         	UpdateServerIdL( aMessage );
       
   387         	break;
       
   388 		default:
       
   389 			_DBG_FILE("Unknown function"); 
       
   390 			PanicClient( aMessage, KErrNotSupported );
       
   391         }
       
   392 	_DBG_FILE( "CNSmlDSHostSession::DispatchMessageL(): end" );
       
   393 	}
       
   394 	
       
   395 // ------------------------------------------------------------------------------------------------
       
   396 // CNSmlDSHostSession::CNSmlDSHostSession
       
   397 // ------------------------------------------------------------------------------------------------
       
   398 CNSmlDSHostSession::CNSmlDSHostSession( CNSmlDSHostServer& aServer ) : 
       
   399     iServer( aServer )
       
   400 	{
       
   401 	_DBG_FILE( "CNSmlDSHostSession::CNSmlDSHostSession(): begin" );
       
   402 	iServer.IncSessionCount();
       
   403 	_DBG_FILE( "CNSmlDSHostSession::CNSmlDSHostSession(): end" );
       
   404 	}
       
   405 
       
   406 // ------------------------------------------------------------------------------------------------
       
   407 // CNSmlDSHostSession::ConstructL
       
   408 // ------------------------------------------------------------------------------------------------
       
   409 void CNSmlDSHostSession::ConstructL()
       
   410 	{
       
   411 	_DBG_FILE( "CNSmlDSHostSession::ConstructL(): begin" );
       
   412     iStringPool.OpenL();
       
   413 	_DBG_FILE( "CNSmlDSHostSession::ConstructL(): end" );
       
   414 	}
       
   415 	
       
   416 
       
   417 // ------------------------------------------------------------------------------------------------
       
   418 // CNSmlDSHostSession::HandleChunk
       
   419 // 
       
   420 // ------------------------------------------------------------------------------------------------
       
   421 void CNSmlDSHostSession::HandleChunk( const RMessage2& aMessage )
       
   422 	{
       
   423 	iMemPtr.iChunk.Close();
       
   424 	const TInt error = iMemPtr.iChunk.Open(aMessage, 0, EFalse);
       
   425 	}
       
   426 
       
   427 // ------------------------------------------------------------------------------------------------
       
   428 // CNSmlDSHostSession::CreateDataProvidersL
       
   429 // Creates Data Providers.
       
   430 // ------------------------------------------------------------------------------------------------
       
   431 void CNSmlDSHostSession::CreateDataProvidersL( const RMessage2& /*aMessage*/ )
       
   432 	{
       
   433 	
       
   434 	RArray<TInt> results;
       
   435     CleanupClosePushL( results );
       
   436     
       
   437     TMemPtr& ptr( MemPtrL() );
       
   438     RReadStream& readStream = ptr.ReadStreamLC();
       
   439     const TUint uidCount ( readStream.ReadInt32L() ) ;
       
   440 
       
   441     for( TUint i = 0; i < uidCount; i++ )
       
   442         {
       
   443         TSmlDataProviderId id;
       
   444         TPckg<TSmlDataProviderId> dpid( id );
       
   445         readStream.ReadL( dpid );
       
   446         TRAPD( err, CreateDataProviderL( dpid() ) );
       
   447         results.AppendL( err );
       
   448         }
       
   449     CleanupStack::PopAndDestroy(); //readStream
       
   450 
       
   451     //to chunk
       
   452     ptr.AdjustChunkIfNeededL( sizeof( TInt32 ) * ( results.Count() + 1 ) );
       
   453     RWriteStream& writeStream = ptr.WriteStreamLC();
       
   454     writeStream.WriteInt32L( results.Count() );
       
   455 
       
   456     for( TInt j = 0; j < results.Count(); j++ )
       
   457         {
       
   458         writeStream.WriteInt32L( results[j] );
       
   459         }
       
   460     writeStream.CommitL();
       
   461     CleanupStack::PopAndDestroy(2); //writeStream, results
       
   462 	}
       
   463 
       
   464 // ------------------------------------------------------------------------------------------------
       
   465 // CNSmlDSHostSession::CreateDataProvidersExceptL
       
   466 // ------------------------------------------------------------------------------------------------
       
   467 void CNSmlDSHostSession::CreateDataProvidersExceptL( const RMessage2& /*aMessage*/ )
       
   468     {
       
   469     iDataProviders.ResetAndDestroy();
       
   470     
       
   471     RArray<TSmlDataProviderId> results;
       
   472     CleanupClosePushL( results );
       
   473 
       
   474     TMemPtr& ptr( MemPtrL() );
       
   475     RReadStream& readStream = ptr.ReadStreamLC();
       
   476     
       
   477     //copying except uids to array.
       
   478     const TInt exceptIdCount ( readStream.ReadInt32L() );
       
   479     	
       
   480     RArray<TSmlDataProviderId> exceptIds( Max<TInt>( 2, exceptIdCount ) );
       
   481     CleanupClosePushL( exceptIds );
       
   482     
       
   483     for ( TInt i = 0; i < exceptIdCount; i++ )
       
   484     	{
       
   485     	TSmlDataProviderId id;
       
   486     	TPckg<TSmlDataProviderId> dpid( id );
       
   487         readStream.ReadL( dpid );
       
   488         exceptIds.AppendL( dpid() );
       
   489     	}
       
   490 
       
   491 	TUid DsUid = { KNSmlDSInterfaceUid };
       
   492 	RImplInfoPtrArray implArray;
       
   493     CleanupStack::PushL( PtrArrCleanupItemRArr( 
       
   494 			CImplementationInformation, &implArray ) );
       
   495 	REComSession::ListImplementationsL( DsUid, implArray );
       
   496 	
       
   497     for( TInt i = 0; i < implArray.Count(); i++ )
       
   498         {
       
   499         CImplementationInformation* implInfo = implArray[i];
       
   500         TSmlDataProviderId uid = implInfo->ImplementationUid().iUid;
       
   501 
       
   502         if ( exceptIds.Find( uid ) == KErrNotFound )
       
   503             {
       
   504             TRAPD( err, CreateDataProviderL( uid ) );
       
   505             if ( err == KErrNone )
       
   506                 {
       
   507                 results.AppendL( uid );
       
   508                 }
       
   509             }
       
   510         }
       
   511         
       
   512     CleanupStack::PopAndDestroy(3); //implArray, exceptIds, readStream
       
   513 
       
   514     //to chunk
       
   515     TStreamBuffers* sb = ptr.StreamBufferLC();
       
   516     sb->iWrite->WriteInt32L( results.Count() );
       
   517 
       
   518     for( TInt j = 0; j < results.Count(); j++ )
       
   519         {
       
   520         TPckgC<TSmlDataProviderId> dpid( results[j] );
       
   521         sb->iWrite->WriteL( dpid );
       
   522         }
       
   523     StreamBufferToChunkL( ptr, sb );
       
   524 	
       
   525     CleanupStack::PopAndDestroy(2); //sb, results
       
   526     }
       
   527     
       
   528 // ------------------------------------------------------------------------------------------------
       
   529 // CNSmlDSHostSession::CreateDataProviderL
       
   530 // ------------------------------------------------------------------------------------------------
       
   531 void CNSmlDSHostSession::CreateDataProviderL( TSmlDataProviderId aId )
       
   532     {
       
   533     CSmlDataProvider* dp = CSmlDataProvider::NewL( aId );
       
   534     CleanupStack::PushL( dp );
       
   535     TInt ret = iDataProviders.InsertL( dp );
       
   536     if ( ret == KErrNone )
       
   537         {
       
   538         CleanupStack::Pop( dp );    
       
   539         }
       
   540     else
       
   541         {
       
   542         CleanupStack::PopAndDestroy( dp );
       
   543         }
       
   544     }
       
   545 
       
   546 // ------------------------------------------------------------------------------------------------
       
   547 // CNSmlDSHostSession::DPInformationL
       
   548 // ------------------------------------------------------------------------------------------------
       
   549 void CNSmlDSHostSession::DPInformationL( const RMessage2& aMessage )
       
   550 	{
       
   551 	TSmlDataProviderId id( aMessage.Int0() );
       
   552 	CSmlDataProvider* dp = DataProviderL( id );
       
   553 	CNSmlDPInformation* dpi = CNSmlDPInformation::NewLC();
       
   554 	TMemPtr& ptr( MemPtrL() );
       
   555 	
       
   556 	const CSmlDataStoreFormat& storeFormat = dp->StoreFormatL();
       
   557 	dpi->SetId( id );
       
   558 	
       
   559 	CDesC8Array* mimetypes = new ( ELeave ) CDesC8ArrayFlat( storeFormat.MimeFormatCount() );
       
   560 	CleanupStack::PushL( mimetypes );
       
   561 	CDesC8Array* mimevers = new ( ELeave ) CDesC8ArrayFlat( storeFormat.MimeFormatCount() );
       
   562 	CleanupStack::PushL( mimevers );
       
   563 	
       
   564 	for ( TInt i = 0; i < storeFormat.MimeFormatCount(); i++ )
       
   565 		{
       
   566 		const CSmlMimeFormat& mf = storeFormat.MimeFormat(i);
       
   567 		mimetypes->AppendL( mf.MimeType().DesC() );
       
   568 		mimevers->AppendL( mf.MimeVersion().DesC() );
       
   569 		}
       
   570 	
       
   571 	dpi->SetMimeTypesL( mimetypes );
       
   572 	dpi->SetMimeVersL( mimevers );
       
   573 	
       
   574 	CleanupStack::Pop( 2 ); //mimetypes, mimevers
       
   575 	
       
   576 	if ( storeFormat.IsSupported( CSmlDataStoreFormat::EOptionHierarchial ) )
       
   577 		{
       
   578 		dpi->SetProtocolVersion( ESmlVersion1_2 );
       
   579 		}
       
   580 	else
       
   581 		{
       
   582 		dpi->SetProtocolVersion( ESmlVersion1_1_2 );
       
   583 		}
       
   584 	
       
   585 	TUid DsUid = { KNSmlDSInterfaceUid };
       
   586 	RImplInfoPtrArray implArray;
       
   587     CleanupStack::PushL( PtrArrCleanupItemRArr( 
       
   588 			CImplementationInformation, &implArray ) );
       
   589 	REComSession::ListImplementationsL( DsUid, implArray );
       
   590 	
       
   591     for( TInt i = 0; i < implArray.Count(); i++ )
       
   592         {
       
   593         CImplementationInformation* implInfo = implArray[i];
       
   594         if ( id == implInfo->ImplementationUid().iUid )
       
   595         	{
       
   596         	TVersion version( implInfo->Version(), 0, 0 );
       
   597         	dpi->SetVersion( version );
       
   598         	dpi->SetDisplayNameL( implInfo->DisplayName() );
       
   599         	}
       
   600         }
       
   601         
       
   602     CleanupStack::PopAndDestroy(); //implArray
       
   603     TStreamBuffers* sb = ptr.StreamBufferLC();
       
   604     dpi->ExternalizeL( *sb->iWrite );
       
   605     StreamBufferToChunkL( ptr, sb );
       
   606 	CleanupStack::PopAndDestroy( 2 ); //sb, dpi
       
   607 	}
       
   608 	
       
   609 // ------------------------------------------------------------------------------------------------
       
   610 // CNSmlDSHostSession::SupportsOperationL
       
   611 // Asks if Data Provider supports some operation.
       
   612 // ------------------------------------------------------------------------------------------------
       
   613 void CNSmlDSHostSession::SupportsOperationL( const RMessage2& aMessage )
       
   614 	{
       
   615     CSmlDataProvider* dp = DataProviderL( aMessage.Int0() );
       
   616     TMemPtr& ptr( MemPtrL() );
       
   617     TInt32 tmp(0);
       
   618     TPckg<TInt32> uidpck( tmp );
       
   619     ptr.CopyTo( uidpck );
       
   620     TUid uid( TUid::Uid( uidpck() ) );
       
   621     TBool retVal( dp->SupportsOperation( uid ) );
       
   622     TPckgC<TBool> respck( retVal );
       
   623     aMessage.WriteL( 2, respck );
       
   624 	}
       
   625 
       
   626 // ------------------------------------------------------------------------------------------------
       
   627 // CNSmlDSHostSession::StoreFormatL
       
   628 // Creates Data Store format of Data Provider.
       
   629 // ------------------------------------------------------------------------------------------------
       
   630 void CNSmlDSHostSession::StoreFormatL( const RMessage2& aMessage )
       
   631 	{
       
   632     CSmlDataProvider* dp = DataProviderL( aMessage.Int0() );
       
   633     TMemPtr& destPtr( MemPtrL() );
       
   634     
       
   635     TStreamBuffers* sb = destPtr.StreamBufferLC();
       
   636     const CSmlDataStoreFormat& dsf = dp->StoreFormatL();
       
   637     dsf.ExternalizeL( *sb->iWrite );
       
   638     StreamBufferToChunkL( destPtr, sb );
       
   639     
       
   640     CleanupStack::PopAndDestroy(); //sb
       
   641 	}
       
   642 	
       
   643 // ------------------------------------------------------------------------------------------------
       
   644 // CNSmlDSHostSession::ListStoresL
       
   645 // Creates list of Data Store names of Data Provider.
       
   646 // ------------------------------------------------------------------------------------------------	
       
   647 void CNSmlDSHostSession::ListStoresL( const RMessage2& aMessage )
       
   648 	{
       
   649     CSmlDataProvider* dp = DataProviderL( aMessage.Int0() );
       
   650     CDesCArray* stores = dp->ListStoresLC();
       
   651 
       
   652     TMemPtr& destPtr( MemPtrL() );
       
   653     TInt size( sizeof( TInt32 ) );
       
   654     
       
   655     if ( stores )
       
   656     	{
       
   657 	    for ( TInt i = 0; i < stores->Count(); i++ )
       
   658 	        {
       
   659 	        size += ( *stores )[i].Size() + sizeof( TInt32 );
       
   660 	        }
       
   661     	}
       
   662     	
       
   663     destPtr.AdjustChunkIfNeededL( size );
       
   664 	RWriteStream& wStream = destPtr.WriteStreamLC();
       
   665 	
       
   666 	if ( stores )
       
   667 		{
       
   668 		wStream.WriteInt32L( stores->Count() );
       
   669 	    for ( TInt i = 0; i < stores->Count(); i++ )
       
   670 	        {
       
   671 	        wStream.WriteInt32L( ( *stores )[i].Length() );
       
   672 	        wStream << ( *stores )[i];
       
   673 	        }
       
   674     	}
       
   675     else
       
   676     	{
       
   677     	wStream.WriteInt32L( 0 );
       
   678     	}
       
   679 
       
   680 	wStream.CommitL();
       
   681     CleanupStack::PopAndDestroy(2); //wStream, stores
       
   682 	}
       
   683 
       
   684 // ------------------------------------------------------------------------------------------------
       
   685 // CNSmlDSHostSession::DefaultStoreL
       
   686 // Creates default name for Data Store of Data Provider.
       
   687 // ------------------------------------------------------------------------------------------------	
       
   688 void CNSmlDSHostSession::DefaultStoreL( const RMessage2& aMessage )
       
   689 	{
       
   690     CSmlDataProvider* dp = DataProviderL( aMessage.Int0() );
       
   691     const TDesC& defStore = dp->DefaultStoreL();
       
   692     TMemPtr& dest( MemPtrL() );
       
   693     dest.AdjustChunkIfNeededL( defStore.Size() + sizeof( TInt32 ) + 2 );
       
   694     RWriteStream& wStream = dest.WriteStreamLC();
       
   695     wStream.WriteInt32L( defStore.Length() );
       
   696     wStream << defStore;
       
   697     wStream.CommitL();
       
   698     CleanupStack::PopAndDestroy(); //wStream
       
   699 	}
       
   700 
       
   701 // ------------------------------------------------------------------------------------------------
       
   702 // CNSmlDSHostSession::SupportedServerFiltersL
       
   703 // This method returns the set of filters that can be used to send to the Sync Partner.
       
   704 // ------------------------------------------------------------------------------------------------	
       
   705 void CNSmlDSHostSession::SupportedServerFiltersL( const RMessage2& aMessage )
       
   706 	{
       
   707     CSmlDataProvider* dp = DataProviderL( aMessage.Int0() );
       
   708     
       
   709     TBool suppOp( dp->SupportsOperation( KUidSmlSupportsUserSelectableMatchType ) );
       
   710     TSyncMLFilterMatchType matchType( ESyncMLMatchDisabled );
       
   711     if ( suppOp )
       
   712     	{
       
   713     	matchType = ESyncMLMatchNotSelected;
       
   714     	}
       
   715     	
       
   716     TPckgC<TSyncMLFilterMatchType> matchTypePckg( matchType );
       
   717     aMessage.WriteL( 2, matchTypePckg );
       
   718     
       
   719     const RPointerArray<CSyncMLFilter>& filters = dp->SupportedServerFiltersL();
       
   720     
       
   721     TMemPtr& dest( MemPtrL() );
       
   722     TStreamBuffers* sb = dest.StreamBufferLC();
       
   723     ExternalizeFiltersL( *sb->iWrite, filters );
       
   724     StreamBufferToChunkL( dest, sb );
       
   725     
       
   726     CleanupStack::PopAndDestroy(); //sb
       
   727 	}
       
   728 
       
   729 // ------------------------------------------------------------------------------------------------
       
   730 // CNSmlDSHostSession::CheckServerFiltersL
       
   731 // This method updates dynamic filters up-to-date
       
   732 // ------------------------------------------------------------------------------------------------		
       
   733 void CNSmlDSHostSession::CheckServerFiltersL( const RMessage2& aMessage )
       
   734 	{
       
   735 	CSmlDataProvider* dp = DataProviderL( aMessage.Int0() );
       
   736 	
       
   737 	RPointerArray<CSyncMLFilter> *filters = new ( ELeave ) RPointerArray<CSyncMLFilter>();
       
   738 	CleanupRPtrArrayPushL( filters );
       
   739 	
       
   740 	TMemPtr& memptr( MemPtrL() );
       
   741     RReadStream& rStream = memptr.ReadStreamLC();
       
   742     TSyncMLFilterChangeInfo changeInfo( static_cast<TSyncMLFilterChangeInfo>( rStream.ReadInt32L() ) );
       
   743     
       
   744     InternalizeFiltersL( rStream, *filters );
       
   745     CleanupStack::PopAndDestroy(); //rStream
       
   746     
       
   747     dp->CheckServerFiltersL( *filters, changeInfo );
       
   748     
       
   749     TStreamBuffers* sb = memptr.StreamBufferLC();
       
   750     sb->iWrite->WriteInt32L( changeInfo );
       
   751     ExternalizeFiltersL( *sb->iWrite, *filters );
       
   752     StreamBufferToChunkL( memptr, sb );
       
   753 
       
   754     CleanupStack::PopAndDestroy(2); //sb, filters
       
   755 	}
       
   756 	
       
   757 // ------------------------------------------------------------------------------------------------
       
   758 // CNSmlDSHostSession::CheckSupportedServerFiltersL
       
   759 // Calls CSmlDataProvider::CheckSupportedServerFiltersL.
       
   760 // ------------------------------------------------------------------------------------------------
       
   761 void CNSmlDSHostSession::CheckSupportedServerFiltersL( const RMessage2& aMessage )
       
   762 	{
       
   763 	CSmlDataProvider* dp = DataProviderL( aMessage.Int0() );
       
   764 	
       
   765 	RPointerArray<CSyncMLFilter> *filters = new ( ELeave ) RPointerArray<CSyncMLFilter>();
       
   766 	CleanupRPtrArrayPushL( filters );
       
   767 	
       
   768 	TMemPtr& memptr( MemPtrL() );
       
   769     RReadStream& rStream = memptr.ReadStreamLC();
       
   770     TSyncMLFilterChangeInfo changeInfo( static_cast<TSyncMLFilterChangeInfo>( rStream.ReadInt32L() ) );
       
   771     CSmlDataStoreFormat* dataStoreFormat = CSmlDataStoreFormat::NewLC( iStringPool, rStream );
       
   772     InternalizeFiltersL( rStream, *filters );
       
   773     
       
   774     dp->CheckSupportedServerFiltersL(*dataStoreFormat, *filters, changeInfo );    
       
   775     CleanupStack::PopAndDestroy(2); //rStream, dataStoreFormat
       
   776     
       
   777     TStreamBuffers* sb = memptr.StreamBufferLC();
       
   778     sb->iWrite->WriteInt32L( changeInfo );
       
   779     ExternalizeFiltersL( *sb->iWrite, *filters );
       
   780     StreamBufferToChunkL( memptr, sb );
       
   781 
       
   782     CleanupStack::PopAndDestroy(2); //sb, filters
       
   783 	}
       
   784 	
       
   785 // ------------------------------------------------------------------------------------------------
       
   786 // CNSmlDSHostSession::GetFiltersL
       
   787 // This method updates dynamic filters up-to-date
       
   788 // ------------------------------------------------------------------------------------------------		
       
   789 void CNSmlDSHostSession::GetFiltersL( const RMessage2& aMessage )
       
   790 	{
       
   791 	CSmlDataProvider* dp = DataProviderL( aMessage.Int0() );
       
   792 	
       
   793 	HBufC* storename = DataStoreNameLC( aMessage );
       
   794 	
       
   795 	RPointerArray<CSyncMLFilter>* filters = new ( ELeave ) RPointerArray<CSyncMLFilter>();
       
   796 	CleanupRPtrArrayPushL( filters );
       
   797 	
       
   798 	TMemPtr& memptr( MemPtrL() );
       
   799     RReadStream& rStream ( memptr.ReadStreamLC() );
       
   800     TSyncMLFilterMatchType matchType ( static_cast<TSyncMLFilterMatchType>( rStream.ReadInt32L() ) );
       
   801     InternalizeFiltersL( rStream, *filters );
       
   802     
       
   803     TBuf<64> recordMimeType;
       
   804     
       
   805     TSyncMLFilterType filterType( ESyncMLTypeInclusive );
       
   806     HBufC* query = dp->GenerateRecordFilterQueryLC( *filters, matchType, recordMimeType, filterType, *storename );
       
   807     
       
   808     RPointerArray<CSmlDataProperty> properties;
       
   809     CleanupStack::PushL( PtrArrCleanupItemRArr( 
       
   810 			CSmlDataProperty, &properties ) );
       
   811 			
       
   812 	TBuf<64> fieldMimeType;
       
   813     
       
   814     dp->GenerateFieldFilterQueryL( *filters, fieldMimeType, properties, *storename );
       
   815     
       
   816     TStreamBuffers* sb = memptr.StreamBufferLC();
       
   817     sb->iWrite->WriteInt32L( filterType );
       
   818     if ( query )
       
   819     	{
       
   820     	sb->iWrite->WriteInt32L( query->Length() );
       
   821     	(*sb->iWrite) << *query;
       
   822     	}
       
   823     else
       
   824     	{
       
   825     	sb->iWrite->WriteInt32L( 0 );
       
   826     	(*sb->iWrite) << KNullDesC;
       
   827     	}
       
   828     
       
   829     sb->iWrite->WriteInt32L( recordMimeType.Length() );
       
   830     (*sb->iWrite) << recordMimeType;
       
   831     sb->iWrite->WriteInt32L( fieldMimeType.Length() );
       
   832     (*sb->iWrite) << fieldMimeType;
       
   833     
       
   834     sb->iWrite->WriteInt32L( properties.Count() );
       
   835     for ( TInt i = 0; i < properties.Count(); i++ )
       
   836     	{
       
   837     	properties[i]->ExternalizeL( *sb->iWrite );
       
   838     	}
       
   839 
       
   840 	StreamBufferToChunkL( memptr, sb );
       
   841     
       
   842     CleanupStack::PopAndDestroy(6); //sb, properties, query, rStream, filters, storename
       
   843 	
       
   844 	}
       
   845 
       
   846 // ------------------------------------------------------------------------------------------------
       
   847 // CNSmlDSHostSession::OpenL
       
   848 // Opens the data store specified by aStoreName.
       
   849 // ------------------------------------------------------------------------------------------------	
       
   850 void CNSmlDSHostSession::OpenL( const RMessage2& aMessage )
       
   851     {
       
   852     if ( HasDataStoreL( aMessage ) )
       
   853     	{
       
   854     	User::Leave( KErrAlreadyExists );
       
   855     	}
       
   856     
       
   857     CNSmlDSAsyncCallBackForOpen* p = new ( ELeave ) CNSmlDSAsyncCallBackForOpen( 
       
   858     	this, aMessage, OpenFinishedL );
       
   859     CleanupStack::PushL( p );
       
   860     
       
   861     p->iDpi = DataProviderItemL( aMessage.Int0() );
       
   862     CSmlDataProvider* dp = p->iDpi->iDataprovider;
       
   863     TMemPtr& memptr( MemPtrL() );
       
   864     RReadStream& rStream = memptr.ReadStreamLC();
       
   865     
       
   866     //server id
       
   867     TInt tempLength = rStream.ReadUint32L();
       
   868 	p->iServerId = HBufC::NewL( rStream, tempLength );
       
   869 	
       
   870 	//remotedb
       
   871 	tempLength = rStream.ReadUint32L();
       
   872 	p->iRemoteDB = HBufC::NewL( rStream, tempLength );
       
   873 	
       
   874 	CleanupStack::PopAndDestroy(); //rStream
       
   875     
       
   876     //Localdb same as storename 
       
   877     HBufC* storeName = DataStoreNameLC( aMessage );
       
   878     
       
   879     CNSmlAdapterLog* adpLog = CNSmlAdapterLog::NewL();
       
   880     CleanupStack::PushL( adpLog );
       
   881     
       
   882     adpLog->SetAdapterLogKeyL( dp->Identifier(), *storeName, *p->iServerId, *p->iRemoteDB );
       
   883     CSmlDataStore* ds = dp->NewStoreInstanceLC();
       
   884     p->iDSItem = iDataProviders.InsertL( p->iDpi, ds, storeName );
       
   885     p->iDSItem->iAdpLog = adpLog;
       
   886     CleanupStack::Pop( 3 ); //ds, adpLog, storeName. iDataProviders takes the ownership
       
   887     
       
   888     p->CallDSAsyncLC().OpenL( *storeName, *adpLog, p->iStatus );
       
   889     
       
   890     CleanupStack::Pop( 2 ); //CallDSAsyncLC, p
       
   891     }
       
   892 
       
   893 // ------------------------------------------------------------------------------------------------
       
   894 // CNSmlDSHostSession::OpenFinished
       
   895 // called when OpenL request is finished.
       
   896 // Note! when aOperation is CNSmlDSAsyncCallBack::ECanceled or CNSmlDSAsyncCallBack::EFree, 
       
   897 // aDSAO->iDSItem might be NULL.
       
   898 // ------------------------------------------------------------------------------------------------	
       
   899 TInt CNSmlDSHostSession::OpenFinishedL( CNSmlDSAsyncCallBack* aDSAO, TCallBackOperation aOperation )
       
   900     {
       
   901     CNSmlDSAsyncCallBackForOpen* p = static_cast<CNSmlDSAsyncCallBackForOpen*> ( aDSAO );
       
   902     TInt err( aDSAO->iStatus.Int() );
       
   903     
       
   904     switch( aOperation )
       
   905     	{
       
   906 		case CNSmlDSAsyncCallBack::EFinished:
       
   907 			if ( err == KErrNone )
       
   908 				{
       
   909 				aDSAO->iDSItem->SetOpened();
       
   910 				}
       
   911 			else
       
   912 				{
       
   913 				//calling recursively
       
   914 				OpenFinishedL( aDSAO, CNSmlDSAsyncCallBack::ECanceled );
       
   915 				}
       
   916 	    	break;
       
   917 	    case CNSmlDSAsyncCallBack::ECanceled:
       
   918 	    	iDataProviders.Remove( p->iDpi, 
       
   919 	    		p->iDSItem ); //aDSAO->iDSItem might be NULL, but remove checks that.
       
   920 	    	err = KErrNone;
       
   921 	    	break;
       
   922 	    case CNSmlDSAsyncCallBack::EFree:
       
   923 			delete p->iServerId;
       
   924 			p->iServerId = NULL;
       
   925 			delete p->iRemoteDB;
       
   926 			p->iRemoteDB = NULL;
       
   927 			
       
   928 	    	aDSAO->iPtr = NULL;
       
   929 	    	break;
       
   930 		default:
       
   931 			User::Leave( KErrUnknown );
       
   932     	};
       
   933 
       
   934     return err;
       
   935     }
       
   936 
       
   937 // ------------------------------------------------------------------------------------------------
       
   938 // CNSmlDSHostSession::CancelRequest
       
   939 // Cancel the current asynchronous request.
       
   940 // ------------------------------------------------------------------------------------------------	
       
   941 void CNSmlDSHostSession::CancelRequestL( const RMessage2& aMessage )
       
   942 	{
       
   943     TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
       
   944     CNSmlDSAsyncRequestHandler* dsao = dsi->iDSAO;
       
   945     //Note! it is possible, that after deleting dsao, 
       
   946     //dsi may not exist anymore.
       
   947     dsi = NULL;
       
   948     
       
   949     if ( dsao )
       
   950         {
       
   951     	delete dsao;
       
   952     	dsao = NULL;
       
   953         }
       
   954 	}
       
   955 
       
   956 // ------------------------------------------------------------------------------------------------
       
   957 // CNSmlDSHostSession::BeginTransaction
       
   958 // Starts the transaction mode.
       
   959 // ------------------------------------------------------------------------------------------------	
       
   960 void CNSmlDSHostSession::BeginTransactionL( const RMessage2& aMessage )
       
   961 	{
       
   962     TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
       
   963 
       
   964     CSmlDataStore* ds = dsi->iDataStore;
       
   965     ds->BeginTransactionL();
       
   966     dsi->iHostMode = ENSmlTransactionMode;
       
   967 	}
       
   968 
       
   969 // ------------------------------------------------------------------------------------------------
       
   970 // CNSmlDSHostSession::CommitTransaction
       
   971 // Method will be called at the end of a successful transaction.
       
   972 // ------------------------------------------------------------------------------------------------	
       
   973 void CNSmlDSHostSession::CommitTransactionL( const RMessage2& aMessage )
       
   974 	{
       
   975     TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
       
   976    
       
   977     CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( this, dsi, aMessage );
       
   978     CleanupStack::PushL( dsao );
       
   979     dsao->CallDSAsyncLC().CommitTransactionL( dsao->iStatus );
       
   980     dsi->iHostMode = ENSmlNormalMode;
       
   981     CleanupStack::Pop( 2 ); //CallDSAsyncLC(), dsao
       
   982 	}
       
   983 
       
   984 // ------------------------------------------------------------------------------------------------
       
   985 // CNSmlDSHostSession::RevertTransaction
       
   986 // Method will be called to abort an ongoing transaction.
       
   987 // ------------------------------------------------------------------------------------------------	
       
   988 void CNSmlDSHostSession::RevertTransactionL( const RMessage2& aMessage )
       
   989 	{
       
   990     TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
       
   991     
       
   992     CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( this, dsi, aMessage );
       
   993     CleanupStack::PushL( dsao );
       
   994     dsao->CallDSAsyncLC().RevertTransaction( dsao->iStatus );
       
   995     dsi->iHostMode = ENSmlNormalMode;
       
   996     CleanupStack::Pop( 2 ); //CallDSAsyncLC(), dsao
       
   997 	}
       
   998 
       
   999 // ------------------------------------------------------------------------------------------------
       
  1000 // CNSmlDSHostSession::BeginBatch
       
  1001 // Starts the batch mode.
       
  1002 // ------------------------------------------------------------------------------------------------	
       
  1003 void CNSmlDSHostSession::BeginBatchL( const RMessage2& aMessage )
       
  1004 	{
       
  1005     TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
       
  1006 
       
  1007     RBatchItemUidArray* biua= new ( ELeave ) RBatchItemUidArray();
       
  1008     CleanupRPtrArrayPushL( biua );
       
  1009     CSmlDataStore* ds = dsi->iDataStore;
       
  1010     ds->BeginBatchL();
       
  1011     dsi->iHostMode = ENSmlBatchMode;
       
  1012     dsi->iBatchItemUids = biua;
       
  1013     CleanupStack::Pop( biua );
       
  1014 	}
       
  1015 	
       
  1016 // ------------------------------------------------------------------------------------------------
       
  1017 // CNSmlDSHostSession::CommitBatchL
       
  1018 // Method will be called at the end of the batch mode.
       
  1019 // ------------------------------------------------------------------------------------------------	
       
  1020 void CNSmlDSHostSession::CommitBatchL( const RMessage2& aMessage )
       
  1021 	{
       
  1022     TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
       
  1023    
       
  1024     RArray<TInt>* resultArray = new ( ELeave ) RArray<TInt>;
       
  1025     CleanupStack::PushL( resultArray );
       
  1026     CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( 
       
  1027     	this, dsi, aMessage, CommitBatchRequestFinishedL, resultArray );
       
  1028     CleanupStack::Pop( resultArray ); //dsao takes ownership
       
  1029     
       
  1030     CleanupStack::PushL( dsao );
       
  1031     dsao->CallDSAsyncLC().CommitBatchL( *resultArray, dsao->iStatus );
       
  1032     CleanupStack::Pop( 2 ); //CallDSAsyncLC(), dsao
       
  1033 	}
       
  1034 
       
  1035 // ------------------------------------------------------------------------------------------------
       
  1036 // CNSmlDSHostSession::CommitBatchRequestFinished
       
  1037 // Called when commitBatchL request is finished
       
  1038 // ------------------------------------------------------------------------------------------------	
       
  1039 TInt CNSmlDSHostSession::CommitBatchRequestFinishedL( CNSmlDSAsyncCallBack* aDSAO, 
       
  1040 	TCallBackOperation aOperation )
       
  1041     {
       
  1042     TInt status ( aDSAO->iStatus.Int() );
       
  1043     TNSmlDSDataStoreElement* dsi = aDSAO->iDSItem;
       
  1044     RArray<TInt>* resultArray = reinterpret_cast<RArray<TInt>*>( aDSAO->iPtr );
       
  1045     
       
  1046     switch( aOperation )
       
  1047     	{
       
  1048 		case CNSmlDSAsyncCallBack::EFinished:
       
  1049 			dsi->iHostMode = ENSmlNormalMode;
       
  1050 			if ( status == KErrNone )
       
  1051 				{
       
  1052 		        TMemPtr& dest( MemPtrL() );
       
  1053 		        TStreamBuffers* sb = dest.StreamBufferLC();
       
  1054 		        
       
  1055 		        // write results
       
  1056 				sb->iWrite->WriteInt32L( resultArray->Count() );
       
  1057 				for ( TInt i = 0; i < resultArray->Count(); i++ )
       
  1058 					{
       
  1059 					sb->iWrite->WriteInt32L( ( *resultArray )[i] );
       
  1060 					}
       
  1061 				// write uids that are added.
       
  1062 				if ( dsi->iBatchItemUids )
       
  1063 					{
       
  1064 					sb->iWrite->WriteInt32L( dsi->iBatchItemUids->Count() );
       
  1065 					for ( TInt i = 0; i < dsi->iBatchItemUids->Count(); i++ )
       
  1066 						{
       
  1067 						TPckgC<TSmlDbItemUid> uid( *( *dsi->iBatchItemUids )[i] );
       
  1068 						sb->iWrite->WriteL( uid );
       
  1069 						}
       
  1070 					}
       
  1071 				else
       
  1072 					{
       
  1073 					sb->iWrite->WriteInt32L( 0 );
       
  1074 					}
       
  1075 				StreamBufferToChunkL( dest, sb );
       
  1076 				CleanupStack::PopAndDestroy(); //sb
       
  1077 		        status = aDSAO->iStatus.Int();
       
  1078 				}
       
  1079 	    	break;
       
  1080 	    case CNSmlDSAsyncCallBack::ECanceled:
       
  1081 	    	break;
       
  1082 	    case CNSmlDSAsyncCallBack::EFree:
       
  1083 	    	dsi->FreeBatchItemArray();
       
  1084 	    	resultArray->Close();
       
  1085 	    	delete resultArray;
       
  1086 	    	aDSAO->iPtr = NULL;
       
  1087 	    	break;
       
  1088 		default:
       
  1089 			User::Leave( KErrUnknown );
       
  1090     	}
       
  1091 
       
  1092     return status;
       
  1093     }
       
  1094 
       
  1095 // ------------------------------------------------------------------------------------------------
       
  1096 // CNSmlDSHostSession::CancelBatchL
       
  1097 // Method will be called to abort an ongoing batch mode.
       
  1098 // ------------------------------------------------------------------------------------------------	
       
  1099 void CNSmlDSHostSession::CancelBatchL( const RMessage2& aMessage )
       
  1100 	{
       
  1101     TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
       
  1102 
       
  1103     CSmlDataStore* ds = dsi->iDataStore;
       
  1104     ds->CancelBatch();
       
  1105     dsi->iHostMode = ENSmlNormalMode;
       
  1106     dsi->FreeBatchItemArray();
       
  1107 	}
       
  1108 	
       
  1109 // ------------------------------------------------------------------------------------------------
       
  1110 // CNSmlDSHostSession::SetRemoteDataStoreFormatL
       
  1111 // Sets the Sync Partner Data Format.
       
  1112 // ------------------------------------------------------------------------------------------------	
       
  1113 void CNSmlDSHostSession::SetRemoteDataStoreFormatL( const RMessage2& aMessage )
       
  1114 	{
       
  1115 	TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
       
  1116     CSmlDataStore* ds = dsi->iDataStore;
       
  1117     TMemPtr& ptr( MemPtrL() );
       
  1118     RReadStream& readStream = ptr.ReadStreamLC();
       
  1119 
       
  1120     CSmlDataStoreFormat* serverDataStoreFormat = CSmlDataStoreFormat::NewLC( iStringPool, readStream );
       
  1121     ds->SetRemoteStoreFormatL( *serverDataStoreFormat );
       
  1122     dsi->setStoreFormat( serverDataStoreFormat );
       
  1123     CleanupStack::Pop(); //serverDataStoreFormat
       
  1124     CleanupStack::PopAndDestroy(); //readStream
       
  1125 	}
       
  1126 	
       
  1127 // ------------------------------------------------------------------------------------------------
       
  1128 // CNSmlDSHostSession::SetRemoteMaxObjectSizeL
       
  1129 // Sets the SyncML server Sync Partner maximum object size.
       
  1130 // ------------------------------------------------------------------------------------------------	
       
  1131 void CNSmlDSHostSession::SetRemoteMaxObjectSizeL( const RMessage2& aMessage )
       
  1132 	{
       
  1133     CSmlDataStore* ds = DataStoreL( aMessage );
       
  1134     
       
  1135     TMemPtr& ptr( MemPtrL() );
       
  1136     TInt tmp(0);
       
  1137     TPckg<TInt> maxObjectSize( tmp );
       
  1138     ptr.CopyTo( maxObjectSize );
       
  1139     ds->SetRemoteMaxObjectSize( maxObjectSize() );
       
  1140 	}
       
  1141 	
       
  1142 // ------------------------------------------------------------------------------------------------
       
  1143 // CNSmlDSHostSession::MaxObjectSizeL
       
  1144 // Gets the Data Store maximum object size which is reported to the SyncML partner.
       
  1145 // ------------------------------------------------------------------------------------------------	
       
  1146 void CNSmlDSHostSession::MaxObjectSizeL( const RMessage2& aMessage )
       
  1147 	{
       
  1148     CSmlDataStore* ds = DataStoreL( aMessage );
       
  1149 
       
  1150     TInt maxObjectSize = ds->MaxObjectSize();
       
  1151     TPckgC<TInt> pck( maxObjectSize );
       
  1152     aMessage.WriteL( 2, pck );
       
  1153 	}	
       
  1154 
       
  1155 // ------------------------------------------------------------------------------------------------
       
  1156 // CNSmlDSHostSession::OpenItemL
       
  1157 // Opens item at Data Store.
       
  1158 // ------------------------------------------------------------------------------------------------	
       
  1159 void CNSmlDSHostSession::OpenItemL( const RMessage2& aMessage )
       
  1160     {
       
  1161     TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
       
  1162     CNSmlServerDSHostItem* dshi = DataStoreItemParamsLC();
       
  1163     
       
  1164     CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( 
       
  1165     	this, dsi, aMessage, OpenItemRequestFinishedL, dshi );
       
  1166     CleanupStack::Pop( dshi ); //dsao takes ownership
       
  1167     CleanupStack::PushL( dsao );
       
  1168     
       
  1169     dsao->CallDSAsyncLC().OpenItemL( 
       
  1170     	dshi->Uid(), dshi->FieldChange(), dshi->Size(), dshi->ParentUid(), 
       
  1171     	dshi->iMimeTypePtr, dshi->iMimeVerPtr, 
       
  1172     	dsao->iStatus );
       
  1173   
       
  1174     CleanupStack::Pop(2); //CallDSAsyncLC(), dsao
       
  1175     }
       
  1176 
       
  1177 // ------------------------------------------------------------------------------------------------
       
  1178 // CNSmlDSHostSession::OpenItemRequestFinishedL
       
  1179 //Called when OpenItemL request is finished.
       
  1180 // ------------------------------------------------------------------------------------------------
       
  1181 TInt CNSmlDSHostSession::OpenItemRequestFinishedL( CNSmlDSAsyncCallBack* aDSAO, 
       
  1182 	TCallBackOperation aOperation )
       
  1183     {
       
  1184     TInt status( aDSAO->iStatus.Int() );
       
  1185     CNSmlServerDSHostItem* dshi = reinterpret_cast<CNSmlServerDSHostItem*>( aDSAO->iPtr );
       
  1186     
       
  1187     switch( aOperation )
       
  1188     	{
       
  1189 		case CNSmlDSAsyncCallBack::EFinished:
       
  1190 			if ( status == KErrNone )
       
  1191 				{
       
  1192 				dshi->SetMimeTypeL( dshi->iMimeTypePtr );
       
  1193 	    		dshi->SetMimeVerL( dshi->iMimeVerPtr );
       
  1194 	    		WriteDataStoreItemParamsL( dshi );
       
  1195 				}
       
  1196 	    	break;
       
  1197 	    case CNSmlDSAsyncCallBack::ECanceled:
       
  1198 	    	status = KErrNone;
       
  1199 	    	break;
       
  1200 	    case CNSmlDSAsyncCallBack::EFree:
       
  1201 	    	delete dshi;
       
  1202 	    	aDSAO->iPtr = NULL;
       
  1203 	    	break;
       
  1204 		default:
       
  1205 			User::Leave( KErrUnknown );
       
  1206     	}
       
  1207 
       
  1208     return status;
       
  1209     }
       
  1210 
       
  1211 // ------------------------------------------------------------------------------------------------
       
  1212 // CNSmlDSHostSession::DataStoreItemParamsLC
       
  1213 // ------------------------------------------------------------------------------------------------
       
  1214 CNSmlDSHostSession::CNSmlServerDSHostItem* CNSmlDSHostSession::DataStoreItemParamsLC()
       
  1215     {
       
  1216     CNSmlServerDSHostItem* dshi = CNSmlServerDSHostItem::NewLC();
       
  1217     TMemPtr& ptr( MemPtrL() );
       
  1218     RReadStream& mrs = ptr.ReadStreamLC();
       
  1219     
       
  1220     dshi->InternalizeL( mrs );
       
  1221     
       
  1222     CleanupStack::PopAndDestroy(); //mrs
       
  1223     return dshi;
       
  1224     }
       
  1225 
       
  1226 // ------------------------------------------------------------------------------------------------
       
  1227 // CNSmlDSHostSession::WriteDataStoreItemParamsL
       
  1228 // ------------------------------------------------------------------------------------------------
       
  1229 void CNSmlDSHostSession::WriteDataStoreItemParamsL( CNSmlDSHostItem* dshi )
       
  1230     {
       
  1231     TMemPtr& ptr( MemPtrL() );
       
  1232     RWriteStream& mws = ptr.WriteStreamLC();
       
  1233     dshi->ExternalizeL( mws );
       
  1234     mws.CommitL();
       
  1235     CleanupStack::PopAndDestroy(); //mws
       
  1236     }
       
  1237 
       
  1238 // ------------------------------------------------------------------------------------------------
       
  1239 // CNSmlDSHostSession::CreateItemL
       
  1240 // Creates new item to Data Store.
       
  1241 // ------------------------------------------------------------------------------------------------	
       
  1242 void CNSmlDSHostSession::CreateItemL( const RMessage2& aMessage )
       
  1243     {
       
  1244     TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
       
  1245     CNSmlServerDSHostItem* dshi = DataStoreItemParamsLC();
       
  1246     CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( 
       
  1247     	this, dsi, aMessage, CreateItemRequestFinishedL, dshi );
       
  1248     CleanupStack::Pop( dshi ); //dsao takes ownership
       
  1249     CleanupStack::PushL( dsao );
       
  1250     
       
  1251     TSmlDbItemUid* uid = NULL;
       
  1252 
       
  1253     if ( dsi->iHostMode == ENSmlBatchMode )
       
  1254         {
       
  1255         uid = new ( ELeave ) TSmlDbItemUid();
       
  1256         CleanupStack::PushL( uid );
       
  1257         dsi->iBatchItemUids->AppendL( uid );
       
  1258         CleanupStack::Pop( uid );
       
  1259         }
       
  1260     else{
       
  1261         uid = &dsi->iCreatedUid;
       
  1262         }
       
  1263         
       
  1264     *uid = dshi->Uid();
       
  1265     dshi->iCreateItemUid = uid;
       
  1266 
       
  1267     dsao->CallDSAsyncLC().CreateItemL(
       
  1268     	*uid, dshi->Size(), dshi->ParentUid(), *dshi->MimeType(), 
       
  1269     	*dshi->MimeVer(), dsao->iStatus );
       
  1270     	
       
  1271     CleanupStack::Pop( 2 ); //CallDSAsyncLC(), dsao
       
  1272     }
       
  1273 
       
  1274 // ------------------------------------------------------------------------------------------------
       
  1275 // CNSmlDSHostSession::CreateItemRequestFinishedL
       
  1276 // Called when CreateItemL request is finished.
       
  1277 // ------------------------------------------------------------------------------------------------
       
  1278 TInt CNSmlDSHostSession::CreateItemRequestFinishedL( CNSmlDSAsyncCallBack* aDSAO, 
       
  1279 	TCallBackOperation aOperation )
       
  1280     {
       
  1281     TInt status( aDSAO->iStatus.Int() );
       
  1282     CNSmlServerDSHostItem* dshi = reinterpret_cast<CNSmlServerDSHostItem*>( aDSAO->iPtr );
       
  1283     
       
  1284     switch( aOperation )
       
  1285     	{
       
  1286 		case CNSmlDSAsyncCallBack::EFinished:
       
  1287 			if ( status == KErrNone )
       
  1288 				{
       
  1289 				dshi->SetUid( *dshi->iCreateItemUid );
       
  1290 				WriteDataStoreItemParamsL( dshi );
       
  1291 				}
       
  1292 	    	break;
       
  1293 	    case CNSmlDSAsyncCallBack::ECanceled:
       
  1294 	    	status = KErrNone;
       
  1295 	    	break;
       
  1296 	    case CNSmlDSAsyncCallBack::EFree:
       
  1297 	    	delete dshi;
       
  1298 	    	aDSAO->iPtr = NULL;
       
  1299 	    	break;
       
  1300 		default:
       
  1301 			User::Leave( KErrUnknown );
       
  1302     	};
       
  1303 
       
  1304     return status;
       
  1305     }
       
  1306 	
       
  1307 // ------------------------------------------------------------------------------------------------
       
  1308 // CNSmlDSHostSession::ReplaceItemL
       
  1309 // Replaces old item at Data Store.
       
  1310 // ------------------------------------------------------------------------------------------------	
       
  1311 void CNSmlDSHostSession::ReplaceItemL( const RMessage2& aMessage )
       
  1312     {
       
  1313     TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
       
  1314     CNSmlDSHostItem* dshi = DataStoreItemParamsLC();
       
  1315     CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( this, dsi, aMessage );
       
  1316     CleanupStack::PushL( dsao );
       
  1317     dsao->CallDSAsyncLC().ReplaceItemL( 
       
  1318     	dshi->Uid(), dshi->Size(), dshi->ParentUid(), dshi->FieldChange(), dsao->iStatus );
       
  1319     CleanupStack::Pop( 2 ); //CallDSAsyncLC(), dsao
       
  1320     CleanupStack::PopAndDestroy(); //dshi
       
  1321     }
       
  1322 
       
  1323 // ------------------------------------------------------------------------------------------------
       
  1324 // CNSmlDSHostSession::ReadItemL
       
  1325 // Reads data from item at Data Store. Item must be opened before this method can be called.
       
  1326 // This method is called until aBuffer is not used totally or method leaves with KErrEof.
       
  1327 // ------------------------------------------------------------------------------------------------	
       
  1328 void CNSmlDSHostSession::ReadItemL( const RMessage2& aMessage )
       
  1329 	{
       
  1330     CSmlDataStore* ds = DataStoreL( aMessage );
       
  1331     TMemPtr& mem( MemPtrL() );
       
  1332     TInt32 sizeBytes(0);
       
  1333     
       
  1334     TPckg<TInt32> bytesToRead( sizeBytes );
       
  1335     mem.CopyTo( bytesToRead );
       
  1336     
       
  1337     TInt chunkSize( mem.Size() - sizeof( TInt ) );
       
  1338     
       
  1339     if ( sizeBytes >  chunkSize )
       
  1340     	{
       
  1341     	sizeBytes = chunkSize;
       
  1342     	}
       
  1343     
       
  1344     TPtr8 ptr( mem.Mid( sizeof( TInt ), sizeBytes ) );
       
  1345     ds->ReadItemL( ptr );
       
  1346     
       
  1347     TPckgC<TInt32> ReadBytes( ptr.Size() );
       
  1348     mem.Des().Copy( ReadBytes );
       
  1349 	}
       
  1350 
       
  1351 // ------------------------------------------------------------------------------------------------
       
  1352 // CNSmlDSHostSession::WriteItemL
       
  1353 // Writes data to item to Data Provider. CreateItemL or ReplaceItemL method must be called before
       
  1354 // this method can be called. This method is called until all data to current item is written.
       
  1355 // ------------------------------------------------------------------------------------------------	
       
  1356 void CNSmlDSHostSession::WriteItemL( const RMessage2& aMessage )
       
  1357 	{
       
  1358     CSmlDataStore* ds = DataStoreL( aMessage );
       
  1359     TMemPtr& mem( MemPtrL() );
       
  1360     
       
  1361     TInt32 tmp(0);
       
  1362     TPckg<TInt32> bytesToWrite( tmp );
       
  1363     mem.CopyTo( bytesToWrite );
       
  1364     
       
  1365     TPtr8 ptr( mem.Mid( 4, bytesToWrite() ) );
       
  1366     ptr.SetLength( ptr.MaxLength() );
       
  1367     
       
  1368     ds->WriteItemL( ptr );
       
  1369     
       
  1370     TPckgC<TInt32> bytesWritten( ptr.Size() );
       
  1371     mem.Des().Copy( bytesWritten );
       
  1372 	}
       
  1373 	
       
  1374 // ------------------------------------------------------------------------------------------------
       
  1375 // CNSmlDSHostSession::CommitItemL
       
  1376 // After item is written to Data Provider it can be saved to the Data Store.
       
  1377 // This method can be called just after WriteItemL method.
       
  1378 // ------------------------------------------------------------------------------------------------	
       
  1379 void CNSmlDSHostSession::CommitItemL( const RMessage2& aMessage )
       
  1380 	{
       
  1381     TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
       
  1382 
       
  1383     CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( 
       
  1384     	this, dsi, aMessage, CommitItemRequestFinishedL );
       
  1385     CleanupStack::PushL( dsao );
       
  1386     dsao->CallDSAsyncLC().CommitItemL( dsao->iStatus );
       
  1387     CleanupStack::Pop(2); //CallDSAsyncLC, dsao
       
  1388 	}
       
  1389 
       
  1390 // ------------------------------------------------------------------------------------------------
       
  1391 // CNSmlDSHostSession::CommitItemRequestFinishedL
       
  1392 // Called when CommitItemL request is finished.
       
  1393 // ------------------------------------------------------------------------------------------------
       
  1394 TInt CNSmlDSHostSession::CommitItemRequestFinishedL( CNSmlDSAsyncCallBack* aDSAO, 
       
  1395 	TCallBackOperation aOperation )
       
  1396     {
       
  1397     TInt status( aDSAO->iStatus.Int() );
       
  1398     
       
  1399     switch( aOperation )
       
  1400     	{
       
  1401 		case CNSmlDSAsyncCallBack::EFinished:
       
  1402 			if ( status == KErrNone )
       
  1403 				{
       
  1404 				TNSmlDSDataStoreElement* dsi = aDSAO->iDSItem;
       
  1405 
       
  1406 	    		if ( dsi->iHostMode != ENSmlBatchMode )
       
  1407 	    	    	{
       
  1408 	        		TSmlDbItemUid uid = dsi->iCreatedUid;
       
  1409 	        		TPckgC<TSmlDbItemUid> pck( uid );
       
  1410 	        		aDSAO->iMessage.WriteL( 2, pck );
       
  1411 		        	}
       
  1412 				}
       
  1413 	    	break;
       
  1414 	    case CNSmlDSAsyncCallBack::ECanceled:
       
  1415 	    	status = KErrNone;
       
  1416 	    	break;
       
  1417 	    case CNSmlDSAsyncCallBack::EFree:
       
  1418 	    	break;
       
  1419 		default:
       
  1420 			User::Leave( KErrUnknown );
       
  1421     	}
       
  1422 
       
  1423     return status;
       
  1424     }
       
  1425 	
       
  1426 // ------------------------------------------------------------------------------------------------
       
  1427 // CNSmlDSHostSession::CloseItem
       
  1428 // Closes opened item.
       
  1429 // ------------------------------------------------------------------------------------------------	
       
  1430 void CNSmlDSHostSession::CloseItemL( const RMessage2& aMessage )
       
  1431 	{
       
  1432     DataStoreL( aMessage )->CloseItem();
       
  1433 	}
       
  1434 	
       
  1435 // ------------------------------------------------------------------------------------------------
       
  1436 // CNSmlDSHostSession::MoveItemL
       
  1437 // Moves item to new location.
       
  1438 // ------------------------------------------------------------------------------------------------	
       
  1439 void CNSmlDSHostSession::MoveItemL( const RMessage2& aMessage )
       
  1440 	{
       
  1441     TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );    
       
  1442     
       
  1443     CNSmlDSHostItem* dshi = DataStoreItemParamsLC();
       
  1444     CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( this, dsi, aMessage );
       
  1445     CleanupStack::PushL( dsao );
       
  1446     dsao->CallDSAsyncLC().MoveItemL( dshi->Uid(), dshi->ParentUid(), dsao->iStatus );
       
  1447     CleanupStack::Pop(2); //CallDSAsyncLC(), dsao
       
  1448     CleanupStack::PopAndDestroy(); //dshi
       
  1449 	}
       
  1450 		
       
  1451 // ------------------------------------------------------------------------------------------------
       
  1452 // CNSmlDSHostSession::DeleteItemL
       
  1453 // Deletes one item at Data Store permanently.
       
  1454 // ------------------------------------------------------------------------------------------------	
       
  1455 void CNSmlDSHostSession::DeleteItemL( const RMessage2& aMessage )
       
  1456 	{
       
  1457     TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
       
  1458     
       
  1459     CNSmlDSHostItem* dshi = DataStoreItemParamsLC();
       
  1460     CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( this, dsi, aMessage );
       
  1461     CleanupStack::PushL( dsao );
       
  1462     dsao->CallDSAsyncLC().DeleteItemL( dshi->Uid(), dsao->iStatus );
       
  1463     CleanupStack::Pop(2); //CallDSAsyncLC(), dsao
       
  1464     CleanupStack::PopAndDestroy(); //dshi
       
  1465 	}
       
  1466 	
       
  1467 // ------------------------------------------------------------------------------------------------
       
  1468 // CNSmlDSHostSession::SoftDeleteItemL
       
  1469 // Soft deletes one item at Data Store.
       
  1470 // ------------------------------------------------------------------------------------------------	
       
  1471 void CNSmlDSHostSession::SoftDeleteItemL( const RMessage2& aMessage )
       
  1472 	{
       
  1473     TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
       
  1474     
       
  1475     CNSmlDSHostItem* dshi = DataStoreItemParamsLC();
       
  1476     CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( this, dsi, aMessage );
       
  1477     CleanupStack::PushL( dsao );
       
  1478     dsao->CallDSAsyncLC().SoftDeleteItemL( dshi->Uid(), dsao->iStatus );
       
  1479     CleanupStack::Pop(2); //CallDSAsyncLC(), dsao
       
  1480     CleanupStack::PopAndDestroy(); //dshi
       
  1481 	}
       
  1482 	
       
  1483 // ------------------------------------------------------------------------------------------------
       
  1484 // CNSmlDSHostSession::DeleteAllItemsL
       
  1485 // Deletes all items at Data Store permanently.
       
  1486 // ------------------------------------------------------------------------------------------------	
       
  1487 void CNSmlDSHostSession::DeleteAllItemsL( const RMessage2& aMessage )
       
  1488 	{
       
  1489     TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
       
  1490     CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( this, dsi, aMessage );
       
  1491     CleanupStack::PushL( dsao );
       
  1492     dsao->CallDSAsyncLC().DeleteAllItemsL( dsao->iStatus );
       
  1493     CleanupStack::Pop(2); //CallDSAsyncLC(), dsao
       
  1494 	}
       
  1495 
       
  1496 // ------------------------------------------------------------------------------------------------
       
  1497 // CNSmlDSHostSession::HasSyncHistoryL
       
  1498 // Checks if the Data Store has sync history. If not then slow sync is proposed to Sync Partner.
       
  1499 // ------------------------------------------------------------------------------------------------	
       
  1500 void CNSmlDSHostSession::HasSyncHistoryL( const RMessage2& aMessage )
       
  1501 	{
       
  1502     CSmlDataStore* ds = DataStoreL( aMessage );
       
  1503     TPckgC<TBool> pck( TBool( ds->HasSyncHistory() ) );
       
  1504     aMessage.WriteL( 2, pck );
       
  1505 	}
       
  1506 	
       
  1507 // ------------------------------------------------------------------------------------------------
       
  1508 // CNSmlDSHostSession::AddedItemsL
       
  1509 // The Data Provider returns UIDs of items that are added after previous synchronization.
       
  1510 // ------------------------------------------------------------------------------------------------	
       
  1511 void CNSmlDSHostSession::AddedItemsL( const RMessage2& aMessage )
       
  1512 	{
       
  1513     CSmlDataStore* ds = DataStoreL( aMessage );
       
  1514     
       
  1515     const MSmlDataItemUidSet& dius = ds->AddedItems();
       
  1516     RNSmlDbItemModificationSet dbims;
       
  1517     CleanupClosePushL( dbims );
       
  1518     
       
  1519     dbims.AddGroupL( dius, TNSmlDbItemModification::ENSmlDbItemAdd );
       
  1520     
       
  1521     TMemPtr& dest( MemPtrL() );
       
  1522     dest.AdjustChunkIfNeededL( dbims.StreamSize() );
       
  1523     RWriteStream& wStream = dest.WriteStreamLC();
       
  1524 	dbims.ExternalizeL( wStream );
       
  1525 	wStream.CommitL();
       
  1526 	CleanupStack::PopAndDestroy(2); //wStream, dbims
       
  1527 	}
       
  1528 	
       
  1529 // ------------------------------------------------------------------------------------------------
       
  1530 // CNSmlDSHostSession::DeletedItemsL
       
  1531 // The Data Provider returns UIDs of items that are deleted after previous synchronization.
       
  1532 // ------------------------------------------------------------------------------------------------	
       
  1533 void CNSmlDSHostSession::DeletedItemsL( const RMessage2& aMessage )
       
  1534 	{
       
  1535     CSmlDataStore* ds = DataStoreL( aMessage );
       
  1536     
       
  1537     const MSmlDataItemUidSet& dius = ds->DeletedItems();
       
  1538     RNSmlDbItemModificationSet dbims;
       
  1539     CleanupClosePushL( dbims );
       
  1540     
       
  1541     dbims.AddGroupL( dius, TNSmlDbItemModification::ENSmlDbItemDelete );
       
  1542     
       
  1543     TMemPtr& dest( MemPtrL() );
       
  1544     dest.AdjustChunkIfNeededL( dbims.StreamSize() );
       
  1545     RWriteStream& wStream = dest.WriteStreamLC();
       
  1546 	dbims.ExternalizeL( wStream );
       
  1547 	wStream.CommitL();
       
  1548 	CleanupStack::PopAndDestroy(2); //wStream, dbims
       
  1549 	}
       
  1550 
       
  1551 // ------------------------------------------------------------------------------------------------
       
  1552 // CNSmlDSHostSession::SoftDeleteItemsL
       
  1553 // The Data Provider returns UIDs of items that are soft deleted after previous synchronization.
       
  1554 // ------------------------------------------------------------------------------------------------	
       
  1555 void CNSmlDSHostSession::SoftDeleteItemsL( const RMessage2& aMessage )
       
  1556 	{
       
  1557     CSmlDataStore* ds = DataStoreL( aMessage );
       
  1558     
       
  1559     const MSmlDataItemUidSet& dius = ds->SoftDeletedItems();
       
  1560     RNSmlDbItemModificationSet dbims;
       
  1561     CleanupClosePushL( dbims );
       
  1562     
       
  1563     dbims.AddGroupL( dius, TNSmlDbItemModification::ENSmlDbItemSoftDelete );
       
  1564     
       
  1565     TMemPtr& dest( MemPtrL() );
       
  1566     dest.AdjustChunkIfNeededL( dbims.StreamSize() );
       
  1567     RWriteStream& wStream = dest.WriteStreamLC();
       
  1568 	dbims.ExternalizeL( wStream );
       
  1569 	wStream.CommitL();
       
  1570 	CleanupStack::PopAndDestroy(2); //wStream, dbims
       
  1571 	}
       
  1572 
       
  1573 // ------------------------------------------------------------------------------------------------
       
  1574 // CNSmlDSHostSession::ModifiedItemsL
       
  1575 // The Data Provider returns UIDs of items that are modified after previous synchronization.
       
  1576 // ------------------------------------------------------------------------------------------------	
       
  1577 void CNSmlDSHostSession::ModifiedItemsL( const RMessage2& aMessage )
       
  1578 	{
       
  1579     CSmlDataStore* ds = DataStoreL( aMessage );
       
  1580     
       
  1581     const MSmlDataItemUidSet& dius = ds->ModifiedItems();
       
  1582     RNSmlDbItemModificationSet dbims;
       
  1583     CleanupClosePushL( dbims );
       
  1584     
       
  1585     dbims.AddGroupL( dius, TNSmlDbItemModification::ENSmlDbItemModify );
       
  1586     
       
  1587     TMemPtr& dest( MemPtrL() );
       
  1588     dest.AdjustChunkIfNeededL( dbims.StreamSize() );
       
  1589     RWriteStream& wStream = dest.WriteStreamLC();
       
  1590 	dbims.ExternalizeL( wStream );
       
  1591 	wStream.CommitL();
       
  1592 	CleanupStack::PopAndDestroy(2); //wStream, dbims
       
  1593 	}
       
  1594 
       
  1595 // ------------------------------------------------------------------------------------------------
       
  1596 // CNSmlDSHostSession::MovedItemsL
       
  1597 // The Data Provider returns UIDs of items that are moved after previous synchronization.
       
  1598 // ------------------------------------------------------------------------------------------------	
       
  1599 void CNSmlDSHostSession::MovedItemsL( const RMessage2& aMessage )
       
  1600 	{
       
  1601     CSmlDataStore* ds = DataStoreL( aMessage );
       
  1602     
       
  1603     const MSmlDataItemUidSet& dius = ds->MovedItems();
       
  1604     RNSmlDbItemModificationSet dbims;
       
  1605     CleanupClosePushL( dbims );
       
  1606     
       
  1607     dbims.AddGroupL( dius, TNSmlDbItemModification::ENSmlDbItemMove );
       
  1608     
       
  1609     TMemPtr& dest( MemPtrL() );
       
  1610     dest.AdjustChunkIfNeededL( dbims.StreamSize() );
       
  1611     RWriteStream& wStream = dest.WriteStreamLC();
       
  1612 	dbims.ExternalizeL( wStream );
       
  1613 	wStream.CommitL();
       
  1614 	CleanupStack::PopAndDestroy(2); //wStream, dbims
       
  1615 	}
       
  1616 
       
  1617 // ------------------------------------------------------------------------------------------------
       
  1618 // CNSmlDSHostSession::AllItemsL
       
  1619 // ------------------------------------------------------------------------------------------------	
       
  1620 void CNSmlDSHostSession::AllItemsL( const RMessage2& aMessage )
       
  1621 	{
       
  1622 	TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
       
  1623 	
       
  1624     CNSmlDSChangedItemsFetcher* dsao = CNSmlDSChangedItemsFetcher::NewLC( 
       
  1625     	this, dsi, aMessage, AllItemsRequestFinishedL );
       
  1626     dsao->FetchAllChangedItemsL();
       
  1627     CleanupStack::Pop(); //dsao
       
  1628 	}
       
  1629 
       
  1630 // ------------------------------------------------------------------------------------------------
       
  1631 // CNSmlDSHostSession::AllItemsRequestFinished
       
  1632 // Called when AllItems request is finished.
       
  1633 // ------------------------------------------------------------------------------------------------	
       
  1634 void CNSmlDSHostSession::AllItemsRequestFinishedL( CNSmlDSChangedItemsFetcher* aDSAO )
       
  1635 	{
       
  1636 	TMemPtr& dest( MemPtrL() );
       
  1637 	const RNSmlDbItemModificationSet* mods = aDSAO->ChangedItems();
       
  1638 	dest.AdjustChunkIfNeededL( mods->StreamSize() );
       
  1639 	RWriteStream& wStream = dest.WriteStreamLC();
       
  1640 	mods->ExternalizeL( wStream );
       
  1641 	wStream.CommitL();
       
  1642 	CleanupStack::PopAndDestroy(); //wStream
       
  1643 	}
       
  1644 
       
  1645 // ------------------------------------------------------------------------------------------------
       
  1646 // CNSmlDSHostSession::ResetChangeInfoL
       
  1647 // Reset change info from the Data Provider. 
       
  1648 // ------------------------------------------------------------------------------------------------	
       
  1649 void CNSmlDSHostSession::ResetChangeInfoL( const RMessage2& aMessage )
       
  1650 	{
       
  1651     TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
       
  1652 
       
  1653     CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( this, dsi, aMessage );
       
  1654     CleanupStack::PushL( dsao );
       
  1655     dsao->CallDSAsyncLC().ResetChangeInfoL( dsao->iStatus );
       
  1656     CleanupStack::Pop(2); //CallDSAsyncLC(), dsao
       
  1657 	}
       
  1658 		
       
  1659 // ------------------------------------------------------------------------------------------------
       
  1660 // CNSmlDSHostSession::CommitChangeInfoL
       
  1661 // This method is called after some changes are synchronized to Sync Partner. If some changes
       
  1662 // were synchronized correctly then those UIDs are included to aItems.
       
  1663 // ------------------------------------------------------------------------------------------------	
       
  1664 void CNSmlDSHostSession::CommitChangesL( const RMessage2& aMessage )
       
  1665 	{
       
  1666     TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
       
  1667     
       
  1668     CNSmlDataItemUidSet* dius = new ( ELeave ) CNSmlDataItemUidSet();
       
  1669     CleanupStack::PushL( dius );
       
  1670     TMemPtr& ptr( MemPtrL() );
       
  1671     RReadStream& readStream = ptr.ReadStreamLC();
       
  1672     dius->InternalizeL( readStream );
       
  1673     CleanupStack::PopAndDestroy(); //readStream
       
  1674     
       
  1675     CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( 
       
  1676     	this, dsi, aMessage, CommitChangesRequestFinishedL, dius );
       
  1677     CleanupStack::Pop( dius ); //dsao takes the ownership.
       
  1678     CleanupStack::PushL( dsao );
       
  1679     dsao->CallDSAsyncLC().CommitChangeInfoL( dsao->iStatus, *dius );
       
  1680     CleanupStack::Pop(2); //CallDSAsyncLC(), dsao
       
  1681 	}
       
  1682 // ------------------------------------------------------------------------------------------------
       
  1683 // CNSmlDSHostSession::CommitItemRequestFinishedL
       
  1684 // This method is called after CommitChangesL request is finished.
       
  1685 // ------------------------------------------------------------------------------------------------	
       
  1686 TInt CNSmlDSHostSession::CommitChangesRequestFinishedL( CNSmlDSAsyncCallBack* aDSAO, 
       
  1687 	TCallBackOperation aOperation )
       
  1688 	{
       
  1689 	TInt status( aDSAO->iStatus.Int() );
       
  1690 	CNSmlDataItemUidSet* dius = reinterpret_cast<CNSmlDataItemUidSet*>( aDSAO->iPtr );
       
  1691     
       
  1692     switch( aOperation )
       
  1693     	{
       
  1694 		case CNSmlDSAsyncCallBack::EFinished:
       
  1695 	    	break;
       
  1696 	    case CNSmlDSAsyncCallBack::ECanceled:
       
  1697 	    	status = KErrNone;
       
  1698 	    	break;
       
  1699 	    case CNSmlDSAsyncCallBack::EFree:
       
  1700 	    	delete dius;
       
  1701 	    	aDSAO->iPtr = NULL;
       
  1702 	    	break;
       
  1703 		default:
       
  1704 			User::Leave( KErrUnknown );
       
  1705     	}
       
  1706 
       
  1707     return status;
       
  1708 	
       
  1709 	}
       
  1710 
       
  1711 // ------------------------------------------------------------------------------------------------
       
  1712 // CNSmlDSHostSession::CommitAllChangesL
       
  1713 // This method is called after some changes are synchronized to Sync Partner. This method is used if
       
  1714 // all changes were synchronized correctly.
       
  1715 // ------------------------------------------------------------------------------------------------	
       
  1716 void CNSmlDSHostSession::CommitAllChangesL( const RMessage2& aMessage )
       
  1717 	{
       
  1718     TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
       
  1719     CNSmlDSAsyncCallBack* dsao = new ( ELeave ) CNSmlDSAsyncCallBack( this, dsi, aMessage );
       
  1720     CleanupStack::PushL( dsao );
       
  1721     dsao->CallDSAsyncLC().CommitChangeInfoL( dsao->iStatus );
       
  1722     CleanupStack::Pop(2); //CallDSAsyncLC(), dsao
       
  1723 	}
       
  1724 
       
  1725 // ------------------------------------------------------------------------------------------------
       
  1726 // CNSmlDSHostSession::UpdateServerIdL
       
  1727 // Updates server id to adapter log.
       
  1728 // ------------------------------------------------------------------------------------------------		
       
  1729 void CNSmlDSHostSession::UpdateServerIdL( const RMessage2& /*aMessage*/ )
       
  1730 	{
       
  1731 	TMemPtr& ptr( MemPtrL() );
       
  1732     RReadStream& readStream = ptr.ReadStreamLC();
       
  1733     
       
  1734 	HBufC* oldServerId = HBufC::NewLC( readStream, readStream.ReadUint32L() );
       
  1735 	HBufC* newValue = HBufC::NewLC( readStream, readStream.ReadUint32L() );
       
  1736 	
       
  1737 	CNSmlAdapterLog* adpLog = CNSmlAdapterLog::NewLC();
       
  1738 	
       
  1739 	adpLog->SetServerIdL( *oldServerId, *newValue );
       
  1740 	
       
  1741 	CleanupStack::PopAndDestroy( 4 ); //adpLog, newValue, oldServerId, readStream
       
  1742 	}
       
  1743 
       
  1744 // ------------------------------------------------------------------------------------------------
       
  1745 // CNSmlDSHostSession::DataProviderL
       
  1746 // ------------------------------------------------------------------------------------------------
       
  1747 CSmlDataProvider* CNSmlDSHostSession::DataProviderL( TSmlDataProviderId aId )
       
  1748     {
       
  1749     CSmlDataProvider* dp = iDataProviders.DataProvider( aId );
       
  1750     if ( !dp )
       
  1751         {
       
  1752         User::Leave( ENSmlDSHostServerErrDPNotCreated );
       
  1753         }
       
  1754     return dp;
       
  1755     }
       
  1756 
       
  1757 // ------------------------------------------------------------------------------------------------
       
  1758 // CNSmlDSHostSession::DataProviderItemL
       
  1759 // ------------------------------------------------------------------------------------------------
       
  1760 TNSmlDSDataProviderElement* CNSmlDSHostSession::DataProviderItemL( TSmlDataProviderId aId )
       
  1761     {
       
  1762     TNSmlDSDataProviderElement* dpi = iDataProviders.DataProviderElement( aId );
       
  1763     if ( !dpi )
       
  1764         {
       
  1765         User::Leave( ENSmlDSHostServerErrDPNotCreated );
       
  1766         }
       
  1767     return dpi;
       
  1768     }
       
  1769     
       
  1770 // ------------------------------------------------------------------------------------------------
       
  1771 // CNSmlDSHostSession::DataStoreL
       
  1772 // ------------------------------------------------------------------------------------------------
       
  1773 CSmlDataStore* CNSmlDSHostSession::DataStoreL( const RMessage2& aMessage )
       
  1774     {
       
  1775     TNSmlDSDataStoreElement* dsi = DataStoreItemL( aMessage );
       
  1776     return dsi->iDataStore;
       
  1777     }
       
  1778 
       
  1779 // ------------------------------------------------------------------------------------------------
       
  1780 // CNSmlDSHostSession::DataStoreItemL
       
  1781 // ------------------------------------------------------------------------------------------------
       
  1782 TNSmlDSDataStoreElement* CNSmlDSHostSession::DataStoreItemL( const RMessage2& aMessage )
       
  1783     {
       
  1784     HBufC* storeName = DataStoreNameLC( aMessage );
       
  1785     TNSmlDSDataStoreElement* dsi = iDataProviders.DataStoreElement( 
       
  1786         iDataProviders.DataProviderElement( aMessage.Int0() ), *storeName );
       
  1787     
       
  1788     if ( !dsi )
       
  1789         {
       
  1790         User::Leave( ENSmlDSHostServerErrDSNotOpened );
       
  1791         }
       
  1792 
       
  1793     CleanupStack::PopAndDestroy(); //storeName
       
  1794 
       
  1795     return dsi;
       
  1796     }
       
  1797 
       
  1798 // ------------------------------------------------------------------------------------------------
       
  1799 // CNSmlDSHostSession::HasDataStoreL
       
  1800 // ------------------------------------------------------------------------------------------------    
       
  1801 TBool CNSmlDSHostSession::HasDataStoreL( const RMessage2& aMessage )
       
  1802 	{
       
  1803 	HBufC* storeName = DataStoreNameLC( aMessage );
       
  1804     TNSmlDSDataStoreElement* dsi = iDataProviders.DataStoreElement( 
       
  1805         iDataProviders.DataProviderElement( aMessage.Int0() ), *storeName );
       
  1806         
       
  1807     CleanupStack::PopAndDestroy(); //storeName
       
  1808     return ( dsi != NULL );
       
  1809 	}
       
  1810 
       
  1811 // ------------------------------------------------------------------------------------------------
       
  1812 // CNSmlDSHostSession::DataStoreNameLC
       
  1813 // ------------------------------------------------------------------------------------------------
       
  1814 HBufC* CNSmlDSHostSession::DataStoreNameLC( const RMessage2& aMessage )
       
  1815     {
       
  1816     TInt desLength = aMessage.GetDesLength( 1 );
       
  1817     if ( desLength < 0 )
       
  1818         {
       
  1819         //if desLength negative, contains system-wide error code.
       
  1820         User::Leave( desLength );
       
  1821         }
       
  1822     HBufC* storeName = HBufC::NewLC( desLength );
       
  1823     TPtr store( storeName->Des() );
       
  1824     aMessage.ReadL( 1, store );
       
  1825     return storeName;
       
  1826     }
       
  1827     
       
  1828 // ------------------------------------------------------------------------------------------------
       
  1829 // CNSmlDSHostSession::InternalizeFiltersL
       
  1830 // Read filters from stream.
       
  1831 // ------------------------------------------------------------------------------------------------
       
  1832 void CNSmlDSHostSession::InternalizeFiltersL( RReadStream& aStream, RPointerArray<CSyncMLFilter>& aFilters )
       
  1833 	{
       
  1834 	
       
  1835 	TInt count( aStream.ReadInt32L() );
       
  1836 	
       
  1837 	for ( TInt i = 0; i < count; i++ )
       
  1838 		{
       
  1839 		CSyncMLFilter* filter = CSyncMLFilter::NewLC( aStream );
       
  1840 		aFilters.AppendL( filter );
       
  1841 		CleanupStack::Pop(); // filter
       
  1842 		}
       
  1843 	}
       
  1844 	
       
  1845 // ------------------------------------------------------------------------------------------------
       
  1846 // CNSmlDSHostSession::ExternalizeFiltersL
       
  1847 // Write filters to stream.
       
  1848 // ------------------------------------------------------------------------------------------------	
       
  1849 void CNSmlDSHostSession::ExternalizeFiltersL( RWriteStream& aStream, const RPointerArray<CSyncMLFilter>& aFilters )
       
  1850 	{
       
  1851 	TInt count( aFilters.Count() );
       
  1852 	aStream.WriteInt32L( count );
       
  1853 	for ( TInt i(0); i < count; i++ )
       
  1854 		{
       
  1855 		aFilters[i]->ExternalizeL( aStream );
       
  1856 		}
       
  1857 	}
       
  1858 	
       
  1859 // ------------------------------------------------------------------------------------------------
       
  1860 // CNSmlDSHostSession::PanicClient
       
  1861 // ------------------------------------------------------------------------------------------------
       
  1862 void CNSmlDSHostSession::PanicClient( const RMessage2& aMessage, TInt aReason ) const
       
  1863 	{
       
  1864 	_DBG_FILE( "CNSmlDSHostSession::PanicClient(): begin " );
       
  1865 	aMessage.Panic( _L( "CNSmlDSHostSession" ), aReason );
       
  1866 	_DBG_FILE( "CNSmlDSHostSession::PanicClient(): end" );
       
  1867 	}
       
  1868 
       
  1869 // ------------------------------------------------------------------------------------------------
       
  1870 // CNSmlDSHostSession::MemPtrL
       
  1871 // ------------------------------------------------------------------------------------------------
       
  1872 CNSmlDSHostSession::TMemPtr& CNSmlDSHostSession::MemPtrL()
       
  1873     {
       
  1874     if ( iMemPtr.iChunk.Handle() == 0 || !iMemPtr.iChunk.IsWritable() )
       
  1875     	{
       
  1876     	User::Leave( KErrBadHandle );
       
  1877     	}
       
  1878     return iMemPtr;
       
  1879     }
       
  1880 
       
  1881 // ------------------------------------------------------------------------------------------------
       
  1882 // CNSmlDSHostSession::StreamBufferToChunkL
       
  1883 // ------------------------------------------------------------------------------------------------
       
  1884 void CNSmlDSHostSession::StreamBufferToChunkL( TMemPtr& aMemPtr, TStreamBuffers* aSb )
       
  1885 	{
       
  1886 	aSb->iWrite->CommitL();
       
  1887 	aMemPtr.AdjustChunkIfNeededL( aSb->iBuffer->Size() );
       
  1888 	RWriteStream& wStream = aMemPtr.WriteStreamLC();
       
  1889 	wStream.WriteL( *aSb->iRead );
       
  1890 	wStream.CommitL();
       
  1891 	CleanupStack::PopAndDestroy(); //wStream
       
  1892 	}
       
  1893 
       
  1894 // End of File