sapi_calendar/calendarservice/src/calendarservice.cpp
changeset 0 14df0fbfcc4e
--- /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 <e32base.h>
+#include <calsession.h>
+#include <calinstance.h>
+#include <calentryview.h>
+#include <calinstanceview.h>
+#include <calrrule.h>
+#include <badesca.h>
+
+#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<CCalEntry>& 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<CCalEntry>& 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<CCalInstance>& 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<TUIDSet>& 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<TUIDSet>& 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;
+			}
+		}
+	}