harvester/server/src/ondemandao.cpp
changeset 0 c53acadfccc6
child 40 910a23996aa0
child 54 a3cc46f37772
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/harvester/server/src/ondemandao.cpp	Mon Jan 18 20:34:07 2010 +0200
@@ -0,0 +1,182 @@
+/*
+* Copyright (c) 2008-2009 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:  
+*/
+#include "ondemandao.h"
+#include "mdeharvestersession.h"
+#include "harvesterdata.h"
+#include "harvesterlog.h"
+#include "harvesterplugin.h"
+#include "harvesterplugininfo.h"
+#include "harvesterpluginfactory.h"
+
+COnDemandAO::COnDemandAO() :
+	CActive( CActive::EPriorityUserInput )
+	{
+	WRITELOG("COnDemandAO::COnDemandAO");
+	}
+
+COnDemandAO* COnDemandAO::NewLC( CMdESession& aSession, MMonitorPluginObserver& aObserver,
+		CHarvesterPluginFactory& aPluginFactory, RPointerArray<CHarvesterData>* aPhArray )
+	{
+	WRITELOG("COnDemandAO::NewLC");
+	COnDemandAO* self = new ( ELeave ) COnDemandAO();
+	CleanupStack::PushL ( self);
+	self->ConstructL ( aSession, aObserver, aPluginFactory, aPhArray );
+	return self;
+	}
+
+COnDemandAO* COnDemandAO::NewL( CMdESession& aSession, MMonitorPluginObserver& aObserver,
+		CHarvesterPluginFactory& aPluginFactory, RPointerArray<CHarvesterData>* aPhArray )
+	{
+	WRITELOG("COnDemandAO::NewL");
+	COnDemandAO* self = COnDemandAO::NewLC ( aSession, aObserver, aPluginFactory, aPhArray );
+	CleanupStack::Pop (); // self;
+	return self;
+	}
+
+void COnDemandAO::ConstructL( CMdESession& aSession, MMonitorPluginObserver& aObserver,
+		CHarvesterPluginFactory& aPluginFactory, RPointerArray<CHarvesterData>* aPhArray )
+	{
+	WRITELOG("COnDemandAO::ConstructL");
+	iMdEHarvesterSession = CMdEHarvesterSession::NewL ( aSession);
+	iObserver = &aObserver;
+	iPluginFactory = &aPluginFactory;
+	iReadyPhArray = aPhArray;
+	CActiveScheduler::Add ( this ); // Add to scheduler
+	}
+
+COnDemandAO::~COnDemandAO()
+	{
+	WRITELOG("COnDemandAO::~COnDemandAO");
+	Cancel (); // Cancel any request, if outstanding
+	if( iMdEHarvesterSession )
+		{
+		delete iMdEHarvesterSession;
+		}
+	// Delete instance variables if any
+	}
+
+void COnDemandAO::DoCancel()
+	{
+	WRITELOG("COnDemandAO::DoCancel");
+	iMdEHarvesterSession->CancelHarvestingPrioritizationObserver ();
+	}
+
+void COnDemandAO::StartL()
+	{
+	WRITELOG("COnDemandAO::StartL");
+	// Cancel any request, just to be sure
+	Cancel ();
+	iMdEHarvesterSession->SetHarvestingPrioritizationChunkL ( 16384 );
+	WaitHarvestingRequest ();
+	}
+
+void COnDemandAO::RunL()
+	{
+	WRITELOG("COnDemandAO::RunL");
+	if( iStatus.Int() != KErrNotFound )
+		{
+		User::LeaveIfError ( iStatus.Int ());
+		
+		TInt count = iMdEHarvesterSession->HarvestingPrioritizationUriCountL();
+		if( count > 0 )
+			{
+			RPointerArray<CHarvesterPluginInfo>& pluginInfos = iPluginFactory->GetPluginInfos();
+			TInt plugins = pluginInfos.Count();
+
+			for (TInt i = count; --i >= 0;)
+				{
+				HBufC* uri = iMdEHarvesterSession->HarvestingPrioritizationUriL( i );
+				CleanupStack::PushL( uri );
+				TBool found = EFalse;
+
+				for ( TInt j = 0; j < plugins && !found; j++ )
+					{
+					RPointerArray<CHarvesterData>& queue = pluginInfos[j]->iQueue;
+					TInt queueSize = queue.Count();
+					for ( TInt k = 0; k < queueSize && !found; k++ )
+						{				
+						if ( queue[k]->Uri().CompareF( *uri ) == 0 )
+							{
+							WRITELOG2("COnDemandAO::RunL URI %S found in plugin %d queue", uri, j);
+							CHarvesterData* hd = queue[k];
+							hd->SetEventType( EHarvesterEdit );
+							hd->SetObjectType( EFastHarvest );
+							queue.Remove( k );
+							queue.Insert( hd, 0 );
+							found = ETrue;
+							}							
+						}
+					}
+
+				const TInt readyPhArraySize = iReadyPhArray->Count();
+				for ( TInt j = 0; j < readyPhArraySize && !found; j++ )
+					{
+					if ( (*iReadyPhArray)[j]->Uri().CompareF( *uri ) == 0 )
+						{
+						WRITELOG1("COnDemandAO::RunL URI %S found in ph array", uri);
+						CHarvesterData* hd = (*iReadyPhArray)[j];
+						hd->SetEventType( EHarvesterEdit );
+						hd->SetObjectType( EFastHarvest );
+						iReadyPhArray->Remove( j );
+						iReadyPhArray->Insert( hd, 0 );
+						found = ETrue;
+						}
+					}
+
+				if ( !found )
+					{
+					WRITELOG1("COnDemandAO::RunL URI %S wasn't found in placeholder queue.", uri);
+					
+					CMdESession& session = iMdEHarvesterSession->SessionRef();
+					TMdEObject object;
+					TRAPD( err, session.CheckObjectL( object, *uri ));
+					if ( err == KErrNone && object.Placeholder() )
+						{
+						CHarvesterData* hd = CHarvesterData::NewL( uri );
+						hd->SetEventType( EHarvesterEdit );
+						hd->SetObjectType( EFastHarvest );
+						iObserver->MonitorEvent( hd );
+						CleanupStack::Pop( uri );
+						}
+					else
+						{
+						CleanupStack::PopAndDestroy( uri );
+						}
+					}
+				else
+					{
+					CleanupStack::PopAndDestroy( uri );
+					}
+				}
+			}
+		}
+
+	WaitHarvestingRequest();
+	}
+
+TInt COnDemandAO::RunError( TInt /*aError*/ )
+	{
+	return KErrNone;
+	}
+
+void COnDemandAO::WaitHarvestingRequest()
+	{
+	WRITELOG("COnDemandAO::WaitHarvestingRequest");
+	iStatus = KRequestPending;
+	iMdEHarvesterSession->AddHarvestingPrioritizationObserver( iStatus );
+	// Tell scheduler a request is active
+	SetActive();
+	}