diff -r 2bb96f4ecad8 -r 8e7494275d3a omads/omadsextensions/adapters/contacts/src/NSmlContactsDataStore.cpp --- a/omads/omadsextensions/adapters/contacts/src/NSmlContactsDataStore.cpp Thu Aug 19 09:41:17 2010 +0300 +++ b/omads/omadsextensions/adapters/contacts/src/NSmlContactsDataStore.cpp Tue Aug 31 15:05:37 2010 +0300 @@ -34,35 +34,15 @@ #include #include #include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include "NSmlContactsModsFetcher.h" +#include +#include +#include #include "nsmldebug.h" #include "nsmlconstants.h" -#include -#include "nsmlcontactsdefs.h" #include "nsmldsimpluids.h" #include "nsmlsnapshotitem.h" #include "nsmlchangefinder.h" -#include + #ifndef __WINS__ // This lowers the unnecessary compiler warning (armv5) to remark. @@ -92,7 +72,7 @@ CleanupStack::PushL(self); self->ConstructL(); - CleanupStack::Pop(self); // self + CleanupStack::Pop(); // self _DBG_FILE("CNSmlContactsDataStore::NewL: END"); return self; @@ -101,35 +81,21 @@ // ---------------------------------------------------------------------------- // CNSmlContactsDataStore::CNSmlContactsDataStore() // ---------------------------------------------------------------------------- -EXPORT_C CNSmlContactsDataStore::CNSmlContactsDataStore() : - iKey( TKeyArrayFix( _FOFF( TNSmlSnapshotItem,ItemId() ),ECmpTInt )), - iContactManager(NULL), - iStore(NULL), - iIdConverter(NULL), - iContactViewBase(NULL), - iSize(NULL), - iBuf(NULL), - iVCardEngine(NULL), - iContactLnks(NULL) +EXPORT_C CNSmlContactsDataStore::CNSmlContactsDataStore() : iKey( TKeyArrayFix( _FOFF( TNSmlSnapshotItem,ItemId() ),ECmpTInt )) { _DBG_FILE("CNSmlContactsDataStore::CNSmlContactsDataStore(): begin"); - iSyncHistory = EFalse; iSnapshotRegistered = EFalse; - iServerMaxObjectSize = 0; // Maximum size default value + iServerMaxObjectSize = 0; // Maximum size default value iItemPos = -1; iModificationCount = KNSmlCompactAfterChanges; iState = ENSmlClosed; iStoreName = NULL; - iRetCommand = KErrNone; - iLastOperation = ENSmlNone; - if(iDeleteAllOperation) - { - delete iDeleteAllOperation; - iDeleteAllOperation = NULL; - } + + iDrive = -1; + _DBG_FILE("CNSmlContactsDataStore::CNSmlContactsDataStore(): end"); } @@ -138,23 +104,22 @@ // ---------------------------------------------------------------------------- EXPORT_C void CNSmlContactsDataStore::ConstructL() { - _DBG_FILE("CNSmlContactsDataStore::ConstructL(): begin"); - - ConstructL( ( VPbkContactStoreUris::DefaultCntDbUri() ), KLegacySymbianDatabase ); - + _DBG_FILE("CNSmlContactsDataStore::CNSmlContactsDataStore(): begin"); + ConstructL( KNSmlContactStoreNameForDefaultDB ); _DBG_FILE("CNSmlContactsDataStore::ConstructL(): end"); } // ---------------------------------------------------------------------------- // CNSmlContactsDataStore::ConstructL() // ---------------------------------------------------------------------------- -EXPORT_C void CNSmlContactsDataStore::ConstructL( - const TDesC& aStoreName, const TDesC& aLegacyStore ) +EXPORT_C void CNSmlContactsDataStore::ConstructL( const TDesC& aStoreName ) { - _DBG_FILE("CNSmlContactsDataStore::ConstructL(): begin"); + _DBG_FILE("CNSmlContactsDataStore::CNSmlContactsDataStore(): begin"); + + //TODO: NOT RESPECTING THE aStoreName VALUE FOR 10.1 User::LeaveIfError( iRfs.Connect() ); - + iStringPool.OpenL(); // Uid Sets @@ -167,25 +132,18 @@ // Create iDataMod // This should be done after OpenL if there are more than one database iDataMod = new (ELeave) CNSmlVCardMod(); + iContactsDataStoreExtension = NULL; SetOwnStoreFormatL(); - // open contact database - CVPbkContactStoreUriArray* uriArray = CVPbkContactStoreUriArray::NewLC(); - uriArray->AppendL( TVPbkContactStoreUriPtr( aStoreName )); - iContactManager = CVPbkContactManager::NewL(*uriArray); - CleanupStack::PopAndDestroy(uriArray); - //Default store name - iDefaultStoreName = aStoreName.AllocL(); + // TODO: Determine the Default StoreName + iDefaultStoreName = HBufC::NewL(KNSmlDefaultStoreNameMaxSize); + *iDefaultStoreName = KNSmlContactStoreNameForDefaultDB; - //Fill iPacketStoreName buffer with legacy store name - TBuf dataBase(aLegacyStore); - iPacketStoreName = HBufC::NewL(dataBase.Length()); - TPtr pktStorePtr(iPacketStoreName->Des()); - pktStorePtr.Copy(dataBase); - iDeleteAllOperation = NULL; + iSnapshot = new (ELeave) CArrayFixSeg(KNSmlContactsGranularity); + iCntUidList = new(ELeave) CArrayFixFlat(KNSmlContactsGranularity); - _DBG_FILE("CNSmlContactsDataStore::ConstructL(): end"); + _DBG_FILE("CNSmlContactsDataStore::ConstructL(): end"); } // ---------------------------------------------------------------------------- @@ -199,73 +157,40 @@ iStringPool.Close(); iRfs.Close(); - iWriteStream.Close(); - iReadStream.Close(); - delete iBuf; - if ( iChangeFinder ) { TRAP_IGNORE( iChangeFinder->CloseL() ); delete iChangeFinder; - iChangeFinder = NULL; } - if(iIdConverter) - { - delete iIdConverter; - iIdConverter = NULL; - } - if(iContactLnks) - { - delete iContactLnks; - iContactLnks = NULL; - } - - if(iContactViewBase) + if( iContactsDataStoreExtension ) { - delete iContactViewBase; - iContactViewBase = NULL; + delete iContactsDataStoreExtension; + iContactsDataStoreExtension = NULL; } - if ( iContactsModsFetcher ) - { - iContactsModsFetcher->CancelRequest(); - delete iContactsModsFetcher; - iContactsModsFetcher = NULL; - } - if ( iContactManager ) - { - if(iStore) - { - iStore->Close( *this ); - } - delete iContactManager; - iContactManager = NULL; - } - - delete iVCardEngine; - // Delete UidSets - // delete iNewUids; delete iDeletedUids; delete iSoftDeletedUids; delete iMovedUids; delete iReplacedUids; - // - // Empty BufferItemList if any - // - if ( iContactsBufferItemList.Count() > 0 ) - { - if ( iContactsBufferItemList[iContactsBufferItemList.Count() - 1]->iItemData == iItemData ) - { - iItemData = NULL; - } - } + delete iSnapshot; + delete iCntUidList; +// +// Empty BufferItemList if any +// + if ( iContactsBufferItemList.Count() > 0 ) + { + if ( iContactsBufferItemList[iContactsBufferItemList.Count() - 1]->iItemData == iItemData ) + { + iItemData = NULL; + } + } iContactsBufferItemList.ResetAndDestroy(); + delete iDataMod; - delete iMergeItem; - + if(iItemData) { if(iItemData->Size() > 0 ) @@ -280,18 +205,10 @@ } delete iDefaultStoreName; - delete iPacketStoreName; delete iStoreName; iAddResultArray.Close(); - - if(iDeleteAllOperation) - { - delete iDeleteAllOperation; - iDeleteAllOperation = NULL; - } - } // ---------------------------------------------------------------------------- @@ -300,8 +217,8 @@ // TRequestStatus& aStatus) // ---------------------------------------------------------------------------- EXPORT_C void CNSmlContactsDataStore::DoOpenL( const TDesC& aStoreName, - MSmlSyncRelationship& aContext, - TRequestStatus& aStatus ) + MSmlSyncRelationship& aContext, + TRequestStatus& aStatus ) { DBG_ARGS(_S("CNSmlContactsDataStore::DoOpenL(): '%S' begin"), &aStoreName); @@ -314,10 +231,12 @@ return; } - if( RFs::CharToDrive(aStoreName[0], iDrive) != KErrNone ) + RFs::CharToDrive( KNSmlDriveC()[0], iDrive ); + + /*if( RFs::CharToDrive(aStoreName[0], iDrive) != KErrNone ) { RFs::CharToDrive( KNSmlDriveC()[0], iDrive ); - } + }*/ iOpened = EFalse; if( iStoreName ) @@ -326,47 +245,50 @@ iStoreName = NULL; } - if ( iChangeFinder ) + if ( iContactsDataStoreExtension ) + { + delete iContactsDataStoreExtension; + iContactsDataStoreExtension = NULL; + } + + TInt err( KErrNone ); + + // TODO:Change the storename later + TRAP( err, iContactsDataStoreExtension = CNsmlContactsDataStoreExtension::NewL( KNSmlContactStoreNameForDefaultDB() ) ); + + if( err == KErrNone ) + { + iOpened = ETrue; + iStoreName = aStoreName.AllocL(); + iOpenedStoreId = iContactsDataStoreExtension->MachineIdL(); + } + else + { + DBG_ARGS(_S("CNSmlContactsDataStore::DoOpenL(): result = %d"), err); // Cnt open = err + iOpened = EFalse; + delete iStoreName; + iStoreName = NULL; + iOpenedStoreId = 0; + User::RequestComplete( iCallerStatus, err ); + _DBG_FILE("CNSmlContactsDataStore::DoOpenL(): CONTACTS FILE NOTFOUND end"); + return; + } + + if ( iChangeFinder ) { iChangeFinder->CloseL(); delete iChangeFinder; iChangeFinder = NULL; } - // The Change finder maintains a list of all changes to the database. - iChangeFinder = CNSmlChangeFinder::NewL( - aContext, iKey, iSyncHistory, KNSmlContactsAdapterImplUid ); - - iState = ENSmlOpenAndWaiting; + iChangeFinder = CNSmlChangeFinder::NewL( aContext, iKey, iSyncHistory, KNSmlContactsAdapterImplUid ); + + iState = ENSmlOpenAndWaiting; - //find and open the store - if ( aStoreName == KNSmlContactStoreNameForDefaultDB ) - { - iStore = iContactManager->ContactStoresL().Find( - TVPbkContactStoreUriPtr(*iDefaultStoreName)); - } - else - { - iStore = iContactManager->ContactStoresL().Find( - TVPbkContactStoreUriPtr(aStoreName)); - } - iStore->OpenL(*this); - - iStoreName = aStoreName.AllocL(); + err = FetchModificationsL(); - iVCardEngine = CVPbkVCardEng::NewL( *iContactManager ); - iIdConverter = CVPbkContactIdConverter::NewL(*iStore ); - if ( iContactsModsFetcher ) - { - iContactsModsFetcher->CancelRequest(); - delete iContactsModsFetcher; - iContactsModsFetcher = NULL; - } - - iContactsModsFetcher = CreateModsFetcherL(); + DBG_ARGS(_S("CNSmlContactsDataStore::DoOpenL(): Error: %d"), err); -#ifdef __NSML_MODULETEST__ - CActiveScheduler::Start(); -#endif + User::RequestComplete( iCallerStatus, err ); _DBG_FILE("CNSmlContactsDataStore::DoOpenL(): end"); } @@ -377,38 +299,6 @@ EXPORT_C void CNSmlContactsDataStore::DoCancelRequest() { _DBG_FILE("CNSmlContactsDataStore::DoCancelRequest(): begin"); - if(iLastOperation == ENSMLDeleteAllOp) - { - if(iDeleteAllOperation) - { - delete iDeleteAllOperation; - iDeleteAllOperation = NULL; - } - - if( iChangeFinder ) - { - TRAP_IGNORE(iChangeFinder->ResetL()); - } - iSnapshotRegistered = EFalse; - - if(iContactLnks) - { - delete iContactLnks; - iContactLnks = NULL; - iContactLink = NULL; - } - - if(iContactViewBase) - { - delete iContactViewBase; - iContactViewBase = NULL; - } - User::RequestComplete( iCallerStatus, KErrCancel ); - } - if(iContactsModsFetcher) - { - iContactsModsFetcher->CancelRequest(); - } _DBG_FILE("CNSmlContactsDataStore::DoCancelRequest(): NOT NEEDED end"); } @@ -429,15 +319,14 @@ EXPORT_C const TDesC& CNSmlContactsDataStore::DefaultStoreNameL() const { _DBG_FILE("CNSmlContactsDataStore::DefaultStoreNameL(): begin"); - + if ( !iDefaultStoreName ) { return KNullDesC; } _DBG_FILE("CNSmlContactsDataStore::DefaultStoreNameL(): end"); - //The engine methods that create syncml packet, use this information in Database fields - return *iPacketStoreName; + return *iDefaultStoreName; } // ---------------------------------------------------------------------------- @@ -486,14 +375,20 @@ _DBG_FILE("CNSmlContactsDataStore::DoBeginBatchL(): begin"); iBatchMode = ETrue; // SUPPORTED on Contacts - + + if( iItemDataAddBatch ) + { + iItemDataAddBatch->Reset(); + } + _DBG_FILE("CNSmlContactsDataStore::DoBeginBatchL(): end"); } // ---------------------------------------------------------------------------- // void CNSmlContactsDataStore::DoCommitBatchL() // ---------------------------------------------------------------------------- -EXPORT_C void CNSmlContactsDataStore::DoCommitBatchL( RArray& aResultArray, TRequestStatus& aStatus ) +EXPORT_C void CNSmlContactsDataStore::DoCommitBatchL( RArray& aResultArray, + TRequestStatus& aStatus ) { _DBG_FILE("CNSmlContactsDataStore::DoCommitBatchL(): begin"); @@ -508,235 +403,41 @@ } // // Go through Buffer and execute all commands return aResultArray +// If none of commands succeeds KErrGeneral returned as status otherwise KErrNone returned // - - iResultArray = &aResultArray; - - iIndex = 0; - TRAPD( leavecode,ExecuteBufferL() ); + TInt err = KErrNone; + + TRAPD( leavecode, err = ExecuteBufferL(aResultArray) ); if( leavecode != KErrNone ) { - User::RequestComplete( iCallerStatus, leavecode ); + err = leavecode; } - +// +// Empty Buffer +// + iContactsBufferItemList.ResetAndDestroy(); + + if( iItemDataAddBatch ) + { + iItemDataAddBatch->Reset(); + } + + iBatchMode = EFalse; // All data handled + User::RequestComplete( iCallerStatus, err ); + _DBG_FILE("CNSmlContactsDataStore::DoCommitBatchL(): end"); } // ---------------------------------------------------------------------------- // void CNSmlContactsDataStore::ExecuteBufferL() // ---------------------------------------------------------------------------- -EXPORT_C void CNSmlContactsDataStore::ExecuteBufferL() - { - _DBG_FILE("CNSmlContactsDataStore::ExecuteBufferL(): begin"); - - TInt retCommand( KErrNone ); - - // - // Loop through buffered commands - // - if( iIndex < iContactsBufferItemList.Count()) - { - - if( iContactsBufferItemList[iIndex]->iStatus!= KNSmlNoError ) - { - retCommand = iContactsBufferItemList[iIndex]->iStatus; - } - else if( iContactsBufferItemList[iIndex]->iModType == ENSmlCntItemAdd ) - { - retCommand = ExecuteAddL(); - } - else if( iContactsBufferItemList[iIndex]->iModType == ENSmlCntItemReplace || - iContactsBufferItemList[iIndex]->iModType == ENSmlCntItemFieldLevelReplace ) - { - ExecuteUpdateL(); - } - else if( iContactsBufferItemList[iIndex]->iModType == ENSmlCntItemMove ) - { - ExecuteMoveL(); - } - else if( iContactsBufferItemList[iIndex]->iModType == ENSmlCntItemDelete || - iContactsBufferItemList[iIndex]->iModType == ENSmlCntItemSoftDelete ) - { - ExecuteDeleteL(); - } - // - // Set allready set commands from iContactsBufferItemList - // - if( ( iContactsBufferItemList[iIndex]->iModType == ENSmlCntItemAdd || - iContactsBufferItemList[iIndex]->iModType == ENSmlCntItemReplace || - iContactsBufferItemList[iIndex]->iModType == ENSmlCntItemFieldLevelReplace || - iContactsBufferItemList[iIndex]->iModType == ENSmlCntItemDelete || - iContactsBufferItemList[iIndex]->iModType == ENSmlCntItemSoftDelete ) && - iContactsBufferItemList[iIndex]->iStatus != KNSmlNoError ) - { - retCommand = iContactsBufferItemList[iIndex]->iStatus; - } - - - //if an error occurs when performing any operation - //return the error status - else if(retCommand!=KErrNone) - { - User::RequestComplete( iCallerStatus, retCommand ); - } - - iRetCommand = retCommand; - } - } - -// ---------------------------------------------------------------------------- -// void CNSmlContactsDataStore::ExecuteAddL() -// ---------------------------------------------------------------------------- - -EXPORT_C TInt CNSmlContactsDataStore::ExecuteAddL() - { - TInt retCommand( KErrNone ); - StripPropertyL( iItemDataAddBatch, KVersitTokenUID() ); // Remove UID's from data +EXPORT_C TInt CNSmlContactsDataStore::ExecuteBufferL(RArray& aResultArray) + { + _DBG_FILE("CNSmlContactsDataStore::ExecuteBufferL()"); + return DoExecuteBufferL( aResultArray ); + } - TInt err( KErrNone ); - if(iBatchMode) - { - TRAP( err,LdoAddItemsL( iItemDataAddBatch, - iItemDataAddBatch->Ptr(0).Length()) ); - if(err!=KErrNone) - { - retCommand = err; - TInt j = iIndex; - while( j < iContactsBufferItemList.Count() ) - { - if( iContactsBufferItemList[j]->iModType == ENSmlCntItemAdd && - iContactsBufferItemList[j]->iStatus == KNSmlNoError ) - { - iContactsBufferItemList[j]->iStatus = KErrNotSupported; - iResultArray->AppendL(KErrNotSupported); - } - j++; - } - } - } - else - { - const TPtr8 dataPtr = iItemDataAddBatch->Ptr(0); - TRAP( err, LdoAddItemL( dataPtr, - iContactsBufferItemList[iIndex]->iSize)); - if(err!=KErrNone) - { - retCommand = err; - } - } - return retCommand; - } - -// ---------------------------------------------------------------------------- -// void CNSmlContactsDataStore::ExecuteDeleteL() -// ---------------------------------------------------------------------------- - -EXPORT_C void CNSmlContactsDataStore:: ExecuteDeleteL() - { - - if(iBatchMode) - { - iContactLnks = CVPbkContactLinkArray::NewL(); - - TInt j=iIndex; - while( j < iContactsBufferItemList.Count() ) - { - if( (iContactsBufferItemList[j]->iModType == ENSmlCntItemDelete || - iContactsBufferItemList[j]->iModType == ENSmlCntItemSoftDelete) && - iContactsBufferItemList[j]->iStatus == KNSmlNoError ) - { - TContactItemId id = iContactsBufferItemList[j]->iUid; - - if( id != 0 ) - { - MVPbkContactLink* contactLink = iIdConverter->IdentifierToLinkLC(id); - //check if the contact link is valid - TInt index = iContactViewBase->IndexOfLinkL(*contactLink); - if(index != KErrNotFound) - { - iContactLnks->AppendL(contactLink); - } - else - { - iContactsBufferItemList[j]->iStatus = KErrNotFound; - } - - CleanupStack::Pop();//contactLink - } - else - { - iContactsBufferItemList[j]->iStatus = KErrNotFound; - } - } - j++; - } - - delete iContactViewBase; - iContactViewBase = NULL; - - iContactManager->DeleteContactsL( *iContactLnks, *this ); - iLastOperation = ENSmlDeleteOp; - } - - } - -// ---------------------------------------------------------------------------- -// void CNSmlContactsDataStore::ExecuteUpdateL() -// ---------------------------------------------------------------------------- - -EXPORT_C void CNSmlContactsDataStore::ExecuteUpdateL() - { - iUid = iContactsBufferItemList[iIndex]->iUid; - - iDataMod->SetUsedMimeType( iServerMimeType, iServerMimeVersion ); - - // Check whether merging is needed or not. - if( iDataMod->NeedsMerge() ) - { - iMergeItem = CBufFlat::NewL(64); - iWriteStream.Open(*iMergeItem); - - MVPbkContactLink* contactLink = iIdConverter->IdentifierToLinkLC(iUid); - - iVCardEngine->ExportVCardForSyncL(iWriteStream,*contactLink,*this); - CleanupStack::PopAndDestroy(); - - iLastOperation = ENSMLUpdateExportOp; - } - else - { - LdoUpdateItemL(); - } - } - -// ---------------------------------------------------------------------------- -// void CNSmlContactsDataStore::ExecuteMoveL -// ---------------------------------------------------------------------------- - -EXPORT_C void CNSmlContactsDataStore::ExecuteMoveL() - { - // move command is not supported - if(!iBatchMode) - { - ResetBuffer(); - User::RequestComplete( iCallerStatus, KErrNotSupported ); - } - else - { - iResultArray->AppendL(KErrNotSupported); - iIndex++; - if(iIndex == iContactsBufferItemList.Count() ) - { - ResetBuffer(); - User::RequestComplete( iCallerStatus, KErrNone ); - } - else - { - ExecuteBufferL(); - } - } - } // ---------------------------------------------------------------------------- // void CNSmlContactsDataStore::DoCancelBatch() // ---------------------------------------------------------------------------- @@ -811,10 +512,21 @@ { TFileName fileName; TParse parse; + + // Locate the resource file + TFileName dllFileName; + Dll::FileName( dllFileName ); + + TFileName resourceFileName; + resourceFileName.Copy( TParsePtrC( dllFileName ).Drive() ); + + resourceFileName.Append( GetStoreFormatResourceFileL() ); - parse.Set( GetStoreFormatResourceFileL(), &KDC_RESOURCE_FILES_DIR, NULL ); + parse.Set( resourceFileName, &KDC_RESOURCE_FILES_DIR, NULL ); fileName = parse.FullName(); + + DBG_ARGS(_S("CNSmlContactsDataStore::SetOwnStoreFormatL(): '%S'"), &parse.FullName()); RResourceFile resourceFile; BaflUtils::NearestLanguageFile( iRfs, fileName ); @@ -828,7 +540,7 @@ reader.SetBuffer( contactsDataFormat ); iStoreFormat = CSmlDataStoreFormat::NewLC( iStringPool, reader ); - CleanupStack::Pop(iStoreFormat); // iStoreFormat + CleanupStack::Pop(); // iStoreFormat CleanupStack::PopAndDestroy(2); // contactsDataFormat, resourceFile } @@ -836,10 +548,10 @@ iDataMod->SetOwnStoreFormat( *iStoreFormat ); // Set own MIME type based on store format resource definition. Allows inherited classes to - // use non-standard MIME type by recource change. E.g. Operator specific MIME types can be used. + // use non-standard MIME type by recource change. E.g. Operator specific MIME types can be used. iUsedMimeType.Set( iStoreFormat->MimeFormat(0).MimeType().DesC() ); iUsedMimeVersion.Set( iStoreFormat->MimeFormat(0).MimeVersion().DesC() ); - + _DBG_FILE("CNSmlContactsDataStore::SetOwnStoreFormatL(): end"); return; } @@ -906,10 +618,33 @@ { iItemData->Reset(); } + + TInt err = LdoFetchItemL( aUid, *iItemData ); - LdoFetchItemL( aUid, *iItemData ); - iSize = &aSize; + if( !err ) + { + iItemData->Compress(); + + iDataMod->StripTxL( *iItemData ); +// Get Item size from database after stripping + aSize = iItemData->Size(); + iState = ENSmlItemOpen; + + if ( iServerMaxObjectSize == 0 || aSize <= iServerMaxObjectSize ) + { + User::RequestComplete( iCallerStatus, KErrNone ); + } + else + { + User::RequestComplete( iCallerStatus, KErrTooBig ); + } + } + else + { + User::RequestComplete( iCallerStatus, err ); + } + _DBG_FILE("CNSmlContactsDataStore::DoOpenItemL(): end"); } @@ -932,8 +667,8 @@ if ( iState != ENSmlOpenAndWaiting ) { + _DBG_FILE("CNSmlContactsDataStore::DoCreateItemL - KErrNotReady: END"); User::RequestComplete( iCallerStatus, KErrNotReady ); - _DBG_FILE("CNSmlContactsDataStore::DoCreateItemL - KErrNotReady: END"); return; } @@ -965,12 +700,12 @@ // Allow using custom MIME type defined in store format resource file ( aMimeType.MatchF( iUsedMimeType ) < 0 ) ) { + _DBG_FILE("CNSmlContactsDataStore::DoCreateItemL - KErrNotSupported: END"); User::RequestComplete( iCallerStatus, KErrNotSupported ); - _DBG_FILE("CNSmlContactsDataStore::DoCreateItemL - KErrNotSupported: END"); return; } - // Is there enough space on drive + // Is there enough space on drive ? if( DriveBelowCriticalLevelL( aSize ) ) { err = KErrDiskFull; @@ -1001,7 +736,7 @@ // ---------------------------------------------------------------------------- EXPORT_C void CNSmlContactsDataStore::DoReplaceItemL( TSmlDbItemUid aUid, TInt aSize, - TSmlDbItemUid /*aParent*/, + TSmlDbItemUid /*aParent*/, TBool aFieldChange, TRequestStatus& aStatus ) { @@ -1014,7 +749,7 @@ iUid = aUid; iItemSize = aSize; - iModType = aFieldChange ? ENSmlCntItemFieldLevelReplace : ENSmlCntItemReplace; + iModType = aFieldChange ? ENSmlCntItemFieldLevelReplace : ENSmlCntItemReplace; if ( iItemPos == -1 || !iBatchMode ) { @@ -1025,9 +760,9 @@ { iItemData->Reset(); } - + iFieldLevelReplace = aFieldChange; - + iItemData = AddBufferListL( aUid, aSize, err ); if( iBatchMode ) @@ -1037,6 +772,34 @@ User::RequestComplete( iCallerStatus, KErrNone ); return; } + + CBufBase* tempData = CBufFlat::NewL( KNSmlItemDataExpandSize ); + CleanupStack::PushL( tempData ); + + _DBG_FILE("CNSmlContactsDataStore::DoReplaceItemL(): CContactDatabase::ExportSelectedContactsL() begin"); + + TInt ret = KErrNone; + TRAP( err, ret = ExportContactsL( TUid::Uid(aUid), *tempData ) ); + + _DBG_FILE("CNSmlContactsDataStore::DoReplaceItemL(): CContactDatabase::ExportSelectedContactsL() end"); + CleanupStack::PopAndDestroy( tempData ); + + if ( err || ret ) + { + _DBG_FILE("CNSmlContactsDataStore::DoReplaceItemL(): CContactDatabase::ExportSelectedContactsL() ERROR"); + if ( err == KErrNone ) + { + err = ret; + } + User::RequestComplete( iCallerStatus, err ); + return; + } + + if( !err && DriveBelowCriticalLevelL( aSize ) ) // Is drive getting full? + { + err = KErrDiskFull; + } + if ( err == KErrNone ) { iState = ENSmlItemUpdating; @@ -1053,7 +816,6 @@ EXPORT_C void CNSmlContactsDataStore::DoReadItemL( TDes8& aBuffer ) { _DBG_FILE("CNSmlContactsDataStore::DoReadItemL(): begin"); - if ( iState != ENSmlItemOpen || !iItemData ) { iItemPos = -1; @@ -1074,8 +836,7 @@ { iItemData->Read( iItemPos, aBuffer, iItemData->Size() - iItemPos ); iItemPos = -1; - } - + } _DBG_FILE("CNSmlContactsDataStore::DoReadItemL(): end"); } @@ -1159,14 +920,14 @@ } } else if ((iModType == ENSmlCntItemAdd || // If some write problems - iModType == ENSmlCntItemReplace || - iModType == ENSmlCntItemFieldLevelReplace ) && - iStateItem != KErrNone && - iContactsBufferItemList.Count() > 0) + iModType == ENSmlCntItemReplace || + iModType == ENSmlCntItemFieldLevelReplace ) && + iStateItem != KErrNone && + iContactsBufferItemList.Count() > 0) { iContactsBufferItemList[iContactsBufferItemList.Count()-1]->iStatus = iStateItem; } - + if( iBatchMode ) { iItemData = NULL; @@ -1175,13 +936,39 @@ return; } - - iIndex = 0; - ExecuteBufferL(); + RArray noResultArray; + CleanupClosePushL( noResultArray ); + + TRAPD(err, ExecuteBufferL( noResultArray )); + if( noResultArray.Count() == 1 ) // Should be a single item commit + { + err = noResultArray[0]; + } + CleanupStack::PopAndDestroy(); // noResultArray + + // + // Empty Buffer if not batch mode + // + if ( !iBatchMode ) + { + if(iItemData) + { + iItemData->Reset(); + } + + if(iItemDataAddBatch) + { + iItemDataAddBatch->Reset(); + } + + iContactsBufferItemList.ResetAndDestroy(); + } iItemData = NULL; iState = ENSmlOpenAndWaiting; + User::RequestComplete( iCallerStatus, err ); + _DBG_FILE("CNSmlContactsDataStore::DoCommitItemL(): end"); } @@ -1235,36 +1022,33 @@ EXPORT_C void CNSmlContactsDataStore::DoDeleteItemL( TSmlDbItemUid aUid, TRequestStatus& aStatus ) { _DBG_FILE("CNSmlContactsDataStore::DoDeleteItemL(): begin"); + TInt err = KErrNone; iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; if( iBatchMode ) { - if(iContactViewBase ==NULL) - { - CreateViewL(); - } - if( iModType != ENSmlCntItemSoftDelete ) // Treated like deletes - { - iModType = ENSmlCntItemDelete; - } + if( iModType != ENSmlCntItemSoftDelete ) // Treated like deletes + { + iModType = ENSmlCntItemDelete; + } - TInt fSize = 0; - AddBufferListL( aUid, fSize, KErrNone ); - User::RequestComplete( iCallerStatus, KErrNone ); - return; - } - iUid = aUid; - - //add the contactlink to CVPbkContactLinkArray - MVPbkContactLink* contactLink = iIdConverter->IdentifierToLinkLC(aUid); - CleanupStack::Pop(); - CVPbkContactLinkArray* contactLnks = CVPbkContactLinkArray::NewLC(); - contactLnks->AppendL( contactLink ); - - iContactManager->DeleteContactsL( *contactLnks, *this ); - CleanupStack::PopAndDestroy(); - iLastOperation = ENSmlDeleteOp; + TInt fSize = 0; + AddBufferListL( aUid, fSize, KErrNone ); + User::RequestComplete( iCallerStatus, KErrNone ); + return; + } + + if( iContactsDataStoreExtension->DeleteContactL( TUid::Uid(aUid) ) ) + { + iChangeFinder->ItemDeleted( TNSmlSnapshotItem( aUid ) ); + } + else + { + err = KErrGeneral; + } + + User::RequestComplete( iCallerStatus, err ); _DBG_FILE("CNSmlContactsDataStore::DoDeleteItemL(): end"); } @@ -1287,17 +1071,23 @@ EXPORT_C void CNSmlContactsDataStore::DoDeleteAllItemsL( TRequestStatus& aStatus ) { _DBG_FILE("CNSmlContactsDataStore::DoDeleteAllItemsL(): begin"); - iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; - - //create view to get all the contactlinks to delete - if(iContactViewBase ==NULL) - { - CreateViewL(); - } - - iLastOperation = ENSMLDeleteAllOp; + + if( iContactsDataStoreExtension->DeleteAllContactsL() ) + { + if( iChangeFinder ) + { + iChangeFinder->ResetL(); + } + iSnapshotRegistered = EFalse; + User::RequestComplete( iCallerStatus, KErrNone ); + } + else + { + DBG_ARGS(_S("CNSmlContactsDataStore::DoDeleteAllItemsL(): Error")); + User::RequestComplete( iCallerStatus, KErrGeneral ); + } _DBG_FILE("CNSmlContactsDataStore::DoDeleteAllItemsL(): end"); } @@ -1468,24 +1258,15 @@ iCallerStatus = &aStatus; *iCallerStatus = KRequestPending; + iSnapshotRegistered = EFalse; + if( iChangeFinder ) { iChangeFinder->ResetL(); + FetchModificationsL(); } - - iSnapshotRegistered = EFalse; - if ( iContactsModsFetcher ) - { - iContactsModsFetcher->FetchModificationsL( aStatus ); -#ifdef __NSML_MODULETEST__ - CActiveScheduler::Start(); -#endif - } - else - { - User::RequestComplete( iCallerStatus, KErrNone ); - } + User::RequestComplete( iCallerStatus, KErrNone ); _DBG_FILE("CNSmlContactsDataStore::DoResetChangeInfoL(): end"); } @@ -1540,142 +1321,311 @@ { _DBG_FILE("CNSmlContactsDataStore::DoListStoresLC(): begin"); - MVPbkContactStoreList& storeList = iContactManager->ContactStoresL(); - CDesCArrayFlat* stores = new (ELeave) CDesCArrayFlat(storeList.Count()); - CleanupStack::PushL( stores ); - - TBuf phoneDataBasePrefix(KVPbhkSymbianDBPrefix); + /*CDesCArray* cntStores = new (ELeave) CDesCArrayFlat(1); + iContactsDataStoreExtension->ListStoresL( cntStores ); + CleanupStack::PushL( cntStores );*/ - for(TInt i=0 ; i< storeList.Count(); i++) - { - TBuf currentStore(storeList.At(i).StoreProperties().Uri().UriDes()); - - if(currentStore.Find(phoneDataBasePrefix) == 0)//Check if Symbian Database - { - //For backward compatability with local and remote servers - //The Symbian Db name remains unchanged - //The engine methods that create syncml packet, use this information in Database fields - stores->AppendL(*iPacketStoreName); - } - else//End Symbian Database check - { - stores->AppendL(storeList.At(i).StoreProperties().Uri().UriDes()); - } - } - - _DBG_FILE("CNSmlContactsDataStore::DoListStoresLC(): end"); - - return stores; + CDesCArray* array = new (ELeave) CDesCArrayFlat(1); + array->AppendL(*iDefaultStoreName); + CleanupStack::PushL( array ); + + _DBG_FILE("CNSmlContactsDataStore::DoListStoresLC(): end"); + + return array; } // ------------------------------------------------------------------------------------------------ // TInt CNSmlContactsDataStore::LdoFetchItemL( TSmlDbItemUid& aUid, CBufBase& aItem ) // ------------------------------------------------------------------------------------------------ -EXPORT_C void CNSmlContactsDataStore::LdoFetchItemL( TSmlDbItemUid& aUid, CBufBase& aItem ) +EXPORT_C TInt CNSmlContactsDataStore::LdoFetchItemL( TSmlDbItemUid& aUid, CBufBase& aItem ) { _DBG_FILE("CNSmlContactsDataStore::LdoFetchItemL(): begin"); - iWriteStream.Open(aItem); - - MVPbkContactLink* contactLink = iIdConverter->IdentifierToLinkLC(aUid); - iVCardEngine->ExportVCardForSyncL(iWriteStream,*contactLink,*this); - CleanupStack::PopAndDestroy(); - - iLastOperation = ENSMLFetchOp; + _DBG_FILE("CNSmlContactsDataStore::FetchItemL(): CContactDatabase::ExportSelectedContactsL() begin"); + + TInt err = KErrNone; + TInt ret = KErrNone; + + TRAP( err, ret = ExportContactsL( TUid::Uid(aUid), aItem ) ); + + if( ret != KErrNone ) + { + DBG_ARGS(_S("CNSmlContactsDataStore::FetchItemL(): Error = %d"), ret); + err = ret; + } + + _DBG_FILE("CNSmlContactsDataStore::FetchItemL(): CContactDatabase::ExportSelectedContactsL() end"); _DBG_FILE("CNSmlContactsDataStore::LdoFetchItemL(): end"); - + return err; } // ------------------------------------------------------------------------------------------------ // TInt CNSmlContactsDataStore::LdoAddItemL( TSmlDbItemUid& aUid, // const TDesC8& aItem, // TInt aSize, -// TTime& aLastModified, -// TBool& aConfidential ) +// TTime& aLastModified ) // ------------------------------------------------------------------------------------------------ -EXPORT_C void CNSmlContactsDataStore::LdoAddItemL( const TDesC8& aItem, - TInt aSize) +EXPORT_C TInt CNSmlContactsDataStore::LdoAddItemL( TSmlDbItemUid& aUid, + const TDesC8& aItem, + TInt aSize, + TTime& aLastModified ) { _DBG_FILE("CNSmlContactsDataStore::LdoAddItemL(): begin"); - + + TInt ret( KErrNone ); + if( !iOpened ) { User::Leave( KErrNotReady ); } - // Is there enough space on drive + // Is there enough space on drive ? if( DriveBelowCriticalLevelL( aSize ) ) { - User::Leave( KErrDiskFull ); + return KErrDiskFull; } - iBuf = aItem.AllocLC(); - StripPropertyL( iBuf, KVersitTokenUID() ); + HBufC8* buf = aItem.AllocLC(); + StripPropertyL( buf, KVersitTokenUID() ); + + CArrayFixFlat* entryArray = NULL; + TRAP( ret, entryArray = ImportContactsL( *buf ) ); + + DBG_ARGS(_S("New item to database with return value: '%d'"), ret ); - iReadStream.Open( *iBuf ); - // import a vcard without checking for duplicates - iVCardEngine->ImportVCardForSyncL(*iStore,iReadStream,*this); - iLastOperation = ENSmlAddOp; - CleanupStack::Pop(iBuf); + if( ret == KErrNone && entryArray != NULL ) + { + CleanupStack::PushL( entryArray ); + if( entryArray->Count() ) + { + TInt err(KErrNone); + TUid tId = entryArray->At( 0 ); + CNsmlContactItem* contactitem = CNsmlContactItem::NewL(); + CleanupStack::PushL( contactitem ); + err = iContactsDataStoreExtension->ReadContactL( tId, contactitem ); + if( err == KErrNone) + { + aLastModified = contactitem->iLastModified; + aUid = tId.iUid; + } + CleanupStack::PopAndDestroy( contactitem ); + } + else + { + ret = KErrNotSupported; + } + CleanupStack::PopAndDestroy( entryArray ); + CleanupStack::PopAndDestroy( buf ); + } + else + { + ret = KErrNotSupported; + CleanupStack::PopAndDestroy( buf ); + } _DBG_FILE("CNSmlContactsDataStore::LdoAddItemL(): end"); - + return ret; } + // ------------------------------------------------------------------------------------------------ -// TInt CNSmlContactsDataStore::LdoAddItemsL( CBufBase*& aItems, -// TInt aSize) +// TInt CNSmlContactsDataStore::LdoAddItemsL( RArray& aUids,CBufBase*& aItems, +// TInt aSize, TTime& aLastModified ) // ------------------------------------------------------------------------------------------------ -EXPORT_C void CNSmlContactsDataStore::LdoAddItemsL( CBufBase*& aItems, - TInt aSize) +EXPORT_C TInt CNSmlContactsDataStore::LdoAddItemsL( RArray& aUids, + CBufBase*& aItems, + TInt aSize, + TTime& aLastModified ) { - _DBG_FILE("CNSmlContactsDataStore::LdoAddItemL(): begin"); - + _DBG_FILE("CNSmlContactsDataStore::LdoAddItemsL(): begin"); + + TInt ret( KErrNone ); + if( !iOpened ) { User::Leave( KErrNotReady ); } - // Is there enough space on drive + // Is there enough space on drive ? if( DriveBelowCriticalLevelL( aSize ) ) { - User::Leave( KErrDiskFull ); + return KErrDiskFull; } - iReadStream.Open( aItems->Ptr(0) ); - // import vcards without checking for duplicates - iVCardEngine->ImportVCardForSyncL(*iStore,iReadStream,*this); - iLastOperation = ENSmlAddOp; - _DBG_FILE("CNSmlContactsDataStore::LdoAddItemL(): end"); + CArrayFixFlat* entryArray = NULL; + TRAP( ret, entryArray = ImportContactsL( aItems->Ptr( 0 ) ) ); + DBG_ARGS(_S("New items to database with return value: '%d'"), ret ); + + if( ret == KErrNone && entryArray != NULL) + { + CleanupStack::PushL( entryArray ); + if( entryArray->Count() ) + { + TInt i = 0; + while( i < entryArray->Count() ) + { + TUid tId = entryArray->At(i); + if (i == (entryArray->Count()-1) ) // Get last Modified date + { + TInt err(KErrNone); + CNsmlContactItem* contactitem = CNsmlContactItem::NewL(); + CleanupStack::PushL( contactitem ); + err = iContactsDataStoreExtension->ReadContactL( tId, contactitem ); + if( err == KErrNone ) + { + aLastModified = contactitem->iLastModified; + } + CleanupStack::PopAndDestroy( contactitem ); + } + aUids.Append( tId.iUid ); + i++; + } + } + else + { + ret = KErrNotSupported; + } + CleanupStack::PopAndDestroy( entryArray ); + } + else + { + ret = KErrNotSupported; + } + + _DBG_FILE("CNSmlContactsDataStore::LdoAddItemsL(): end"); + return ret; } - + // ------------------------------------------------------------------------------------------------ // TInt CNSmlContactsDataStore::LdoUpdateItemL(TSmlDbItemUid aUid, // const TDesC8& aItem, // TInt aSize, // TTime& aLastModified ) // ------------------------------------------------------------------------------------------------ -EXPORT_C void CNSmlContactsDataStore::LdoUpdateItemL() +EXPORT_C TInt CNSmlContactsDataStore::LdoUpdateItemL( TSmlDbItemUid aUid, + const TDesC8& aItem, + TInt aSize, + TTime& aLastModified ) { _DBG_FILE("CNSmlContactsDataStore::LdoUpdateItemL(): begin"); + TInt ret(KErrNone); + + // Is there enough space on drive ? + if( DriveBelowCriticalLevelL( aSize) ) + { + return KErrDiskFull; + } - iBuf = iContactsBufferItemList[iIndex]->iItemData->Ptr(0).AllocLC(); - // Remove UID's from data - StripPropertyL( iBuf, KVersitTokenUID() ); + CNsmlContactItem* contactitem = CNsmlContactItem::NewL(); + CleanupStack::PushL( contactitem ); + ret = iContactsDataStoreExtension->ReadContactL( TUid::Uid( aUid ), contactitem ); + + if( ret != KErrNone ) + { + CleanupStack::PopAndDestroy( contactitem ); + DBG_ARGS(_S("CNSmlContactsDataStore::LdoUpdateItemL(): Error = %d"), ret); + return ret; + } + + // Set mimetype + version + iDataMod->SetUsedMimeType( iServerMimeType, iServerMimeVersion ); - iReadStream.Open( *iBuf ); - iContactLink = iIdConverter->IdentifierToLinkLC(iUid); - iVCardEngine->ImportVCardMergeL(*iContactLink, *iStore, iReadStream, *this); + DBG_DUMP((void*)aItem.Ptr(), aItem.Length(), + _S8("CNSmlContactsDataStore::LdoUpdateItemL(): ReceivedItem:")); + + CBufBase* bItem = LdoMergeLC( aUid, aItem ); + HBufC8* hItemBuf = HBufC8::NewL( bItem->Size() + 80 ); + *hItemBuf = bItem->Ptr(0); + CleanupStack::PopAndDestroy(); // bItem + CleanupStack::PushL( hItemBuf ); + StripPropertyL( hItemBuf, KVersitTokenUID() ); + + TPtr8 hItemPtr( hItemBuf->Des() ); + HBufC8* endPropBuf = HBufC8::NewLC( KVersitTokenEND().Length() + KVersitTokenCRLF().Length() + KVersitTokenColon().Length() ); + TPtr8 endPropPtr( endPropBuf->Des() ); + endPropPtr.Append( KVersitTokenCRLF() ); + endPropPtr.Append( KVersitTokenEND() ); + endPropPtr.Append( KVersitTokenColon() ); + TInt endPos = hItemPtr.Find( endPropPtr ); + if( endPos == KErrNotFound ) + { + User::Leave( KErrNotSupported ); + } + hItemPtr.Insert( endPos, KVersitTokenCRLF() ); + endPos += KVersitTokenCRLF().Length(); + hItemPtr.Insert( endPos, KVersitTokenUID() ); + endPos += KVersitTokenUID().Length(); + hItemPtr.Insert( endPos, KVersitTokenColon() ); + endPos += KVersitTokenColon().Length(); + hItemPtr.Insert( endPos, *contactitem->iGuid ); + + DBG_DUMP((void*)hItemPtr.Ptr(), hItemPtr.Length(), + _S8("CNSmlContactsDataStore::LdoUpdateItemL(): MergedItem:")); + + CleanupStack::PopAndDestroy( endPropBuf ); - CleanupStack::Pop(); - iLastOperation = ENSMLUpdateImportOp; - CleanupStack::Pop(iBuf); + // TODO: Get it reviewed + CArrayFixFlat* entryArray = NULL; + TRAP( ret, entryArray = ImportContactsL( hItemPtr ) ); + if( ret == KErrNone && entryArray != NULL) + { + CleanupStack::PushL( entryArray ); + if( !entryArray->Count() ) + { + ret = KErrNotSupported; + } + else + { + TInt err(KErrNone); + TUid tId = TUid::Uid( aUid ); + CNsmlContactItem* updatedContactitem = CNsmlContactItem::NewL(); + CleanupStack::PushL( updatedContactitem ); + err = iContactsDataStoreExtension->ReadContactL( tId, contactitem ); + if( err == KErrNone) + { + aLastModified = updatedContactitem->iLastModified; + } + CleanupStack::PopAndDestroy( updatedContactitem ); // updatedContact + } + CleanupStack::PopAndDestroy(3); // contactitem, hItemBuf, entryArray + } + else + { + ret = KErrNotSupported; + CleanupStack::PopAndDestroy(2); // contactitem, hItemBuf + } + + iFieldLevelReplace = EFalse; _DBG_FILE("CNSmlContactsDataStore::LdoUpdateItemL(): end"); - + return ret; } +// ------------------------------------------------------------------------------------------------ +// CBufBase* CNSmlContactsDataStore::LdoMergeLC( TSmlDbItemUid& aUid, const TDesC8& aItem ) +// ------------------------------------------------------------------------------------------------ +EXPORT_C CBufBase* CNSmlContactsDataStore::LdoMergeLC( TSmlDbItemUid& aUid, const TDesC8& aItem ) + { + _DBG_FILE("CNSmlContactsDataStore::LdoMergeLC(): begin"); + CBufFlat* b = CBufFlat::NewL(64); + CleanupStack::PushL( b ); + b->InsertL( 0, aItem ); + + if( iDataMod->NeedsMerge() ) + { + CBufFlat* mergeItem = CBufFlat::NewL(64); + CleanupStack::PushL( mergeItem ); + if( LdoFetchItemL( aUid, *mergeItem) == KErrNone ) + { + iDataMod->MergeRxL( *b, *mergeItem, iFieldLevelReplace ); + } + CleanupStack::PopAndDestroy(); // mergeItem + } + + _DBG_FILE("CNSmlContactsDataStore::LdoMergeLC(): end"); + return b; + } // ------------------------------------------------------------------------------------------------ // CNSmlContactsDataStore::DriveBelowCriticalLevelL() @@ -1724,6 +1674,7 @@ iMimeTypeItem.Set( KNullDesC8 ); iMimeVersionItem.Set( KNullDesC8 ); + iLastItem = ETrue; CleanupStack::Pop(); @@ -1807,756 +1758,399 @@ CleanupStack::PopAndDestroy(); // propBuf _DBG_FILE("CNSmlContactsDataStore::StripPropertyL(): end"); } - -// ---------------------------------------------------------------------------- -// CNSmlContactsDataStore::IsConfidentialL -// ---------------------------------------------------------------------------- -// -EXPORT_C TBool CNSmlContactsDataStore::IsConfidentialL( MVPbkStoreContact& aItem ) - { - _DBG_FILE("CNSmlContactsDataStore::IsConfidentialL(): begin"); - TBool ret( EFalse ); - - //find X-CLASS field type - const MVPbkFieldType* syncclass = - iContactManager->FieldTypes().Find(R_VPBK_FIELD_TYPE_SYNCCLASS ); - CVPbkBaseContactFieldTypeIterator* itr = - CVPbkBaseContactFieldTypeIterator::NewLC( *syncclass, - aItem.Fields() ); - while ( itr->HasNext() ) - { - const MVPbkBaseContactField* field = itr->Next(); - const MVPbkContactFieldTextData& data = MVPbkContactFieldTextData::Cast(field->FieldData()); - TPtrC ptr = data.Text(); - //compare the sync type - if ( ptr.Compare( KNSmlContactSyncNoSync ) == 0 ) - { - _DBG_FILE("CNSmlContactsDataStore::IsConfidentialL(): \ - find confidential"); - ret = ETrue; - } - - } - CleanupStack::PopAndDestroy( itr ); - - _DBG_FILE("CNSmlContactsDataStore::IsConfidentialL(): end"); - return ret; - } - - // ---------------------------------------------------------------------------- -// CNSmlContactsDataStore::ResetBuffer -// ---------------------------------------------------------------------------- -// -EXPORT_C void CNSmlContactsDataStore:: ResetBuffer() - { - if( iItemDataAddBatch ) - { - iItemDataAddBatch->Reset(); - } - iContactsBufferItemList.ResetAndDestroy(); - } -// ----------------------------------------------------------------------------- -// From MVPbkContactStoreListObserver -// Called when a contact store is ready to use. -// ----------------------------------------------------------------------------- - -EXPORT_C void CNSmlContactsDataStore::StoreReady( MVPbkContactStore& /*aContactStore*/ ) - { - _DBG_FILE("CNSmlContactsDataStore::StoreReady(): begin"); - //The contact data base opened successfully - iOpened = ETrue; - //id to uniquely identify the opened store - iOpenedStoreId = DefaultHash::Des16( - iStore->StoreProperties().Uri().UriDes()); - - TRAPD(error, iContactsModsFetcher->FetchModificationsL( *iCallerStatus )); - if(error != KErrNone) - { - User::RequestComplete( iCallerStatus, error ); - } - _DBG_FILE("CNSmlContactsDataStore::StoreReady(): end"); - } - - -// --------------------------------------------------------------------------- -// From MVPbkContactStoreListObserver -// Called when a contact store becomes unavailable. -// --------------------------------------------------------------------------- -// -EXPORT_C void CNSmlContactsDataStore::StoreUnavailable( - MVPbkContactStore& /*aContactStore*/, - TInt aReason ) - { - _DBG_FILE("CNSmlContactsDataStore::StoreUnavailable(): begin"); - - //Unable open the default contact data base - iOpened = EFalse; - delete iStoreName; - iStoreName = NULL; - iOpenedStoreId = 0; - User::RequestComplete( iCallerStatus, aReason ); - _DBG_FILE("CNSmlContactsDataStore::StoreUnavailable(): end"); - return; - - } - -// --------------------------------------------------------------------------- -// From MVPbkContactStoreListObserver -// --------------------------------------------------------------------------- -// -EXPORT_C void CNSmlContactsDataStore::HandleStoreEventL( - MVPbkContactStore& /*aContactStore*/, - TVPbkContactStoreEvent /*aStoreEvent*/ ) - { - //Indication not needed. - } - -// --------------------------------------------------------------------------- -// CNSmlContactsDataStore::VPbkSingleContactOperationComplete -// --------------------------------------------------------------------------- -// -EXPORT_C void CNSmlContactsDataStore::VPbkSingleContactOperationComplete( - MVPbkContactOperationBase& aOperation, - MVPbkStoreContact* aContact ) - { - MVPbkContactOperationBase* operation = &aOperation; - if ( operation ) - { - delete operation; - operation = NULL; - } - TRAPD(error ,SingleContactOperationCompleteL(aContact)); - delete aContact; - if(error!= KErrNone) - { - User::RequestComplete( iCallerStatus, error ); - } - } - -// --------------------------------------------------------------------------- -// CNSmlContactsDataStore::VPbkSingleContactOperationFailed -// --------------------------------------------------------------------------- -// -EXPORT_C void CNSmlContactsDataStore::VPbkSingleContactOperationFailed( - MVPbkContactOperationBase& aOperation, - TInt aError ) - { - MVPbkContactOperationBase* operation = &aOperation; - if ( operation ) - { - delete operation; - operation = NULL; - } - - if(iLastOperation == ENSMLFetchOp) - { - iWriteStream.Close(); - User::RequestComplete( iCallerStatus, aError ); - } - else if (iLastOperation == ENSMLUpdateExportOp) - { - iWriteStream.Close(); - delete iMergeItem; - iMergeItem = NULL; - User::RequestComplete( iCallerStatus, aError ); - } - else if (iLastOperation == ENSMLUpdateImportOp) - { - if(iBatchMode) - { - iResultArray->Append( aError ); - } - delete iContactLink; - iContactLink = NULL; - delete iBuf; - iBuf = NULL; - iReadStream.Close(); - iIndex++; - if(iIndex == iContactsBufferItemList.Count() ) - { - ResetBuffer(); - User::RequestComplete( iCallerStatus, aError ); - } - else - { - _DBG_FILE("VPbkSingleContactOperationFailed, Continuing to complete the Batch Operation"); - ExecuteBufferL(); - } - } - else if(iLastOperation == ENSmlRetrieveOp) - { - iRetrieveCount--; - if(iBatchMode) - { - iResultArray->AppendL( aError ); - } - iIndex++; - if(iIndex == iContactsBufferItemList.Count() ) - { - ResetBuffer(); - User::RequestComplete( iCallerStatus, aError ); - } - else if(!iRetrieveCount) - { - _DBG_FILE("VPbkSingleContactOperationFailed, Continuing to complete the Batch Operation"); - ExecuteBufferL(); - } - } - else - { - _DBG_FILE("VPbkSingleContactOperationFailed, No Matching LastOperation Completing the Operation"); - User::RequestComplete( iCallerStatus, aError ); - } - _DBG_FILE("CNSmlContactsDataStore::VPbkSingleContactOperationFailed(): end"); - } - // --------------------------------------------------------------------------- -// CNSmlContactsDataStore::VPbkSingleContactOperationFailed -// --------------------------------------------------------------------------- -// -EXPORT_C void CNSmlContactsDataStore::SingleContactOperationCompleteL( - MVPbkStoreContact* aContact) - { - if(iLastOperation == ENSMLFetchOp) - { - iWriteStream.Close(); - - iItemData->Compress(); - //strip the fields not supported by server - iDataMod->StripTxL( *iItemData ); - *iSize = iItemData->Size(); - iState = ENSmlItemOpen; - if ( iServerMaxObjectSize == 0 || *iSize <= iServerMaxObjectSize ) - { - User::RequestComplete( iCallerStatus, KErrNone ); - } - else - { - User::RequestComplete( iCallerStatus, KErrTooBig ); - } - } - else if (iLastOperation == ENSMLUpdateExportOp) - { - iDataMod->MergeRxL( *iContactsBufferItemList[iIndex]->iItemData, - *iMergeItem, iFieldLevelReplace ); - iWriteStream.Close(); - delete iMergeItem; - iMergeItem = NULL; - LdoUpdateItemL(); - } - else if (iLastOperation == ENSMLUpdateImportOp) - { - iFieldLevelReplace = EFalse; - - if(!IsConfidentialL(*aContact)) - { - TInt32 id = iIdConverter->LinkToIdentifier(*aContact->CreateLinkLC()); - - TNSmlSnapshotItem item(id); - - MVPbkStoreContact2* tempContact = - reinterpret_cast (aContact->StoreContactExtension (KMVPbkStoreContactExtension2Uid)); - - MVPbkStoreContactProperties *contactProterties - = tempContact ->PropertiesL();; - CleanupDeletePushL(contactProterties); - item.SetLastChangedDate(contactProterties->LastModifiedL()); - CleanupStack::PopAndDestroy(); - - item.SetSoftDelete( EFalse ); - - TRAP_IGNORE(iChangeFinder->ItemUpdatedL( item )); - - CleanupStack::PopAndDestroy(); - if(iBatchMode) - { - iResultArray->Append(KErrNone); - } - - delete iContactLink; - iContactLink = NULL; - - delete iBuf; - iBuf = NULL; - iReadStream.Close(); - - iIndex++; - if(iIndex == iContactsBufferItemList.Count() ) - { - ResetBuffer(); - User::RequestComplete( iCallerStatus, iRetCommand ); - } - else - { - ExecuteBufferL(); - } - } - - } - else if(iLastOperation == ENSmlRetrieveOp) - { - iRetrieveCount--; - if(!IsConfidentialL(*aContact)) - { - TInt32 id = iIdConverter->LinkToIdentifier(*aContact->CreateLinkLC()); - *iContactsBufferItemList[iIndex]->iPUid = id; - - TNSmlSnapshotItem item(id); - - MVPbkStoreContact2* tempContact = - reinterpret_cast (aContact->StoreContactExtension (KMVPbkStoreContactExtension2Uid)); - - MVPbkStoreContactProperties *contactProterties - = tempContact ->PropertiesL();; - CleanupDeletePushL(contactProterties); - item.SetLastChangedDate(contactProterties->LastModifiedL()); - CleanupStack::PopAndDestroy(); - - item.SetSoftDelete( EFalse ); - // Add the snapshot item to the Change Finder. - TRAP_IGNORE(iChangeFinder->ItemAddedL( item )); - - CleanupStack::PopAndDestroy(); - } - if(iBatchMode) - { - iResultArray->AppendL(iRetCommand); - } - - iIndex++; - if(iIndex == iContactsBufferItemList.Count() ) - { - ResetBuffer(); - User::RequestComplete( iCallerStatus, iRetCommand ); - } - else if(!iRetrieveCount) - { - ExecuteBufferL(); - } - - } - } - // --------------------------------------------------------------------------- -// CNSmlContactsDataStore::ContactsSaved. -// --------------------------------------------------------------------------- -// -EXPORT_C void CNSmlContactsDataStore::ContactsSaved( - MVPbkContactOperationBase& aOperation, - MVPbkContactLinkArray* aResults ) - { - MVPbkContactOperationBase* operation = &aOperation; - if ( operation ) - { - delete operation; - operation = NULL; - } - - if(iLastOperation == ENSmlAddOp) - { - //Count of contacts to be added from server to client - TInt cntAddCount( 0 ); - TInt i(iIndex); - while( iiModType == ENSmlCntItemAdd && - iContactsBufferItemList[i]->iStatus == KNSmlNoError ) - { - cntAddCount++; - } - i++; - } - - //Count of contacts successfully added to client - iRetrieveCount = aResults->Count(); - - //Count of contacts which could not be added - TInt cntAddFailedCount(0); - cntAddFailedCount = cntAddCount-iRetrieveCount; - while(cntAddFailedCount > 0) - { - iContactsBufferItemList[iIndex++]->iStatus = KErrGeneral; - iResultArray->Append(KErrGeneral); - cntAddFailedCount--; - } - - if ( aResults->Count() > 0 ) - { - for(TInt i=0;iCount();i++) - { - //retrieve the contact - TRAPD(error,iContactManager->RetrieveContactL( aResults->At(i), *this )); - if(error != KErrNone) - { - User::RequestComplete( iCallerStatus, error ); - } - iLastOperation = ENSmlRetrieveOp; - } - } - delete iBuf; - delete aResults; - iBuf = NULL; - iReadStream.Close(); - } - - } - - // --------------------------------------------------------------------------- -// CNSmlContactsDataStore::ContactsSavingFailed -// --------------------------------------------------------------------------- -// -EXPORT_C void CNSmlContactsDataStore::ContactsSavingFailed( - MVPbkContactOperationBase& aOperation, TInt aError ) - { - MVPbkContactOperationBase* operation = &aOperation; - if ( operation ) - { - delete operation; - operation = NULL; - } - - if(iLastOperation == ENSmlAddOp) - { - if(iBatchMode) - { - while( iIndex < iContactsBufferItemList.Count() && - iContactsBufferItemList[iIndex]->iModType == ENSmlCntItemAdd ) - { - iContactsBufferItemList[iIndex++]->iStatus = KErrGeneral; - iResultArray->Append(KErrGeneral); - } - } - else - { - iIndex++; - } - - if(iIndex == iContactsBufferItemList.Count()) - { - User::RequestComplete( iCallerStatus, aError ); - ResetBuffer(); - delete iBuf; - iBuf = NULL; - iReadStream.Close(); - } - //Execute the remaining commands in batch - else - { - TRAPD(error,ExecuteBufferL()); - if(error != KErrNone) - { - User::RequestComplete( iCallerStatus, error ); - } - } - } - } -// --------------------------------------------------------------------------- -// CNSmlContactsDataStore::StepComplete -// --------------------------------------------------------------------------- -// -EXPORT_C void CNSmlContactsDataStore::StepComplete( - MVPbkContactOperationBase& /*aOperation*/, - TInt aStepSize ) - { - if(iLastOperation == ENSmlDeleteOp) - { - if(iBatchMode) - { - for(TInt i = 0 ; iAppend(KErrNone); - if( iContactsBufferItemList[iIndex]->iModType == ENSmlCntItemDelete && - iContactsBufferItemList[iIndex]->iStatus == KNSmlNoError ) - { - iContactsBufferItemList[iIndex]->iStatus = KErrNone; - iUid = iContactsBufferItemList[iIndex]->iUid; - iChangeFinder->ItemDeleted( TNSmlSnapshotItem( iUid )); - } - else if( iContactsBufferItemList[iIndex]->iModType == ENSmlCntItemSoftDelete && - iContactsBufferItemList[iIndex]->iStatus == KNSmlNoError ) - { - - iContactsBufferItemList[iIndex]->iStatus = KErrNone; - iUid = iContactsBufferItemList[iIndex]->iUid; - TRAP_IGNORE(iChangeFinder->ItemSoftDeletedL( TNSmlSnapshotItem( iUid ) )); - } - iIndex++; - } - } - else - { - iChangeFinder->ItemDeleted( TNSmlSnapshotItem( iUid ) ); - User::RequestComplete( iCallerStatus, KErrNone ); - } - } - } - // --------------------------------------------------------------------------- -// CNSmlContactsDataStore::StepFailed -// --------------------------------------------------------------------------- -// -EXPORT_C TBool CNSmlContactsDataStore::StepFailed( - MVPbkContactOperationBase& /*aOperation*/, - TInt /*aStepSize*/, - TInt aError ) - { - if(iLastOperation == ENSmlDeleteOp) - { - if(iBatchMode) - { - if( iIndex < iContactsBufferItemList.Count() && - iContactsBufferItemList[iIndex]->iModType == ENSmlCntItemDelete ) - { - iContactsBufferItemList[iIndex++]->iStatus = KErrGeneral; - iResultArray->Append(KErrGeneral); - } - - } - else - { - User::RequestComplete( iCallerStatus, aError ); - } - } - return ETrue; - } -// --------------------------------------------------------------------------- -// CNSmlContactsDataStore::OperationComplete -// --------------------------------------------------------------------------- -// -EXPORT_C void CNSmlContactsDataStore::OperationComplete - ( MVPbkContactOperationBase& aOperation ) - { - MVPbkContactOperationBase* operation = &aOperation; - if ( operation ) - { - delete operation; - operation = NULL; - } - - TRAPD(error ,OperationCompleteL()); - if(error != KErrNone) - { - User::RequestComplete( iCallerStatus, error ); - } - } - -// --------------------------------------------------------------------------- -// CNSmlContactsDataStore::OperationCompleteL -// --------------------------------------------------------------------------- -// -EXPORT_C void CNSmlContactsDataStore::OperationCompleteL() - { - if(iLastOperation == ENSmlDeleteOp) - { - if(iBatchMode ) - { - if(iResultArray->Count() != iContactsBufferItemList.Count()) - { - while( iIndex < iContactsBufferItemList.Count() && - iContactsBufferItemList[iIndex]->iModType == ENSmlCntItemDelete - && iContactsBufferItemList[iIndex]->iStatus == KErrNotFound ) - { - iResultArray->Append(KErrNotFound); - iIndex++; - } - } - - if(iIndex == iContactsBufferItemList.Count()) - { - if(iItemData) - { - iItemData->Reset(); - } - - ResetBuffer(); - User::RequestComplete( iCallerStatus, KErrNone ); - } - else - { - ExecuteBufferL(); - } - } - else - { - - if(iItemData) - { - iItemData->Reset(); - } - - ResetBuffer(); - } - } - else - { - if(iLastOperation == ENSMLDeleteAllOp) - { - iDeleteAllOperation = NULL; - } - if( iChangeFinder ) - { - iChangeFinder->ResetL(); - } - iSnapshotRegistered = EFalse; - - delete iContactLnks; - iContactLnks = NULL; - iContactLink = NULL; - - delete iContactViewBase; - iContactViewBase = NULL; - User::RequestComplete( iCallerStatus, KErrNone ); - - } - - } - -// --------------------------------------------------------------------------- -// CNSmlContactsDataStore::ContactViewReady -// Implements the view ready function of MVPbkContactViewObserver -// --------------------------------------------------------------------------- -EXPORT_C void CNSmlContactsDataStore::ContactViewReady( - MVPbkContactViewBase& /*aView*/ ) - { - if(iLastOperation == ENSMLDeleteAllOp) - { - TRAPD(error,DoDeleteAllContactsL()); - if(error != KErrNone) - { - User::RequestComplete( iCallerStatus, error ); - } - } - } -// --------------------------------------------------------------------------- -// CNSmlContactsDataStore::PrepareForContactsDeleteL() -// Delete all the contacts at client -// --------------------------------------------------------------------------- -EXPORT_C void CNSmlContactsDataStore::DoDeleteAllContactsL() - { - iContactLnks = CVPbkContactLinkArray::NewL(); - TInt contactCount = iContactViewBase->ContactCountL(); - //add all the contact links to ContactLinkArray - for( TInt i = 0; i < contactCount; i++ ) - { - const MVPbkViewContact& contact = - iContactViewBase->ContactAtL(i); - iContactLink = contact.CreateLinkLC(); - iContactLnks->AppendL(iContactLink); - CleanupStack::Pop(); - } - - iDeleteAllOperation = iContactManager->DeleteContactsL( *iContactLnks, *this ); - - } - -// --------------------------------------------------------------------------- -// CNSmlContactsDataStore::ContactViewUnavailable -// Implements the view unavailable function of MVPbkContactViewObserver -// --------------------------------------------------------------------------- -EXPORT_C void CNSmlContactsDataStore::ContactViewUnavailable( - MVPbkContactViewBase& /*aView*/ ) - { - - } - -// --------------------------------------------------------------------------- -// CNSmlContactsDataStore::ContactAddedToView -// Implements the add contact function of MVPbkContactViewObserver -// --------------------------------------------------------------------------- -EXPORT_C void CNSmlContactsDataStore::ContactAddedToView( - MVPbkContactViewBase& /*aView*/, - TInt /*aIndex*/, - const MVPbkContactLink& /*aContactLink*/ ) - { - } - -// --------------------------------------------------------------------------- -// CNSmlContactsDataStore::ContactRemovedFromView -// Implements the remove contact function of MVPbkContactViewObserver -// --------------------------------------------------------------------------- -EXPORT_C void CNSmlContactsDataStore::ContactRemovedFromView( - MVPbkContactViewBase& /*aView*/, - TInt /*aIndex*/, - const MVPbkContactLink& /*aContactLink*/ ) - { - } - -// --------------------------------------------------------------------------- -// CNSmlContactsDataStore::ContactViewError -// Implements the view error function of MVPbkContactViewObserver -// --------------------------------------------------------------------------- -EXPORT_C void CNSmlContactsDataStore::ContactViewError( - MVPbkContactViewBase& /*aView*/, - TInt /*aError*/, - TBool /*aErrorNotified*/ ) - { - - } - -// ----------------------------------------------------------------------------- -// CNSmlContactsDataStore::CreateViewL() -// Create a contact view -// ----------------------------------------------------------------------------- -EXPORT_C void CNSmlContactsDataStore::CreateViewL() - { - - CVPbkContactViewDefinition* viewDef = CVPbkContactViewDefinition::NewL(); - CleanupStack::PushL( viewDef ); - viewDef->SetType( EVPbkContactsView ); - - viewDef->SetUriL(iStore->StoreProperties().Uri().UriDes()); - - iContactViewBase = iContactManager->CreateContactViewLC( - *this, - *viewDef, - iContactManager->FieldTypes() ); - CleanupStack::Pop(); - CleanupStack::PopAndDestroy(viewDef); - } // ------------------------------------------------------------------------------------------------ // CNSmlContactsDataStore::GetStoreFormatResourceFileL // ------------------------------------------------------------------------------------------------ -EXPORT_C const TDesC& CNSmlContactsDataStore::GetStoreFormatResourceFileL() +EXPORT_C const TDesC& CNSmlContactsDataStore::GetStoreFormatResourceFileL() const { - _DBG_FILE("CNSmlContactsDataStore::GetStoreFormatResourceFileL(): begin"); - + _DBG_FILE("CNSmlContactsDataStore::GetStoreFormatResourceFileL(): BEGIN"); + // Check correct Data Sync protocol TInt value( EDataSyncNotRunning ); TInt error = RProperty::Get( KPSUidDataSynchronizationInternalKeys, - KDataSyncStatus, value ); - if ( error == KErrNone && - value == EDataSyncRunning ) + KDataSyncStatus, + value ); + if ( error == KErrNone && value == EDataSyncRunning ) { + _DBG_FILE("CNSmlContactsDataStore::GetStoreFormatResourceFileL() 1.1.2: END"); return KNSmlContactsStoreFormatRsc_1_1_2; } else // error or protocol version 1.2 { + _DBG_FILE("CNSmlContactsDataStore::GetStoreFormatResourceFileL() 1.2: END"); return KNSmlContactsStoreFormatRsc_1_2; } - _DBG_FILE("CNSmlContactsDataStore::GetStoreFormatResourceFileL(): end"); + } + + +// ---------------------------------------------------------------------------- +// CNSmlContactsDataStore::DoExecuteBufferL +// ---------------------------------------------------------------------------- +EXPORT_C TInt CNSmlContactsDataStore::DoExecuteBufferL(RArray& aResultArray) + { + _DBG_FILE("CNSmlContactsDataStore::DoExecuteBufferL(): begin"); + + TBool batchOK = EFalse; + TInt ret( KErrNone ); + TInt retCommand( KErrNone ); + TInt itemAdds( 0 ); + + aResultArray.Reset(); + + if( iContactsBufferItemList.Count() == 0 ) + { + return retCommand; + } + + TInt i = 0; + // + // ResultArray initialized + // + while( iiModType == ENSmlCntItemAdd && + iContactsBufferItemList[i]->iStatus == KNSmlNoError ) + { + itemAdds++; + } + aResultArray.Append( KErrGeneral ); + i++; + } + + i = 0; + // + // Loop through buffered commands + // + while( iiStatus!= KNSmlNoError ) + { + retCommand = iContactsBufferItemList[i]->iStatus; + } + else if( iContactsBufferItemList[i]->iModType == ENSmlCntItemAdd ) + { + ret =0 ; + iPUid = 0; + + StripPropertyL( iItemDataAddBatch, KVersitTokenUID() ); // Remove UID's from data + + TInt err( KErrNone ); + TTime lastModified; + if( iBatchMode ) // All adds handled when first add on iContactsBufferItemList + { + iAddResultArray.Reset(); + + TRAP( err, ret = LdoAddItemsL( iAddResultArray, iItemDataAddBatch, + iItemDataAddBatch->Ptr(0).Length(), + lastModified ) ); + if( err == KErrNone && ret == KErrNone && + itemAdds == iAddResultArray.Count() ) + { + TInt j = i; + TInt k = 0; + while( j < iContactsBufferItemList.Count() ) + { + if( iContactsBufferItemList[j]->iModType == ENSmlCntItemAdd && + iContactsBufferItemList[j]->iStatus == KNSmlNoError && + k < iAddResultArray.Count() ) + { + iContactsBufferItemList[j]->iStatus = KErrNone; + *iContactsBufferItemList[j]->iPUid = iAddResultArray[k]; + + TNSmlSnapshotItem item( iAddResultArray[k]); + item.SetLastChangedDate( lastModified ); + item.SetSoftDelete( EFalse ); + iChangeFinder->ItemAddedL( item ); + + k++; + } + j++; + } + } + else + { + TInt j = i; + while( j < iContactsBufferItemList.Count() ) + { + if( iContactsBufferItemList[j]->iModType == ENSmlCntItemAdd && + iContactsBufferItemList[j]->iStatus == KNSmlNoError ) + { + iContactsBufferItemList[j]->iStatus = KErrNotSupported; + } + j++; + } + } + } + else + { + TTime lastModified; + iPUid =iContactsBufferItemList[i]->iPUid; + const TPtr8 dataPtr = iItemDataAddBatch->Ptr(0); + TRAP( err, ret = LdoAddItemL(*iPUid, dataPtr, + iContactsBufferItemList[i]->iSize, + lastModified)); + if( (err == KErrNone) && (ret == KErrNone)) + { + // Add the snapshot item to the Change Finder. + // The Change finder maintains a list of all changes to the database. + + TNSmlSnapshotItem item( *iPUid ); + item.SetLastChangedDate( lastModified ); + item.SetSoftDelete( EFalse ); + + iChangeFinder->ItemAddedL( item ); + retCommand = KErrNone; + } + else if( err == KErrNone ) + { + retCommand = ret; + } + else + { + retCommand = err; + } + } + } + else if( iContactsBufferItemList[i]->iModType == ENSmlCntItemReplace || + iContactsBufferItemList[i]->iModType == ENSmlCntItemFieldLevelReplace ) + { + iItemData = iContactsBufferItemList[i]->iItemData; + iUid = iContactsBufferItemList[i]->iUid; + const TPtr8 dataPtr = iItemData->Ptr(0); + ret = 0; + TTime lastModified; + + TRAPD( err, ret = LdoUpdateItemL(iUid, dataPtr, + iContactsBufferItemList[i]->iSize, + lastModified )); + if( (err == KErrNone) && (ret == KErrNone) ) + { + retCommand = KErrNone; + iContactsBufferItemList[i]->iStatus = KErrNone; + + TNSmlSnapshotItem item( iUid ); + item.SetLastChangedDate( lastModified ); + item.SetSoftDelete( EFalse ); + + iChangeFinder->ItemUpdatedL( item ); + } + else if( err == KErrNone ) + { + retCommand = ret; + iContactsBufferItemList[i]->iStatus = ret; + } + else + { + retCommand = err; + iContactsBufferItemList[i]->iStatus = err; + } + iItemData = NULL; + } + else if( iContactsBufferItemList[i]->iModType == ENSmlCntItemMove ) + { + retCommand = KErrNotSupported; + } + else if( iContactsBufferItemList[i]->iModType == ENSmlCntItemDelete || + iContactsBufferItemList[i]->iModType == ENSmlCntItemSoftDelete ) + { + if( iBatchMode ) // All deletes handled when 1'st occurrence on list + { + CArrayFixFlat* arrDelete = new(ELeave) CArrayFixFlat(4); + CleanupStack::PushL( arrDelete ); + TInt j=i; + while( j < iContactsBufferItemList.Count() ) + { + if( (iContactsBufferItemList[j]->iModType == ENSmlCntItemDelete || + iContactsBufferItemList[j]->iModType == ENSmlCntItemSoftDelete) && + iContactsBufferItemList[j]->iStatus == KNSmlNoError ) + { + TUid id = TUid::Uid( iContactsBufferItemList[j]->iUid ); + CNsmlContactItem* contactitem = CNsmlContactItem::NewL(); + CleanupStack::PushL( contactitem ); + TInt err = KErrNone; + TInt ret = KErrNone; + TRAP( err, ret = iContactsDataStoreExtension->ReadContactL( id, contactitem ) ); + if( err == KErrNone && ret == KErrNone && id.iUid != 0 ) + { + arrDelete->AppendL( id ); + } + else if( err == KErrNone && ret == KErrNone ) + { + iContactsBufferItemList[j]->iStatus = KErrNotFound; + } + else + { + iContactsBufferItemList[j]->iStatus = err; + } + CleanupStack::PopAndDestroy( contactitem ); // item + } + j++; + } + if( arrDelete->Count() > 0 ) + { + TInt err2 = KErrInUse; + TRAP( err2, iContactsDataStoreExtension->DeleteContactsL( arrDelete ) ); + CleanupStack::PopAndDestroy( arrDelete ); + + if( err2 == KErrInUse ) + { + err2 = KErrGeneral; + } + + j= i; + while( j < iContactsBufferItemList.Count() ) // Mark deleted items + { + if( iContactsBufferItemList[j]->iModType == ENSmlCntItemDelete && + iContactsBufferItemList[j]->iStatus == KNSmlNoError ) + { + + iContactsBufferItemList[j]->iStatus = err2; + if( err2 == KErrNone ) + { + iUid = iContactsBufferItemList[j]->iUid; + iChangeFinder->ItemDeleted( TNSmlSnapshotItem( iUid )); + } + } + else if( iContactsBufferItemList[j]->iModType == ENSmlCntItemSoftDelete && + iContactsBufferItemList[j]->iStatus == KNSmlNoError ) + { + + iContactsBufferItemList[j]->iStatus = err2; + if( err2 == KErrNone ) + { + iUid = iContactsBufferItemList[j]->iUid; + iChangeFinder->ItemSoftDeletedL( TNSmlSnapshotItem( iUid ) ); + } + } + j++; + } + } + else + { + CleanupStack::PopAndDestroy( arrDelete ); + } + } + else + { + iUid = iContactsBufferItemList[i]->iUid; + TInt err = KErrNone; + TRAP( err, iContactsDataStoreExtension->DeleteContactL( TUid::Uid( iUid ) ) ); + if( err == KErrNone ) + { + iChangeFinder->ItemDeleted( TNSmlSnapshotItem( iUid ) ); + } + + iContactsBufferItemList[i]->iStatus = err; + retCommand = err; + } + } + // + // Set allready set commands from iContactsBufferItemList + // + if( ( iContactsBufferItemList[i]->iModType == ENSmlCntItemAdd || + iContactsBufferItemList[i]->iModType == ENSmlCntItemReplace || + iContactsBufferItemList[i]->iModType == ENSmlCntItemFieldLevelReplace || + iContactsBufferItemList[i]->iModType == ENSmlCntItemDelete || + iContactsBufferItemList[i]->iModType == ENSmlCntItemSoftDelete ) && + iContactsBufferItemList[i]->iStatus != KNSmlNoError ) + { + retCommand = iContactsBufferItemList[i]->iStatus; + } + + + if( !batchOK && retCommand == KErrNone ) // If one command is OK => batchOK + { + batchOK = ETrue; + } + + aResultArray[i++] = retCommand; + } + + if ( batchOK ) + { + _DBG_FILE("CNSmlContactsDataStore::DoExecuteBufferL(): end"); + return KErrNone; + } + + _DBG_FILE("CNSmlContactsDataStore::DoExecuteBufferL(): ERROR end"); + return KErrGeneral; // All commands failed } // ------------------------------------------------------------------------------------------------ -// CNSmlContactsDataStore::CreateModsFetcherL +// CNSmlContactsDataStore::FetchModificationsL // ------------------------------------------------------------------------------------------------ -EXPORT_C MContactsModsFetcher* CNSmlContactsDataStore::CreateModsFetcherL() +// +TInt CNSmlContactsDataStore::FetchModificationsL() { - _DBG_FILE("CNSmlContactsDataStore::CreateModsFetcherL(): begin"); - CNSmlContactsModsFetcher* modsFetcher = - new ( ELeave ) CNSmlContactsModsFetcher( iSnapshotRegistered, - *iContactManager,*iStore, iKey, *iChangeFinder ); - CleanupStack::PushL( modsFetcher ); - modsFetcher->ConstructL(); - CleanupStack::Pop( modsFetcher ); - _DBG_FILE("CNSmlContactsDataStore::CreateModsFetcherL(): end"); - return modsFetcher; + _DBG_FILE("CNSmlContactsDataStore::FetchModificationsL(): begin"); + + TInt error = KErrNone; + + if( !iSnapshot ) + { + iSnapshot = new (ELeave) CArrayFixSeg( KNSmlContactsGranularity ); + } + + iCntUidList->Reset(); + iContactsDataStoreExtension->ListContactsL( iCntUidList ); + + if( !iSnapshotRegistered ) + { + DBG_ARGS(_S("CNSmlContactsDataStore::FetchModificationsL(): Count = %d"), iCntUidList->Count()); + for ( TInt i = 0; i < iCntUidList->Count(); i++ ) + { + CNsmlContactItem* contactitem = CNsmlContactItem::NewL(); + CleanupStack::PushL( contactitem ); + error = iContactsDataStoreExtension->ReadContactL( iCntUidList->At(i), contactitem ); + if(error != KErrNone) + { + DBG_ARGS(_S("CNSmlContactsDataStore::FetchModificationsL(): Error = %d"), error); + CleanupStack::PopAndDestroy(contactitem); // item + return error; + } + TNSmlSnapshotItem snap( iCntUidList->At(i).iUid ); + snap.SetLastChangedDate( contactitem->iLastModified ); + iSnapshot->InsertIsqL( snap, iKey ); + + CleanupStack::PopAndDestroy(contactitem); // item + } + iSnapshot->Compress(); + + iChangeFinder->SetNewSnapshot( iSnapshot ); // changefinder takes ownership + iSnapshot = NULL; + iSnapshotRegistered = ETrue; + } + + _DBG_FILE("CNSmlContactsDataStore::FetchModificationsL(): end"); + return KErrNone; } -// ------------------------------------------------------------------------------------------------ +// ----------------------------------------------------------------------------» // CNSmlContactsDataStore::GetDataMod -// ------------------------------------------------------------------------------------------------ +// return reference to datamod instance. +// ---------------------------------------------------------------------------- EXPORT_C CNSmlDataModBase& CNSmlContactsDataStore::GetDataMod() { - _DBG_FILE("CNSmlContactsDataStore::GetDataMod()"); return *iDataMod; } +// ---------------------------------------------------------------------------- +// CNSmlContactsDataStore::ExportContactsL +// ---------------------------------------------------------------------------- +EXPORT_C TInt CNSmlContactsDataStore::ExportContactsL( + const TUid& aUid, CBufBase& aContactBufBase ) + { + return iContactsDataStoreExtension->ExportContactsL( aUid, aContactBufBase ); + } + +// ---------------------------------------------------------------------------- +// CNSmlContactsDataStore::ImportContactsL +// ---------------------------------------------------------------------------- +EXPORT_C CArrayFixFlat* CNSmlContactsDataStore::ImportContactsL( + const TDesC8& aContactBufBase ) + { + return iContactsDataStoreExtension->ImportContactsL( aContactBufBase ); + } + // End of File