--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/serviceproviders/sapi_calendar/calendarservice/src/calendarimport.cpp Fri Jul 03 15:51:24 2009 +0100
@@ -0,0 +1,308 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+
+//System Includes
+#include <e32cmn.h> //for RPointerArray
+#include <calsession.h> //For CCalSession
+#include <calentryview.h>
+#include <CalenImporter.h>
+#include <CalenInterimUtils2.h>
+#include <s32mem.h>
+#include <s32file.h>
+
+//User Include
+#include "calendarheader.h"
+#include "calendarconstants.h"
+#include "asyncreqobserver.h"
+#include "calendarimport.h"
+
+
+
+void CleanupCCalEntryArray(TAny* aPointer);
+void CleanupCCalInstanceArray(TAny* aPointer);
+
+// --------------------------------------------------------------------------------------------------------
+// Static Method which either returns the Two Phase constructed Object or Leave
+// NOTE: Ownership of any of the parameters is not taken through this function call
+// NOTE: Therefore the User of this function needs to take care of neccessary cleanup of passed parameters
+// --------------------------------------------------------------------------------------------------------
+//
+CCalendarImport* CCalendarImport::NewL ( CCalendarSessionInfo* aCalSessionInfo,
+ const TDesC8& aFormat,
+ const TDesC8& aInputBuffer,
+ CAsyncRequestObserver* aAsyncRequestObserver,
+ MCalCallbackBase* aCallBack )
+ {
+ CCalendarImport* self = new (ELeave) CCalendarImport( aCalSessionInfo, aAsyncRequestObserver, aCallBack );
+
+ CleanupStack::PushL(self);
+
+ self->ConstructL( aFormat, aInputBuffer );
+
+ CleanupStack::Pop(self);
+
+ return self;
+ }
+
+// --------------------------------------------------------------------------------------------------------
+// Static Method which either returns the Two Phase constructed Object or Leave
+// NOTE: Ownership of any of the parameters is not taken through this function call
+// NOTE: Therefore the User of this function needs to take care of neccessary cleanup of passed parameters
+// --------------------------------------------------------------------------------------------------------
+//
+CCalendarImport* CCalendarImport::NewL ( CCalendarSessionInfo* aCalSessionInfo,
+ const TDesC8& aFormat,
+ const TDesC& aImportFile,
+ CAsyncRequestObserver* aAsyncRequestObserver,
+ MCalCallbackBase* aCallBack )
+ {
+ CCalendarImport* self = new (ELeave) CCalendarImport( aCalSessionInfo, aAsyncRequestObserver, aCallBack );
+
+ CleanupStack::PushL(self);
+
+ self->ConstructL( aFormat, aImportFile );
+
+ CleanupStack::Pop(self);
+
+ return self;
+ }
+
+
+// --------------------------------------------------------------------------------------------------------
+// Destructor.
+// --------------------------------------------------------------------------------------------------------
+//
+CCalendarImport::~CCalendarImport()
+ {
+ Cancel();
+
+ delete iCalenImporter;
+
+ delete iFormat;
+
+ delete iInputBuffer;
+
+ delete iImportFile;
+
+ iOutputUIDArray.ResetAndDestroy();
+ }
+
+// --------------------------------------------------------------------------------------------------------
+// Synchronous Version of Import which takes InputBuffer set at the time of Construction of this object
+// and Imports them to the Calender opened in CalSession of CalendarSessionInfoL object passed to this object
+// It sets the LUids and GUids in the aOutputLocalUidArray, this object is not the owner of aOutputLocalUidArray
+// --------------------------------------------------------------------------------------------------------
+//
+void CCalendarImport::ImportL( RPointerArray<TUIDSet>& aOutputUIDArray )
+ {
+ if ( iInputBuffer )
+ {
+ RDesReadStream rStream( *iInputBuffer );
+
+ CleanupClosePushL( rStream );
+
+ ImportFromStreamL(rStream, aOutputUIDArray);
+
+ CleanupStack::PopAndDestroy( &rStream );
+ }
+ else
+ {
+ RFs rfs;
+ User::LeaveIfError( rfs.Connect() );
+ CleanupClosePushL( rfs );
+
+ RFile file;
+ User::LeaveIfError( file.Open( rfs, *iImportFile, EFileRead ));
+ CleanupClosePushL( rfs );
+
+ RFileReadStream rStream( file );
+ CleanupClosePushL( rStream );
+
+ ImportFromStreamL(rStream, aOutputUIDArray);
+
+ CleanupStack::PopAndDestroy( 3 , &rfs );
+ }
+ }
+
+// --------------------------------------------------------------------------------------------------------
+// Synchronous Version of Import which takes InputStream set at the time of Construction of this object
+// and Imports them to the Calender opened in CalSession of CalendarSessionInfoL object passed to this object
+// It sets the LUids and GUids in the aOutputLocalUidArray, this object is not the owner of aOutputLocalUidArray
+// --------------------------------------------------------------------------------------------------------
+//
+void CCalendarImport::ImportFromStreamL(RReadStream& aStream, RPointerArray<TUIDSet>& aOutputUIDArray )
+ {
+ RPointerArray<CCalEntry> outputCalEntryArray;
+
+ CleanupStack::PushL( TCleanupItem(CleanupCCalEntryArray, &outputCalEntryArray) );
+
+ if ( iFormat->CompareF(KCalFmtVCal) == 0 )
+ {
+ iCalenImporter->ImportVCalendarL( aStream, outputCalEntryArray );
+ }
+ else if ( iFormat->CompareF(KCalFmtICal) == 0 )
+ {
+ iCalenImporter->ImportICalendarL( aStream, outputCalEntryArray );
+ }
+ else
+ User::Leave( KErrNotSupported );
+
+ TInt count = outputCalEntryArray.Count();
+
+ for ( TInt index = 0; index < count; index ++ )
+ {
+ CCalenInterimUtils2::StoreL( *iCalSessionInfo->EntryView() , *outputCalEntryArray[index] );
+
+ TUIDSet* newUid = new(ELeave) TUIDSet;
+
+ CleanupStack::PushL( newUid );
+
+ newUid->iLocalUID = outputCalEntryArray[index]->LocalUidL();
+
+ newUid->iGlobalUID = outputCalEntryArray[index]->UidL().AllocL();
+
+ aOutputUIDArray.AppendL( newUid );
+
+ CleanupStack::Pop( newUid );
+ }
+
+ CleanupStack::PopAndDestroy( &outputCalEntryArray );
+ }
+
+
+
+// --------------------------------------------------------------------------------------------------------
+// ASynchronous Version of Import which takes InputBuffer set at the time of Construction of this object through NewL
+// and Imports to the Calender(outputis passed through callback)
+// --------------------------------------------------------------------------------------------------------
+//
+void CCalendarImport::ImportL()
+ {
+ if( !iCallBack || !iAsyncRequestObserver ) //if any of the async handlers are not set then leave
+ User::Leave( KErrArgument );
+
+ CActiveScheduler::Add ( this );
+
+ ActivateRequest( KErrNone );
+ }
+
+
+
+// --------------------------------------------------------------------------------------------------------
+// Constructor.
+// --------------------------------------------------------------------------------------------------------
+//
+CCalendarImport::CCalendarImport( CCalendarSessionInfo* aCalSessionInfo,
+ CAsyncRequestObserver* aAsyncRequestObserver,
+ MCalCallbackBase* aCallBack ):
+ //CActive( EPriorityStandard ),
+ iCalSessionInfo(aCalSessionInfo),
+ iCallBack( aCallBack ),
+ iAsyncRequestObserver(aAsyncRequestObserver)
+ {
+
+ }
+
+
+// --------------------------------------------------------------------------------------------------------
+// 2nd-phased constructor of two phase construction
+// --------------------------------------------------------------------------------------------------------
+//
+void CCalendarImport::ConstructL( const TDesC8& aFormat, const TDesC8& aInputBuffer )
+ {
+ //instantiating the iCalDataExchange handle
+ iCalenImporter=CCalenImporter::NewL(*(iCalSessionInfo->Session()));
+
+ iFormat = aFormat.AllocL();
+
+ iInputBuffer = aInputBuffer.AllocL();
+
+ }
+
+void CCalendarImport::ConstructL( const TDesC8& aFormat, const TDesC& aImportFile )
+ {
+ //instantiating the iCalDataExchange handle
+ iCalenImporter=CCalenImporter::NewL(*(iCalSessionInfo->Session()));
+
+ iFormat = aFormat.AllocL();
+
+ iImportFile = aImportFile.AllocL();
+
+ }
+
+
+// ---------------------------------------------------------------------------
+// Inherited from CActive class
+// ---------------------------------------------------------------------------
+//
+void CCalendarImport::DoCancel()
+ {
+ NotifyRequestResult( KErrCancel );
+ }
+
+// ---------------------------------------------------------------------------
+// Inherited from CActive class
+// ---------------------------------------------------------------------------
+//
+void CCalendarImport::RunL()
+ {
+ TInt err = iStatus.Int();
+
+ if ( err == KErrNone )
+ {
+ TRAP( err, ImportL( iOutputUIDArray ));
+ }
+
+ NotifyRequestResult( err );
+ }
+
+
+// ---------------------------------------------------------------------------
+// Activates the asynchronous request
+// ---------------------------------------------------------------------------
+//
+void CCalendarImport::ActivateRequest( TInt aReason )
+ {
+ iStatus = KRequestPending;
+
+ SetActive();
+
+ TRequestStatus* temp = &iStatus;
+
+ User::RequestComplete( temp, aReason );
+ }
+
+
+// ---------------------------------------------------------------------------
+// Notifies callback the result for asynchronous request.
+// ---------------------------------------------------------------------------
+//
+void CCalendarImport::NotifyRequestResult( TInt aReason )
+ {
+ if ( iCallBack )
+ {
+ iAsyncRequestObserver->RequestComplete( iCallBack->iTransactionId );
+
+ TRAPD( err, iCallBack->NotifyResultL( aReason, ( TAny * )( & iOutputUIDArray )));
+
+ }
+
+ // caller will delete the object in case of cancel
+ if ( aReason != KErrCancel )
+ delete this;
+ }