calendarui/calenaiwprovider/src/calenaiwprovider.cpp
changeset 0 f979ecb2b13e
child 16 55d60436f00b
--- /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.