--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/calendarui/calenaiwprovider/src/calenaiwprovider.cpp Tue Feb 02 10:12:19 2010 +0200
@@ -0,0 +1,583 @@
+/*
+ * 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 "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 : Aiw provider class provide menuservice which launched calendar
+ * list dialog with multiple calendars.
+ *
+ */
+
+// System includes.
+#include <AiwMenu.h>
+#include <calenaiwprovidermenu.rsg>
+#include <AiwGenericParam.hrh>
+#include <AiwCommon.hrh>
+#include <CalenImporter.h>
+#include <s32file.h>
+#include <CalenInterimUtils2.h>
+#include <calentryview.h>
+#include <sysutil.h>
+#include <aknnotewrappers.h>
+#include <calcalendariterator.h>
+#include <StringLoader.h>
+#include <CalenInterimUtils2.h>
+#include <calentry.h>
+#include <bautils.h>
+#include <data_caging_path_literals.hrh>
+
+// User inlcudes.
+#include "calenaiwprovider.h"
+#include "multicaluidialog.h"
+#include "calendarui_debug.h"
+#include "calsession.h"
+#include "calendar.hrh"
+// Literals.
+_LIT( KResourceFileName, "calenaiwprovidermenu.rsc" );
+// Recognition string for ical
+_LIT8(KVersionICal, "VERSION:2.0");
+// Recognition string for vcal
+_LIT8(KVersionVCal, "VERSION:1.0");
+
+// Constants.
+const TInt KReadDataAmount = 256;
+const TInt KVCalBcLeaveCodeCorrupt = -90;
+
+// ---------------------------------------------------------------------------
+// CCalenAiwProvider::NewL
+// (rest of the details are commented in the header)
+// ---------------------------------------------------------------------------
+//
+CCalenAiwProvider* CCalenAiwProvider::NewL()
+ {
+ TRACE_ENTRY_POINT
+
+ CCalenAiwProvider* self = CCalenAiwProvider::NewLC();
+ CleanupStack::Pop(self);
+
+ TRACE_EXIT_POINT
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CCalenAiwProvider::NewLC
+// (rest of the details are commented in the header)
+// ---------------------------------------------------------------------------
+//
+CCalenAiwProvider* CCalenAiwProvider::NewLC()
+ {
+ TRACE_ENTRY_POINT
+
+ CCalenAiwProvider* self = new (ELeave) CCalenAiwProvider;
+ CleanupStack::PushL(self);
+ self->ConstructL();
+
+ TRACE_EXIT_POINT
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CCalenAiwProvider::~CCalenAiwProvider
+// (rest of the details are commented in the header)
+// ---------------------------------------------------------------------------
+//
+CCalenAiwProvider::~CCalenAiwProvider()
+ {
+ TRACE_ENTRY_POINT
+
+ if(iCalEntryArray.Count())
+ {
+ iCalEntryArray.ResetAndDestroy();
+ }
+ if( iCalEntryView )
+ {
+ delete iCalEntryView;
+ iCalEntryView = NULL;
+ }
+ if( iCalSession )
+ {
+ delete iCalSession;
+ iCalSession = NULL;
+ }
+ if( iResourceFileOffset )
+ {
+ CCoeEnv::Static()->DeleteResourceFile( iResourceFileOffset );
+ }
+ if(iInterimUtils)
+ {
+ delete iInterimUtils;
+ iInterimUtils = NULL;
+ }
+
+ TRACE_EXIT_POINT
+ }
+
+// ---------------------------------------------------------------------------
+// CCalenAiwProvider::InitialiseL
+// (rest of the details are commented in the header)
+// ---------------------------------------------------------------------------
+//
+void CCalenAiwProvider::InitialiseL( MAiwNotifyCallback& /*aFrameworkCallback*/,
+ const RCriteriaArray& /*aInterest*/ )
+ {
+ TRACE_ENTRY_POINT
+
+ // No implementation yet.
+
+ TRACE_EXIT_POINT
+ }
+
+// ---------------------------------------------------------------------------
+// CCalenAiwProvider::HandleServiceCmdL
+// Handles the menu item command.
+// (rest of the details are commented in the header)
+// ---------------------------------------------------------------------------
+//
+void CCalenAiwProvider::HandleServiceCmdL( const TInt& aCmdId,
+ const CAiwGenericParamList& aInParamList,
+ CAiwGenericParamList& /*aOutParamList*/,
+ TUint /*aCmdOptions*/,
+ const MAiwNotifyCallback* /*aCallback*/ )
+ {
+ TRACE_ENTRY_POINT
+
+ switch( aCmdId )
+ {
+ case KAiwCmdSaveToCalendar:
+ {
+ // Parsing the parameters sent by consumer.
+ TInt count = aInParamList.Count();
+ TInt index = 0;
+ TInt errTrapVal( KErrNone );
+ TInt errVal( KErrNone );
+ const TAiwGenericParam* uidParam = aInParamList.FindFirst( index,
+ EGenericParamFile,
+ EVariantTypeFileHandle);
+
+ if( index >= 0 )
+ {
+ // Get the data.
+ const TAiwVariant& val = uidParam->Value();
+ RFile fileHandle ( val.AsFileHandle() );
+
+ // Get the entries from filehandle.
+ ImportVCalendarL( fileHandle );
+
+ if( HasMorethanOneCalendarL() )
+ {
+ TRAP( errTrapVal, errVal = SaveWithDialogL() );
+ if( !errTrapVal && ( -2 == errVal || errVal == ECalenSelectCmdOk ) )
+ {
+ CAknInformationNote* calSavenote = new( ELeave )CAknInformationNote;
+ HBufC* calSaveNote = StringLoader::LoadLC( R_SAVECALENDARNOTE_TEXT,
+ CCoeEnv::Static() );
+
+ calSavenote->ExecuteLD( *calSaveNote );
+ CleanupStack::PopAndDestroy( calSaveNote );
+ }
+ }
+ else
+ {
+ TRAP( errTrapVal, errVal = SaveWithoutDialogL() );
+ if( !errTrapVal && ( 0 == errVal ) )
+ {
+ CAknInformationNote* calSavenote = new( ELeave )CAknInformationNote;
+ HBufC* calSaveNote = StringLoader::LoadLC( R_SAVECALENDARNOTE_TEXT,
+ CCoeEnv::Static() );
+
+ calSavenote->ExecuteLD( *calSaveNote );
+ CleanupStack::PopAndDestroy( calSaveNote );
+ }
+ }
+
+ }
+ else
+ {
+ // RFile param not found param not found. Error handling could be added here.
+ }
+ }
+ break;
+
+ default:
+ {
+ // no implementation yet.
+ }
+ break;
+ }
+
+ TRACE_EXIT_POINT
+ }
+
+// ---------------------------------------------------------------------------
+// CCalenAiwProvider::InitializeMenuPaneL
+// (rest of the details are commented in the header)
+// ---------------------------------------------------------------------------
+//
+void CCalenAiwProvider::InitializeMenuPaneL( CAiwMenuPane& aMenuPane,
+ TInt aIndex,
+ TInt /*aCascadeId*/,
+ const CAiwGenericParamList& /*aInParamList*/ )
+ {
+ TRACE_ENTRY_POINT
+
+ // Append the item to the menu pane.
+ aMenuPane.AddMenuItemsL( iResourceFileName,
+ R_CALEN_AIW_PROVIDER_MENU_PANE,
+ KAiwCmdSaveToCalendar,
+ aIndex );
+ TRACE_EXIT_POINT
+ }
+
+// ---------------------------------------------------------------------------
+// CCalenAiwProvider::HandleMenuCmdL
+// (rest of the details are commented in the header)
+// ---------------------------------------------------------------------------
+//
+void CCalenAiwProvider::HandleMenuCmdL( TInt aMenuCmdId,
+ const CAiwGenericParamList& aInParamList,
+ CAiwGenericParamList& aOutParamList,
+ TUint aCmdOptions,
+ const MAiwNotifyCallback* aCallback )
+ {
+ TRACE_ENTRY_POINT
+
+ // Handle it in HandleServiceCmdL.
+ HandleServiceCmdL( aMenuCmdId,
+ aInParamList,
+ aOutParamList,
+ aCmdOptions,
+ aCallback );
+
+ TRACE_EXIT_POINT
+ }
+
+// ---------------------------------------------------------------------------
+// CCalenAiwProvider::Progress
+// (rest of the details are commented in the header)
+// ---------------------------------------------------------------------------
+//
+void CCalenAiwProvider::Progress( TInt /* aPercentageCompleted */ )
+ {
+ // No implementation yet.
+ }
+
+// ---------------------------------------------------------------------------
+// CCalenAiwProvider::Completed
+// (rest of the details are commented in the header)
+// ---------------------------------------------------------------------------
+//
+void CCalenAiwProvider::Completed( TInt aError )
+ {
+ iCalEntryViewInitErrno = aError;
+ }
+
+// ---------------------------------------------------------------------------
+// CCalenAiwProvider::NotifyProgress
+// (rest of the details are commented in the header)
+// ---------------------------------------------------------------------------
+//
+TBool CCalenAiwProvider::NotifyProgress()
+ {
+ // Return ETrue if you want progress information.
+ return EFalse;
+ }
+
+// ---------------------------------------------------------------------------
+// CCalenAiwProvider::ImportVCalendarL
+// (rest of the details are commented in the header)
+// ---------------------------------------------------------------------------
+//
+#if defined (__I_CAL_SUPPORT) && defined (RD_MESSAGING_ICAL_IMPORT)
+void CCalenAiwProvider::ImportVCalendarL( RFile& aFileHandle )
+ {
+ TRACE_ENTRY_POINT
+
+ CCalenImporter* calImporter = CCalenImporter::NewL( *iCalSession );
+ CleanupStack::PushL( calImporter );
+ calImporter->SetImportMode( ECalenImportModeExtended );
+
+ RFileReadStream stream( aFileHandle,0 );
+ CleanupClosePushL( stream );
+
+ TBuf8<KReadDataAmount> vcalData;
+
+ TInt errRead( KErrNone );
+ TRAP( errRead,stream.ReadL( vcalData, KReadDataAmount ) );
+
+ if( errRead != KErrEof && errRead != KErrNone )
+ {
+ User::Leave( KVCalBcLeaveCodeCorrupt );
+ }
+
+ // Return the read stream back to the beginning for import
+ stream.Source()->SeekL( MStreamBuf::ERead, EStreamBeginning, 0 );
+
+ TInt errImport( KErrNone );
+ //Reset the array if its already imported.
+ if(iCalEntryArray.Count())
+ {
+ iCalEntryArray.ResetAndDestroy();
+ }
+
+
+ if ( vcalData.FindF( KVersionVCal ) == KErrNotFound )
+ {
+ //using the ICAl import API
+ TRAP( errImport, calImporter->ImportICalendarL( stream, iCalEntryArray ) );
+ }
+ else if ( vcalData.FindF( KVersionICal ) == KErrNotFound )
+ {
+ //using the VCAL import API
+ TRAP( errImport, calImporter->ImportVCalendarL( stream, iCalEntryArray ) );
+ }
+ // Cleaning up calImproter and stream.
+ CleanupStack::PopAndDestroy( 2, calImporter );
+
+ if( errImport != KErrNone || iCalEntryArray.Count() == 0 )
+ {
+ // the data was corrupt
+ User::Leave( KVCalBcLeaveCodeCorrupt );
+ }
+
+ // BIO viewer always sets the local UID to 0 in imported entry
+ iCalEntryArray[0]->SetLocalUidL( TCalLocalUid( 0 ) );
+
+ TRACE_EXIT_POINT
+ }
+#else
+void CCalenAiwProvider::ImportVCalendarL( RFile& aFileHandle )
+ {
+ TRACE_ENTRY_POINT
+
+ CCalenImporter* calImporter = CCalenImporter::NewL( *iCalSession );
+ CleanupStack::PushL( calImporter );
+ calImporter->SetImportMode( ECalenImportModeExtended );
+
+ RFileReadStream stream( aFileHandle,0 );
+ CleanupClosePushL( stream );
+
+ iCalEntryArray.ResetAndDestroy();
+ TRAPD( err, calImporter->ImportVCalendarL( stream, iCalEntryArray ) );
+
+ // Cleaning up calImproter and stream.
+ CleanupStack::PopAndDestroy( 2,calImporter );//stream, calImporter
+ if( err != KErrNone || iCalEntryArray.Count() == 0 )
+ {
+ // The data was corrupt
+ User::Leave( KVCalBcLeaveCodeCorrupt );
+ }
+
+ // BIO viewer always sets the local UID to 0 in imported entry
+ iCalEntryArray[0]->SetLocalUidL( TCalLocalUid( 0 ) );
+
+ TRACE_EXIT_POINT
+ }
+#endif
+
+// ----------------------------------------------------------------------------
+// CCalenListDialogModel::HasMorethanOneCalendar
+// Rest of the details are commented in header.
+// ----------------------------------------------------------------------------
+//
+TBool CCalenAiwProvider::HasMorethanOneCalendarL()
+ {
+ TRACE_ENTRY_POINT
+
+ TInt retVal( EFalse );
+ if(iCalSession)
+ {
+ CCalCalendarIterator* calIter = CCalCalendarIterator::NewL( *iCalSession );
+ CleanupStack::PushL( calIter );
+ if ( calIter->Count()> 1 )
+ {
+ retVal = ETrue;
+ }
+ CleanupStack::PopAndDestroy(calIter);
+ }
+
+
+ TRACE_EXIT_POINT
+ return retVal;
+ }
+
+// ----------------------------------------------------------------------------
+// CCalenListDialogModel::SaveWithDialogL
+// Rest of the details are commented in header.
+// ----------------------------------------------------------------------------
+//
+TInt CCalenAiwProvider::SaveWithDialogL()
+ {
+ TRACE_ENTRY_POINT
+
+ TInt errVal( KErrNone );
+
+ if( SysUtil::FFSSpaceBelowCriticalLevelL( NULL ) )
+ {
+ errVal = KErrDiskFull ;
+ User::LeaveIfError( errVal );
+ }
+ // Handle the command here.
+
+ CMultiCalUiDialog* multiCalUiDialog = CMultiCalUiDialog::NewLC( iCalEntryArray );
+ errVal = multiCalUiDialog->LaunchL();
+ CleanupStack::PopAndDestroy( multiCalUiDialog );
+
+ return errVal;
+
+ TRACE_EXIT_POINT
+ }
+
+// ----------------------------------------------------------------------------
+// CCalenListDialogModel::SaveWithoutDialogL
+// Rest of the details are commented in header.
+// ----------------------------------------------------------------------------
+//
+TInt CCalenAiwProvider::SaveWithoutDialogL()
+ {
+ TRACE_ENTRY_POINT
+
+ TInt errVal( KErrNone );
+ if( ! iCalEntryView )
+ {
+ iCalEntryView = CCalEntryView::NewL( *iCalSession );
+ User::LeaveIfError( iCalEntryViewInitErrno );
+ }
+
+ if( SysUtil::FFSSpaceBelowCriticalLevelL( NULL ) )
+ {
+ errVal = KErrDiskFull ;
+ return errVal;
+ }
+
+ TInt numSuccessfulEntry(0);
+ if( iCalEntryView )
+ {
+ // Get the guid changed for every entires.
+ CreateCopyWithNewGuidL( iCalEntryArray );
+ TRAP( errVal, iCalEntryView->StoreL( iCalEntryArray, numSuccessfulEntry ) );
+
+ if( numSuccessfulEntry != iCalEntryArray.Count() )
+ {
+ errVal = KErrCompletion ;
+ }
+ }
+
+
+ TRACE_EXIT_POINT
+
+ return errVal;
+ }
+
+// ----------------------------------------------------------------------------
+// CCalenListDialogModel::CreateCopyWithNewGuidL
+// Rest of the details are commented in header.
+// ----------------------------------------------------------------------------
+//
+void CCalenAiwProvider::CreateCopyWithNewGuidL( RPointerArray<CCalEntry>& aSrcDesEntryArray )
+ {
+ TRACE_ENTRY_POINT;
+
+ for( TInt count = 0; count< aSrcDesEntryArray.Count(); count++ )
+ {
+ CCalEntry* sourceEnrty = aSrcDesEntryArray[count];
+ HBufC8* guid = iInterimUtils->GlobalUidL();
+ CleanupStack::PushL(guid);
+ CCalEntry* entry = CCalEntry::NewL( sourceEnrty->EntryTypeL(), guid, CCalEntry::EMethodNone, 0 );
+
+ // ownership was passed
+ CleanupStack::Pop( guid );
+ CleanupStack::PushL( entry );
+ // make sure entry is fully loaded.
+ sourceEnrty->DescriptionL();
+ entry->CopyFromL( *sourceEnrty, CCalEntry::EDontCopyId );
+ // make sure entry is fully copied
+ entry->DescriptionL();
+
+ // Remove the entry at current "count" and insert the new entry in same place.
+ aSrcDesEntryArray.Remove(count);
+ delete sourceEnrty;
+ aSrcDesEntryArray.Insert( entry, count );
+ CleanupStack::Pop( entry );
+ }
+
+
+ TRACE_EXIT_POINT;
+ }
+
+// ---------------------------------------------------------------------------
+// CCalenAiwProvider::ConstructL
+// (rest of the details are commented in the header)
+// ---------------------------------------------------------------------------
+//
+void CCalenAiwProvider::ConstructL()
+ {
+ TRACE_ENTRY_POINT
+
+ if( !iCalSession )
+ {
+ iCalSession = CCalSession::NewL();
+ }
+
+ // Which calendar file should be used.
+ TRAPD( err, iCalSession->OpenL( iCalSession->DefaultFileNameL() ) );
+ if ( err == KErrNotFound )
+ {
+ // TODO : what to do with this code ??????
+ // If calendar file was not found, should we create it or not?
+ // I think is not BIO control's responsibility to create it.
+ //
+ iCalSession->CreateCalFileL( iCalSession->DefaultFileNameL() );
+ iCalSession->OpenL( iCalSession->DefaultFileNameL() );
+ }
+ else
+ {
+ User::LeaveIfError( err );
+ }
+
+ // Load the required the resource file.
+ TFileName resFile;
+
+ // We take the drive in which the dll is being used from append the same
+ // drive name to the beginning of the resource file path.
+ TFileName dllName;
+ Dll::FileName( dllName );
+ // Two characters for the drive name. For e.g: (C:)
+ TBuf< 2 > driveLetter = dllName.Left( 2 );
+ resFile.Insert( 0, driveLetter );
+ resFile.Append( KDC_APP_RESOURCE_DIR );
+ resFile.Append( KResourceFileName );
+
+ iResourceFileName = resFile;
+
+ BaflUtils::NearestLanguageFile( CCoeEnv::Static()->FsSession(), iResourceFileName );
+
+ iResourceFileOffset = CCoeEnv::Static()->AddResourceFileL( iResourceFileName );
+
+ iInterimUtils = CCalenInterimUtils2::NewL();
+
+ TRACE_EXIT_POINT
+ }
+
+// ---------------------------------------------------------------------------
+// CCalenAiwProvider::CCalenAiwProvider
+// (rest of the details are commented in the header)
+// ---------------------------------------------------------------------------
+//
+CCalenAiwProvider::CCalenAiwProvider()
+ {
+ TRACE_ENTRY_POINT
+
+ // No implementation yet.
+
+ TRACE_EXIT_POINT
+ }
+
+// End of file --Don't delete this.