messagingappbase/schemeplugin/src/LocalAppHandler.cpp
changeset 0 72b543305e3a
--- /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
+