diff -r 000000000000 -r 14df0fbfcc4e sapi_calendar/calendarservice/src/calendarservice.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sapi_calendar/calendarservice/src/calendarservice.cpp Mon Mar 30 12:51:10 2009 +0300 @@ -0,0 +1,575 @@ +/* +* 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: Interface to Calender service +* +*/ + + +#include +#include +#include +#include +#include +#include +#include + +#include "calendarheader.h" +#include "calendarconstants.h" +#include "entryattributes.h" +#include "calendarservice.h" +#include "Calendarnotify.h" +#include "calendardeleteentry.h" +#include "calendarimport.h" +#include "calendarexport.h" +#include "addentry.h" +#include "asyncreqobserver.h" + + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CAsyncRequestObserver* CAsyncRequestObserver::NewL() + { + return new(ELeave) CAsyncRequestObserver; + } + +// --------------------------------------------------------------------------- +// Destructor. +// --------------------------------------------------------------------------- +// +CAsyncRequestObserver::~CAsyncRequestObserver() + { + DeleteAsyncObjects();//deletes all Asychronous objects + iAsyncObjArray.Reset(); + } + +// --------------------------------------------------------------------------- +// Notifies about the completeion of an async request. +// --------------------------------------------------------------------------- +// +void CAsyncRequestObserver::RequestComplete( const TInt32 aTransactionId ) + { + TInt pos = iAsyncObjArray.Count() - 1; + TAsyncRequestInfo obj; + for ( ; pos >= 0; pos-- ) + { + obj = iAsyncObjArray[pos]; + // Remove object with transaction id aTransactionId from async object array + if( obj.iTransactionId == aTransactionId ) + { + iAsyncObjArray.Remove(pos); + iAsyncObjArray.Compress(); + return; + } + } + } + +// --------------------------------------------------------------------------- +// Deletes all the asynchronous request objects +// --------------------------------------------------------------------------- +// +void CAsyncRequestObserver::DeleteAsyncObjects() + { + TInt pos = iAsyncObjArray.Count() - 1; + TAsyncRequestInfo obj; + for ( ; pos >= 0; pos-- ) + { + obj = iAsyncObjArray[pos]; + obj.iAsyncObj->Cancel(); + delete obj.iAsyncObj; + } + } + + + +// --------------------------------------------------------------------------- +// Cancels asynchronous request +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CAsyncRequestObserver::Cancel( const TInt32 aTransactionId ) + { + TInt pos = iAsyncObjArray.Count() - 1; + TAsyncRequestInfo obj; + for ( ; pos >= 0; pos-- ) + { + obj = iAsyncObjArray[pos]; + // Cancel and remove object with transaction id aTransactionId from async object array + if( obj.iTransactionId == aTransactionId ) + { + if(obj.iAsyncObj->IsInProgress()) + return KErrInUse; + + obj.iAsyncObj->Cancel(); + delete obj.iAsyncObj; + return KErrNone; + } + } + + return KErrNotFound; + } + +// --------------------------------------------------------------------------- +// Adds asynchronous request object +// --------------------------------------------------------------------------- +// +void CAsyncRequestObserver::AddAsyncObjL( const TInt32 aTransactionId, CCalendarASyncRequest* aAsyncObj ) + { + // Add async object to array to keep track of async requests + TAsyncRequestInfo asyncRequestInfo; + asyncRequestInfo.iTransactionId = aTransactionId; + asyncRequestInfo.iAsyncObj = aAsyncObj; + User::LeaveIfError( iAsyncObjArray.Append( asyncRequestInfo ) ); + } + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +EXPORT_C CCalendarService* CCalendarService::NewL() + { + CCalendarService* self = new (ELeave) CCalendarService; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Destructor. +// --------------------------------------------------------------------------- +// +CCalendarService::~CCalendarService() + { + delete iAsyncReqObserver; + iArraySessionInfo.ResetAndDestroy(); + } + +// --------------------------------------------------------------------------- +// Constructor. +// --------------------------------------------------------------------------- +// +CCalendarService::CCalendarService() + { + } + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +void CCalendarService::ConstructL() + { + //Create default calendar session + CalendarSessionInfoL( KNullDesC ); + iAsyncReqObserver = CAsyncRequestObserver::NewL(); + } + +// --------------------------------------------------------------------------- +// Returns list of available calendars in device. +// Default calendar will be returned in case aDefault is true. +// --------------------------------------------------------------------------- +// +EXPORT_C void CCalendarService::GetListL( CDesCArray*& aCalendarList, const TBool aDefault ) + { + if ( aDefault ) + { + aCalendarList = new(ELeave) CDesCArraySeg( KArrayGran ); + // Append default calendar to calendar list if aDefault == ETrue + CleanupStack::PushL( aCalendarList ); + aCalendarList->AppendL( iArraySessionInfo[KArrayZeroIndex]->Calendar() ); + CleanupStack::Pop( aCalendarList ); + } + else + { + // Append all available to calendar list + aCalendarList = iArraySessionInfo[KArrayZeroIndex]->Session()->ListCalFilesL(); + } + } + +// --------------------------------------------------------------------------- +// Returns list of calendar entries from given calendar with the given Global UID. +// --------------------------------------------------------------------------- +// +EXPORT_C void CCalendarService::GetListL( const TDesC& aCalendarName, const TDesC8& aGuid, RPointerArray& aEntryList) + { + CCalendarSessionInfo* sessionInfo = CalendarSessionInfoL( aCalendarName ); + + // Get list of calendar entries using CCalEntryView + sessionInfo->EntryView()->FetchL( aGuid, aEntryList ); + } + +// --------------------------------------------------------------------------- +// Returns list of calendar entries from given calendar with the given Local UID. +// --------------------------------------------------------------------------- +// +EXPORT_C void CCalendarService::GetListL( const TDesC& aCalendarName, const TCalLocalUid aLocalUid, RPointerArray& aEntryList) + { + CCalendarSessionInfo* sessionInfo = CalendarSessionInfoL( aCalendarName ); + + // Fetch only that entry having local uid aLocalUid + CCalEntry* entry = sessionInfo->EntryView()->FetchL( aLocalUid ); + if( entry ) + { + aEntryList.Append( entry ); + } + } + +// --------------------------------------------------------------------------- +// Returns list of calendar instances from given calendar based on input filter. +// --------------------------------------------------------------------------- +// +EXPORT_C void CCalendarService::GetListL( const TDesC& aCalendarName, CCalendarFilter* aFilter, + RPointerArray& aInstanceList ) + { + if ( !aFilter ) + User::Leave( KErrArgument ); + + CCalendarSessionInfo* sessionInfo = CalendarSessionInfoL( aCalendarName ); + CalCommon::TCalTimeRange range = aFilter->TimeRange(); + if( (range.EndTime().TimeLocalL()) < (range.StartTime().TimeLocalL()) ) + User::Leave( KErrArgument ); + if ( aFilter->FilterText().Length() ) + { + // Search and return all instances which match filter text and time range + CCalInstanceView::TCalSearchParams searchParam( aFilter->FilterText(), CalCommon::EFoldedTextSearch ); + sessionInfo->InstanceView()->FindInstanceL( aInstanceList, + aFilter->FilterType(), + aFilter->TimeRange(), searchParam ) ; + } + else + { + // Search and return all instances which match filter type and time range + sessionInfo->InstanceView()->FindInstanceL( aInstanceList, + aFilter->FilterType(), + aFilter->TimeRange() ) ; + } + } + +// --------------------------------------------------------------------------- +// Adds new calendar +// --------------------------------------------------------------------------- +// +EXPORT_C void CCalendarService::AddL( const TDesC& aCalendarName ) + { + //Create a new calendar file using the existing session object + iArraySessionInfo[KArrayZeroIndex]->Session()->CreateCalFileL( aCalendarName ); + } + +// --------------------------------------------------------------------------- +// Add +// --------------------------------------------------------------------------- +// +EXPORT_C void CCalendarService::AddL( const TDesC& aCalendarName, + CEntryAttributes* aCalendarData, TUIDSet*& aUidAdded ) + { + if ( !aCalendarData ) + User::Leave( KErrArgument ); + + CCalendarSessionInfo* sessionInfo = CalendarSessionInfoL( aCalendarName ); + CCalendarAddEntry* obj = CCalendarAddEntry::NewL( sessionInfo, aCalendarData ); + CleanupStack::PushL( obj ); + obj->AddL( aUidAdded ); + CleanupStack::PopAndDestroy( obj ); + } + +// --------------------------------------------------------------------------- +// Remove calendar from the device. Deletion of defaut calendar is not supported +// --------------------------------------------------------------------------- +// +EXPORT_C void CCalendarService::DeleteL( const TDesC& aCalendarName ) + { + if ( aCalendarName.CompareF(iArraySessionInfo[KArrayZeroIndex]->Calendar()) != 0 ) + { + RemoveSessionInfo( aCalendarName ); + iArraySessionInfo[KArrayZeroIndex]->Session()->DeleteCalFileL( aCalendarName ); + } + else + { + User::Leave( KErrNotSupported ); + } + } + +// --------------------------------------------------------------------------- +// Remove entries from the given calendar based on input filter +// --------------------------------------------------------------------------- +// +EXPORT_C void CCalendarService::DeleteL( const TDesC& aCalendarName, CCalendarFilter* aFilter, MCalCallbackBase* aCallBack ) + { + if ( !aFilter ) + User::Leave( KErrArgument ); + + CCalendarSessionInfo* sessionInfo = CalendarSessionInfoL( aCalendarName ); + + //Instantiate the Delete Class Object + CCalendarDeleteEntry* obj = CCalendarDeleteEntry::NewL( sessionInfo, aFilter, iAsyncReqObserver, aCallBack); + + CleanupStack::PushL( obj ); + + // Call the appropriate version of delete depending on input + obj->DeleteL(); + + if ( aCallBack ) + { + AddAsyncObjL(aCallBack->iTransactionId, obj ); + CleanupStack::Pop( obj ); + } + else + CleanupStack::PopAndDestroy( obj ); + } + +// --------------------------------------------------------------------------- +// ImportL: This is the Synchronous version of Import which imports all the +// entries in the format specified from the Calendar +// --------------------------------------------------------------------------- +// +EXPORT_C void CCalendarService::ImportL( const TDesC& aCalendarName, + const TDesC8& aFormat, + const TDesC8& aInputBuffer, + RPointerArray& aUIDSet ) + { + //Step 1: get the session + CCalendarSessionInfo* sessionInfo = CalendarSessionInfoL( aCalendarName ); + + //Step 2: Instantiate the Import CoreClass Object + CCalendarImport* importObj = CCalendarImport::NewL( sessionInfo, aFormat, aInputBuffer ); + + //Step 3: Push the ImportObject onto the cleanup stack as the Import function can Leave + CleanupStack::PushL( importObj ); + + //Step 4: Call the Import along side the handle to the Output i.e.., aUIDSet + importObj->ImportL( aUIDSet ); + + //Step 5: Destroy the Object as the processing is done + CleanupStack::PopAndDestroy( importObj ); + } + +// --------------------------------------------------------------------------- +// ImportL: This is the Synchronous version of Import which imports all the +// entries in the format specified from the Calendar +// --------------------------------------------------------------------------- +// +EXPORT_C void CCalendarService::ImportL( const TDesC& aCalendarName, + const TDesC8& aFormat, + const TDesC& aImportFile, + RPointerArray& aUIDSet ) + { + //Step 1: get the session + CCalendarSessionInfo* sessionInfo = CalendarSessionInfoL( aCalendarName ); + + //Step 2: Instantiate the Import CoreClass Object + CCalendarImport* importObj = CCalendarImport::NewL( sessionInfo, aFormat, aImportFile ); + + //Step 3: Push the ImportObject onto the cleanup stack as the Import function can Leave + CleanupStack::PushL( importObj ); + + //Step 4: Call the Import along side the handle to the Output i.e.., aUIDSet + importObj->ImportL( aUIDSet ); + + //Step 5: Destroy the Object as the processing is done + CleanupStack::PopAndDestroy( importObj ); + } + +// ----------------------------------------------------------------------------- +// ImportAsyncL: This is the Asynchronous version of Import which imports all the +// entries in the format specified to the Calendar +// ------------------------------------------------------------------------------ +// +EXPORT_C void CCalendarService::ImportL( const TDesC& aCalendarName, + const TDesC8& aFormat, + const TDesC8& aInputBuffer, + MCalCallbackBase* aCallBack ) + { + //get the session + CCalendarSessionInfo* sessionInfo = CalendarSessionInfoL( aCalendarName ); + + //Instantiate the Import CoreClass Object + CCalendarImport* importObj = CCalendarImport::NewL( sessionInfo, aFormat, aInputBuffer, iAsyncReqObserver, aCallBack ); + + //Push the ImportObject onto the cleanup stack as the Import function can Leave + CleanupStack::PushL( importObj ); + + importObj->ImportL(); + + AddAsyncObjL( aCallBack->iTransactionId, importObj ); + + CleanupStack::Pop( importObj ); + } + +// ----------------------------------------------------------------------------- +// ImportAsyncL: This is the Asynchronous version of Import which imports all the +// entries in the format specified to the Calendar +// ------------------------------------------------------------------------------ +// +EXPORT_C void CCalendarService::ImportL( const TDesC& aCalendarName, + const TDesC8& aFormat, + const TDesC& aImportFile, + MCalCallbackBase* aCallBack ) + { + //get the session + CCalendarSessionInfo* sessionInfo = CalendarSessionInfoL( aCalendarName ); + + //Instantiate the Import CoreClass Object + CCalendarImport* importObj = CCalendarImport::NewL( sessionInfo, aFormat, aImportFile, iAsyncReqObserver, aCallBack ); + + //Push the ImportObject onto the cleanup stack as the Import function can Leave + CleanupStack::PushL( importObj ); + + importObj->ImportL(); + + AddAsyncObjL( aCallBack->iTransactionId, importObj ); + + CleanupStack::Pop( importObj ); + } + + + +// --------------------------------------------------------------------------- +// ExportL: This is the Synchronous Version which exports all the entries of +// Calendar in the Specified format +// --------------------------------------------------------------------------- +// +EXPORT_C void CCalendarService::ExportL( const TDesC& aCalendarName, + const TDesC8& aFormat, + CCalendarExportParams* aParams, + HBufC8*& aOutputBuffer ) + { + if( !aParams ) + User::Leave( KErrArgument ); + + CCalendarSessionInfo* sessionInfo = CalendarSessionInfoL( aCalendarName ); + + CCalendarExport* exportObj = CCalendarExport::NewL( sessionInfo, aFormat, aParams ); + + CleanupStack::PushL( exportObj ); + + exportObj->ExportL( aOutputBuffer ); + + CleanupStack::PopAndDestroy( exportObj ); + } + + +// --------------------------------------------------------------------------- +// ExportAsyncL: This is the Asynchronous Version which exports all the entries of +// Calendar in the Specified format +// --------------------------------------------------------------------------- +// +EXPORT_C void CCalendarService::ExportL( const TDesC& aCalendarName, + const TDesC8& aFormat, + CCalendarExportParams* aParams, + MCalCallbackBase* aCallBack ) + { + if( !aParams ) + User::Leave( KErrArgument ); + + CCalendarSessionInfo* sessionInfo = CalendarSessionInfoL( aCalendarName ); + + CCalendarExport* exportObj = CCalendarExport::NewL( sessionInfo, aFormat, aParams, iAsyncReqObserver, aCallBack ); + + CleanupStack::PushL( exportObj ); + + exportObj->ExportL(); + + AddAsyncObjL(aCallBack->iTransactionId, exportObj ); + + CleanupStack::Pop( exportObj ); + } + +// --------------------------------------------------------------------------- +// Start Notification for changes in given calendar +// --------------------------------------------------------------------------- +// +EXPORT_C void CCalendarService::StartChangeNotifyL( const TDesC& aCalendarName, CCalendarFilter* aFilter, MCalCallbackBase* aCallBack ) + { + if( !aCallBack || !aFilter ) + User::Leave( KErrArgument ); + + CCalendarSessionInfo* sessionInfo = CalendarSessionInfoL( aCalendarName ); + + CCalendarObserver* obj = CCalendarObserver::NewL( sessionInfo, aFilter, iAsyncReqObserver, aCallBack ); + + CleanupStack::PushL( obj ); + + // notify in case of add/delete/update operation performed on calendar entries + obj->StartChangeNotificationL(); + + AddAsyncObjL(aCallBack->iTransactionId, obj ); + + CleanupStack::Pop( obj ); + + } + +// --------------------------------------------------------------------------- +// Adds asynchronous request object +// --------------------------------------------------------------------------- +// +void CCalendarService::AddAsyncObjL( const TInt32 aTransactionId, CCalendarASyncRequest* aAsyncObj ) + { + iAsyncReqObserver->AddAsyncObjL( aTransactionId, aAsyncObj ); + } + +// --------------------------------------------------------------------------- +// Cancels asynchronous request +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CCalendarService::Cancel( const TInt32 aTransactionId ) + { + return iAsyncReqObserver->Cancel( aTransactionId ); + } + +// --------------------------------------------------------------------------- +// Returns Calendar session information for given calendar +// --------------------------------------------------------------------------- +// +CCalendarSessionInfo* CCalendarService::CalendarSessionInfoL( const TDesC& aCalendar ) + { + // Return default session object if aCalendar is KNullDesC + if ( ( iArraySessionInfo.Count() > 0 ) && ( aCalendar.Length() == 0 ) ) + return iArraySessionInfo[KArrayZeroIndex]; + + TInt count = iArraySessionInfo.Count(); + for( TInt index = 0; index < count; index++ ) + { + // Return session information of object corresponding to aCalendar + if ( aCalendar.CompareF(iArraySessionInfo[index]->Calendar() ) == 0 ) + return iArraySessionInfo[index]; + } + // If session object is not found, create new session object + // and append to session info array + CCalendarSessionInfo* sessionInfo = CCalendarSessionInfo::NewL( aCalendar ); + CleanupStack::PushL( sessionInfo ); + iArraySessionInfo.AppendL( sessionInfo ); + CleanupStack::Pop( sessionInfo ); + return sessionInfo; + } + +// --------------------------------------------------------------------------- +// Closes Calendar session for given calendar +// --------------------------------------------------------------------------- +// +void CCalendarService::RemoveSessionInfo( const TDesC& aCalendar ) + { + TInt count = iArraySessionInfo.Count(); + for( TInt index = 1; index < count; index++ ) + { + if( aCalendar.CompareF(iArraySessionInfo[index]->Calendar()) == 0 ) + { + // Remove session information for aCalendar and close session + CCalendarSessionInfo* sessionInfo = iArraySessionInfo[index]; + iArraySessionInfo.Remove( index ); + iArraySessionInfo.Compress(); + delete sessionInfo; + break; + } + } + }