omads/omadsextensions/adapters/contacts/src/NSmlContactsDataStore.cpp
branchRCL_3
changeset 51 8e7494275d3a
parent 17 4d5e9526124e
child 52 4f0867e42d62
--- 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 <SmlDataProvider.h>
 #include <e32property.h>
 #include <DataSyncInternalPSKeys.h>
-#include <e32hashtab.h>
-
-#include <CVPbkContactStoreUriArray.h>
-#include <VPbkContactStoreUris.h>
-#include <TVPbkContactStoreUriPtr.h>
-#include <MVPbkContactStoreList.h>
-#include <MVPbkContactStoreProperties.h>
-#include <MVPbkStoreContactProperties.h>
-#include <MVPbkViewContact.h>
-#include <MVPbkStoreContact.h>
-#include <MVPbkStoreContact2.h>
-#include <MVPbkFieldType.h>
-#include <MVPbkContactFieldTextData.h>
-#include <CVPbkContactFieldIterator.h>
-#include <CVPbkContactViewDefinition.h>
-
-#include <MVPbkContactLink.h>
-#include <s32mem.h>
-
-#include <NSmlContactsDataStore.h>
-#include "NSmlContactsModsFetcher.h"
+#include <nsmlcontactsdatastoreextension.h>
+#include <NSmlDataModBase.h>
+#include <nsmlcontactsdatastore.h>
 #include "nsmldebug.h"
 #include "nsmlconstants.h"
-#include <NSmlDataModBase.h>
-#include "nsmlcontactsdefs.h"
 #include "nsmldsimpluids.h"
 #include "nsmlsnapshotitem.h"
 #include "nsmlchangefinder.h"
-#include <VPbkEng.rsg>
+
 
 #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<KOldSymbianDBLength> dataBase(aLegacyStore);
-    iPacketStoreName = HBufC::NewL(dataBase.Length());
-    TPtr pktStorePtr(iPacketStoreName->Des());
-    pktStorePtr.Copy(dataBase);
-    iDeleteAllOperation = NULL;
+    iSnapshot = new (ELeave) CArrayFixSeg<TNSmlSnapshotItem>(KNSmlContactsGranularity);
+    iCntUidList = new(ELeave) CArrayFixFlat<TUid>(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<TInt>& aResultArray, TRequestStatus& aStatus )
+EXPORT_C void CNSmlContactsDataStore::DoCommitBatchL( RArray<TInt>& 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<TInt>& 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<TInt> 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<KVPbhkPrefixLength> phoneDataBasePrefix(KVPbhkSymbianDBPrefix);
+	 /*CDesCArray* cntStores = new (ELeave) CDesCArrayFlat(1);
+	 iContactsDataStoreExtension->ListStoresL( cntStores );
+     CleanupStack::PushL( cntStores );*/
 	
-	for(TInt i=0 ; i< storeList.Count(); i++)
-	{
-	    TBuf<KNSmlDefaultStoreNameMaxSize>  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<TUid>* 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<TInt>& aUids,CBufBase*& aItems,
+//                                            TInt aSize, TTime& aLastModified )
 // ------------------------------------------------------------------------------------------------
-EXPORT_C void CNSmlContactsDataStore::LdoAddItemsL( CBufBase*& aItems,
-                                          TInt aSize)
+EXPORT_C TInt CNSmlContactsDataStore::LdoAddItemsL( RArray<TInt>& 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<TUid>* 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<TUid>* 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<MVPbkStoreContact2*> (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<MVPbkStoreContact2*> (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( i<iContactsBufferItemList.Count() )
-			{
-			if ( iContactsBufferItemList[i]->iModType == 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;i<aResults->Count();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 ; i<aStepSize && iIndex < iContactsBufferItemList.Count() ;i++)
-				{
-				iResultArray->Append(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<TInt>& 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( i<iContactsBufferItemList.Count() )
+        {
+        if ( iContactsBufferItemList[i]->iModType == ENSmlCntItemAdd &&
+             iContactsBufferItemList[i]->iStatus  == KNSmlNoError )
+            {
+            itemAdds++;
+            }
+        aResultArray.Append( KErrGeneral ); 
+        i++;
+        }
+
+    i = 0;
+    //
+    // Loop through buffered commands
+    //
+    while( i<iContactsBufferItemList.Count() )
+        {       
+        if( iContactsBufferItemList[i]->iStatus!= 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<TUid>* arrDelete = new(ELeave) CArrayFixFlat<TUid>(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<TNSmlSnapshotItem>( 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<TUid>* CNSmlContactsDataStore::ImportContactsL( 
+    const TDesC8& aContactBufBase )
+    {
+    return iContactsDataStoreExtension->ImportContactsL( aContactBufBase ); 
+    }
+
 // End of File