--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/schemeplugin/src/LocalAppHandler.cpp Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,416 @@
+/*
+* Copyright (c) 2004 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:
+* Implementation of Scheme handler interface implementation
+* for localapp: scheme
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#include "LocalAppHandler.h"
+#include "SchemeDefs.h"
+#include "SchemeDispLogger.h"
+#include "MmsToHandler.h"
+#include "SmsHandler.h"
+#include <ecom.h> // For REComSession
+#include <eikenv.h>
+#include <DocumentHandler.h>
+#include <apgcli.h>
+#include <apparc.h>
+#include <eikdoc.h>
+#include <eikproc.h>
+#include <f32file.h>
+#include <txtrich.h>
+#include <eikappui.h>
+#include <apgtask.h> // for TApaTaskList
+
+// ================= CONSTANTS =======================
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CLocalAppHandler::NewL()
+// ---------------------------------------------------------
+//
+CLocalAppHandler* CLocalAppHandler::NewL( const TDesC& aUrl )
+ {
+ CLOG_ENTERFN( "CLocalAppHandler::NewL()" );
+
+ CLocalAppHandler* self = new( ELeave ) CLocalAppHandler();
+ CleanupStack::PushL( self );
+ self->ConstructL( aUrl );
+ CleanupStack::Pop( self );
+
+ CLOG_LEAVEFN( "CLocalAppHandler::NewL()" );
+
+ return self;
+ }
+
+// ---------------------------------------------------------
+// CLocalAppHandler::~CLocalAppHandler()
+// ---------------------------------------------------------
+//
+CLocalAppHandler::~CLocalAppHandler()
+ {
+ CLOG_ENTERFN( "CLocalAppHandler::~CLocalAppHandler()" );
+
+ CLOG_LEAVEFN( "CLocalAppHandler::~CLocalAppHandler()" );
+ }
+
+// ---------------------------------------------------------
+// CLocalAppHandler::CLocalAppHandler()
+// ---------------------------------------------------------
+//
+CLocalAppHandler::CLocalAppHandler() : CBaseHandler(), iToday( EFalse ), iEmbedded( EFalse )
+ {
+ // Deliberately do nothing here :
+ // See ConstructL() for initialisation completion.
+ }
+
+// ---------------------------------------------------------
+// CLocalAppHandler::ConstructL()
+// ---------------------------------------------------------
+//
+void CLocalAppHandler::ConstructL( const TDesC& aUrl )
+ {
+ CLOG_ENTERFN( "CLocalAppHandler::ConstructL()" );
+
+ BaseConstructL( aUrl );
+
+ CLOG_LEAVEFN( "CLocalAppHandler::ConstructL()" );
+ }
+
+// ---------------------------------------------------------
+// CLocalAppHandler::HandleUrlEmbeddedL()
+// ---------------------------------------------------------
+//
+void CLocalAppHandler::HandleUrlEmbeddedL()
+ {
+ CLOG_ENTERFN( "CLocalAppHandler::HandleUrlEmbeddedL()" );
+ iEmbedded = ETrue;
+ HandleUrlL();
+ NotifyClient();
+ CLOG_LEAVEFN( "CLocalAppHandler::HandleUrlEmbeddedL()" );
+ }
+
+// ---------------------------------------------------------
+// CLocalAppHandler::HandleUrlStandaloneL()
+// ---------------------------------------------------------
+//
+void CLocalAppHandler::HandleUrlStandaloneL()
+ {
+ CLOG_ENTERFN( "CLocalAppHandler::HandleUrlStandaloneL()" );
+ iEmbedded = EFalse;
+ HandleUrlL();
+ CLOG_LEAVEFN( "CLocalAppHandler::HandleUrlStandaloneL()" );
+ }
+
+// ---------------------------------------------------------
+// CLocalAppHandler::HandleUrlL()
+// ---------------------------------------------------------
+//
+void CLocalAppHandler::HandleUrlL()
+ {
+ TInt start = 0;
+ TInt length= 0;
+ // Find "localapp://" from the beginning
+ if ( 0 == iParsedUrl->FindF( KLocalAppSlash ))
+ {
+ length = KLocalAppSlash.iTypeLength;
+ }
+ // Else find "localapp:" from the beginning
+ else if ( 0 == iParsedUrl->FindF( KLocalApp ) )
+ {
+ length = KLocalApp.iTypeLength;
+ }
+ else
+ {
+ return; // not recognized URI.
+ }
+
+ TPtrC startPtrC = iParsedUrl->Mid( length );
+
+ // Remove space from the beginning
+ while ( start < startPtrC.Length() && ' ' == startPtrC[start] )
+ {
+ ++start;
+ }
+ TPtrC headerPtrC = startPtrC.Mid( start );
+
+ if ( 0 == headerPtrC.FindF( KContactsId ) )
+ {
+ HandleContactsL();
+ }
+ else if ( 0 == headerPtrC.FindF( KCalendarId ) )
+ {
+ HandleCalendarL();
+ }
+ else if ( 0 == headerPtrC.FindF( KMessagingId ) )
+ {
+ HandleMessagingL();
+ }
+ else if ( 0 == headerPtrC.FindF( KMmsId ) )
+ {
+ HandleMmsL();
+ }
+ else if ( 0 == headerPtrC.FindF( KSmsId ) )
+ {
+ HandleSmsL();
+ }
+ else if ( 0 == headerPtrC.FindF( KJamId ) )
+ {
+ HandleJamL();
+ }
+ else
+ {
+ return; // do nothing, header was unknown
+ }
+ }
+// ---------------------------------------------------------
+// CLocalAppHandler::HandleJamL()
+// ---------------------------------------------------------
+//
+void CLocalAppHandler::HandleJamL()
+ {
+ // Change "localapp:..." to "javaapp:..."
+ HBufC *modifiedUrl = iParsedUrl->AllocL();
+ CleanupStack::PushL( modifiedUrl );
+ TPtr ptrModifiedUrl = modifiedUrl->Des();
+ ptrModifiedUrl.Replace( 0, KLocalApp.iTypeLength, KJavaApp );
+
+ CSchemeHandler *schemeHandler = CSchemeHandler::NewL( ptrModifiedUrl );
+ CleanupStack::PushL( schemeHandler );
+
+ if (iEmbedded)
+ {
+ schemeHandler->HandleUrlEmbeddedL();
+ }
+ else
+ {
+ schemeHandler->HandleUrlStandaloneL();
+ }
+ CleanupStack::PopAndDestroy( schemeHandler );
+ CleanupStack::PopAndDestroy( modifiedUrl );
+ }
+// ---------------------------------------------------------
+// CLocalAppHandler::HandleMmsL()
+// ---------------------------------------------------------
+//
+void CLocalAppHandler::HandleMmsL()
+ {
+ TInt compose = iParsedUrl->FindF( KCompose );
+ TInt show = iParsedUrl->FindF( KShow );
+ if ( show == KErrNotFound && compose == KErrNotFound )
+ {
+ return;
+ }
+ else if ( ( show != KErrNotFound && compose == KErrNotFound )
+ || show != KErrNotFound && show < compose )
+ {
+ TInt inbox = iParsedUrl->FindF( KInbox );
+ TInt composer = iParsedUrl->FindF( KComposer );
+ if ( ( inbox != KErrNotFound && compose == KErrNotFound ) ||
+ ( inbox != KErrNotFound && inbox < composer ) )
+ {
+ TUid viewUid( KMceInboxViewId );
+ TVwsViewId tvwsViewId(KUidMessaging, viewUid);
+ TBuf8<1> customMessage;
+ CEikonEnv::Static()->EikAppUi()->ActivateViewL( tvwsViewId, KMessageId, customMessage );
+ }
+ else
+ {
+ CMmsToHandler* mmsto = CMmsToHandler::NewL( KMmsto );
+ CleanupStack::PushL( mmsto );
+ if (iEmbedded)
+ {
+ mmsto->HandleUrlEmbeddedL();
+ }
+ else
+ {
+ mmsto->HandleUrlStandaloneL();
+ }
+ CleanupStack::PopAndDestroy( mmsto );
+ }
+ }
+ else
+ {
+ TPtrC url = iParsedUrl->Mid( compose + KCompose.iTypeLength );
+ CMmsToHandler* mmsto = CMmsToHandler::NewL( url );
+ CleanupStack::PushL( mmsto );
+ if (iEmbedded)
+ {
+ mmsto->HandleUrlEmbeddedL();
+ }
+ else
+ {
+ mmsto->HandleUrlStandaloneL();
+ }
+ CleanupStack::PopAndDestroy( mmsto );
+ }
+ }
+// ---------------------------------------------------------
+// CLocalAppHandler::HandleSmsL()
+// ---------------------------------------------------------
+//
+void CLocalAppHandler::HandleSmsL()
+ {
+ TInt compose = iParsedUrl->FindF( KCompose );
+ TInt show = iParsedUrl->FindF( KShow );
+ if ( show == KErrNotFound && compose == KErrNotFound )
+ {
+ return;
+ }
+ else if ( ( show != KErrNotFound && compose == KErrNotFound )
+ || show != KErrNotFound && show < compose )
+ {
+ TInt inbox = iParsedUrl->FindF( KInbox );
+ TInt composer = iParsedUrl->FindF( KComposer );
+ if ( ( inbox != KErrNotFound && compose == KErrNotFound ) ||
+ ( inbox != KErrNotFound && inbox < composer ) )
+ {
+ TUid viewUid( KMceInboxViewId );
+ TVwsViewId tvwsViewId( KUidMessaging, viewUid );
+ TBuf8<1> customMessage;
+ CEikonEnv::Static()->EikAppUi()->ActivateViewL( tvwsViewId, KMessageId, customMessage );
+ }
+ else
+ {
+ CSmsHandler* sms = CSmsHandler::NewL( KSms );
+ CleanupStack::PushL( sms );
+ if ( iEmbedded )
+ {
+ sms->HandleUrlEmbeddedL();
+ }
+ else
+ {
+ sms->HandleUrlStandaloneL();
+ }
+ CleanupStack::PopAndDestroy( sms );
+ }
+ }
+ else
+ {
+ TPtrC url = iParsedUrl->Mid( compose + KCompose.iTypeLength );
+ CSmsHandler* sms = CSmsHandler::NewL( url );
+ CleanupStack::PushL( sms );
+ if ( iEmbedded )
+ {
+ sms->HandleUrlEmbeddedL();
+ }
+ else
+ {
+ sms->HandleUrlStandaloneL();
+ }
+ CleanupStack::PopAndDestroy( sms );
+ }
+ }
+// ---------------------------------------------------------
+// CLocalAppHandler::HandleCalendarL()
+// ---------------------------------------------------------
+//
+void CLocalAppHandler::HandleCalendarL()
+ {
+ iAppUid = KUidCalendar;
+ if ( KErrNotFound != iParsedUrl->FindF( KToday ) )
+ {
+ iToday = ETrue;
+ }
+ StartAppL();
+ }
+// ---------------------------------------------------------
+// CLocalAppHandler::HandleContactsL()
+// ---------------------------------------------------------
+//
+void CLocalAppHandler::HandleContactsL()
+ {
+ iAppUid = KUidContacts ;
+ StartAppL();
+ }
+// ---------------------------------------------------------
+// CLocalAppHandler::HandleMessagingL()
+// ---------------------------------------------------------
+//
+void CLocalAppHandler::HandleMessagingL()
+ {
+ iAppUid = KUidMessaging;
+ StartAppL();
+ }
+
+// ---------------------------------------------------------
+// CLocalAppHandler::StartAppL()
+// ---------------------------------------------------------
+//
+void CLocalAppHandler::StartAppL()
+ {
+ RWsSession wsServer;
+ User::LeaveIfError( wsServer.Connect() );
+ CleanupClosePushL( wsServer );
+ TApaTaskList taskList( wsServer );
+ TApaTask task(taskList.FindApp( iAppUid ));
+
+ if ( task.Exists() )
+ {
+ task.BringToForeground();
+ }
+ else
+ {
+ TApaAppInfo appInfo;
+ TApaAppCapabilityBuf capabilityBuf;
+ RApaLsSession lsSession;
+ User::LeaveIfError( lsSession.Connect() );
+ CleanupClosePushL( lsSession );
+ User::LeaveIfError(lsSession.GetAppInfo(appInfo, iAppUid ));
+ User::LeaveIfError(lsSession.GetAppCapability(capabilityBuf, iAppUid ));
+ TApaAppCapability& caps = capabilityBuf();
+
+ TFileName appName = appInfo.iFullName;
+ CApaCommandLine* cmdLine = CApaCommandLine::NewLC();
+ #if (defined(SYMBIAN_SUPPORT_UI_FRAMEWORKS_V1) || defined(__SERIES60_27__) || defined(__SERIES60_28__))
+ cmdLine->SetLibraryNameL(appName);
+ #else
+ cmdLine->SetExecutableNameL(appName);
+ #endif
+
+ // If Calendar's Day view selected
+ if ( iAppUid == KUidCalendar && iToday )
+ {
+ TBuf8<12> todayBuf;
+ todayBuf.Copy( (TUint8*)KDesToday().Ptr(), ( KDesToday.iTypeLength * 2 ) );
+ cmdLine->SetTailEndL( todayBuf );
+ }
+
+ if (caps.iLaunchInBackground)
+ {
+ cmdLine->SetCommandL(EApaCommandBackground);
+ }
+ else
+ {
+ cmdLine->SetCommandL(EApaCommandRun);
+ }
+
+ User::LeaveIfError(lsSession.StartApp(*cmdLine));
+
+ CleanupStack::PopAndDestroy(cmdLine);
+ CleanupStack::PopAndDestroy(); // lsSession
+ } // else
+
+ CleanupStack::PopAndDestroy(); // wsServer
+ }
+
+// End of file
+