omads/omadsextensions/adapters/contacts/src/NSmlContactsDataStore.cpp
branchRCL_3
changeset 10 b922b9936679
parent 8 ad0f53516d84
child 11 3f1ffafb31ec
--- a/omads/omadsextensions/adapters/contacts/src/NSmlContactsDataStore.cpp	Fri Feb 19 22:40:37 2010 +0200
+++ b/omads/omadsextensions/adapters/contacts/src/NSmlContactsDataStore.cpp	Fri Mar 12 15:41:30 2010 +0200
@@ -53,11 +53,11 @@
 #include <MVPbkContactLink.h>
 #include <s32mem.h>
 
-#include "NSmlContactsDataStore.h"
+#include <NSmlContactsDataStore.h>
 #include "NSmlContactsModsFetcher.h"
 #include "nsmldebug.h"
 #include "nsmlconstants.h"
-#include "NSmlDataModBase.h"
+#include <NSmlDataModBase.h>
 #include "nsmlcontactsdefs.h"
 #include "nsmldsimpluids.h"
 #include "nsmlsnapshotitem.h"
@@ -75,7 +75,7 @@
 // ----------------------------------------------------------------------------
 // CNSmlContactsDataStore::CNSmlContactsBufferItem::~CNSmlContactsBufferItem
 // ----------------------------------------------------------------------------
-CNSmlContactsDataStore::CNSmlContactsBufferItem::~CNSmlContactsBufferItem()
+EXPORT_C CNSmlContactsDataStore::CNSmlContactsBufferItem::~CNSmlContactsBufferItem()
 	{
 	delete iItemData;
 	delete iMimeType;
@@ -85,7 +85,7 @@
 // ----------------------------------------------------------------------------
 // CNSmlContactsDataStore::NewL
 // ----------------------------------------------------------------------------
-CNSmlContactsDataStore* CNSmlContactsDataStore::NewL()
+EXPORT_C CNSmlContactsDataStore* CNSmlContactsDataStore::NewL()
 	{
 	_DBG_FILE("CNSmlContactsDataStore::NewL: BEGIN");
 	CNSmlContactsDataStore* self = new ( ELeave ) CNSmlContactsDataStore();
@@ -101,16 +101,16 @@
 // ----------------------------------------------------------------------------
 // CNSmlContactsDataStore::CNSmlContactsDataStore() 
 // ----------------------------------------------------------------------------
-CNSmlContactsDataStore::CNSmlContactsDataStore() : 
+EXPORT_C CNSmlContactsDataStore::CNSmlContactsDataStore() : 
 	iKey( TKeyArrayFix( _FOFF( TNSmlSnapshotItem,ItemId() ),ECmpTInt )),
 	iContactManager(NULL),
 	iStore(NULL),
-	iVCardEngine(NULL),
 	iIdConverter(NULL),
-	iContactLnks(NULL),
 	iContactViewBase(NULL),
 	iSize(NULL),	
-	iBuf(NULL)
+	iBuf(NULL),
+	iVCardEngine(NULL),
+	iContactLnks(NULL)
 	{
 	_DBG_FILE("CNSmlContactsDataStore::CNSmlContactsDataStore(): begin");
 
@@ -132,50 +132,61 @@
 // ----------------------------------------------------------------------------
 // CNSmlContactsDataStore::ConstructL()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::ConstructL()
+EXPORT_C void CNSmlContactsDataStore::ConstructL()
 	{
-	_DBG_FILE("CNSmlContactsDataStore::CNSmlContactsDataStore(): begin");
-	
-	User::LeaveIfError( iRfs.Connect() );
-
-	iUsedMimeType.Set( KNSmlvCard21Name() );
-	iUsedMimeVersion.Set( KNSmlvCard21Ver() );
-	iStringPool.OpenL();
+	_DBG_FILE("CNSmlContactsDataStore::ConstructL(): begin");
 	
-	// Uid Sets
-	iNewUids = new (ELeave) CNSmlDataItemUidSet();
-	iDeletedUids = new (ELeave) CNSmlDataItemUidSet();
-	iSoftDeletedUids = new (ELeave) CNSmlDataItemUidSet();
-	iMovedUids = new (ELeave) CNSmlDataItemUidSet();
-	iReplacedUids = new (ELeave) CNSmlDataItemUidSet();
-
-	// Create iDataMod
-	// This should be done after OpenL if there are more than one database
-	iDataMod = new (ELeave) CNSmlVCardMod();
-
-	SetOwnStoreFormatL();
-	// open  contact database
-	CVPbkContactStoreUriArray* uriArray = CVPbkContactStoreUriArray::NewLC();
-	uriArray->AppendL( TVPbkContactStoreUriPtr(VPbkContactStoreUris::DefaultCntDbUri()));
-	
-	iContactManager = CVPbkContactManager::NewL(*uriArray);
-	CleanupStack::PopAndDestroy(uriArray);
-	//Default store name
-	iDefaultStoreName = (VPbkContactStoreUris::DefaultCntDbUri()).AllocL();
-	
-	//Fill iPacketStoreName buffer with KLegacySymbianDatabase
-    TBuf<KOldSymbianDBLength> dataBase(KLegacySymbianDatabase);
-	iPacketStoreName = HBufC::NewL(dataBase.Length());        
-	TPtr pktStorePtr(iPacketStoreName->Des());
-	pktStorePtr.Copy(dataBase);
+	ConstructL( ( VPbkContactStoreUris::DefaultCntDbUri() ), KLegacySymbianDatabase );
 		
 	_DBG_FILE("CNSmlContactsDataStore::ConstructL(): end");
 	}
-	
+
+// ----------------------------------------------------------------------------
+// CNSmlContactsDataStore::ConstructL()
+// ----------------------------------------------------------------------------
+EXPORT_C void CNSmlContactsDataStore::ConstructL(
+    const TDesC& aStoreName, const TDesC& aLegacyStore )
+    {
+    _DBG_FILE("CNSmlContactsDataStore::ConstructL(): begin");
+    
+    User::LeaveIfError( iRfs.Connect() );
+
+    iStringPool.OpenL();
+    
+    // Uid Sets
+    iNewUids = new (ELeave) CNSmlDataItemUidSet();
+    iDeletedUids = new (ELeave) CNSmlDataItemUidSet();
+    iSoftDeletedUids = new (ELeave) CNSmlDataItemUidSet();
+    iMovedUids = new (ELeave) CNSmlDataItemUidSet();
+    iReplacedUids = new (ELeave) CNSmlDataItemUidSet();
+
+    // Create iDataMod
+    // This should be done after OpenL if there are more than one database
+    iDataMod = new (ELeave) CNSmlVCardMod();
+
+    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();
+    
+    //Fill iPacketStoreName buffer with legacy store name
+    TBuf<KOldSymbianDBLength> dataBase(aLegacyStore);
+    iPacketStoreName = HBufC::NewL(dataBase.Length());
+    TPtr pktStorePtr(iPacketStoreName->Des());
+    pktStorePtr.Copy(dataBase);
+        
+    _DBG_FILE("CNSmlContactsDataStore::ConstructL(): end");    
+    }
+
 // ----------------------------------------------------------------------------
 // CNSmlContactsDataStore::~CNSmlContactsDataStore()
 // ----------------------------------------------------------------------------
-CNSmlContactsDataStore::~CNSmlContactsDataStore()
+EXPORT_C CNSmlContactsDataStore::~CNSmlContactsDataStore()
 	{
 	_DBG_FILE("CNSmlContactsDataStore::~CNSmlContactsDataStore(): begin");
 	
@@ -208,7 +219,7 @@
 	delete iContactViewBase;
 	if ( iContactsModsFetcher )
 		{
-		iContactsModsFetcher->Cancel(); 
+		iContactsModsFetcher->CancelRequest(); 
 		delete iContactsModsFetcher;
 		}
 	if ( iContactManager )
@@ -271,7 +282,7 @@
 //									    MSmlSyncRelationship& aContext,
 //									    TRequestStatus& 	  aStatus)
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoOpenL( const TDesC& aStoreName, 
+EXPORT_C void CNSmlContactsDataStore::DoOpenL( const TDesC& aStoreName, 
 									MSmlSyncRelationship& aContext, 
 									TRequestStatus& aStatus )
 	{
@@ -329,14 +340,12 @@
 	iIdConverter = CVPbkContactIdConverter::NewL(*iStore );
 	if ( iContactsModsFetcher )
 		{
-		iContactsModsFetcher->Cancel();
+		iContactsModsFetcher->CancelRequest();
 		delete iContactsModsFetcher;
 		iContactsModsFetcher = NULL;
 		}
 		
-	iContactsModsFetcher = new (ELeave) CNSmlContactsModsFetcher( 
-							iSnapshotRegistered, *iContactManager,*iStore, iKey, *iChangeFinder );
-	iContactsModsFetcher->ConstructL();
+	iContactsModsFetcher = CreateModsFetcherL();
 	
 #ifdef __NSML_MODULETEST__
 	CActiveScheduler::Start();
@@ -348,12 +357,12 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoCancelRequest()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoCancelRequest()
+EXPORT_C void CNSmlContactsDataStore::DoCancelRequest()
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoCancelRequest(): begin");
 		if(iContactsModsFetcher)
 		{
-		iContactsModsFetcher->Cancel();
+		iContactsModsFetcher->CancelRequest();
 		}
 	
 	_DBG_FILE("CNSmlContactsDataStore::DoCancelRequest(): NOT NEEDED end");
@@ -362,7 +371,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoStoreName()
 // ----------------------------------------------------------------------------
-const TDesC& CNSmlContactsDataStore::DoStoreName() const
+EXPORT_C const TDesC& CNSmlContactsDataStore::DoStoreName() const
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoStoreName(): begin");
 	_DBG_FILE("CNSmlContactsDataStore::DoStoreName(): end");
@@ -372,7 +381,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DefaultStoreNameL()
 // ----------------------------------------------------------------------------
-const TDesC& CNSmlContactsDataStore::DefaultStoreNameL() const
+EXPORT_C const TDesC& CNSmlContactsDataStore::DefaultStoreNameL() const
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DefaultStoreNameL(): begin");
 	
@@ -389,7 +398,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoBeginTransactionL()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoBeginTransactionL()
+EXPORT_C void CNSmlContactsDataStore::DoBeginTransactionL()
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoBeginTransactionL(): begin");
 	User::Leave( KErrNotSupported );
@@ -399,7 +408,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoCommitTransactionL()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoCommitTransactionL(TRequestStatus& aStatus)
+EXPORT_C void CNSmlContactsDataStore::DoCommitTransactionL(TRequestStatus& aStatus)
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoCommitTransactionL(): begin");
 	
@@ -413,7 +422,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoRevertTransaction()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoRevertTransaction(TRequestStatus& aStatus)
+EXPORT_C void CNSmlContactsDataStore::DoRevertTransaction(TRequestStatus& aStatus)
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoRevertTransaction(): begin");
 	
@@ -427,7 +436,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoBeginBatchL()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoBeginBatchL()
+EXPORT_C void CNSmlContactsDataStore::DoBeginBatchL()
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoBeginBatchL(): begin");
 	
@@ -439,7 +448,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoCommitBatchL()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoCommitBatchL( RArray<TInt>& aResultArray, TRequestStatus& aStatus )
+EXPORT_C void CNSmlContactsDataStore::DoCommitBatchL( RArray<TInt>& aResultArray, TRequestStatus& aStatus )
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoCommitBatchL(): begin");
 
@@ -472,7 +481,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::ExecuteBufferL()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::ExecuteBufferL() 
+EXPORT_C void CNSmlContactsDataStore::ExecuteBufferL() 
 	{
 	_DBG_FILE("CNSmlContactsDataStore::ExecuteBufferL(): begin");
 	
@@ -492,7 +501,8 @@
 			{
 			retCommand = ExecuteAddL();
 			}
-		else if( iContactsBufferItemList[iIndex]->iModType == ENSmlCntItemReplace )
+		else if( iContactsBufferItemList[iIndex]->iModType == ENSmlCntItemReplace ||
+            iContactsBufferItemList[iIndex]->iModType == ENSmlCntItemFieldLevelReplace )
 			{
 			ExecuteUpdateL();		
 			}
@@ -510,6 +520,7 @@
 		//
 		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 )
@@ -533,7 +544,7 @@
 // void CNSmlContactsDataStore::ExecuteAddL()
 // ----------------------------------------------------------------------------
 	
-TInt CNSmlContactsDataStore::ExecuteAddL()
+EXPORT_C TInt CNSmlContactsDataStore::ExecuteAddL()
 	{
 	TInt  retCommand( KErrNone );
 	StripPropertyL( iItemDataAddBatch, KVersitTokenUID() ); // Remove UID's from data
@@ -576,7 +587,7 @@
 // void CNSmlContactsDataStore::ExecuteDeleteL()
 // ----------------------------------------------------------------------------
 	
-void CNSmlContactsDataStore:: ExecuteDeleteL()
+EXPORT_C void CNSmlContactsDataStore:: ExecuteDeleteL()
 	{
 	
 	if(iBatchMode)			
@@ -629,7 +640,7 @@
 // void CNSmlContactsDataStore::ExecuteUpdateL()
 // ----------------------------------------------------------------------------
 	
-void CNSmlContactsDataStore::ExecuteUpdateL()
+EXPORT_C void CNSmlContactsDataStore::ExecuteUpdateL()
 	{
 	iUid  = iContactsBufferItemList[iIndex]->iUid;
 
@@ -658,7 +669,7 @@
 // void CNSmlContactsDataStore::ExecuteMoveL
 // ----------------------------------------------------------------------------
 
-void CNSmlContactsDataStore::ExecuteMoveL()
+EXPORT_C void CNSmlContactsDataStore::ExecuteMoveL()
 	{
 	// move command is not supported
 	if(!iBatchMode)
@@ -684,7 +695,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoCancelBatch()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoCancelBatch()
+EXPORT_C void CNSmlContactsDataStore::DoCancelBatch()
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoCancelBatch(): begin");
 	if( iBatchMode )
@@ -703,7 +714,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoSetRemoteStoreFormatL()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoSetRemoteStoreFormatL( const CSmlDataStoreFormat& aServerDataStoreFormat )
+EXPORT_C void CNSmlContactsDataStore::DoSetRemoteStoreFormatL( const CSmlDataStoreFormat& aServerDataStoreFormat )
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoSetRemoteStoreFormatL(): begin");
 	
@@ -747,7 +758,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::SetOwnStoreFormatL()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::SetOwnStoreFormatL()
+EXPORT_C void CNSmlContactsDataStore::SetOwnStoreFormatL()
 	{
 	_DBG_FILE("CNSmlContactsDataStore::SetOwnStoreFormatL(): begin");
 	
@@ -756,20 +767,7 @@
 		TFileName fileName;
 		TParse parse;
 
-		// Check correct Data Sync protocol
-        TInt value( EDataSyncNotRunning );
-        TInt error = RProperty::Get( KPSUidDataSynchronizationInternalKeys,
-                                     KDataSyncStatus,
-                                     value );
-        if ( error == KErrNone &&
-             value == EDataSyncRunning )
-            {
-            parse.Set( KNSmlContactsStoreFormatRsc_1_1_2, &KDC_RESOURCE_FILES_DIR, NULL );
-            }
-        else // error or protocol version 1.2 
-            {
-            parse.Set( KNSmlContactsStoreFormatRsc_1_2, &KDC_RESOURCE_FILES_DIR, NULL );
-            }		
+		parse.Set( GetStoreFormatResourceFileL(), &KDC_RESOURCE_FILES_DIR, NULL  );
 
 		fileName = parse.FullName();
 
@@ -791,7 +789,12 @@
 		}
 		
 	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.
+    iUsedMimeType.Set( iStoreFormat->MimeFormat(0).MimeType().DesC() );
+    iUsedMimeVersion.Set( iStoreFormat->MimeFormat(0).MimeVersion().DesC() );
+
 	_DBG_FILE("CNSmlContactsDataStore::SetOwnStoreFormatL(): end");
 	return;
 	}
@@ -799,7 +802,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoSetRemoteMaxObjectSize()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoSetRemoteMaxObjectSize( TInt aServerMaxObjectSize )
+EXPORT_C void CNSmlContactsDataStore::DoSetRemoteMaxObjectSize( TInt aServerMaxObjectSize )
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoSetRemoteMaxObjectSize(): begin");
 	
@@ -811,7 +814,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoMaxObjectSize()
 // ----------------------------------------------------------------------------
-TInt CNSmlContactsDataStore::DoMaxObjectSize() const
+EXPORT_C TInt CNSmlContactsDataStore::DoMaxObjectSize() const
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoMaxObjectSize(): begin");
 	_DBG_FILE("CNSmlContactsDataStore::DoMaxObjectSize() 100 k: end");
@@ -821,7 +824,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoOpenItemL()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoOpenItemL( TSmlDbItemUid aUid, 
+EXPORT_C void CNSmlContactsDataStore::DoOpenItemL( TSmlDbItemUid aUid, 
 										  TBool& aFieldChange, 
 										  TInt& aSize, 
 										  TSmlDbItemUid& aParent, 
@@ -868,7 +871,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoCreateItemL()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoCreateItemL( TSmlDbItemUid& aUid, 
+EXPORT_C void CNSmlContactsDataStore::DoCreateItemL( TSmlDbItemUid& aUid, 
 											TInt aSize, 
 											TSmlDbItemUid /*aParent*/, 
 											const TDesC8& aMimeType, 
@@ -913,7 +916,9 @@
 		
 	// Check MimeType and MimeVersion
 	if( ( aMimeType.MatchF( KNSmlvCard21Name ) < 0 ) &&
-	    ( aMimeType.MatchF( KNSmlvCard30Name ) < 0 ))
+	    ( aMimeType.MatchF( KNSmlvCard30Name ) < 0 ) &&
+	    // Allow using custom MIME type defined in store format resource file
+	    ( aMimeType.MatchF( iUsedMimeType ) < 0 ) )
 		{
 		User::RequestComplete( iCallerStatus, KErrNotSupported );
 		_DBG_FILE("CNSmlContactsDataStore::DoCreateItemL - KErrNotSupported: END");
@@ -949,7 +954,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoReplaceItemL()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoReplaceItemL( TSmlDbItemUid aUid, 
+EXPORT_C void CNSmlContactsDataStore::DoReplaceItemL( TSmlDbItemUid aUid, 
 											 TInt aSize, 
 											 TSmlDbItemUid /*aParent*/,
 											 TBool aFieldChange, 
@@ -964,7 +969,7 @@
 			
 	iUid      = aUid;
 	iItemSize = aSize;
-	iModType  = ENSmlCntItemReplace;
+	iModType  =  aFieldChange ? ENSmlCntItemFieldLevelReplace : ENSmlCntItemReplace;
 	
 	if ( iItemPos == -1 || !iBatchMode )
 		{
@@ -975,18 +980,9 @@
 		{
 		iItemData->Reset();
 		}
-		
-	// Field change not supported
-	if( aFieldChange )
-		{
-		err = KErrNotSupported;
-		if( !iBatchMode )
-			{
-			User::RequestComplete( iCallerStatus, err );
-			return;
-			}
-		}
-		
+
+	iFieldLevelReplace = aFieldChange;
+
 	iItemData = AddBufferListL( aUid, aSize, err );
 	
 	if( iBatchMode )
@@ -1009,7 +1005,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoReadItemL()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoReadItemL( TDes8& aBuffer )
+EXPORT_C void CNSmlContactsDataStore::DoReadItemL( TDes8& aBuffer )
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoReadItemL(): begin");
 
@@ -1041,7 +1037,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoWriteItemL()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoWriteItemL( const TDesC8& aData )
+EXPORT_C void CNSmlContactsDataStore::DoWriteItemL( const TDesC8& aData )
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoWriteItemL(): begin");
 
@@ -1099,7 +1095,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoCommitItemL()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoCommitItemL( TRequestStatus& aStatus )
+EXPORT_C void CNSmlContactsDataStore::DoCommitItemL( TRequestStatus& aStatus )
 	{
 	iCallerStatus = &aStatus;
 	*iCallerStatus = KRequestPending;
@@ -1118,9 +1114,10 @@
       	    }
 	    }
 	 else if ((iModType   == ENSmlCntItemAdd ||         // If some write problems
-      	       iModType   == ENSmlCntItemReplace) && 
-      	       iStateItem != KErrNone &&
-      	       iContactsBufferItemList.Count() > 0) 
+         iModType   == ENSmlCntItemReplace ||
+         iModType   == ENSmlCntItemFieldLevelReplace ) &&  
+      	 iStateItem != KErrNone &&
+      	 iContactsBufferItemList.Count() > 0) 
 	    {
         iContactsBufferItemList[iContactsBufferItemList.Count()-1]->iStatus  = iStateItem; 
 	    }
@@ -1146,7 +1143,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoCloseItem()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoCloseItem()
+EXPORT_C void CNSmlContactsDataStore::DoCloseItem()
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoCloseItem(): begin");
 
@@ -1167,7 +1164,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoMoveItemL()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoMoveItemL( TSmlDbItemUid aUid, TSmlDbItemUid /*aNewParent*/, TRequestStatus& aStatus )
+EXPORT_C void CNSmlContactsDataStore::DoMoveItemL( TSmlDbItemUid aUid, TSmlDbItemUid /*aNewParent*/, TRequestStatus& aStatus )
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoMoveItemL(): begin");
 	
@@ -1190,7 +1187,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoDeleteItemL()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoDeleteItemL( TSmlDbItemUid aUid, TRequestStatus& aStatus )
+EXPORT_C void CNSmlContactsDataStore::DoDeleteItemL( TSmlDbItemUid aUid, TRequestStatus& aStatus )
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoDeleteItemL(): begin");
 	iCallerStatus = &aStatus;
@@ -1230,7 +1227,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoSoftDeleteItemL()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoSoftDeleteItemL( TSmlDbItemUid /*aUid*/, TRequestStatus& aStatus )
+EXPORT_C void CNSmlContactsDataStore::DoSoftDeleteItemL( TSmlDbItemUid /*aUid*/, TRequestStatus& aStatus )
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoSoftDeleteItemL(): begin");
 	iCallerStatus = &aStatus;
@@ -1242,7 +1239,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoDeleteAllItemsL()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoDeleteAllItemsL( TRequestStatus& aStatus )
+EXPORT_C void CNSmlContactsDataStore::DoDeleteAllItemsL( TRequestStatus& aStatus )
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoDeleteAllItemsL(): begin");
 	
@@ -1263,7 +1260,7 @@
 // ----------------------------------------------------------------------------
 // TBool CNSmlContactsDataStore::DoHasSyncHistory()
 // ----------------------------------------------------------------------------
-TBool CNSmlContactsDataStore::DoHasSyncHistory() const
+EXPORT_C TBool CNSmlContactsDataStore::DoHasSyncHistory() const
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoHasSyncHistory(): begin");
 	
@@ -1299,7 +1296,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoAddedItems()
 // ----------------------------------------------------------------------------
-const MSmlDataItemUidSet& CNSmlContactsDataStore::DoAddedItems() const
+EXPORT_C const MSmlDataItemUidSet& CNSmlContactsDataStore::DoAddedItems() const
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoAddedItems(): begin");
 	if ( iState == ENSmlOpenAndWaiting )
@@ -1323,7 +1320,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoDeletedItems()
 // ----------------------------------------------------------------------------
-const MSmlDataItemUidSet& CNSmlContactsDataStore::DoDeletedItems() const
+EXPORT_C const MSmlDataItemUidSet& CNSmlContactsDataStore::DoDeletedItems() const
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoDeletedItems(): begin");	
 	if ( iState == ENSmlOpenAndWaiting )
@@ -1347,7 +1344,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoSoftDeletedItems()
 // ----------------------------------------------------------------------------
-const MSmlDataItemUidSet& CNSmlContactsDataStore::DoSoftDeletedItems() const
+EXPORT_C const MSmlDataItemUidSet& CNSmlContactsDataStore::DoSoftDeletedItems() const
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoSoftDeletedItems(): begin");
 	if ( iState == ENSmlOpenAndWaiting )
@@ -1371,7 +1368,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoModifiedItems()
 // ----------------------------------------------------------------------------
-const MSmlDataItemUidSet& CNSmlContactsDataStore::DoModifiedItems() const
+EXPORT_C const MSmlDataItemUidSet& CNSmlContactsDataStore::DoModifiedItems() const
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoModifiedItems(): begin");
 	if ( iState == ENSmlOpenAndWaiting )
@@ -1395,7 +1392,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoMovedItems()
 // ----------------------------------------------------------------------------
-const MSmlDataItemUidSet& CNSmlContactsDataStore::DoMovedItems() const
+EXPORT_C const MSmlDataItemUidSet& CNSmlContactsDataStore::DoMovedItems() const
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoMovedItems(): begin");
 	
@@ -1420,7 +1417,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoResetChangeInfoL()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoResetChangeInfoL( TRequestStatus& aStatus )
+EXPORT_C void CNSmlContactsDataStore::DoResetChangeInfoL( TRequestStatus& aStatus )
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoResetChangeInfoL(): begin");
 	iCallerStatus = &aStatus;
@@ -1451,7 +1448,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoCommitChangeInfoL()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoCommitChangeInfoL( TRequestStatus& aStatus, 
+EXPORT_C void CNSmlContactsDataStore::DoCommitChangeInfoL( TRequestStatus& aStatus, 
 												  const MSmlDataItemUidSet& aItems )
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoCommitChangeInfoL(aItems): begin");
@@ -1473,7 +1470,7 @@
 // ----------------------------------------------------------------------------
 // void CNSmlContactsDataStore::DoCommitChangeInfoL()
 // ----------------------------------------------------------------------------
-void CNSmlContactsDataStore::DoCommitChangeInfoL( TRequestStatus& aStatus )
+EXPORT_C void CNSmlContactsDataStore::DoCommitChangeInfoL( TRequestStatus& aStatus )
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoCommitChangeInfoL(): begin");
 	iCallerStatus = &aStatus;
@@ -1494,7 +1491,7 @@
 // ----------------------------------------------------------------------------
 // CDesCArray* CNSmlContactsDataStore::DoListStoresLC()
 // ----------------------------------------------------------------------------
-CDesCArray* CNSmlContactsDataStore::DoListStoresLC()
+EXPORT_C CDesCArray* CNSmlContactsDataStore::DoListStoresLC()
 	{
 	_DBG_FILE("CNSmlContactsDataStore::DoListStoresLC(): begin");
 	
@@ -1529,7 +1526,7 @@
 // ------------------------------------------------------------------------------------------------
 // TInt CNSmlContactsDataStore::LdoFetchItemL( TSmlDbItemUid& aUid, CBufBase& aItem )
 // ------------------------------------------------------------------------------------------------
-void CNSmlContactsDataStore::LdoFetchItemL( TSmlDbItemUid& aUid, CBufBase& aItem )
+EXPORT_C void CNSmlContactsDataStore::LdoFetchItemL( TSmlDbItemUid& aUid, CBufBase& aItem )
 	{
 	_DBG_FILE("CNSmlContactsDataStore::LdoFetchItemL(): begin");
 	
@@ -1552,7 +1549,7 @@
 //                                           TTime& aLastModified,
 //                                           TBool& aConfidential )
 // ------------------------------------------------------------------------------------------------
-void CNSmlContactsDataStore::LdoAddItemL( const TDesC8& aItem,
+EXPORT_C void CNSmlContactsDataStore::LdoAddItemL( const TDesC8& aItem,
                                           TInt aSize)
 	{
 	_DBG_FILE("CNSmlContactsDataStore::LdoAddItemL(): begin");
@@ -1584,7 +1581,7 @@
 // TInt CNSmlContactsDataStore::LdoAddItemsL( CBufBase*& aItems,
 //                                           TInt aSize)
 // ------------------------------------------------------------------------------------------------
-void CNSmlContactsDataStore::LdoAddItemsL( CBufBase*& aItems,
+EXPORT_C void CNSmlContactsDataStore::LdoAddItemsL( CBufBase*& aItems,
                                           TInt aSize)
 	{
 	_DBG_FILE("CNSmlContactsDataStore::LdoAddItemL(): begin");
@@ -1614,7 +1611,7 @@
 //                                             TInt aSize,
 //                                             TTime& aLastModified )
 // ------------------------------------------------------------------------------------------------
-void CNSmlContactsDataStore::LdoUpdateItemL()
+EXPORT_C void CNSmlContactsDataStore::LdoUpdateItemL()
 	{
 	_DBG_FILE("CNSmlContactsDataStore::LdoUpdateItemL(): begin");
 	
@@ -1623,8 +1620,8 @@
 	StripPropertyL( iBuf, KVersitTokenUID() );
 
 	iReadStream.Open( *iBuf );
-	MVPbkContactLink* contactLink = iIdConverter->IdentifierToLinkLC(iUid);
-	  iVCardEngine->ImportVCardMergeL(*contactLink,*iStore,iReadStream,*this);
+	iContactLink = iIdConverter->IdentifierToLinkLC(iUid);
+	iVCardEngine->ImportVCardMergeL(*iContactLink, *iStore, iReadStream, *this);
 
 	CleanupStack::Pop();
 	iLastOperation = ENSMLUpdateImportOp;
@@ -1638,7 +1635,7 @@
 // ------------------------------------------------------------------------------------------------
 // CNSmlContactsDataStore::DriveBelowCriticalLevelL()
 // ------------------------------------------------------------------------------------------------
-TBool CNSmlContactsDataStore::DriveBelowCriticalLevelL( TInt aSize )
+EXPORT_C TBool CNSmlContactsDataStore::DriveBelowCriticalLevelL( TInt aSize )
 	{
 	return SysUtil::DiskSpaceBelowCriticalLevelL( &iRfs, aSize, iDrive );
 	}
@@ -1646,7 +1643,7 @@
 // ----------------------------------------------------------------------------
 // CBufBase* CNSmlContactsDataStore::AddBufferListL()
 // ----------------------------------------------------------------------------
-CBufBase* CNSmlContactsDataStore::AddBufferListL( TSmlDbItemUid& aUid, TInt aSize, TInt aStatus )
+EXPORT_C CBufBase* CNSmlContactsDataStore::AddBufferListL( TSmlDbItemUid& aUid, TInt aSize, TInt aStatus )
 	{
 	_DBG_FILE("CNSmlContactsDataStore::AddBufferListL(): begin");
 	
@@ -1700,7 +1697,7 @@
 // ------------------------------------------------------------------------------------------------
 // void CNSmlContactsDataStore::StripPropertyL( HBufC8*& aItem, const TDesC8& aProperty )
 // ------------------------------------------------------------------------------------------------
-void CNSmlContactsDataStore::StripPropertyL( HBufC8*& aItem, const TDesC8& aProperty ) const
+EXPORT_C void CNSmlContactsDataStore::StripPropertyL( HBufC8*& aItem, const TDesC8& aProperty ) const
 	{
 	_DBG_FILE("CNSmlContactsDataStore::StripPropertyL(): begin");
 
@@ -1733,7 +1730,7 @@
 // ------------------------------------------------------------------------------------------------
 // void CNSmlContactsDataStore::StripPropertyL( CBufBase*& aItem, const TDesC8& aProperty )
 // ------------------------------------------------------------------------------------------------
-void CNSmlContactsDataStore::StripPropertyL( CBufBase*& aItem, const TDesC8& aProperty ) const
+EXPORT_C void CNSmlContactsDataStore::StripPropertyL( CBufBase*& aItem, const TDesC8& aProperty ) const
 	{
 	_DBG_FILE("CNSmlContactsDataStore::StripPropertyL(): begin");
 	
@@ -1770,7 +1767,7 @@
 // CNSmlContactsDataStore::IsConfidentialL
 // ----------------------------------------------------------------------------
 //	
-TBool CNSmlContactsDataStore::IsConfidentialL(  MVPbkStoreContact& aItem )
+EXPORT_C TBool CNSmlContactsDataStore::IsConfidentialL(  MVPbkStoreContact& aItem )
     {
     _DBG_FILE("CNSmlContactsDataStore::IsConfidentialL(): begin");
     TBool ret( EFalse );
@@ -1789,7 +1786,7 @@
         //compare the sync type
         if ( ptr.Compare( KNSmlContactSyncNoSync ) == 0 )
             {
-            _DBG_FILE("CNSmlContactsModsFetcher::IsConfidentialL(): \
+            _DBG_FILE("CNSmlContactsDataStore::IsConfidentialL(): \
                        find confidential");
             ret = ETrue;
             }
@@ -1805,7 +1802,7 @@
 // CNSmlContactsDataStore::ResetBuffer
 // ----------------------------------------------------------------------------
 //	
-void CNSmlContactsDataStore:: ResetBuffer()
+EXPORT_C void CNSmlContactsDataStore:: ResetBuffer()
 	{
 	if( iItemDataAddBatch )
 		{
@@ -1818,7 +1815,7 @@
 // Called when a contact store is ready to use.
 // -----------------------------------------------------------------------------
  
-void CNSmlContactsDataStore::StoreReady( MVPbkContactStore& /*aContactStore*/ )
+EXPORT_C void CNSmlContactsDataStore::StoreReady( MVPbkContactStore& /*aContactStore*/ )
 	{
 	_DBG_FILE("CNSmlContactsDataStore::StoreReady(): begin");
 	//The contact data base opened successfully
@@ -1827,7 +1824,7 @@
 	iOpenedStoreId = DefaultHash::Des16(
 						iStore->StoreProperties().Uri().UriDes());
 	
-	TRAPD(error,iContactsModsFetcher->FetchModificationsL( *iCallerStatus ));
+	TRAPD(error, iContactsModsFetcher->FetchModificationsL( *iCallerStatus ));
 	if(error != KErrNone)
 		{
 		User::RequestComplete( iCallerStatus, error );
@@ -1841,7 +1838,7 @@
 //	Called when a contact store becomes unavailable.
 // ---------------------------------------------------------------------------
 //
-void CNSmlContactsDataStore::StoreUnavailable(
+EXPORT_C void CNSmlContactsDataStore::StoreUnavailable(
         MVPbkContactStore& /*aContactStore*/,
         TInt aReason )
     {
@@ -1862,7 +1859,7 @@
 // From MVPbkContactStoreListObserver  
 // ---------------------------------------------------------------------------
 //
-void CNSmlContactsDataStore::HandleStoreEventL(
+EXPORT_C void CNSmlContactsDataStore::HandleStoreEventL(
         MVPbkContactStore& /*aContactStore*/,
         TVPbkContactStoreEvent /*aStoreEvent*/ )
 	{
@@ -1873,8 +1870,7 @@
 //  CNSmlContactsDataStore::VPbkSingleContactOperationComplete
 // ---------------------------------------------------------------------------
 //
-    
- void CNSmlContactsDataStore::VPbkSingleContactOperationComplete(
+EXPORT_C void CNSmlContactsDataStore::VPbkSingleContactOperationComplete(
 		MVPbkContactOperationBase& aOperation,
 		MVPbkStoreContact* aContact )
 	{
@@ -1896,18 +1892,19 @@
 //  CNSmlContactsDataStore::VPbkSingleContactOperationFailed
 // ---------------------------------------------------------------------------
 //
-void CNSmlContactsDataStore::VPbkSingleContactOperationFailed(
-		MVPbkContactOperationBase& aOperation,
-		 TInt aError )
-	 {
+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 );
 	 	}
@@ -1924,6 +1921,8 @@
             {
             iResultArray->Append( aError ); 
             } 
+		delete iContactLink;
+        iContactLink = NULL;	
         delete iBuf;
         iBuf = NULL;
         iReadStream.Close();
@@ -1969,7 +1968,7 @@
 //  CNSmlContactsDataStore::VPbkSingleContactOperationFailed
 // ---------------------------------------------------------------------------
 //
- void CNSmlContactsDataStore::SingleContactOperationCompleteL(
+EXPORT_C void CNSmlContactsDataStore::SingleContactOperationCompleteL(
  		MVPbkStoreContact* aContact)
 	{
 	if(iLastOperation == ENSMLFetchOp)
@@ -1992,7 +1991,8 @@
 		}
 	else if (iLastOperation == ENSMLUpdateExportOp)
 		{
-		iDataMod->MergeRxL( *iContactsBufferItemList[iIndex]->iItemData, *iMergeItem );
+		iDataMod->MergeRxL( *iContactsBufferItemList[iIndex]->iItemData, 
+		    *iMergeItem, iFieldLevelReplace );
 		iWriteStream.Close();
 		delete iMergeItem;
 		iMergeItem = NULL;
@@ -2000,6 +2000,8 @@
 		}
 	else if (iLastOperation == ENSMLUpdateImportOp)
 		{
+		iFieldLevelReplace = EFalse;
+		
 		if(!IsConfidentialL(*aContact))
 			{
 			TInt32 id = iIdConverter->LinkToIdentifier(*aContact->CreateLinkLC());
@@ -2025,12 +2027,13 @@
 				iResultArray->Append(KErrNone);	
 				}
 			
+	        delete iContactLink;
+	        iContactLink = NULL;
 			
 			delete iBuf;
 			iBuf = NULL;
 			iReadStream.Close();
 			
-			
 			iIndex++;
 			if(iIndex == iContactsBufferItemList.Count() )
 				{
@@ -2091,7 +2094,7 @@
 //  CNSmlContactsDataStore::ContactsSaved.
 // ---------------------------------------------------------------------------
 //
- void CNSmlContactsDataStore::ContactsSaved( 
+EXPORT_C void CNSmlContactsDataStore::ContactsSaved( 
 		MVPbkContactOperationBase& aOperation,
         MVPbkContactLinkArray* aResults ) 
 	{
@@ -2155,7 +2158,7 @@
 //  CNSmlContactsDataStore::ContactsSavingFailed
 // ---------------------------------------------------------------------------
 //       
-void CNSmlContactsDataStore::ContactsSavingFailed( 
+EXPORT_C void CNSmlContactsDataStore::ContactsSavingFailed( 
         MVPbkContactOperationBase& aOperation, TInt aError )
 	{
 	MVPbkContactOperationBase* operation = &aOperation;
@@ -2204,7 +2207,7 @@
 //  CNSmlContactsDataStore::StepComplete
 // ---------------------------------------------------------------------------
 //
-void CNSmlContactsDataStore::StepComplete(
+EXPORT_C void CNSmlContactsDataStore::StepComplete(
 		 MVPbkContactOperationBase& /*aOperation*/, 
         TInt aStepSize )
 	{
@@ -2244,7 +2247,7 @@
 //  CNSmlContactsDataStore::StepFailed
 // ---------------------------------------------------------------------------
 //
- TBool CNSmlContactsDataStore::StepFailed(
+EXPORT_C TBool CNSmlContactsDataStore::StepFailed(
         MVPbkContactOperationBase& /*aOperation*/,
         TInt /*aStepSize*/,
         TInt aError )
@@ -2272,7 +2275,7 @@
 //  CNSmlContactsDataStore::OperationComplete
 // ---------------------------------------------------------------------------
 //
-void CNSmlContactsDataStore::OperationComplete
+EXPORT_C void CNSmlContactsDataStore::OperationComplete
 		( MVPbkContactOperationBase& aOperation )
 	{
 	MVPbkContactOperationBase* operation = &aOperation;
@@ -2293,8 +2296,7 @@
 //  CNSmlContactsDataStore::OperationCompleteL
 // ---------------------------------------------------------------------------
 //
-
-void CNSmlContactsDataStore::OperationCompleteL()
+EXPORT_C void CNSmlContactsDataStore::OperationCompleteL()
 	{
 	if(iLastOperation == ENSmlDeleteOp)
 		{
@@ -2361,7 +2363,7 @@
 // CNSmlContactsDataStore::ContactViewReady
 // Implements the view ready function of MVPbkContactViewObserver
 // --------------------------------------------------------------------------- 
-void CNSmlContactsDataStore::ContactViewReady(
+EXPORT_C void CNSmlContactsDataStore::ContactViewReady(
                 MVPbkContactViewBase& /*aView*/ ) 
 	{
 	if(iLastOperation == ENSMLDeleteAllOp)
@@ -2377,7 +2379,7 @@
 // CNSmlContactsDataStore::PrepareForContactsDeleteL()
 // Delete all the contacts at client
 // ---------------------------------------------------------------------------	
-void CNSmlContactsDataStore::DoDeleteAllContactsL()
+EXPORT_C void CNSmlContactsDataStore::DoDeleteAllContactsL()
 	{
 	iContactLnks = CVPbkContactLinkArray::NewL();
 	TInt contactCount = iContactViewBase->ContactCountL();
@@ -2399,7 +2401,7 @@
 // CNSmlContactsDataStore::ContactViewUnavailable
 // Implements the view unavailable function of MVPbkContactViewObserver
 // --------------------------------------------------------------------------- 
-void CNSmlContactsDataStore::ContactViewUnavailable(
+EXPORT_C void CNSmlContactsDataStore::ContactViewUnavailable(
                 MVPbkContactViewBase& /*aView*/ )  
 	{
 	   
@@ -2409,7 +2411,7 @@
 // CNSmlContactsDataStore::ContactAddedToView
 // Implements the add contact function of MVPbkContactViewObserver
 // --------------------------------------------------------------------------- 
-void CNSmlContactsDataStore::ContactAddedToView(
+EXPORT_C void CNSmlContactsDataStore::ContactAddedToView(
             MVPbkContactViewBase& /*aView*/, 
             TInt /*aIndex*/, 
             const MVPbkContactLink& /*aContactLink*/ ) 
@@ -2420,7 +2422,7 @@
 // CNSmlContactsDataStore::ContactRemovedFromView
 // Implements the remove contact function of MVPbkContactViewObserver
 // --------------------------------------------------------------------------- 
-void CNSmlContactsDataStore::ContactRemovedFromView(
+EXPORT_C void CNSmlContactsDataStore::ContactRemovedFromView(
                 MVPbkContactViewBase& /*aView*/, 
                 TInt /*aIndex*/, 
                 const MVPbkContactLink& /*aContactLink*/ )  
@@ -2431,7 +2433,7 @@
 // CNSmlContactsDataStore::ContactViewError
 // Implements the view error function of MVPbkContactViewObserver
 // --------------------------------------------------------------------------- 
-void CNSmlContactsDataStore::ContactViewError(
+EXPORT_C void CNSmlContactsDataStore::ContactViewError(
             MVPbkContactViewBase& /*aView*/, 
             TInt /*aError*/, 
             TBool /*aErrorNotified*/ )  
@@ -2443,8 +2445,7 @@
 // CNSmlContactsDataStore::CreateViewL()
 // Create a contact view 
 // -----------------------------------------------------------------------------
- 
-void CNSmlContactsDataStore::CreateViewL()
+EXPORT_C void CNSmlContactsDataStore::CreateViewL()
 	{
 	
 	CVPbkContactViewDefinition* viewDef = CVPbkContactViewDefinition::NewL();
@@ -2459,7 +2460,54 @@
 				                         iContactManager->FieldTypes()  );
 	CleanupStack::Pop();
 	CleanupStack::PopAndDestroy(viewDef);	
-	
 	}
 
+// ------------------------------------------------------------------------------------------------
+// CNSmlContactsDataStore::GetStoreFormatResourceFileL
+// ------------------------------------------------------------------------------------------------
+EXPORT_C const TDesC& CNSmlContactsDataStore::GetStoreFormatResourceFileL()
+    {
+    _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 )
+        {
+        return KNSmlContactsStoreFormatRsc_1_1_2;
+        }
+    else // error or protocol version 1.2 
+        {
+        return KNSmlContactsStoreFormatRsc_1_2;
+        }
+    _DBG_FILE("CNSmlContactsDataStore::GetStoreFormatResourceFileL(): end");
+    }
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlContactsDataStore::CreateModsFetcherL
+// ------------------------------------------------------------------------------------------------
+EXPORT_C MContactsModsFetcher* CNSmlContactsDataStore::CreateModsFetcherL()
+    {
+    _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;
+    }
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlContactsDataStore::GetDataMod
+// ------------------------------------------------------------------------------------------------
+EXPORT_C CNSmlDataModBase& CNSmlContactsDataStore::GetDataMod()
+    {
+    _DBG_FILE("CNSmlContactsDataStore::GetDataMod()");
+    return *iDataMod;
+    }
+
 // End of File