diff -r 000000000000 -r b497e44ab2fc syncmlfw/ds/hostserver/dshostclient/src/fakeclient.cpp --- /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 +#include +#include +#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& aIds, RArray& 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& 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 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 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& /*aProperties*/, const TSmlDataProviderId /*aId*/, TInt& aResultCode ) const + { + aResultCode = KErrNone; + } + +EXPORT_C void CNSmlDSHostClient::GetFilterL( const TSmlDataProviderId aId, const TDesC& aStoreName, const RPointerArray& 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& 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