diff -r ebe688cedc25 -r 7fdbb852d323 messagingappbase/schemeplugin/src/LocalAppHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/schemeplugin/src/LocalAppHandler.cpp Wed Sep 01 12:31:54 2010 +0100 @@ -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 // For REComSession +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // 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 +