serviceproviders/sapi_calendar/calendarservice/src/calendarexport.cpp
changeset 19 989d2f495d90
child 33 50974a8b132e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/serviceproviders/sapi_calendar/calendarservice/src/calendarexport.cpp	Fri Jul 03 15:51:24 2009 +0100
@@ -0,0 +1,430 @@
+/*
+* 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 Exporting the contents of a Calender
+*
+*/
+
+
+//System Includes
+#include <e32cmn.h> 		//for RPointerArray
+#include <s32file.h>
+#include <calsession.h>
+#include <calentryview.h>
+#include <CalenExporter.h>
+#include <calentryview.h>
+#include <caliterator.h>
+
+//User Include
+#include "calendarheader.h"
+#include "calendarconstants.h"
+#include "asyncreqobserver.h"
+#include "CalendarExport.h"
+
+
+void CleanupCCalEntryArray(TAny* aPointer);
+void CleanupCCalInstanceArray(TAny* aPointer);
+
+
+//used in case of writing the temporary output while exporting the entries
+_LIT(KTempFilePath,"C:\\");
+
+//--------------------------------------------------------------------------------------------------------
+// Static Method which either returns the Two Phase constructed Object or Leave 
+// Used to set local copies of some of the parameters like aFormat to iFormat
+//--------------------------------------------------------------------------------------------------------
+//
+CCalendarExport* CCalendarExport::NewL ( CCalendarSessionInfo* aCalSessionInfo, 
+										 const TDesC8& aFormat, 
+										 CCalendarExportParams* aParams, 
+										 CAsyncRequestObserver* aAsyncRequestObserver,
+										 MCalCallbackBase* aCallBack )
+	{
+	CCalendarExport* self = new (ELeave) CCalendarExport( aCalSessionInfo, aAsyncRequestObserver, aCallBack );
+	
+    CleanupStack::PushL(self);
+    
+    self->ConstructL( aFormat, aParams );
+    
+    CleanupStack::Pop( self );
+    
+    return self;
+	}
+
+
+// --------------------------------------------------------------------------------------------------------
+// Destructor.
+// --------------------------------------------------------------------------------------------------------
+//
+CCalendarExport::~CCalendarExport()
+	{
+	Cancel();
+	
+	delete iCalenExporter;
+	
+	delete iFormat;
+	
+	delete iOutputBuffer;
+	
+	if ( iAsyncRequestObserver )
+		delete iParams;	
+	}
+
+// --------------------------------------------------------------------------------------------------------
+// Synchronous Export Function which decides the flow basing on the inputs set at the time of Construction 
+// of this object through NewL and generates corresponding entries in an Ouput Buffer
+// --------------------------------------------------------------------------------------------------------
+//
+void CCalendarExport::ExportL( HBufC8*& aOutputBuffer )
+	{
+	if( !iParams )
+			User::Leave( KErrArgument );
+	
+	if( iParams->Params() & CCalendarExportParams::EParamsGUid && 
+			iParams->Params() & CCalendarExportParams::EParamsLUid)
+		{
+		User::Leave( KErrArgument );		
+		}
+	else if( iParams->Params() & CCalendarExportParams::EParamsGUid )
+		{
+		ConvertGUIDAndExportL( aOutputBuffer );
+		}
+	else if( iParams->Params() & CCalendarExportParams::EParamsLUid )
+		{
+		ConvertLUIDAndExportL( aOutputBuffer );
+		}
+	else
+		{
+		GetCalEntriesAndExportL( aOutputBuffer );
+		}
+	}
+
+
+// --------------------------------------------------------------------------------------------------------
+// ASynchronous Export Function which actually sets the ActiveObject up in the Active Schedular
+// 				Exports entries basing on the input set at the time of construction of this object througn NewL
+//						all the entries of the Calender(outputis passed through callback)
+// --------------------------------------------------------------------------------------------------------
+//
+void CCalendarExport::ExportL()
+	{
+	if( !iAsyncRequestObserver || !iCallBack )
+		User::Leave( KErrArgument );
+		
+	CActiveScheduler::Add ( this );
+	
+	ActivateRequest( KErrNone );
+	}
+	
+	
+// --------------------------------------------------------------------------------------------------------
+// Constructor
+// --------------------------------------------------------------------------------------------------------
+//
+CCalendarExport::CCalendarExport( CCalendarSessionInfo* aCalSessionInfo, CAsyncRequestObserver* aAsyncRequestObserver, 
+												MCalCallbackBase* aCallBack ): 
+								  					//CActive( EPriorityStandard ),
+								  					iCalSessionInfo( aCalSessionInfo ),
+								  					iCallBack( aCallBack ),
+								  					iAsyncRequestObserver( aAsyncRequestObserver )
+	{
+	}
+	
+	
+// --------------------------------------------------------------------------------------------------------
+// 2nd-phased constructor of two phase construction
+// NOTE: Ownership of any of the parameters is not taken through this function call
+// --------------------------------------------------------------------------------------------------------
+//	
+void CCalendarExport::ConstructL( const TDesC8& aFormat, CCalendarExportParams* aParams )
+	{	
+	if ( iAsyncRequestObserver )
+		{
+		iParams = aParams->CloneL();
+		}
+	else	
+		{
+		iParams = aParams;
+		}
+	
+	iFormat = aFormat.AllocL();
+	
+	iCalenExporter = CCalenExporter::NewL( * ( iCalSessionInfo->Session() ) );
+	}
+
+// --------------------------------------------------------------------------------------------------------
+// Private Export Function which is internally called (by both Overloaded 
+// synchronous functions) to export the ccalentries to OutputBuffer
+// --------------------------------------------------------------------------------------------------------
+//
+void CCalendarExport::ExportToBufferL( const RPointerArray<CCalEntry>& aCalEntryArray , HBufC8*& aOutputBuffer )
+	{
+	TFileName tempFileName;
+	
+	TPtrC filePath( KTempFilePath );
+	
+	RFs fileServer;
+    
+    User::LeaveIfError( fileServer.Connect() );
+    
+    CleanupClosePushL( fileServer );
+	
+	//writeStream for the Export to write to
+	RFileWriteStream wFileStream;
+	
+	wFileStream.PushL();
+	
+	if ( iParams->Params() & CCalendarExportParams::EParamsFileName )
+		{
+		User::LeaveIfError( wFileStream.Replace(fileServer, iParams->ExportFileName(), EFileWrite ));
+		}
+	else
+		{
+		//opens the temp file for reading and writing and returns its name in tempFileName
+		User::LeaveIfError( wFileStream.Temp( fileServer, filePath , tempFileName , EFileWrite ));
+		}
+	
+	TInt calEntryArrayCount = aCalEntryArray.Count();	
+	
+	//Step2: Exporting the Entries to wFileStream(Temporary file) 
+	if ( iFormat->CompareF(KCalFmtVCal) == 0 )
+		{
+		for(TInt j = 0 ; j < calEntryArrayCount ; ++j )
+			{			
+			//As the current Implementation of ExportVCal does not support taking an array of CCalEntries at a time and 
+			//returning the result in the writeStream....Only one entry is supported at a time.
+			//Though it provides the overloaded functions one taking an entry at a time and the other taking array at a time
+			//the One that take an array at a time Leaves if the array length is greater than 1
+			
+			iCalenExporter->ExportVCalL( *aCalEntryArray[j], wFileStream );
+			}
+		}
+	else if ( iFormat->CompareF(KCalFmtICal) == 0 )
+		{
+		for(TInt j = 0 ; j < calEntryArrayCount ;++j )
+			{			
+			//As the current Implementation of ExportVCal does not support taking an array of CCalEntries at a time and 
+			//returning the result in the writeStream....Only one entry is supported at a time.
+			//Though it provides the overloaded functions one taking an entry at a time and the other taking array at a time
+			//the One that take an array at a time Leaves if the array length is greater than 1
+			
+			iCalenExporter->ExportICalL( *aCalEntryArray[j], wFileStream );
+			}
+		}
+	else
+		{
+		User::Leave( KErrNotSupported );
+		}	
+	
+	wFileStream.CommitL();
+	
+	wFileStream.Close();
+	
+	wFileStream.Pop();
+	
+	wFileStream.Release();
+	
+	//wStream( temporary file ) contains the entries exported from the calender...
+	//Coping the content to the aOutputBuffer
+
+	if ( !( iParams->Params() & CCalendarExportParams::EParamsFileName ))
+		{
+		RFile file;
+		
+		TInt fileSize;
+		
+		User::LeaveIfError( file.Open( fileServer, tempFileName, EFileRead ));
+		
+	    CleanupClosePushL( file );
+		
+		file.Size( fileSize );
+
+		aOutputBuffer = HBufC8::NewL( fileSize );
+		
+		TPtr8 temp = aOutputBuffer->Des();
+		
+		//reads all the contents of the temporary file into the descriptor and its length is set accoordingly
+		file.Read( temp );
+		
+		CleanupStack::PopAndDestroy( &file );//file
+		
+		//deleting the temporary file using the RFs Object 
+		fileServer.Delete( tempFileName );
+		}
+	
+	CleanupStack::PopAndDestroy( &fileServer );//fileServer
+	}
+
+
+// --------------------------------------------------------------------------------------------------------
+// Internal Function For Conversion of LocalUIDS to CCalEntry and call ExportToBuffer
+// (this is called in case of Asynchronous from RUNL)
+// --------------------------------------------------------------------------------------------------------
+//          
+void CCalendarExport::GetCalEntriesAndExportL( HBufC8*& aOutputBuffer )
+	{
+	
+	RPointerArray<CCalEntry> calEntryArray;
+	 //to store all the calendery entries correspongind to the Input LocalUID Array
+
+	CleanupStack::PushL( TCleanupItem(CleanupCCalEntryArray, &calEntryArray) );
+	
+	//Step1:Retrieving all the CCalEntryArray from the Calendar
+
+	CCalIter* calIter = CCalIter::NewL( *iCalSessionInfo->Session() );
+	
+	CleanupStack::PushL( calIter );
+	
+	TPtrC8 calEntryUID(calIter->FirstL());
+	
+	while( calEntryUID != KNullDesC8 )
+			{
+			//fetch the total array of entries at once for the first uid
+			iCalSessionInfo->EntryView()->FetchL( calEntryUID , calEntryArray );
+			
+			calEntryUID.Set(calIter->NextL());
+			}
+			
+	//Step2: Exporting the Entries to writeStream(Temporary file) and copying the contents to the aOutputBuffer
+	
+	ExportToBufferL( calEntryArray, aOutputBuffer );
+	
+	CleanupStack::PopAndDestroy( 2, &calEntryArray );
+	}
+	
+	
+// --------------------------------------------------------------------------------------------------------
+// Internal Function For Conversion of GlobalUIDS to CCalEntry and call ExportToBuffer
+// (this is called in case of Asynchronous from RUNL)
+// --------------------------------------------------------------------------------------------------------
+//	
+void CCalendarExport::ConvertGUIDAndExportL( HBufC8*& aOutputBuffer )
+	{
+	RPointerArray< CCalEntry > calEntryArray; 
+	//to store all the calendery entries correspongind to the Input GUID Array
+	CleanupStack::PushL( TCleanupItem(CleanupCCalEntryArray, &calEntryArray) );
+	
+	//Step1: Generating the CCalEntryArray corresponding to input GUID(Descriptor..alpha numberic) Array
+	
+	TInt inputArrayCount = iParams->GuidArray()->Count();//MdcaCount(); this can also be used
+	
+	for ( TInt i = 0; i < inputArrayCount; ++i ) 
+		{	
+		iCalSessionInfo->EntryView()->FetchL( (*iParams->GuidArray())[i] , calEntryArray );
+		}
+		
+	
+	//Step2: Exporting the Entries to writeStream(Temporary file) and copying the contents to the aOutputBuffer
+	
+	ExportToBufferL( calEntryArray , aOutputBuffer );
+	
+	CleanupStack::PopAndDestroy( &calEntryArray );
+	}
+		
+
+// --------------------------------------------------------------------------------------------------------
+// Internal Function For Conversion of LocalUIDS to CCalEntry and call ExportToBuffer
+// (this is called in case of Asynchronous from RUNL)
+// --------------------------------------------------------------------------------------------------------
+//          
+void CCalendarExport::ConvertLUIDAndExportL( HBufC8*& aOutputBuffer )
+	{
+	
+	RPointerArray<CCalEntry> calEntryArray; //needs this to be pushed onto the stack But little support to do this
+	//to store all the calendery entries correspongind to the Input LocalUID Array
+	CleanupStack::PushL( TCleanupItem(CleanupCCalEntryArray, &calEntryArray) );
+	
+	//Step1:Generating the CCalEntryArray corresponding to input LocalUID(unsigned int) Array
+	
+	TInt inputArrayCount = iParams->LocalUidArray().Count();
+	
+	for(TInt i = 0; i < inputArrayCount ; ++i) 
+		{
+		CCalEntry* entry = iCalSessionInfo->EntryView()->FetchL( iParams->LocalUidArray()[i] );
+		if ( entry )
+			{
+			CleanupStack::PushL( entry );
+			
+			calEntryArray.AppendL( entry );
+			
+			CleanupStack::Pop( entry );
+			}
+		}
+		
+		
+	//Step2: Exporting the Entries to writeStream(Temporary file) and copying the contents to the aOutputBuffer
+	
+	ExportToBufferL( calEntryArray, aOutputBuffer );
+	
+	CleanupStack::PopAndDestroy( &calEntryArray );
+	}
+			
+// --------------------------------------------------------------------------------------------------------
+// Inherited from CActive class 
+// --------------------------------------------------------------------------------------------------------
+//
+void CCalendarExport::DoCancel()
+	{
+	NotifyRequestResult( KErrCancel );
+	}
+
+
+// --------------------------------------------------------------------------------------------------------
+// Inherited from CActive class 
+// --------------------------------------------------------------------------------------------------------
+//
+void CCalendarExport::RunL()
+	{
+	TInt err = iStatus.Int();
+
+	if ( err == KErrNone )//ExportL(const TDesC8 aFormat, RArray<TUint>& aInputLocalUidArray , HBufC8*& aOutputBuffer )
+		{
+		TRAP( err, ExportL( iOutputBuffer ));
+		}		
+	NotifyRequestResult( err );		
+	}
+	
+	
+// --------------------------------------------------------------------------------------------------------
+// Activates the asynchronous request
+// --------------------------------------------------------------------------------------------------------
+//
+void CCalendarExport::ActivateRequest( TInt aReason )
+	{
+	iStatus = KRequestPending;
+	
+	SetActive();
+	
+	TRequestStatus* temp = &iStatus;
+	
+	User::RequestComplete( temp, aReason );
+	}
+
+
+// --------------------------------------------------------------------------------------------------------
+// Notifies callback the result for asynchronous request.
+// --------------------------------------------------------------------------------------------------------
+//
+void CCalendarExport::NotifyRequestResult( TInt aReason )
+	{
+	if ( iCallBack )
+		{
+		iAsyncRequestObserver->RequestComplete( iCallBack->iTransactionId );
+		
+		TRAPD( err, iCallBack->NotifyResultL( aReason, ( TAny * )( iOutputBuffer )));
+		}
+	
+	// caller will delete the object in case of cancel
+	if ( aReason != KErrCancel )
+		delete this;
+	}