--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/calendarengines/calenlauncher/src/CalenLauncherImpl.cpp Tue Feb 02 10:12:19 2010 +0200
@@ -0,0 +1,492 @@
+/*
+* 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 "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: Wrapper implementation class for launching S60 Calendar
+*
+*/
+
+
+/**
+* Include files
+*/
+#include "CalenLauncherImpl.h" // CCalenLauncherImpl
+#include <calenlauncher.h> // View UIDs
+
+#include <apgcli.h> // RApaLsSession
+#include <apgtask.h> // TApaTask, TApaTaskList
+#include <eikenv.h> // CEikEnv
+#include <e32std.h>
+
+/**
+* Constants
+*/
+const TUid KCalendarUid = {0x10005901}; // Calendar application UID
+const TInt KMaxCmdLineLength = 128; // Max length of cmd line string
+
+/**
+* Command line parameter strings. Should NOT be localised.
+*/
+_LIT(KCmdNewMeeting, "NEW_MEETING"); // Launch to new meeting editor
+_LIT(KCmdNewAnniv, "NEW_ANNIV"); // Launch to new anniv editor
+_LIT(KCmdNewTodo, "NEW_TODO"); // Launch to new todo editor
+_LIT(KCmdDefault, "DEFAULT"); // Launch to default view
+_LIT(KCmdMonth, "MONTH"); // Launch to month view
+_LIT(KCmdWeek, "WEEK"); // Launch to week view
+_LIT(KCmdDay, "DAY"); // Launch to day view
+_LIT(KCmdTodo, "TODO"); // Launch to todo view
+_LIT(KCmdLUid, "LUID"); // Launch to editor
+_LIT(KCmdLUidViewer, "LUIDVIEWER"); // Launch to viewer
+_LIT(KCommandAlarmViewer, "LUIDALARMVIEWER"); // Launch to alarm viewer
+_LIT(KCommandAlarmViewerNoSnooze, "LUIDALARMVIEWER_NOSNOOZE"); // Launch to alarm viewer (with only stop key available)
+_LIT(KLUidFormat, "%u"); // TLocalUid is unsigned int
+_LIT(KDateParamFormat, "%d"); // Date components are signed ints
+_LIT(KFlagFormat, "%d"); // Flag is int
+_LIT(KSpace, " "); // Space
+
+/**
+* First stage constructor.
+* Creates an instance of CCalenLauncherImpl and places it
+* on the cleanup stack before passing ownership to the caller.
+*/
+CCalenLauncherImpl* CCalenLauncherImpl::NewLC()
+ {
+ CCalenLauncherImpl* self = new (ELeave) CCalenLauncherImpl;
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+/**
+* Second stage constructor.
+* Performs any leaving operations needed for construction.
+*/
+void CCalenLauncherImpl::ConstructL()
+ {
+ iLaunchUnicode = HBufC::NewL( KMaxCmdLineLength );
+ }
+
+/**
+* Private constructor
+*/
+CCalenLauncherImpl::CCalenLauncherImpl()
+ {
+ // Nothing to do.
+ }
+
+/**
+* Destructor
+*/
+CCalenLauncherImpl::~CCalenLauncherImpl()
+ {
+ delete iLaunchUnicode;
+ delete iLaunchParams;
+ }
+
+/**
+* Opens Calendar directly to the new entry editor.
+* Calendar will be closed when the editor is closed.
+* Any open dialogs (eg entry viewer or editor) will be closed.
+* @param aEntryType Type of entry editor to open
+*/
+void CCalenLauncherImpl::NewEntryL( const CCalEntry::TType& aEntryType, TInt aFlag )
+ {
+ switch (aEntryType)
+ {
+ case CCalEntry::EAppt:
+ case CCalEntry::EEvent:
+ // Add string 'NEW_MEETING'
+ AddLaunchParamL( KCmdNewMeeting );
+ break;
+
+ case CCalEntry::ETodo:
+ // Add string 'NEW_TODO'
+ AddLaunchParamL( KCmdNewTodo );
+ break;
+
+ case CCalEntry::EAnniv:
+ // Add string 'NEW_ANNIV'
+ AddLaunchParamL( KCmdNewAnniv );
+ break;
+
+ case CCalEntry::EReminder:
+ User::Leave( KErrNotSupported );
+ break;
+
+ default:
+ User::Leave( KErrNotSupported );
+ break;
+ }
+
+ AddFlagParamL( aFlag );
+ // Launch Calendar
+ LaunchAppL();
+ }
+
+/**
+* Opens a Calendar entry directly in the entry viewer. If the
+* entry is a repeating entry then entire series will be opened.
+* The entry editor may be launched from the entry viewer.
+* Calendar will be closed when the viewer is closed.
+* Any open dialogs (eg entry viewer or editor) will be closed.
+* @param aLocalUid LocalUid of the entry to view
+*/
+void CCalenLauncherImpl::ViewEntryL( const TCalLocalUid& aLocalUid )
+ {
+ // Add string 'LUIDVIEWER'
+ AddLaunchParamL( KCmdLUidViewer );
+
+ // Add the local uid
+ AddUidParamL( aLocalUid );
+
+ // Launch Calendar
+ LaunchAppL();
+ }
+
+/**
+* Opens an instance of a repeating Calendar entry directly in the
+* entry viewer.
+* The entry editor may be launched from the entry viewer.
+* Calendar will be closed when the viewer is closed.
+* Any open dialogs (eg entry viewer or editor) will be closed.
+* @param aLocalUid LocalUid of the entry to view
+* @param aInstanceTime Instance time of the repeated entry
+*/
+void CCalenLauncherImpl::ViewEntryL( const TCalLocalUid& aLocalUid, const TCalTime& aInstanceTime, TInt aFlags )
+ {
+ if( aFlags & CalenLauncher::EAlarmViewer )
+ {
+ // Add string 'LUIDALARMVIEWER'
+ AddLaunchParamL( KCommandAlarmViewer );
+ }
+ else if( aFlags & CalenLauncher::EAlarmViewerNoSnooze )
+ {
+ // Add string 'LUIDALARMVIEWER_NOSNOOZE'
+ AddLaunchParamL( KCommandAlarmViewerNoSnooze );
+ }
+ else // aFlags == 0
+ {
+ // Add string 'LUIDVIEWER'
+ AddLaunchParamL( KCmdLUidViewer );
+ }
+
+ // Add the local uid
+ AddUidParamL( aLocalUid );
+
+ // Add the time
+ AddTimeParamL( aInstanceTime );
+
+ // Launch Calendar
+ LaunchAppL();
+ }
+
+/**
+* Opens an instance of a repeating Calendar entry directly in the
+* entry viewer.
+* The entry editor may be launched from the entry viewer.
+* Calendar will be closed when the viewer is closed.
+* Any open dialogs (eg entry viewer or editor) will be closed.
+* @param aLocalUid LocalUid of the entry to view
+* @param aInstanceTime Instance time of the repeated entry
+* @param aCalFileName Calendar DB name of the repeated entry
+*/
+void CCalenLauncherImpl::ViewEntryL( const TCalLocalUid& aLocalUid, const TCalTime& aInstanceTime, const TDesC& aCalFileName, TInt aFlags )
+ {
+ if( aFlags & CalenLauncher::EAlarmViewer )
+ {
+ // Add string 'LUIDALARMVIEWER'
+ AddLaunchParamL( KCommandAlarmViewer );
+ }
+ else if( aFlags & CalenLauncher::EAlarmViewerNoSnooze )
+ {
+ // Add string 'LUIDALARMVIEWER_NOSNOOZE'
+ AddLaunchParamL( KCommandAlarmViewerNoSnooze );
+ }
+ else // aFlags == 0
+ {
+ // Add string 'LUIDVIEWER'
+ AddLaunchParamL( KCmdLUidViewer );
+ }
+
+ // Add the local uid
+ AddUidParamL( aLocalUid );
+
+ AddLaunchParamL( aCalFileName );
+
+ // Add the time
+ AddTimeParamL( aInstanceTime );
+
+ // Launch Calendar
+ LaunchAppL();
+ }
+/**
+* Opens a Calendar entry directly in the entry editor. If the
+* entry is a repeating entry then entire series will be opened.
+* Calendar will be closed when the editor is closed.
+* Any open dialogs (eg entry viewer or editor) will be closed.
+* @param aLocalUid LocalUid of the entry to view
+*/
+void CCalenLauncherImpl::EditEntryL( const TCalLocalUid& aLocalUid )
+ {
+ // Add string 'LUID'
+ AddLaunchParamL( KCmdLUid );
+
+ // Add the local uid
+ AddUidParamL( aLocalUid );
+
+ // Launch Calendar
+ LaunchAppL();
+ }
+
+/**
+* Opens an instance of a repeating Calendar entry directly in the
+* entry editor.
+* Calendar will be closed when the editor is closed.
+* Any open dialogs (eg entry viewer or editor) will be closed.
+* @param aLocalUid LocalUid of the entry to view
+* @param aInstanceTime Instance time of the repeated entry
+*/
+void CCalenLauncherImpl::EditEntryL( const TCalLocalUid& aLocalUid, const TCalTime& aInstanceTime )
+ {
+ // Add string 'LUID'
+ AddLaunchParamL( KCmdLUid );
+
+ // Add the local uid
+ AddUidParamL( aLocalUid );
+
+ // Add the time
+ AddTimeParamL( aInstanceTime );
+
+ // Launch Calendar
+ LaunchAppL();
+ }
+
+/**
+* Launches Calendar in the specified view.
+* If Calendar is already running it will be brought to the foreground
+* in the specified view.
+* Any open dialogs (eg entry viewer or editor) will be closed.
+* @param aViewUid UID of the Calendar view to use.
+*/
+void CCalenLauncherImpl::LaunchL( const TUid& aViewUid )
+ {
+ // Add the view command
+ AddViewUidParamL( aViewUid );
+
+ // Launch Calendar
+ LaunchAppL();
+ }
+
+/**
+* Launches Calendar in the specified view, focused to the specified time
+* If Calendar is already running it will be brought to the foreground
+* in the specified view.
+* Any open dialogs (eg entry viewer or editor) will be closed.
+* @param aViewUid UID of the Calendar view to use.
+* @param aLaunchTime Initial focus time
+*/
+void CCalenLauncherImpl::LaunchL( const TUid& aViewUid, const TCalTime& aInstanceTime )
+ {
+ // Add the view command
+ AddViewUidParamL( aViewUid );
+
+ // Add the time
+ AddTimeParamL( aInstanceTime );
+
+ // Launch Calendar
+ LaunchAppL();
+ }
+
+/**
+* AddLaunchParamL
+* Adds a parameter to the unicode launch string
+* @param aLaunchParam Parameter to add
+*/
+void CCalenLauncherImpl::AddLaunchParamL( const TDesC& aLaunchParam )
+ {
+ TPtr ptr = iLaunchUnicode->Des();
+ ptr.Append( aLaunchParam );
+ ptr.Append( KSpace );
+ }
+
+/**
+* AddTimeParamL
+* Expands a TCalTime and adds the individual components to the
+* unicode launch string.
+* @param aCalTime Time to add.
+*/
+void CCalenLauncherImpl::AddTimeParamL( const TCalTime& aCalTime )
+ {
+ TBuf<10> dateBuf;
+ TDateTime dateTime = aCalTime.TimeLocalL().DateTime();
+
+ // Add year
+ TInt dateParam = dateTime.Year();
+ dateBuf.Format( KDateParamFormat, dateParam );
+ AddLaunchParamL( dateBuf );
+
+ // Add month
+ dateParam = dateTime.Month();
+ ++dateParam; // Month is offset from 0
+ dateBuf.Format( KDateParamFormat, dateParam );
+ AddLaunchParamL( dateBuf );
+
+ // Add day
+ dateParam = dateTime.Day();
+ ++dateParam; // Day is offset from 0
+ dateBuf.Format( KDateParamFormat, dateParam );
+ AddLaunchParamL( dateBuf );
+
+ // Add hour
+ dateParam = dateTime.Hour();
+ dateBuf.Format( KDateParamFormat, dateParam );
+ AddLaunchParamL( dateBuf );
+
+ // Add minutes
+ dateParam = dateTime.Minute();
+ dateBuf.Format( KDateParamFormat, dateParam );
+ AddLaunchParamL( dateBuf );
+ }
+
+/**
+* AddUidParamL
+* Adds a local uid to the unicode launch string.
+* @param aLocalUid Uid to add.
+*/
+void CCalenLauncherImpl::AddUidParamL( const TCalLocalUid& aLocalUid )
+ {
+ TBuf<10> uidBuf;
+ uidBuf.Format( KLUidFormat, aLocalUid );
+ AddLaunchParamL( uidBuf );
+ }
+
+/**
+* AddViewUidParamL
+* Adds a view uid to the unicode launch string as a command.
+* @param aViewUid Uid to add.
+*/
+void CCalenLauncherImpl::AddViewUidParamL( const TUid& aViewUid )
+ {
+ if ( aViewUid.iUid == KCalMonthViewUid.iUid )
+ {
+ // Add string "MONTH"
+ AddLaunchParamL( KCmdMonth );
+ }
+
+ else if ( aViewUid.iUid == KCalWeekViewUid.iUid )
+ {
+ // Add string "WEEK"
+ AddLaunchParamL( KCmdWeek );
+ }
+
+ else if ( aViewUid.iUid == KCalDayViewUid.iUid )
+ {
+ // Add string "DAY"
+ AddLaunchParamL( KCmdDay );
+ }
+
+ else if ( aViewUid.iUid == KCalTodoViewUid.iUid )
+ {
+ // Add string "TODO"
+ AddLaunchParamL( KCmdTodo );
+ }
+
+ else if ( aViewUid.iUid == KCalDefaultViewUid.iUid )
+ {
+ // Add string "DEFAULT"
+ AddLaunchParamL( KCmdDefault );
+ }
+
+ else
+ {
+ // Need to handle custom views here at some point...
+ User::Leave( KErrNotSupported );
+ }
+ }
+
+/**
+* ConvertLaunchParamsFromUnicodeL
+* Converts the launch parameters to pass to calendar. For some obscure reason,
+* lost in the midsts of time and space, Calendar is expecting an 8 bit
+* descriptor containing 16 bit unicode. No one knows why. Nice.
+*/
+void CCalenLauncherImpl::ConvertLaunchParamsFromUnicodeL()
+ {
+ // copy the 16-bit data from iLaunchUnicode to iLaunchParams
+ iLaunchParams = HBufC8::NewL( iLaunchUnicode->Length() *2 );
+ TPtr8 ptr = iLaunchParams->Des();
+ ptr.Copy( reinterpret_cast<const TUint8*>( iLaunchUnicode->Ptr()), iLaunchUnicode->Length() *2 );
+ }
+
+/**
+* LaunchAppL
+* Starts Calendar with command line parameters. This will call
+* TApaTask::SendMessage if Calendar is running, or launch Calendar normally.
+* Either way, the command line parameters will end up in
+* CCalenAppUi::ProcessCommandParametersL
+*/
+void CCalenLauncherImpl::LaunchAppL()
+ {
+ // Convert the launch parameters to 8-bit unicode
+ ConvertLaunchParamsFromUnicodeL();
+
+ // See if Calendar is running or not.
+ TApaTaskList taskList(CEikonEnv::Static()->WsSession());
+ TApaTask calenTask = taskList.FindApp(KCalendarUid);
+
+ // If Calendar is running we can just send a message with the parameters
+ if (calenTask.Exists())
+ {
+ const TUid dummyUID = { 0x0 };
+ calenTask.SendMessage(dummyUID, *iLaunchParams);
+ calenTask.BringToForeground();
+ }
+
+ // If Calendar is not running we launch from the command line
+ else
+ {
+ // Construct the command line object
+ CApaCommandLine* cmdLine = CApaCommandLine::NewLC();
+ cmdLine->SetCommandL(EApaCommandRun);
+ cmdLine->SetExecutableNameL(_L("calendar.exe"));
+
+ // Set the command line parameters
+ cmdLine->SetTailEndL(*iLaunchParams);
+
+ // Connect to the application architecture server
+ RApaLsSession appArcSession;
+ CleanupClosePushL(appArcSession);
+ TInt error = appArcSession.Connect();
+ User::LeaveIfError( error != KErrNone );
+
+ // Start the app (standard command line launch)
+ appArcSession.StartApp(*cmdLine);
+
+ // Clean up
+ CleanupStack::PopAndDestroy(&appArcSession);
+ CleanupStack::PopAndDestroy(cmdLine);
+ }
+ }
+
+/**
+* AddFlagParamL
+* Adds a parameter to the unicode launch string
+* @param aFlag Parameter to add
+*/
+void CCalenLauncherImpl::AddFlagParamL( TInt aFlag )
+ {
+ TBuf<10> flagBuf;
+ flagBuf.Format( KFlagFormat, aFlag );
+ AddLaunchParamL( flagBuf );
+ }
+
+// End of File