serviceproviders/sapi_calendar/calendarservice/src/calendarnotify.cpp
changeset 5 989d2f495d90
child 23 50974a8b132e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/serviceproviders/sapi_calendar/calendarservice/src/calendarnotify.cpp	Fri Jul 03 15:51:24 2009 +0100
@@ -0,0 +1,183 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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 <calchangecallback.h>
+#include <calsession.h>
+
+
+#include "Calendarheader.h"
+#include "Calendarnotify.h"
+#include "asyncreqobserver.h"
+
+
+// ---------------------------------------------------------------------------
+// two-phased constructor
+// ---------------------------------------------------------------------------
+CCalendarObserver* CCalendarObserver::NewL( CCalendarSessionInfo* aSessionInfo,
+												CCalendarFilter* aFilter,
+												CAsyncRequestObserver* aAsyncRequestObserver,
+												MCalCallbackBase* aNotifyCallback )
+	{
+	CCalendarObserver* self = new(ELeave) CCalendarObserver( aSessionInfo, aAsyncRequestObserver, aNotifyCallback );
+	CleanupStack::PushL( self );
+	self->ConstructL( aFilter );
+	CleanupStack::Pop( self );
+	return self;
+	}
+	
+// ---------------------------------------------------------------------------
+// destructor
+// ---------------------------------------------------------------------------
+CCalendarObserver::~CCalendarObserver()
+	{
+	delete iFilter;
+	
+	if ( iSession )
+		{
+		iSession->StopChangeNotification();
+		delete iSession;
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// default constructor
+// ---------------------------------------------------------------------------
+CCalendarObserver::CCalendarObserver( CCalendarSessionInfo* aSessionInfo, 
+										CAsyncRequestObserver* aAsyncRequestObserver,
+										MCalCallbackBase* aNotifyCallback ) :
+//						CActive( EPriorityStandard ),
+						iSessionInfo( aSessionInfo ),
+						iNotifyCallback( aNotifyCallback ),
+						iAsyncRequestObserver( aAsyncRequestObserver ),
+						iIsInProgress(EFalse)
+	{
+	CActiveScheduler::Add( this ); 
+	}
+
+// ---------------------------------------------------------------------------
+// second phase constructor
+// ---------------------------------------------------------------------------
+void CCalendarObserver::ConstructL( CCalendarFilter* aFilter )
+	{
+	iFilter = CCalendarFilter::NewL();
+	*iFilter = *aFilter;
+	}
+
+// ---------------------------------------------------------------------------
+// Initiates the Notification process
+// ---------------------------------------------------------------------------
+void CCalendarObserver::StartChangeNotificationL()
+	{
+	iSession = CCalSession::NewL();
+	iSession->OpenL( iSessionInfo->Calendar() );
+
+	TBool includeUndateToDo = ( iFilter->Filter() & EFlagUnDateToDo );
+
+	CalCommon::TCalTimeRange range =  iFilter->TimeRange();
+
+	if( range.EndTime().TimeLocalL() != Time::NullTTime() && 
+		range.StartTime().TimeLocalL() != Time::NullTTime() )
+		{
+		if( range.EndTime().TimeLocalL() < range.StartTime().TimeLocalL() )
+			User::Leave( KErrArgument );
+		}
+
+	// Create notification filter object specifying that notification for all entry types is required
+	CCalChangeNotificationFilter* filter = CCalChangeNotificationFilter::NewL( MCalChangeCallBack2::EChangeEntryAll, 
+													includeUndateToDo, 
+													iFilter->TimeRange() );
+	iSession->StartChangeNotification( *this, *filter );
+	delete filter;
+	ActivateRequest( KErrNone );
+	}
+
+
+// ---------------------------------------------------------------------------
+// MCalChangeCallBack2::CalChangeNotification
+// Indicates the event of arrival of change in calendar.
+// ---------------------------------------------------------------------------
+void CCalendarObserver::CalChangeNotification(RArray< TCalChangeEntry > &aChangeItems)
+	{
+	iIsInProgress = ETrue;
+	if ( iFilter->Filter() & EFilterLUid )
+		{
+		RArray< TCalChangeEntry > filteredItems;
+		TInt count = aChangeItems.Count();
+		TInt uidCount = iFilter->LocalUidList().Count();
+			
+		for ( TInt index = 0; index < count; index++ )
+			{
+			for ( TInt i = 0; i < uidCount; i++ )
+				{
+				// Filter only those entries having local uids specified
+				if ( aChangeItems[index].iEntryId ==  iFilter->LocalUidList()[i] )
+					{
+					filteredItems.Append( aChangeItems[index] );
+					break;
+					}
+				}
+			}
+		// Notify the user of the changed entries
+		TRAPD(err, iNotifyCallback->NotifyResultL( KErrNone, (TAny*)(&filteredItems) ));
+		filteredItems.Reset();
+		}
+	else
+		{
+		TRAPD(err, iNotifyCallback->NotifyResultL( KErrNone, (TAny*)(&aChangeItems) ));
+		}
+	iIsInProgress = EFalse;	
+	}		
+	
+// ---------------------------------------------------------------------------
+// Inherited from CActive class 
+// ---------------------------------------------------------------------------
+//
+void CCalendarObserver::DoCancel()
+	{
+	TRequestStatus* temp = &iStatus;
+	User::RequestComplete( temp, KErrCancel );
+	// Stop the notificaton operation
+	iSession->StopChangeNotification();
+	iAsyncRequestObserver->RequestComplete( iNotifyCallback->iTransactionId );
+	TRAPD( err, iNotifyCallback->NotifyResultL( KErrCancel, NULL ));
+	}
+
+// ---------------------------------------------------------------------------
+// Inherited from CActive class 
+// ---------------------------------------------------------------------------
+//
+void CCalendarObserver::RunL()
+	{
+
+	}
+	
+// ---------------------------------------------------------------------------
+// Activates the asynchronous request
+// ---------------------------------------------------------------------------
+//
+void CCalendarObserver::ActivateRequest( TInt /*aReason*/ )
+	{
+	iStatus = KRequestPending;
+	SetActive();
+	}
+
+TBool CCalendarObserver::IsInProgress()
+	{
+	return iIsInProgress;
+	}