--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/meetingrequest/mrcasplugin/src/cesmrcaspluginuilauncher.cpp Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,500 @@
+/*
+* Copyright (c) 2007-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: This file implements class CESMRCasPluginUiLauncher.
+ *
+*/
+
+
+#include "emailtrace.h"
+#include "cesmrcaspluginuilauncher.h"
+#include "mesmrcaspluginuilauncherobserver.h"
+#include "esmrinternaluid.h"
+// <cmail> Profiler removed. </cmail>
+
+#include <badesca.h>
+//<cmail>
+#include "tfsccontactactionpluginparams.h"
+#include <MVPbkStoreContact.h>
+#include <CalenInterimUtils2.h>
+#include <cmrmailboxutils.h>
+#include <calsession.h>
+#include <calentry.h>
+#include <CAgnEntryUi.h>
+#include <caluser.h>
+#include "mfscactionutils.h"
+//</cmail>
+#include <aknPopup.h>
+#include <aknlists.h>
+#include <utf.h>
+#include <ecom/ecom.h>
+#include "esmrcommands.h"
+#include <esmrcasplugindata.rsg>
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
+
+
+// Unnamed namespace for local definitions and functions
+namespace { // codescanner::namespace
+
+#ifdef _DEBUG
+ enum TPanic
+ {
+ EPanicIndexOOB = 1
+ };
+
+ void Panic( TPanic aPanic )
+ {
+ _LIT( KCntxt, "CESMRCasPluginUiLauncher" );
+ User::Panic( KCntxt(), aPanic );
+ }
+#endif // _DEBUG
+
+const TUint KMRSequenceNo( 0 );
+const TInt KOneHour( 1 );
+
+// Constants for rounding up MR start time
+const TInt KMinuteRoundToHourStart( 46 );
+const TInt KMinuteRoundToHourEnd( 15 );
+
+const TInt KHourMinutes( 0 );
+const TInt KHalfHourMinutes( 30 );
+
+/**
+ * Prompts user to select default mailbox.
+ */
+TInt PromptForDefaultMailboxL(
+ RArray<CMRMailboxUtils::TMailboxInfo>& aMailBoxes )
+ {
+ FUNC_LOG;
+ TInt selected( KErrCancel );
+
+ TInt mbCount = aMailBoxes.Count();
+ if( mbCount > 0)
+ {
+ CAknSinglePopupMenuStyleListBox* list =
+ new (ELeave) CAknSinglePopupMenuStyleListBox;
+ CleanupStack::PushL(list);
+
+ CAknPopupList* popupList = CAknPopupList::NewL(
+ list,
+ R_AVKON_SOFTKEYS_OK_CANCEL);
+ CleanupStack::PushL(popupList);
+
+ list->ConstructL(popupList, CEikListBox::ELeftDownInViewRect);
+ list->CreateScrollBarFrameL(ETrue);
+ list->ScrollBarFrame()->SetScrollBarVisibilityL(
+ CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
+
+ CEikonEnv* eikEnv = CEikonEnv::Static();// codescanner::eikonenvstatic
+
+ CDesCArrayFlat* items = new (ELeave)CDesCArrayFlat(mbCount);
+ CleanupStack::PushL(items);
+ for(TInt i=0; i<mbCount; ++i)
+ {
+ items->AppendL( aMailBoxes[i].iName );
+ }
+ CleanupStack::Pop(items);
+ CTextListBoxModel* model = list->Model();
+
+ //Pass ownersip of items to model
+ model->SetItemTextArray(items);
+
+ HBufC* title = KNullDesC().AllocLC();
+ popupList->SetTitleL(*title);
+ CleanupStack::PopAndDestroy(title);
+
+ TBool accepted = popupList->ExecuteLD();
+ CleanupStack::Pop( popupList );
+
+ if(accepted)
+ {
+ selected = list->CurrentItemIndex();
+ }
+ else
+ {
+ selected = KErrCancel;
+ }
+
+ CleanupStack::PopAndDestroy( list );
+ }
+ else
+ {
+ //No mailboxes defined. Could prompt user to define one here.
+ selected = KErrCancel;
+ }
+
+ return selected;
+ }
+
+/**
+ * Fetches the supported mailboxes.
+ * @param aMBUtils utils class
+ * @param aMailBoxes to test
+ */
+void SupportedMailboxesL(
+ CMRMailboxUtils& aMBUtils,
+ RArray<CMRMailboxUtils::TMailboxInfo>& aMailBoxes )
+ {
+ FUNC_LOG;
+ aMBUtils.ListMailBoxesL( aMailBoxes );
+
+ RImplInfoPtrArrayOwn implArray;
+ CleanupClosePushL( implArray );
+
+ //Get all MRViewers Implementation
+ const TUid mrViewersIface = TUid::Uid(KMRViewersInterfaceUID);
+ REComSession::ListImplementationsL(mrViewersIface, implArray );
+ TInt mrviewerCount( implArray.Count() );
+
+ TInt index(0);
+ TInt mailboxCount( aMailBoxes.Count() );
+ while ( index < mailboxCount )
+ {
+ TBool supported( EFalse );
+
+ for ( TInt i(0); (i < mrviewerCount) && !supported; ++ i )
+ {
+ TBuf16<KMaxUidName> mbName;
+ CnvUtfConverter::ConvertToUnicodeFromUtf8(
+ mbName,
+ implArray[i]->DataType() );
+ __ASSERT_DEBUG( aMailBoxes.Count() > index, Panic( EPanicIndexOOB ) );
+ if( aMailBoxes[index].iMtmUid.Name().CompareF(mbName) == 0)
+ {
+ supported = ETrue;
+ }
+ }
+
+ if ( supported )
+ {
+ index++;
+ }
+ else
+ {
+ aMailBoxes.Remove( index );
+ mailboxCount = aMailBoxes.Count();
+ }
+ }
+ CleanupStack::PopAndDestroy( &implArray );
+ }
+
+}//namespace
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CESMRCasPluginUiLauncher::CESMRCasPluginUiLauncher
+// ---------------------------------------------------------------------------
+//
+inline CESMRCasPluginUiLauncher::CESMRCasPluginUiLauncher(
+ CCalSession& aCalSession,
+ CCalenInterimUtils2& aCalUtils,
+ CMRMailboxUtils& aMBUtils,
+ const TFscContactActionPluginParams& aParams,
+ MESMRCasPluginUiLauncherObserver& aExecuteObserver )
+: iInParams(
+ TUid::Uid( KUidCalendarApplication ),
+ aCalSession,
+ MAgnEntryUi::ECreateNewEntry ),
+ iCalSession( aCalSession ),
+ iParams( aParams ),
+ iCalUtils( aCalUtils ),
+ iMBUtils( aMBUtils ),
+ iExecuteObserver( aExecuteObserver )
+ {
+ FUNC_LOG;
+ iInParams.iMsgSession = NULL;
+ iInParams.iSpare = 0;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRCasPluginUiLauncher::~CESMRCasPluginUiLauncher
+// ---------------------------------------------------------------------------
+//
+CESMRCasPluginUiLauncher::~CESMRCasPluginUiLauncher()
+ {
+ FUNC_LOG;
+ delete iMtmUid;
+ delete iCalEntry;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRCasPluginUiLauncher::NewL
+// ---------------------------------------------------------------------------
+//
+CESMRCasPluginUiLauncher* CESMRCasPluginUiLauncher::NewL(
+ CCalSession& aCalSession,
+ CCalenInterimUtils2& aCalUtils,
+ CMRMailboxUtils& aMBUtils,
+ const TFscContactActionPluginParams& aParams,
+ MESMRCasPluginUiLauncherObserver& aExecuteObserver )
+ {
+ FUNC_LOG;
+ CESMRCasPluginUiLauncher* self =
+ new (ELeave ) CESMRCasPluginUiLauncher(
+ aCalSession,
+ aCalUtils,
+ aMBUtils,
+ aParams,
+ aExecuteObserver );
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRCasPluginUiLauncher::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CESMRCasPluginUiLauncher::ConstructL()
+ {
+ FUNC_LOG;
+ //nothing to do here
+ }
+
+
+// ---------------------------------------------------------------------------
+// CESMRCasPluginUiLauncher::LaunchMeetingRequestViewL
+// ---------------------------------------------------------------------------
+//
+void CESMRCasPluginUiLauncher::LaunchMeetingRequestViewL(
+ const RPointerArray<CCalUser>& aAttendees )
+ {
+ FUNC_LOG;
+
+ HBufC8* guidBuf = iCalUtils.GlobalUidL();
+ CleanupStack::PushL( guidBuf );
+
+ delete iCalEntry; iCalEntry = NULL;
+ iCalEntry = CCalEntry::NewL(
+ CCalEntry::EAppt,
+ guidBuf,
+ CCalEntry::EMethodRequest,
+ KMRSequenceNo );
+
+ CleanupStack::Pop (guidBuf ); // Ownership is transferred
+
+ AddOrganizerL();
+ AddAttendeesL( aAttendees );
+ SetStartAndEndTimeL();
+
+ // Launch Entry UI
+ RPointerArray<CCalEntry> entries;
+ CleanupClosePushL ( entries );
+ entries.AppendL( iCalEntry );
+
+ MAgnEntryUi* editorsPlugin = NULL;
+ if ( iCalUtils.MRViewersEnabledL( ETrue ) )
+ {
+ //CAgnEntryUi resolves Meeting request viewer based on mtm uid
+ TBuf8<KMaxUidName> mrMtm;
+ CnvUtfConverter::ConvertFromUnicodeToUtf8(
+ mrMtm,
+ *iMtmUid );
+ editorsPlugin = CAgnEntryUi::NewL( mrMtm );
+ CleanupDeletePushL(editorsPlugin );
+ }
+ else
+ {
+ // MR is not supported --> Leave
+ User::Leave (KErrNotSupported );
+ }
+
+ editorsPlugin->ExecuteViewL( entries, iInParams, iOutParams, *this );
+
+ if (iOutParams.iAction == MAgnEntryUi::EMeetingSaved)
+ {
+ TInt res = R_FS_MR_NOTE_SAVED;
+ HBufC* prompt = StringLoader::LoadLC( res, CEikonEnv::Static() );
+ CAknConfirmationNote* dialog = new( ELeave )CAknConfirmationNote();
+ dialog->ExecuteLD( *prompt );
+ CleanupStack::PopAndDestroy( prompt );
+ }
+
+ CleanupStack::PopAndDestroy( editorsPlugin );
+ CleanupStack::PopAndDestroy( &entries );
+
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRCasPluginUiLauncher::ProcessCommandL
+// ---------------------------------------------------------------------------
+//
+void CESMRCasPluginUiLauncher::ProcessCommandL(
+ TInt aCommandId )
+ {
+ FUNC_LOG;
+ ProcessCommandWithResultL( aCommandId );
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRCasPluginUiLauncher::ProcessCommandWithResultL
+// ---------------------------------------------------------------------------
+//
+TInt CESMRCasPluginUiLauncher::ProcessCommandWithResultL(
+ TInt aCommandId )
+ {
+ FUNC_LOG;
+ if ( aCommandId == EESMRCmdEditorInitializationComplete )
+ {
+ iExecuteObserver.MREditorInitializationComplete();
+ }
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRCasPluginUiLauncher::IsCommandAvailable
+// ---------------------------------------------------------------------------
+//
+TBool CESMRCasPluginUiLauncher::IsCommandAvailable(
+ TInt aCommandId )
+ {
+ FUNC_LOG;
+ TBool retVal = EFalse;
+ if ( aCommandId == EESMRCmdEditorInitializationComplete )
+ {
+ retVal = ETrue;
+ }
+ return retVal;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRCasPluginUiLauncher::AddOrganizerL
+// ---------------------------------------------------------------------------
+//
+void CESMRCasPluginUiLauncher::AddOrganizerL()
+ {
+ FUNC_LOG;
+ CMRMailboxUtils::TMailboxInfo defaultMailBox;
+
+ RArray<CMRMailboxUtils::TMailboxInfo> mailBoxes;
+ CleanupClosePushL( mailBoxes );
+ SupportedMailboxesL( iMBUtils, mailBoxes );
+
+ if ( KErrNone == iMBUtils.GetDefaultMRMailBoxL(defaultMailBox) )
+ {
+ for ( TInt i(0); i < mailBoxes.Count(); i++ )
+ {
+ if ( (defaultMailBox.iEntryId != mailBoxes[i].iEntryId) &&
+ ( i == mailBoxes.Count() - 1 ) )
+ {
+ TInt selectedMailbox( PromptForDefaultMailboxL(mailBoxes) );
+
+ if ( KErrCancel != selectedMailbox )
+ {
+ iMBUtils.SetDefaultMRMailBoxL( mailBoxes[selectedMailbox].iEntryId );
+ iMBUtils.GetDefaultMRMailBoxL(defaultMailBox);
+ }
+
+ // This will leave if user cancelled the mailbox selection
+ User::LeaveIfError( selectedMailbox );
+ }
+ }
+ }
+
+ CleanupStack::PopAndDestroy( &mailBoxes );
+
+ delete iMtmUid; iMtmUid = NULL;
+ iMtmUid = defaultMailBox.iMtmUid.Name().AllocL();
+
+ //Set the organizer from the selected mailbox
+ CCalUser* organizer = CCalUser::NewL( defaultMailBox.iEmailAddress );
+ CleanupStack::PushL(organizer );
+ iCalEntry->SetOrganizerL(organizer );
+ CleanupStack::Pop( organizer ); // Ownership trasferred
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRCasPluginUiLauncher::AddAttendeesL
+// ---------------------------------------------------------------------------
+//
+void CESMRCasPluginUiLauncher::AddAttendeesL(
+ const RPointerArray<CCalUser>& aAttendees )
+ {
+ FUNC_LOG;
+ //Add attendees from contact set
+ TInt attendeeCount( aAttendees.Count() );
+ for (TInt i=0; i < attendeeCount; ++i )
+ {
+ CCalAttendee* attendee = CCalAttendee::NewL( aAttendees[i]->Address() );
+ CleanupStack::PushL( attendee );
+
+ attendee->SetCommonNameL( aAttendees[i]->CommonName() );
+ attendee->SetRoleL( CCalAttendee::EReqParticipant );
+
+ iCalEntry->AddAttendeeL( attendee );
+
+ CleanupStack::Pop( attendee );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRCasPluginUiLauncher::SetStartAndEndTimeL
+// ---------------------------------------------------------------------------
+//
+void CESMRCasPluginUiLauncher::SetStartAndEndTimeL()
+ {
+ FUNC_LOG;
+ // Adjust start time to future
+ TTime start;
+ start.UniversalTime();
+ start = start + TTimeIntervalMinutes( KHalfHourMinutes );
+
+ // Round up start time.
+ // Minutes between 46 ... 15 ==> 00
+ // Minutes between 16 ... 45 ==> 30
+
+ TDateTime currentTime = start.DateTime();
+ TInt minute( currentTime.Minute() );
+
+ if ( minute >= KMinuteRoundToHourStart ||
+ minute <= KMinuteRoundToHourEnd )
+ {
+ // Rounding to hour
+ currentTime.SetMinute( KHourMinutes );
+ }
+ else
+ {
+ currentTime.SetMinute( KHalfHourMinutes );
+ }
+
+ start = currentTime;
+
+ TTime end = start + TTimeIntervalHours( KOneHour );
+
+ TCalTime startCalTime;
+ startCalTime.SetTimeUtcL( start );
+
+ TCalTime endCalTime;
+ endCalTime.SetTimeUtcL( end );
+
+ iCalEntry->SetStartAndEndTimeL( startCalTime, endCalTime );
+
+ // Set time for input parameters
+ TUint8 timemode = iCalEntry->StartTimeL().TimeMode ( );
+ if (timemode == TCalTime::EFloating )
+ {
+ iInParams.iInstanceDate.SetTimeLocalFloatingL( start );
+ }
+ else
+ {
+ iInParams.iInstanceDate.SetTimeUtcL (start );
+ }
+ }
+
+// EOF
+