pimappservices/calendar/client/src/calasynctask.cpp
changeset 0 f979ecb2b13e
child 60 96907930389d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pimappservices/calendar/client/src/calasynctask.cpp	Tue Feb 02 10:12:19 2010 +0200
@@ -0,0 +1,231 @@
+// Copyright (c) 2005-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 "agmsimpleentry.h"
+#include "calclient.h"
+#include "calcategoryimpl.h"
+#include "calentryimpl.h"
+#include <calprogresscallback.h>
+#include "calsessionimpl.h"
+#include "calcategorymanagerimpl.h"
+#include "agmdebug.h"
+
+CCalAsyncTaskManager::CCalAsyncTaskManager(CCalSessionImpl& aSessionImpl)
+	: CActive(EPriorityStandard),
+	iSessionImpl(aSessionImpl)
+	{
+	CActiveScheduler::Add(this);
+	}
+	
+CCalAsyncTaskManager::~CCalAsyncTaskManager()
+	{
+	CancelAsynTask();
+	iCallBacks.Close();
+	delete iEntryIdList;
+	}
+	
+CCalAsyncTaskManager* CCalAsyncTaskManager::NewL(CCalSessionImpl& aSessionImpl)
+	{
+	CCalAsyncTaskManager* self = new (ELeave) CCalAsyncTaskManager(aSessionImpl);
+	return self;
+	}
+
+void CCalAsyncTaskManager::StartBuildIndexL(MCalProgressCallBack& aProgressCallBack)
+	{
+	/*If it is a task of building index, place the callback into the queue, 
+	so that all of them can be completed when the building index. 
+	*/
+	_DBGLOG_ASYNC(AgmDebug::DebugLogTimeStampL("StartBuildIndexL: Commencing async build index");)
+	
+	if (iAction==EBuildIndex)
+		{
+		iCallBacks.AppendL(&aProgressCallBack);
+		}
+	else if (iAction!=ENoAction)
+		{
+		//The index must have been built if it is doing other asynchronous operations
+		aProgressCallBack.Completed(KErrNone);
+		}
+	else
+		{
+		iAction = EBuildIndex;
+		iCallBacks.AppendL(&aProgressCallBack);
+
+		if (!IsActive())
+			{
+			SetActive();
+			}
+		iSessionImpl.Server().StartBuildIndex(aProgressCallBack.NotifyProgress(), iStatus, iSessionImpl.CollectionId());
+		}
+	}
+
+void CCalAsyncTaskManager::StartDeleteEntryL(MCalProgressCallBack& aProgressCallBack, const CalCommon::TCalTimeRange& aCalTimeRange, CalCommon::TCalViewFilter aFilter)
+	{
+	/*If it is a task of building index, place the callback into the queue, 
+	so that all of them can be completed when the building index. If it is a
+	task of deleting entry, simply leave with "busy". 
+	*/
+	_DBGLOG_ASYNC(AgmDebug::DebugLogTimeStampL("StartDeleteEntryL: Commencing async delete");)
+	
+	if(iAction!=ENoAction)
+		{
+		User::Leave(KErrLocked);
+		}
+		
+	TTime todaysDate;
+	todaysDate.HomeTime();
+
+	iAction = EDeleteEntry;
+	iCallBacks.Append(&aProgressCallBack);
+
+	TAgnFilter agnFilter(aFilter, CalCommon::EFoldedTextSearch);
+	TRAPD(err, iSessionImpl.Server().StartTidyByDateL(aProgressCallBack.NotifyProgress(), iStatus, agnFilter, todaysDate, aCalTimeRange, iSessionImpl.CollectionId()));
+
+	if (err != KErrNone)
+		{
+		iCallBacks.Remove(iCallBacks.Count() - 1);
+		iAction = ENoAction;
+		User::Leave(err);
+		}
+	else if (!IsActive())
+		{
+		SetActive();
+		}
+	}
+	
+void CCalAsyncTaskManager::StartCategoryTaskL(MCalProgressCallBack& aProgressCallBack, TAsyncAction aAction, const CCalCategory& aCategory, RPointerArray<CCalEntry>* aFilteredEntry)
+	{
+	/*If it is a task of building index, place the callback into the queue, 
+	so that all of them can be completed when the building index. If it is a
+	task of deleting entry, simply leave with "busy". 
+	*/
+	_DBGLOG_ASYNC(AgmDebug::DebugLogTimeStampL("StartCategoryTaskL: Commencing async category task");)
+	
+	if(iAction!=ENoAction)
+		{
+		User::Leave(KErrLocked);
+		}
+		
+
+	iAction = aAction;
+	iCallBacks.Append(&aProgressCallBack);
+
+	if(iAction==EFilterCategory)
+		{
+		iFilteredEntry = aFilteredEntry;
+		}
+
+	TRAPD(err, iSessionImpl.Server().StartCategoryTaskL(aProgressCallBack.NotifyProgress(), iStatus, *(aCategory.Impl()->AgnCategory()), aAction, iSessionImpl.CollectionId()));
+	if (err != KErrNone)
+		{
+		iCallBacks.Remove(iCallBacks.Count() - 1);
+		iAction = ENoAction;
+		User::Leave(err);
+		}
+	else if (!IsActive())
+		{
+		SetActive();
+		}
+	}
+
+		
+void CCalAsyncTaskManager::DoCancel()
+	{
+	}
+
+void CCalAsyncTaskManager::CancelAsynTask()
+	{
+	if (iAction != ENoAction)
+		{
+		iSessionImpl.Server().CancelTask(iSessionImpl.FileId());
+		CompleteRequest(KErrCancel);
+		Cancel();
+		}
+	iAction = ENoAction;
+	}
+
+void CCalAsyncTaskManager::RunL()
+	{
+	//If the progress value is 100 or negative it means that the observed process
+	//has finished and thereby it should have provided the progress value to report
+	//Under normal conditions we use the complete status as a progress parameter (%)
+	TInt progress = iStatus.Int();
+
+	//If The ongoing process is not cancelled or finished then request again
+	if (progress > 0 && progress < 100)
+		{
+		TInt count=iCallBacks.Count();
+		for(TInt ii=0; ii<count; ++ii)
+			{
+			if((iCallBacks)[ii])
+				{
+				(iCallBacks)[ii]->Progress(progress);
+				}
+			}
+
+		//requesting itself
+		if (iAction == EBuildIndex)
+			{//When asynchronous operation is to build index, we should call RAgendaServ::StartBuildIndex  for progress requess. 
+			iSessionImpl.Server().StartBuildIndex(ETrue, iStatus, iSessionImpl.CollectionId());
+			}
+		else
+			{
+			iSessionImpl.Server().RequestProgress(iStatus, iSessionImpl.CollectionId());
+			}
+		
+		SetActive();
+		}
+	else 
+		{
+		if (iAction==EFilterCategory && progress==KErrNone)
+			{
+			TRAP(progress,GetFilteredEntryL());
+			}
+		CompleteRequest(progress);
+		}
+	}
+
+void CCalAsyncTaskManager::CompleteRequest(TInt aCompleteCode)
+	{
+	for(TInt ii=0; ii<iCallBacks.Count(); ++ii)
+		{
+		if((iCallBacks)[ii])
+			{
+			iCallBacks[ii]->Completed(aCompleteCode);
+			}
+		}
+	iCallBacks.Reset();
+	delete iEntryIdList;
+	iEntryIdList=NULL;
+	iAction = ENoAction;
+	}
+	
+void CCalAsyncTaskManager::GetFilteredEntryL()
+	{// Get the light entry by its entry id and fill in it into the array past in by the client
+	iEntryIdList = new (ELeave) CArrayFixSeg<TAgnEntryId> (32);
+	CCalCategoryManagerImpl::GetFilteredEntryL(*iEntryIdList, *iFilteredEntry, iSessionImpl);
+	delete iEntryIdList;
+	iEntryIdList=NULL;
+	}
+
+TBool CCalAsyncTaskManager::BuildingIndex() const
+	{
+	return (iAction == EBuildIndex);
+	}
+	
+TBool CCalAsyncTaskManager::IsBusy() const
+	{
+	return iAction!=ENoAction;	
+	}