--- /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;
+ }