syncmlfw/ds/hostserver/dshostclient/src/fakeclient.cpp
changeset 0 b497e44ab2fc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/ds/hostserver/dshostclient/src/fakeclient.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,1021 @@
+/*
+* Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Client module of DS Host Servers
+*
+*/
+
+
+#include <e32math.h>
+#include <vtoken.h>
+#include <f32file.h>
+#include "nsmldbcaps.h"
+#include "nsmlfilter.h"
+//#include "nsmlconstants.h"
+
+const TInt KItemSize( 128 );
+const TInt KNSmlMaxObjSize( 786432 );
+const TSmlDbItemUid KFailDeleteUid = 13;
+const TSmlDbItemUid KFailReplaceUid = 13;
+const TSmlDbItemUid KFailMoveUid = 13;
+const TSmlDbItemUid KInvalidParent = 113;
+const TSmlDbItemUid KFieldLevelReplace = 14;
+const TInt KMakeBatchFail = 5;
+
+const TUid KContacts = { 0x101F6DDD };
+const TUid KAgenda   = { 0x101F6DDE };
+const TUid KEmpty1 = { 0x101F6FFF };
+const TUid KEmpty2 = { 0x101F6FFE };
+const TUid KUidNotValid = { 0x101F6FFD };
+
+_LIT( KNSmlUnicodeContactsLocalDbName, "C:\\System\\Data\\Contacts.cdb" );
+_LIT( KNSmlUnicodeAgenda1LocalDbName, "C:\\System\\Data\\Agenda1.cdb" );
+_LIT( KNSmlUnicodeAgenda2LocalDbName, "C:\\System\\Data\\Agenda2.cdb" );
+_LIT( KNSmlUnicodeEmpty1LocalDbName, "C:\\System\\Data\\Empty1.cdb" );
+_LIT( KNSmlUnicodeEmpty2LocalDbName, "C:\\System\\Data\\Empty2.cdb" );
+_LIT( KReceivedDataFile, "C:\ReceivedData.txt" );
+
+_LIT8( KWriteSeparator, "\r\n==============================================\r\n" );
+_LIT8( KNSmlContactsLocalDbName, "C:\\System\\Data\\Contacts.cdb" );
+_LIT8( KNSmlAgenda1LocalDbName, "C:\\System\\Data\\Agenda1.cdb" );
+_LIT8( KNSmlAgenda2LocalDbName, "C:\\System\\Data\\Agenda2.cdb" );
+_LIT8( KNSmlEmpty1LocalDbName, "C:\\System\\Data\\Empty1.cdb" );
+_LIT8( KNSmlEmpty2LocalDbName, "C:\\System\\Data\\Empty21.cdb" );
+_LIT8( KNSmlvCard30Name, "text/vcard" );
+_LIT8( KNSmlvCard30Ver, "3.0" );
+_LIT8( KNSmlvCard21Name, "text/x-vcard" );
+_LIT8( KNSmlvCard21Ver, "2.1" );
+
+_LIT8( KVersitTokenHOME, "HOME"  );
+_LIT8( KVersitTokenWORK, "WORK"  );
+_LIT8( KVersitTokenCELL, "CELL"  );
+_LIT8( KVersitTokenPAGER,"PAGER" );
+_LIT8( KVersitTokenFAX,  "FAX"   );
+_LIT8( KVersitTokenVOICE,"VOICE" );
+
+_LIT8( KNSmlvCalendar, "text/x-vcalendar" );
+_LIT8( KNSmlvCalendarVer, "1.0" );
+#define KNSmlvCalendarVersion TVersion(1,0,0);
+
+_LIT8( KNSmliCalendar, "text/calendar" );
+_LIT8( KNSmliCalendarVer, "2.0" );
+#define KNSmliCalendarVersion TVersion(2,0,0);
+
+_LIT8( KVersitVarTokenVCALENDAR8, "VCALENDAR");
+_LIT8( KVersitVarTokenVEVENT8, "VEVENT");
+_LIT8( KVersitVarTokenVTODO8, "VTODO");
+_LIT8( KVersitVarTokenXEPOCSOUND, "TYPE" );
+_LIT8( KVersitVarTokenXEPOCAGENDAENTRYTYPE, "X-EPOCAGENDAENTRYTYPE" );
+_LIT8( KVCalTokenPUBLIC8,"PUBLIC" );
+_LIT8( KVCalTokenPRIVATE8,"PRIVATE" );
+_LIT8( KVCalTokenCONFIDENTIAL8,"CONFIDENTIAL" );
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::CNSmlDSHostClient
+// C++ constructor.
+// ------------------------------------------------------------------------------------------------
+CNSmlDSHostClient::CNSmlDSHostClient()
+	{
+	iBatchMode = EFalse;
+	iBatchCount = 0;
+	iReadCount = 0;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::ConstrucL
+// ConstrucL
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSHostClient::ConstructL()
+	{
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::SessionForDataProvider
+// Return session to correct server that has current Data Provider.
+// ------------------------------------------------------------------------------------------------
+TInt CNSmlDSHostClient::SessionForDataProvider( const TSmlDataProviderId /*aId*/ ) const
+	{	
+	return 0;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient - public methods
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::NewL
+// Creates new instance of CNSmlDSHostClient based class.
+// ------------------------------------------------------------------------------------------------
+EXPORT_C CNSmlDSHostClient* CNSmlDSHostClient::NewL()
+	{
+	CNSmlDSHostClient* self = NewLC();
+	CleanupStack::Pop();
+	return self;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::NewLC
+// Creates new instance of CNSmlDSHostClient based class.
+// ------------------------------------------------------------------------------------------------
+EXPORT_C CNSmlDSHostClient* CNSmlDSHostClient::NewLC()
+	{
+	CNSmlDSHostClient* self = new (ELeave) CNSmlDSHostClient();
+	CleanupStack::PushL( self );
+	self->ConstructL();
+	return self;
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::~CNSmlDSHostClient
+// C++ Destructor.
+// ------------------------------------------------------------------------------------------------
+EXPORT_C CNSmlDSHostClient::~CNSmlDSHostClient()
+	{
+	iBatchResults.Close();
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::CreateDataProvidersL
+// Creates Data Providers.
+// ------------------------------------------------------------------------------------------------
+EXPORT_C void CNSmlDSHostClient::CreateDataProvidersL( const RArray<TSmlDataProviderId>& aIds, RArray<TInt>& aResultArray )
+	{
+	for ( TInt i = 0; i < aIds.Count(); i++ )
+		{
+		aResultArray.Append( KErrNone )	;
+		}
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::CreateAllDataProvidersL
+// Creates all possible Data Providers.
+// ------------------------------------------------------------------------------------------------
+EXPORT_C void CNSmlDSHostClient::CreateAllDataProvidersL( RArray<TSmlDataProviderId>& aIds )
+	{
+	aIds.Append( KContacts.iUid );
+	aIds.Append( KAgenda.iUid );
+	aIds.Append( KEmpty1.iUid );
+	aIds.Append( KEmpty2.iUid );
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::SupportsOperationL
+// Asks if Data Provider supports some operation.
+// ------------------------------------------------------------------------------------------------
+EXPORT_C TBool CNSmlDSHostClient::SupportsOperationL( TUid aOpId, TSmlDataProviderId aId, TInt& aResultCode ) const
+	{
+	aResultCode = KErrNone;
+	
+	if ( aId == KContacts.iUid )
+		{
+		if ( aOpId == KUidSmlSupportTransaction )
+			{
+			return ETrue;		
+			}
+
+		if ( aOpId == KUidSmlSupportSuspendResume )
+			{
+			return EFalse;		
+			}
+
+		if ( aOpId == KUidSmlSupportBatch )
+			{
+			return ETrue;		
+			}
+		}
+	else if ( aId == KAgenda.iUid )
+		{
+		if ( aOpId == KUidSmlSupportTransaction )
+			{
+			return EFalse;		
+			}
+
+		if ( aOpId == KUidSmlSupportSuspendResume )
+			{
+			return EFalse;		
+			}
+
+		if ( aOpId == KUidSmlSupportBatch )
+			{
+			return EFalse;		
+			}
+		}
+
+	return EFalse;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::StoreFormatL
+// Creates Data Store format of Data Provider.
+// ------------------------------------------------------------------------------------------------
+EXPORT_C CNSmlDbCaps* CNSmlDSHostClient::StoreFormatL( const TSmlDataProviderId aId, TInt& aResultCode )
+	{
+	CNSmlDbCaps* dbCaps = CNSmlDbCaps::NewLC();
+	
+	if ( aId == KContacts.iUid || aId == KEmpty1.iUid || aId == KEmpty2.iUid )
+		{
+		dbCaps->SetSourceRefL( KNSmlContactsLocalDbName );
+		dbCaps->SetSyncType( CNSmlDbCaps::EAllTypes );
+		dbCaps->SetRxPrefL (KNSmlvCard21Name(), KNSmlvCard21Ver() );
+		dbCaps->AddRxL( KNSmlvCard30Name(), KNSmlvCard30Ver() );
+		dbCaps->SetTxPrefL( KNSmlvCard21Name(), KNSmlvCard21Ver() );
+		dbCaps->SetSupportHierarchicalSyncL();
+		
+		TInt pc( 0 );
+		CNSmlCtCap* cap = dbCaps->AddCtCapLC(); ++pc;
+		cap->SetCtTypeL( KNSmlvCard21Name() );
+		cap->SetVerCtL( KNSmlvCard21Ver() );
+		CNSmlDevInfProp* pr = cap->AddDevInfPropLC( KVersitTokenBEGIN() ); ++pc;
+		pr->AddValEnumL( KVersitTokenVCARD() );
+		pr = cap->AddDevInfPropLC( KVersitTokenEND() ); ++pc;
+		pr->AddValEnumL( KVersitTokenVCARD() );
+		pr = cap->AddDevInfPropLC( KVersitTokenVERSION() ); ++pc;
+		pr->AddValEnumL( KNSmlvCard21Ver() );
+
+		cap->AddDevInfPropLC( KVersitTokenREV() ); ++pc;
+		cap->AddDevInfPropLC( KVersitTokenN() ); ++pc;
+
+		pr = cap->AddDevInfPropLC( KVersitTokenADR() ); ++pc;
+		pr->AddParamLC( KVersitTokenHOME() ); ++pc;
+		pr->AddParamLC( KVersitTokenWORK() ); ++pc;
+
+		pr = cap->AddDevInfPropLC( KVersitTokenTEL() ); ++pc;
+		pr->AddParamLC( KVersitTokenHOME() ); ++pc;
+		pr->AddParamLC( KVersitTokenWORK() ); ++pc;
+		pr->AddParamLC( KVersitTokenCELL() ); ++pc;
+		pr->AddParamLC( KVersitTokenPAGER() ); ++pc;
+		pr->AddParamLC( KVersitTokenFAX() ); ++pc;
+
+		cap->AddDevInfPropLC( KVersitTokenFN() ); ++pc;
+
+		pr = cap->AddDevInfPropLC( KVersitTokenEMAIL() ); ++pc;
+		pr->AddParamLC( KVersitTokenINTERNET() ); ++pc;
+		pr->AddParamLC( KVersitTokenHOME() ); ++pc;
+		pr->AddParamLC( KVersitTokenWORK() ); ++pc;
+
+		pr = cap->AddDevInfPropLC( KVersitTokenURL() ); ++pc;
+		pr->AddParamLC( KVersitTokenHOME() ); ++pc;
+		pr->AddParamLC( KVersitTokenWORK() ); ++pc;
+
+		cap->AddDevInfPropLC( KVersitTokenNOTE() ); ++pc;
+
+		cap->AddDevInfPropLC( KVersitTokenTITLE() ); ++pc;
+		cap->AddDevInfPropLC( KVersitTokenORG() ); ++pc;
+
+		cap->AddDevInfPropLC( KVersitTokenPHOTO() ); ++pc;
+		cap->AddDevInfPropLC( KVersitTokenBDAY() ); ++pc;
+
+		CleanupStack::PopAndDestroy( pc );
+		}
+	else
+		{
+		dbCaps->SetSourceRefL( KNSmlAgenda1LocalDbName );
+		dbCaps->SetSyncType( CNSmlDbCaps::EAllTypes );
+		dbCaps->SetRxPrefL(KNSmlvCalendar(), KNSmlvCalendarVer() );
+		dbCaps->AddRxL( KNSmliCalendar(), KNSmliCalendarVer() );
+		dbCaps->SetTxPrefL( KNSmlvCalendar(), KNSmlvCalendarVer() );	
+		
+        TInt pc( 0 );
+        CNSmlCtCap* cap = dbCaps->AddCtCapLC(); pc++;
+        cap->SetCtTypeL( KNSmlvCalendar() );
+        cap->SetVerCtL( KNSmlvCalendarVer() );
+        CNSmlDevInfProp* pr = cap->AddDevInfPropLC(KVersitTokenBEGIN()); pc++;
+        pr->AddValEnumL(KVersitVarTokenVCALENDAR8());
+        pr->AddValEnumL(KVersitVarTokenVEVENT8());
+        pr->AddValEnumL(KVersitVarTokenVTODO8());
+        pr = cap->AddDevInfPropLC(KVersitTokenEND()); pc++;
+        pr->AddValEnumL(KVersitVarTokenVCALENDAR8());
+        pr->AddValEnumL(KVersitVarTokenVEVENT8());
+        pr->AddValEnumL(KVersitVarTokenVTODO8());
+
+        pr = cap->AddDevInfPropLC(KVersitTokenVERSION()); pc++;
+        pr->AddValEnumL( KNSmlvCalendarVer() );
+
+        cap->AddDevInfPropLC(KVersitTokenUID()); pc++;
+        cap->AddDevInfPropLC(KVersitTokenSUMMARY()); pc++;
+        cap->AddDevInfPropLC(KVersitTokenDESCRIPTION()); pc++;
+        cap->AddDevInfPropLC(KVersitTokenDTEND()); pc++;
+        cap->AddDevInfPropLC(KVersitTokenDTSTART()); pc++;
+
+        pr = cap->AddDevInfPropLC(KVersitTokenAALARM()); pc++;
+
+        pr = cap->AddDevInfPropLC(KVersitTokenCLASS()); pc++;
+        pr->AddValEnumL(KVCalTokenPUBLIC8());
+        pr->AddValEnumL(KVCalTokenPRIVATE8());
+        pr->AddValEnumL(KVCalTokenCONFIDENTIAL8());
+
+        cap->AddDevInfPropLC(KVersitTokenCOMPLETED()); pc++;
+        cap->AddDevInfPropLC(KVersitTokenLOCATION()); pc++;
+        cap->AddDevInfPropLC(KVersitTokenDCREATED()); pc++;
+        cap->AddDevInfPropLC(KVersitTokenLASTMODIFIED()); pc++;
+        cap->AddDevInfPropLC(KVersitTokenPRIORITY()); pc++;
+        cap->AddDevInfPropLC(KVersitTokenSTATUS()); pc++;
+        cap->AddDevInfPropLC(KVersitTokenRRULE()); pc++;
+        cap->AddDevInfPropLC(KVersitTokenDUE()); pc++;
+        cap->AddDevInfPropLC(KVersitTokenEXDATE()); pc++;
+        cap->AddDevInfPropLC(KVersitVarTokenXEPOCAGENDAENTRYTYPE()); pc++;
+        
+        CleanupStack::PopAndDestroy( pc );
+		}
+		
+	aResultCode = KErrNone;
+	CleanupStack::Pop(); // dbCaps
+	
+	return dbCaps;
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::ListStoresL
+// Creates list of Data Store names of Data Provider.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::ListStoresL( CDesCArray* aNameList, const TSmlDataProviderId aId, TInt& aResultCode )
+	{
+	if ( aId == KContacts.iUid )
+		{
+		aNameList->AppendL( KNSmlUnicodeContactsLocalDbName );
+		}
+	else if ( aId == KAgenda.iUid )
+		{
+		aNameList->AppendL( KNSmlUnicodeAgenda1LocalDbName );
+		aNameList->AppendL( KNSmlUnicodeAgenda2LocalDbName );
+		}
+	else if ( aId == KEmpty1.iUid )
+		{
+		aNameList->AppendL( KNSmlUnicodeEmpty1LocalDbName );
+		}
+	else 
+		{
+		aNameList->AppendL( KNSmlUnicodeEmpty2LocalDbName );
+		}
+		
+	aResultCode = KErrNone;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::DefaultStoreL
+// Creates default name for Data Store of Data Provider.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C HBufC* CNSmlDSHostClient::DefaultStoreL( const TSmlDataProviderId aId, TInt& aResultCode )
+	{
+	HBufC* storeName;
+	
+	if ( aId == KContacts.iUid )
+		{
+		storeName = KNSmlUnicodeContactsLocalDbName().AllocL();
+		}
+	else if ( aId == KAgenda.iUid )
+		{
+		storeName = KNSmlUnicodeAgenda1LocalDbName().AllocL();
+		}
+	else if ( aId == KEmpty1.iUid )
+		{
+		storeName = KNSmlUnicodeEmpty1LocalDbName().AllocL();
+		}
+	else
+		{
+		storeName = KNSmlUnicodeEmpty2LocalDbName().AllocL();
+		}
+		
+	aResultCode = KErrNone;
+	
+	return storeName;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::SupportedServerFiltersL
+// This method returns the set of filters that can be used to send to the Sync Partner.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C const RPointerArray<RSmlFilterDef> CNSmlDSHostClient::SupportedServerFiltersL( const TSmlDataProviderId /*aId*/, TInt& aResultCode ) const
+	{
+	aResultCode = KErrNone;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::SupportedServerFiltersL
+// This method returns the set of filters that can be used to send to the Sync Partner.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C const RPointerArray<RSmlFilterDef> CNSmlDSHostClient::SupportedServerFiltersL( const CNSmlDbCaps& /*aServerDataStoreFormat*/, const TSmlDataProviderId /*aId*/, TInt& aResultCode ) const
+	{
+	aResultCode = KErrNone;
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::GenerateRecordFilterQueryLC
+// This method generates a record filter query to be sent to the SyncML server for the provided filter.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C HBufC* CNSmlDSHostClient::GenerateRecordFilterQueryLC( const RSmlFilter& /*aFilter*/, TDes& /*aFilterMimeType*/, TDes& /*aFilterMimeVersion*/, const TSmlDataProviderId /*aId*/, TInt& aResultCode ) const
+	{
+	aResultCode = KErrNone;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::GenerateFieldFilterQueryL
+// This method generates a field filter query to be sent to the SyncML server for the provided filter.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::GenerateFieldFilterQueryL( const RSmlFilter& /*aFilter*/, RPointerArray<CSmlDataProperty>& /*aProperties*/, const TSmlDataProviderId /*aId*/, TInt& aResultCode ) const
+	{
+	aResultCode = KErrNone;
+	}
+
+EXPORT_C void CNSmlDSHostClient::GetFilterL( const TSmlDataProviderId aId, const TDesC& aStoreName, const RPointerArray<CSyncMLFilter>& aFilterArray, CNSmlFilter*& aFilter, TSyncMLFilterMatchType aMatchType, TInt& aResultCode )
+    {
+    aFilter->SetFilterMetaTypeL( _L8( "METATYPE" ) );
+    aFilter->SetFilterTypeL( _L8( "EXCLUSIVE" ) );
+    aFilter->SetRecordL( _L8( "RECORD METATYPE" ) , _L8( "RECORD DATA" ) );
+    aFilter->SetFieldMetaTypeL( _L8( "FIELD METATYPE" ) );
+    
+    aResultCode = KErrNone;    
+    }
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::OpenL
+// Opens the data store specified by aStoreName asynchronously.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::OpenL( const TSmlDataProviderId aId, const TDesC& /*aStoreName*/, const TDesC& /*aServerId*/, const TDesC& /*aRemoteDB*/, TInt& aResultCode )
+	{
+	if ( aId == KUidNotValid.iUid )
+		{
+		aResultCode = KErrNotFound;
+		}
+	else
+		{
+		aResultCode = KErrNone;
+		}
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::CancelRequestL
+// Cancel the current asynchronous request.
+// ------------------------------------------------------------------------------------------------	
+IMPORT_C void CNSmlDSHostClient::CancelRequestL( const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode )
+	{
+	aResultCode = KErrNone;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::BeginTransactionL
+// Starts the transaction mode.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::BeginTransactionL( const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode )
+	{
+	aResultCode = KErrNone;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::CommitTransactionL
+// Method will be called at the end of a successful transaction.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::CommitTransactionL( const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode )
+	{
+	aResultCode = KErrNone;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::RevertTransactionL
+// Method will be called to abort an ongoing transaction.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::RevertTransactionL( const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode )
+	{
+	aResultCode = KErrNone;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::BeginBatchL
+// Starts the batch mode.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::BeginBatchL( const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode )
+	{
+	aResultCode = KErrNone;
+	iBatchMode = ETrue;
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::CommitBatchL
+// Method will be called at the end of the batch mode.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::CommitBatchL( RArray<TInt>& aResultArray, const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode )
+	{	
+	iBatchMode = EFalse;
+	TBool lastOpSucceeded( EFalse );
+	
+	// make batch fail
+	if ( iBatchCount == KMakeBatchFail )
+		{
+		aResultCode = KErrGeneral;
+		return;
+		}
+	
+	for ( TInt i = 0; i < iBatchCount; i++ )
+		{
+/*		TTime time;
+		time.HomeTime();
+		TInt64 seed = time.Int64();
+		
+		TInt result = Math::Rand( seed ) % 2 + 1;
+		aResultArray.Append( result );*/
+/*		if ( lastOpSucceeded )
+			{
+			aResultArray.Append( KErrNotFound );
+			lastOpSucceeded = EFalse;
+			}
+		else
+			{
+			aResultArray.Append( KErrNone );
+			lastOpSucceeded = ETrue;
+			}*/
+			aResultArray.Append( iBatchResults[i] );
+		}
+		
+	iBatchMode = EFalse;
+	iBatchResults.Reset();
+	
+	aResultCode = KErrNone;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::CancelBatchL
+// Method will be called to abort an ongoing batch mode.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::CancelBatchL( const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode )
+	{
+	aResultCode = KErrNone;
+	iBatchMode = EFalse;
+	iBatchResults.Reset();
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::SetRemoteDataStoreFormatL
+// Sets the Sync Partner Data Format.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::SetRemoteDataStoreFormatL( const CNSmlDbCaps& /*aServerDataStoreFormat*/, const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode )
+	{
+	aResultCode = KErrNone;
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::SetRemoteMaxObjectSizeL
+// Sets the SyncML server Sync Partner maximum object size.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::SetRemoteMaxObjectSizeL( TInt /*aServerMaxObjectSize*/, const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode )
+	{
+	aResultCode = KErrNone;
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::MaxObjectSizeL
+// Gets the Data Store maximum object size which is reported to the SyncML partner.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C TInt CNSmlDSHostClient::MaxObjectSizeL( const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode ) const
+	{
+	aResultCode = KErrNone;
+	return KNSmlMaxObjSize;
+	}	
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::OpenItemL
+// Opens item at Data Store.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::OpenItemL( TSmlDbItemUid aUid, TBool& aFieldChange, TInt& aSize, TSmlDbItemUid& aParent, HBufC8*& aMimeType, HBufC8*& aMimeVer, const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode )
+	{
+	if ( aUid == KContacts.iUid )
+		{
+		aFieldChange = EFalse;	
+		aSize = KItemSize;
+		aParent = KNullDataItemId;
+		aMimeType = KNSmlvCard21Name().AllocL();
+		aMimeVer = KNSmlvCard21Ver().AllocL();
+		}
+	else
+		{
+		aFieldChange = EFalse;	
+		aSize = KItemSize;
+		aParent = KNullDataItemId;
+		aMimeType = KNSmlvCalendar().AllocL();
+		aMimeVer = KNSmlvCalendarVer().AllocL();
+		}
+	
+	aResultCode = KErrNone;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::CreateItemL
+// Creates new item to Data Store.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::CreateItemL( TSmlDbItemUid& aUid, TInt /*aSize*/, TSmlDbItemUid aParent, const TDesC8& aMimeType, const TDesC8& /*aMimeVer*/, const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode )
+	{
+	
+	if ( aMimeType.Find( _L8("invalid") ) != KErrNotFound )
+		{
+		aResultCode = KErrNotSupported;
+		return;
+		}
+		
+	if ( aParent == KInvalidParent )
+		{
+		aResultCode = KErrPathNotFound;
+		return;
+		}
+		
+	TTime time;
+	time.HomeTime();
+	TInt64 seed = time.Int64();
+	
+	aUid = Math::Rand( seed ) % 4096 + 1;
+	
+	if ( iBatchMode )
+		{
+		++iBatchCount;
+		aResultCode = KErrNone;
+		
+		if ( aParent == KInvalidParent )
+			{
+			iBatchResults.Append( KErrPathNotFound );
+			}
+		else
+			{
+			iBatchResults.Append( KErrNone );
+			}
+		}
+	else
+		{
+		if ( aParent == KInvalidParent )
+			{
+			aResultCode = KErrPathNotFound;
+			}
+		else
+			{
+			aResultCode = KErrNone;
+			}
+		}
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::ReplaceItemL
+// Replaces old item at Data Store.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::ReplaceItemL( TSmlDbItemUid aUid, TInt /*aSize*/, TSmlDbItemUid aParent, TBool aFieldChange, TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode )
+	{
+	if ( iBatchMode )
+		{
+		++iBatchCount;
+		
+		if ( aUid == KFailReplaceUid )
+			{
+			iBatchResults.Append( KErrNotFound );
+			}
+		else if ( aUid == KFieldLevelReplace && !aFieldChange )
+			{
+			iBatchResults.Append( KErrNotFound );
+			}
+		else if ( aUid != KFieldLevelReplace && aFieldChange )
+			{
+			iBatchResults.Append( KErrNotFound );
+			}
+		else
+			{
+			iBatchResults.Append( KErrNone );
+			}
+
+		aResultCode = KErrNone;
+		
+		return;
+		}
+
+	// make replace to fail for testing purposes
+	if ( aUid == KFailReplaceUid )
+		{
+		aResultCode = KErrNotFound;
+		}
+	else if ( aUid == KFieldLevelReplace && !aFieldChange )
+		{
+		aResultCode = KErrNotFound;
+		}
+	else if ( aUid != KFieldLevelReplace && aFieldChange )
+		{
+		aResultCode = KErrNotFound;
+		}
+	else
+		{
+		if ( aParent == KInvalidParent )
+			{
+			aResultCode = KErrPathNotFound;
+			}
+		else
+			{
+			aResultCode = KErrNone;
+			}
+		}				
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::ReadItemL
+// Reads data from item at Data Store. Item must be opened before this method can be called.
+// This method is called until aBuffer is not used totally or method leaves with KErrEof.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::ReadItemL( TDes8& aBuffer, const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode )
+	{
+	for ( TInt i = 0; i < aBuffer.MaxSize(); i++ )
+		{
+		if ( iReadCount == 0 )
+			{
+			aBuffer.Append( 'X' );
+			}
+		else
+			{
+			aBuffer.Append( 'Y' );
+			}
+		}
+		
+	++iReadCount;
+	aResultCode = KErrNone;
+	}
+		
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::WriteItemL
+// Writes data to item to Data Provider. CreateItemL or ReplaceItemL method must be called before
+// this method can be called. This method is called until all data to current item is written.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::WriteItemL( const TDesC8& aData, const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode )
+	{
+	RFs fSession;
+	RFile file;
+	
+	User::LeaveIfError( fSession.Connect() );
+	TInt result = file.Open( fSession, KReceivedDataFile, EFileWrite|EFileShareAny );
+	
+	if ( result == KErrNotFound )
+		{
+		file.Create( fSession, KReceivedDataFile, EFileWrite|EFileShareAny );
+		}
+
+	TInt pos( 0 );
+	file.Seek( ESeekEnd, pos );
+	file.Write( KWriteSeparator );
+	file.Write( aData );
+			
+	file.Close();
+	fSession.Close();
+	
+	if ( iBatchMode )
+		{
+		++iBatchCount;
+		iBatchResults.Append( KErrNone );
+		}
+		
+	aResultCode = KErrNone;
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::CommitItemL
+// After item is written to Data Provider it can be saved to the Data Store.
+// This method can be called just after WriteItemL method.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::CommitItemL( const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode )
+	{
+	if ( iBatchMode )
+		{
+		++iBatchCount;
+		iBatchResults.Append( KErrNone );
+		}
+
+	aResultCode = KErrNone;
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::CloseItemL
+// Closes opened item.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::CloseItemL( const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode )
+	{
+	aResultCode = KErrNone;
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::MoveItemL
+// Moves item to new location.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::MoveItemL( TSmlDbItemUid aUid, TSmlDbItemUid aNewParent, const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode )
+	{
+	if ( iBatchMode )
+		{
+		++iBatchCount;
+		
+		if ( aUid == KFailMoveUid )
+			{
+			iBatchResults.Append( KErrNotFound );
+			}
+		else
+			{
+			iBatchResults.Append( KErrNone );
+			}
+			
+		aResultCode = KErrNone;
+
+		return;
+		}
+		
+	// make move to fail for testing purposes
+	if ( aUid == KFailMoveUid )
+		{
+		aResultCode = KErrNotFound;
+		}
+	else
+		{
+		if ( aNewParent == KInvalidParent )
+			{
+			aResultCode = KErrPathNotFound;
+			}
+		else
+			{
+			aResultCode = KErrNone;
+			}
+		}
+	}
+		
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::DeleteItemL
+// Deletes one item at Data Store permanently.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::DeleteItemL( TSmlDbItemUid aUid, const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode )
+	{
+	if ( iBatchMode )
+		{
+		++iBatchCount;
+		
+		if ( aUid == KFailDeleteUid )
+			{
+			iBatchResults.Append( KErrNotFound );
+			}
+		else
+			{
+			iBatchResults.Append( KErrNone );
+			}
+
+		aResultCode = KErrNone;
+		
+		return;
+		}
+
+	// make delete to fail for testing purposes
+	if ( aUid == KFailDeleteUid )
+		{
+		aResultCode = KErrNotFound;
+		}
+	else
+		{
+		aResultCode = KErrNone;
+		}
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::SoftDeleteItemL
+// Soft deletes one item at Data Store.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::SoftDeleteItemL( TSmlDbItemUid /*aUid*/, const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode )
+	{
+	if ( iBatchMode )
+		{
+		++iBatchCount;
+		iBatchResults.Append( KErrNone );
+		}
+
+	aResultCode = KErrNone;
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::DeleteAllItemsL
+// Deletes all items at Data Store permanently.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::DeleteAllItemsL( const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode )
+	{
+	aResultCode = KErrNone;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::HasSyncHistoryL
+// Checks if the Data Store has sync history. If not then slow sync is proposed to Sync Partner.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C TBool CNSmlDSHostClient::HasSyncHistoryL( const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode ) const
+	{
+	aResultCode = KErrNone;
+	return EFalse;
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::AddedItemsL
+// The Data Provider returns UIDs of items that are added after previous synchronization.
+// If the Data Provider uses hierarchical synchronization then added folders must be placed
+// first (from root to leaves) to UID set and finally items.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::AddedItemsL( RNSmlDbItemModificationSet& /*aUidSet*/, const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode ) const
+	{
+	aResultCode = KErrNone;
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::DeletedItemsL
+// The Data Provider returns UIDs of items that are deleted after previous synchronization.
+// If the Data Provider uses hierarchical synchronization then deleted items must be placed
+// first to UID set and folders after items (from leaves to root).
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::DeletedItemsL( RNSmlDbItemModificationSet& /*aUidSet*/, const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode ) const
+	{
+	aResultCode = KErrNone;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::SoftDeleteItemsL
+// The Data Provider returns UIDs of items that are soft deleted after previous synchronization.
+// If the Data Provider uses hierarchical synchronization then soft deleted items must be placed
+// first to UID set and folders after items (from leaves to root).
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::SoftDeleteItemsL( RNSmlDbItemModificationSet& /*aUidSet*/, const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode ) const
+	{
+	aResultCode = KErrNone;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::ModifiedItemsL
+// The Data Provider returns UIDs of items that are modified after previous synchronization.
+// If the Data Provider uses hierarchical synchronization then modified folders must be placed
+// first (from root to leaves) to UID set and finally items.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::ModifiedItemsL( RNSmlDbItemModificationSet& /*aUidSet*/, const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode ) const
+	{
+	aResultCode = KErrNone;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::MovedItemsL
+// The Data Provider returns UIDs of items that are moved after previous synchronization.
+// If the Data Provider uses hierarchical synchronization then moved folders must be placed
+// first (from root to leaves) to UID set and finally items.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::MovedItemsL( RNSmlDbItemModificationSet& /*aUidSet*/, const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode ) const
+	{
+	aResultCode = KErrNone;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::AllItemsL
+// The Data Provider returns UIDs of items that are added, deleted, modified, softdeleted
+// or moved after previous synchronization.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::AllItemsL( RNSmlDbItemModificationSet& aUidSet, const TSmlDataProviderId aId, const TDesC& aStoreName, TInt& aResultCode ) const
+	{
+	if ( aId == KAgenda.iUid )
+		{
+		if ( aStoreName == KNSmlUnicodeAgenda1LocalDbName )
+			{
+			TNSmlDbItemModification modification( 1, TNSmlDbItemModification::ENSmlDbItemAdd );
+			aUidSet.AddItem ( modification );
+			}
+		}
+
+	aResultCode = KErrNone;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::ResetChangeInfoL
+// Reset change info from the Data Provider. The result of this method is that the Data Provider
+// sends just ADD commands to Sync Partner.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::ResetChangeInfoL( const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode )
+	{
+	aResultCode = KErrNone;
+	}
+		
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::CommitChangeInfoL
+// This method is called after some changes are synchronized to Sync Partner. If some changes
+// were synchronized correctly then those UIDs are included to aItems.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::CommitChangeInfoL( MSmlDataItemUidSet& /*aItems*/, const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode )
+	{
+	aResultCode = KErrNone;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostClient::CommitChangeInfoL
+// This method is called after some changes are synchronized to Sync Partner. This method is used if
+// all changes were synchronized correctly.
+// ------------------------------------------------------------------------------------------------	
+EXPORT_C void CNSmlDSHostClient::CommitChangeInfoL( const TSmlDataProviderId /*aId*/, const TDesC& /*aStoreName*/, TInt& aResultCode )
+	{
+	aResultCode = KErrNone;
+	}
+
+EXPORT_C TNSmlDPInformation* CNSmlDSHostClient::DataProviderInformationL( const TSmlDataProviderId /*aId*/, TInt& /*aResultCode*/ ) const
+	{
+	return NULL;
+	}
+	
\ No newline at end of file