diff -r 000000000000 -r 14df0fbfcc4e sapi_calendar/calendarservice/src/calendarnotify.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sapi_calendar/calendarservice/src/calendarnotify.cpp Mon Mar 30 12:51:10 2009 +0300 @@ -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 +#include + + +#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; + }