diff -r 000000000000 -r 79c6a41cd166 homescreensrv_plat/sapi_actionhandler/actionhandlerplugins/src/ahpapplauncher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreensrv_plat/sapi_actionhandler/actionhandlerplugins/src/ahpapplauncher.cpp Thu Dec 17 08:54:17 2009 +0200 @@ -0,0 +1,406 @@ +/* +* Copyright (c) 2008 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: App for Action handler + * +*/ + + +#include +#include +#include +#include +#include +#include +#include + +#include "ahproperties.hrh" +#include "ahpapplauncher.h" + +// ======== MEMBER FUNCTIONS ======== + +// ---------------------------------------------------------------------------- +// Symbian 2nd phase constructor can leave. +// ---------------------------------------------------------------------------- +// +void CAHAppLauncher::ConstructL() + { + iEnv = CEikonEnv::Static( ); + } + +// ---------------------------------------------------------------------------- +// Two-phased constructor. +// ---------------------------------------------------------------------------- +// +CAHAppLauncher* CAHAppLauncher::NewL() + { + CAHAppLauncher* self = CAHAppLauncher::NewLC( ); + CleanupStack::Pop( self ); + return self; + } + +// ---------------------------------------------------------------------------- +// Two-phased constructor. +// ---------------------------------------------------------------------------- +// +CAHAppLauncher* CAHAppLauncher::NewLC() + { + CAHAppLauncher* self = new( ELeave ) CAHAppLauncher; + CleanupStack::PushL( self ); + self->ConstructL( ); + return self; + } + +// --------------------------------------------------------------------------- +// destructor +// --------------------------------------------------------------------------- +CAHAppLauncher::~CAHAppLauncher() + { + } + +// --------------------------------------------------------------------------- +// Executes provided action +// --------------------------------------------------------------------------- +// +TInt CAHAppLauncher::ExecuteTypeLaunchL( const CLiwMap* aMap ) + { + TInt errCode(KErrArgument); + RBuf launchMethod; + CleanupClosePushL( launchMethod ); + + if ( !ExtractDesL( aMap, launchMethod, KLaunchMethod ) ) + { + if ( !launchMethod.CompareF( KLaunchMethodValueCmdLine ) ) + { + errCode = ExecuteCommmandLineL( aMap ); + } + else if ( !launchMethod.CompareF( KLaunchMethodValueMessageWithDoc ) + || !launchMethod.CompareF( KLaunchMethodValueMessageWithTail ) ) + { + errCode = ExecuteApaMessageL( aMap ); + } + } + + CleanupStack::PopAndDestroy( &launchMethod ); + return errCode; + } + +// --------------------------------------------------------------------------- +// Executes provided command line action +// --------------------------------------------------------------------------- +// +TInt CAHAppLauncher::ExecuteCommmandLineL( const CLiwMap* aMap ) + { + TInt errCode(KErrArgument); + TUid appUid= TUid::Null( ); + + if ( !ExtractUidL( aMap, appUid, KApplicationUid ) ) + { + RApaLsSession appSession; + CleanupClosePushL( appSession ); + User::LeaveIfError( appSession.Connect( ) ); + + CApaCommandLine* cmd = CApaCommandLine::NewLC( ); + cmd->SetCommandL( GetCommandL( aMap ) ); + RBuf documentNameValue; + CleanupClosePushL( documentNameValue ); + if( !ExtractDesL( aMap, documentNameValue, KDocumentName ) ) + { + cmd->SetDocumentNameL( documentNameValue ); + } + TApaAppInfo appInfo; + appSession.GetAppInfo( appInfo, appUid ); + cmd->SetExecutableNameL( appInfo.iFullName ); + errCode = appSession.StartApp( *cmd ); + + CleanupStack::PopAndDestroy( &documentNameValue ); + CleanupStack::PopAndDestroy( cmd ); + CleanupStack::PopAndDestroy( &appSession ); + } + return errCode; + } + +// --------------------------------------------------------------------------- +// Executes provided apa message action +// --------------------------------------------------------------------------- +// +TInt CAHAppLauncher::ExecuteApaMessageL( const CLiwMap* aMap ) + { + TInt errCode(KErrArgument); + TUid appUid= TUid::Null( ); + if ( !ExtractUidL( aMap, appUid, KApplicationUid ) ) + { + TApaTaskList taskList( iEnv->WsSession() ); + TApaTask task = taskList.FindApp( appUid ); + if ( task.Exists( ) ) + { + TUid messageUid= TUid::Null( ); + + RBuf8 additionalData; + CleanupClosePushL( additionalData ); + if ( !ExtractUidL( aMap, messageUid, KMessageUid ) + && !ExtractDes8L( aMap, additionalData, KAdditionalData ) ) + { + errCode = task.SendMessage( messageUid, additionalData ); + } + CleanupStack::PopAndDestroy( &additionalData ); + } + else + { // app not yet running + RBuf launchMethod; + CleanupClosePushL( launchMethod ); + if ( !ExtractDesL( aMap, launchMethod, KLaunchMethod ) ) + { + if ( !launchMethod.CompareF( KLaunchMethodValueMessageWithDoc ) ) + { + errCode = StartDocumentL( aMap ) ; + } + else if ( !launchMethod.CompareF( KLaunchMethodValueMessageWithTail ) ) + { + errCode = StartAppL( aMap ); + } + } + CleanupStack::PopAndDestroy( &launchMethod ); + } + } + return errCode; + + } +// --------------------------------------------------------------------------- +// Start document +// --------------------------------------------------------------------------- +// +TInt CAHAppLauncher::StartDocumentL( const CLiwMap* aMap ) + { + TInt errCode(KErrArgument); + TUid appUid= TUid::Null( ); + RBuf documentNameValue; + CleanupClosePushL( documentNameValue ); + if ( !ExtractUidL( aMap, appUid, KApplicationUid ) + && !ExtractDesL( aMap, documentNameValue, KDocumentName ) ) + { + RApaLsSession appArcSession; + CleanupClosePushL( appArcSession ); + User::LeaveIfError( appArcSession.Connect( ) ); + TThreadId id; + errCode = appArcSession.StartDocument( documentNameValue, appUid, id ); + CleanupStack::PopAndDestroy( &appArcSession ); + } + CleanupStack::PopAndDestroy( &documentNameValue ); + return errCode; + } +// --------------------------------------------------------------------------- +// Starts application +// --------------------------------------------------------------------------- +// +TInt CAHAppLauncher::StartAppL( const CLiwMap* aMap ) + { + TInt errCode(KErrArgument); + TUid appUid= TUid::Null( ); + RBuf8 additionalData; + CleanupClosePushL( additionalData ); + if ( !ExtractUidL( aMap, appUid, KApplicationUid ) + && !ExtractDes8L( aMap, additionalData, KAdditionalData ) ) + { + RApaLsSession appArcSession; + CleanupClosePushL( appArcSession ); + User::LeaveIfError( appArcSession.Connect( ) ); + TApaAppInfo appInfo; + errCode = appArcSession.GetAppInfo( appInfo, appUid ); + if ( errCode == KErrNone ) + { + CApaCommandLine* cmdLine = CApaCommandLine::NewLC( ); + cmdLine->SetExecutableNameL( appInfo.iFullName ); + cmdLine->SetCommandL( EApaCommandRun ); + cmdLine->SetTailEndL( additionalData ); + + errCode = appArcSession.StartApp( *cmdLine ); + CleanupStack::PopAndDestroy( cmdLine ); + } + CleanupStack::PopAndDestroy( &appArcSession ); + } + CleanupStack::PopAndDestroy( &additionalData ); + return errCode; + } +// ---------------------------------------------------------------------------- +// Executes provided action - activate view +// ---------------------------------------------------------------------------- +// +TInt CAHAppLauncher::ExecuteActivateViewL( const CLiwMap* aMap ) + { + TInt errCode(KErrGeneral); + if ( iEnv ) + { + CCoeAppUi* appui = iEnv-> EikAppUi( ); + if ( appui ) + { + TUid messageUid= TUid::Null( ); + TVwsViewId viewId; + if ( !ExtractViewIdL( aMap, viewId ) ) + { + RBuf8 additionalData; + CleanupClosePushL( additionalData ); + if ( !ExtractUidL( aMap, messageUid, KMessageUid ) + && !ExtractDes8L( aMap, additionalData, KAdditionalData ) ) + { + appui->ActivateViewL( viewId, messageUid, additionalData ); + } + else + { + appui->ActivateViewL( viewId ); + } + errCode = KErrNone; + CleanupStack::PopAndDestroy( &additionalData ); + } + } + } + return errCode; + } + +// --------------------------------------------------------------------------- +// Executes provided action +// --------------------------------------------------------------------------- +// +TInt CAHAppLauncher::ExecuteActionL( const CLiwMap* aMap ) + { + TInt errCode(KErrNotFound); + RBuf type; + CleanupClosePushL( type ); + errCode = ExtractDesL( aMap, type, KType ); + + if ( errCode == KErrNone ) + { + if ( !type.CompareF( KActionValueLaunchApplication ) ) + { + errCode = ExecuteTypeLaunchL( aMap ); + } + else if ( !type.CompareF( KActionValueViewActivation ) ) + { + errCode = ExecuteActivateViewL( aMap ); + } + } + CleanupStack::PopAndDestroy( &type ); + return errCode; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CAHAppLauncher::ExtractDesL( const CLiwMap* aMap, + RBuf& aString, const TDesC8& aMapName ) + { + TInt errCode(KErrNotFound); + TLiwVariant variant; + variant.PushL( ); + TPtrC tempString( KNullDesC ); + if ( aMap->FindL( aMapName, variant ) ) + { + variant.Get( tempString ); + aString.ReAllocL( tempString.Length( ) ); + aString.Append( tempString ); + errCode = KErrNone; + } + CleanupStack::PopAndDestroy( &variant ); + return errCode; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CAHAppLauncher::ExtractDes8L( const CLiwMap* aMap, + RBuf8& aString, const TDesC8& aMapName ) + { + TInt errCode(KErrNotFound); + TLiwVariant variant; + variant.PushL( ); + TPtrC8 tempString( KNullDesC8 ); + if ( aMap->FindL( aMapName, variant ) ) + { + variant.Get( tempString ); + aString.ReAllocL( tempString.Length( ) ); + aString.Append( tempString ); + errCode = KErrNone; + } + CleanupStack::PopAndDestroy( &variant ); + return errCode; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CAHAppLauncher::ExtractUidL( const CLiwMap* aMap, TUid& aUid, + const TDesC8& aMapName ) + + { + TInt errCode(KErrNotFound); + TInt32 temp; + TLiwVariant variant; + variant.PushL( ); + if ( aMap->FindL( aMapName, variant ) ) + { + variant.Get( temp ); + aUid = TUid::Uid( temp ); + errCode = KErrNone; + } + CleanupStack::PopAndDestroy( &variant ); + return errCode; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CAHAppLauncher::ExtractViewIdL( const CLiwMap* aMap, TVwsViewId& aViewId ) + + { + TInt errCode(KErrNotFound); + TLiwVariant variant; + if ( aMap->FindL( KViewId, variant ) ) + { + variant.Get( aViewId.iViewUid.iUid ); + variant.Reset( ); + if ( aMap->FindL( KViewAppUid, variant ) ) + { + variant.Get( aViewId.iAppUid.iUid ); + variant.Reset( ); + errCode = KErrNone; + } + } + + return errCode; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TApaCommand CAHAppLauncher::GetCommandL( const CLiwMap* aMap ) + { + TApaCommand command(EApaCommandOpen); + RBuf appCommand; + CleanupClosePushL( appCommand ); + if ( ExtractDesL( aMap, appCommand, KApaCommand ) == KErrNone ) + { + if( appCommand.Compare( KApaCommandBackground ) == KErrNone ) + { + command = EApaCommandBackground; + } + } + CleanupStack::PopAndDestroy( &appCommand ); + return command; + } + +// End of file