syncmlfw/ds/hostserver/dshostserverbase/src/NsmldschangedItemsFetcher.cpp
changeset 0 b497e44ab2fc
child 23 4af31167ea77
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/ds/hostserver/dshostserverbase/src/NsmldschangedItemsFetcher.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,181 @@
+/*
+* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  array for storing dataproviders and datastores.
+*
+*/
+
+
+// INCLUDE FILES
+#include <s32mem.h>
+#include <nsmldebug.h>
+
+#include "nsmldshostconstants.h"
+#include "Nsmldsasyncrequesthandler.h"
+#include "Nsmldsdataproviderarray.h"
+
+#ifdef __HOST_SERVER_MTEST__
+#include "../../stif/DSHostServerTest/inc/fakedataprovider.h"
+#else
+#include <SmlDataProvider.h>
+#endif
+
+// CONSTANTS
+_LIT( KNSmlPanicCategory, " Host Server Session\\Changed items fetcher " );
+
+// ======================================= MEMBER FUNCTIONS =======================================
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSChangedItemsFetcher::NewLC
+// ------------------------------------------------------------------------------------------------
+CNSmlDSChangedItemsFetcher* CNSmlDSChangedItemsFetcher::NewLC( CNSmlDSHostSession* aSession, 
+        TNSmlDSDataStoreElement* aDSItem, 
+        const RMessage2& aMessage,
+        RequestFinishedFunction aReqFinishedFunc )
+	{
+	CNSmlDSChangedItemsFetcher* self = new ( ELeave ) CNSmlDSChangedItemsFetcher(
+		aSession, aDSItem, aMessage, aReqFinishedFunc );
+	CleanupStack::PushL( self );
+	self->ConstructL();
+	return self;
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSChangedItemsFetcher::~CNSmlDSChangedItemsFetcher
+// ------------------------------------------------------------------------------------------------
+CNSmlDSChangedItemsFetcher::~CNSmlDSChangedItemsFetcher()
+	{
+	if (iChangedItems)
+		{		
+		iChangedItems->Close();
+		delete iChangedItems;
+		}
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSChangedItemsFetcher::FetchAllChangedItemsL
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSChangedItemsFetcher::FetchAllChangedItemsL()
+	{
+	AddToSchedulerL();
+    SetActive();
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete( status, KErrNone );
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSChangedItemsFetcher::CNSmlDSChangedItemsFetcher
+// ------------------------------------------------------------------------------------------------      
+CNSmlDSChangedItemsFetcher::CNSmlDSChangedItemsFetcher( CNSmlDSHostSession* aSession, 
+        			TNSmlDSDataStoreElement* aDSItem, 
+        			const RMessage2& aMessage,
+        			RequestFinishedFunction aReqFinishedFunc ) :
+	CNSmlDSAsyncRequestHandler( EPriorityLow, aSession, aDSItem, aMessage ),  
+	iChangedItems( NULL )
+	{
+	iNextModsToFetch = TNSmlDbItemModification::ENSmlDbItemAdd;
+	iReqFinishedFunc = aReqFinishedFunc;
+	ASSERT( iReqFinishedFunc != NULL );
+	ASSERT( iDSItem != NULL );
+    }
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSChangedItemsFetcher::ConstructL
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSChangedItemsFetcher::ConstructL()
+	{
+	iChangedItems = new ( ELeave ) RNSmlDbItemModificationSet();
+	}	
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSChangedItemsFetcher::DoCancel
+// No need to do anything. Here to prevent base class DoCancel from getting called.
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSChangedItemsFetcher::DoCancel()
+	{
+	
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSChangedItemsFetcher::RunL
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSChangedItemsFetcher::RunL()
+	{
+	CSmlDataStore* ds = iDSItem->iDataStore;
+	TBool fetchFinished( EFalse );
+	TNSmlDbItemModification::TNSmlDbItemModificationType 
+		toNextModsToFetch( TNSmlDbItemModification::ENSmlDbItemAdd );
+	const MSmlDataItemUidSet* dius = NULL;
+	
+	//Order of items must be preserved for hierarchy sync.
+	//1.Add, 2.Replace, 3.Move, 4.SoftDelete, 5.Delete.
+	switch( iNextModsToFetch )
+		{
+		case TNSmlDbItemModification::ENSmlDbItemAdd:
+			{		
+			dius = &ds->AddedItems();
+			toNextModsToFetch = TNSmlDbItemModification::ENSmlDbItemModify;
+			break;
+			}
+		case TNSmlDbItemModification::ENSmlDbItemDelete:
+			{
+			dius = &ds->DeletedItems();
+			fetchFinished = ETrue;
+			break;
+			}
+		case TNSmlDbItemModification::ENSmlDbItemSoftDelete:
+			{
+			dius = &ds->SoftDeletedItems();
+			toNextModsToFetch = TNSmlDbItemModification::ENSmlDbItemDelete;
+			break;
+			}
+		case TNSmlDbItemModification::ENSmlDbItemMove:
+			{
+			dius = &ds->MovedItems();
+			toNextModsToFetch = TNSmlDbItemModification::ENSmlDbItemSoftDelete;
+			break;
+			}
+		case TNSmlDbItemModification::ENSmlDbItemModify:
+			{
+			dius = &ds->ModifiedItems();
+			toNextModsToFetch = TNSmlDbItemModification::ENSmlDbItemMove;
+			break;
+			}
+		default:
+			User::Panic( KNSmlPanicCategory, KErrUnknown );
+		}
+		
+	TInt status = KErrNone;	
+	
+	if ( dius )
+		{
+		iChangedItems->AddGroupL( *dius, iNextModsToFetch );
+		}
+	
+	if ( fetchFinished )
+		{
+		TRAP( status, ( *iSession.*iReqFinishedFunc )( this ) );
+
+		iMessage.Complete( status );
+		delete this;
+		}
+	else
+		{
+		iNextModsToFetch = toNextModsToFetch;
+		SetActive();
+		TRequestStatus* rstatus = &iStatus;
+    	User::RequestComplete( rstatus, KErrNone );
+		}
+	}
+	
+// End of File