--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/htiui/HtiServicePlugins/HtiAppServicePlugin/src/HtiAppControl.cpp Wed Oct 13 14:32:52 2010 +0300
@@ -0,0 +1,2094 @@
+/*
+* Copyright (c) 2009 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: HtiAppControl implementation
+*
+*/
+
+
+// INCLUDE FILES
+#include <apacmdln.h>
+#include <apgtask.h>
+#include <apgwgnam.h>
+#include <apmstd.h>
+
+#include <badesca.h>
+#include <f32file.h>
+
+#include "HtiAppControl.h"
+#include <HtiDispatcherInterface.h>
+#include <HtiLogging.h>
+
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
+#include <SWInstApi.h>
+#include <swi/sisregistrysession.h>
+#include <swi/sisregistrypackage.h>
+#else
+#include <usif/sif/sif.h>
+#include <usif/scr/scr.h> //RSoftwareComponentRegistry
+#endif
+#include <javaregistryincludes.h>
+#include <WidgetRegistryClient.h>
+
+using namespace Java;
+#if ( SYMBIAN_VERSION_SUPPORT >= SYMBIAN_4 )
+_LIT8( KSisxMimeType, "x-epoc/x-sisx-app" );
+_LIT8( KSisMimeType, "application/vnd.symbian.install" );
+_LIT8( KPipMimeType, "application/x-pip" );
+_LIT8( KJadMIMEType, "text/vnd.sun.j2me.app-descriptor" );
+_LIT8( KJarMIMEType, "application/java-archive" );
+_LIT8( KJavaMIMEType, "application/java");
+_LIT8( KJarxMIMEType, "application/x-java-archive");
+#endif
+
+// CONSTANTS
+const static TUid KAppServiceUid = { 0x1020DEC7 }; //This is Uid of AppServiceOS
+
+//error descriptions
+_LIT8( KErrDescrNoMemory, "No memory" );
+_LIT8( KErrDescrInvalidCmd, "Invalid command" );
+_LIT8( KErrDescrInvalidArguments, "Invalid arguments" );
+_LIT8( KErrDescrFailedCreateProcess, "Failed create process" );
+_LIT8( KErrDescrNotSupported, "Command not supported" );
+
+_LIT8( KErrDescrFailedStartApp, "Failed start app" );
+_LIT8( KErrDescrInvalidUid, "Invalid application uid" );
+_LIT8( KErrDescrFailedFindApp, "Failed find app" );
+
+_LIT8( KErrDescrFailedConnectSilentInstaller, "Failed to connect to silent installer" );
+_LIT8( KErrDescrFailedInstall, "Failed to install" );
+_LIT8( KErrDescrFailedUnInstall, "Failed to uninstall" );
+_LIT8( KErrDescrFailedFindPackage, "Failed to find the package" );
+#if ( SYMBIAN_VERSION_SUPPORT >= SYMBIAN_4 )
+_LIT8( KErrDescrBadComponentId, "Bad component id");
+#endif
+_LIT8( KErrDescrFailedListInstApps, "Failed to list installed apps" );
+
+const static TUint8 KUnicodeMask = 0x01;
+const static TInt KTerminateReason = 0;
+const static TInt KTUintLength = sizeof(TUint);
+const static TInt KCloseTaskDelay = 250000; // microseconds
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================ MEMBER FUNCTIONS ===============================
+CHtiAppControl* CHtiAppControl::NewL()
+ {
+ CHtiAppControl* self = new ( ELeave ) CHtiAppControl;
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+// Constructor
+CHtiAppControl::CHtiAppControl():iIsAppCmdsSupported( EFalse )
+ {
+ }
+
+EXPORT_C CHtiAppControl* NewHtiAppControl()
+ {
+ return CHtiAppControl::NewL();
+ }
+
+CHtiAppControl::~CHtiAppControl()
+ {
+ HTI_LOG_FUNC_IN( "~CHtiAppControl" );
+
+ for ( TInt i = 0; i < iProcessHandleArray.Count(); i++ )
+ {
+ iProcessHandleArray[i].Close();
+ }
+ iProcessHandleArray.Close();
+
+ iAppServer.Close();
+ iWs.Close();
+
+ if ( iMimeTypes )
+ {
+ iMimeTypes->Reset();
+ delete iMimeTypes;
+ }
+
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
+ iAugmentations.ResetAndDestroy();
+#endif
+
+ HTI_LOG_FUNC_OUT( "~CHtiAppControl" );
+ }
+
+// Second phase construction.
+void CHtiAppControl::ConstructL()
+ {
+ HTI_LOG_FUNC_IN( "CHtiAppControl::ConstructL" );
+ iMimeTypes = new (ELeave) CDesC8ArrayFlat( 8 );
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
+ iMimeTypes->AppendL( SwiUI::KSisxMimeType() );
+ iMimeTypes->AppendL( SwiUI::KSisMimeType() );
+ iMimeTypes->AppendL( SwiUI::KPipMimeType() );
+ iMimeTypes->AppendL( SwiUI::KJadMIMEType() );
+ iMimeTypes->AppendL( SwiUI::KJarMIMEType() );
+ iMimeTypes->AppendL( SwiUI::KJavaMIMEType() );
+ iMimeTypes->AppendL( SwiUI::KJarxMIMEType() );
+#else
+ iMimeTypes->AppendL( KSisxMimeType() );
+ iMimeTypes->AppendL( KSisMimeType() );
+ iMimeTypes->AppendL( KPipMimeType() );
+ iMimeTypes->AppendL( KJadMIMEType() );
+ iMimeTypes->AppendL( KJarMIMEType() );
+ iMimeTypes->AppendL( KJavaMIMEType() );
+ iMimeTypes->AppendL( KJarxMIMEType() );
+#endif
+ iMimeTypes->AppendL( KWidgetMime() ); // from widgetregistryconstants.h
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
+ iAugmentationIndex = 0;
+#endif
+
+ TInt err = iAppServer.Connect();
+ if ( err == KErrNone )
+ {
+ err = iWs.Connect();
+ }
+ if ( err == KErrNone )
+ {
+ iIsAppCmdsSupported = ETrue;
+ }
+ else
+ {
+ iAppServer.Close();
+ }
+ HTI_LOG_FUNC_OUT( "CHtiAppControl::ConstructL" );
+ }
+
+TInt CHtiAppControl::ParseString( const TDesC8& aRequest,
+ TInt anOffset,
+ TBool aUnicode,
+ TDes& aResult )
+ {
+ HTI_LOG_FUNC_IN( "CHtiAppControl::ParseString" );
+ //validate parameters
+ //if offset outside the string return empty string
+ if ( anOffset >= aRequest.Size() )
+ {
+ return anOffset;
+ }
+
+ TInt len = aRequest[anOffset];
+ HTI_LOG_FORMAT( "length %d", len );
+
+ if ( len > aResult.MaxLength() )
+ {
+ return KErrBadDescriptor;
+ }
+
+ TInt nextOffset = ( aUnicode ? len * 2 : len ) + anOffset + 1;
+ HTI_LOG_FORMAT( "nextOffset %d", nextOffset );
+ HTI_LOG_FORMAT( "reqSize %d", aRequest.Size() );
+ if ( nextOffset > aRequest.Size() )
+ {
+ return KErrArgument;
+ }
+
+ if ( aUnicode )
+ {
+ const TPtrC8 aFrom( aRequest.Mid( anOffset + 1, len * 2 ) );
+ aResult.SetLength( len );
+ for ( TInt i = 0; i < len; ++i )
+ {
+ aResult[i] = ( TUint16 ) aFrom[i << 1] +
+ ( ( ( TUint16 ) aFrom[( i << 1 ) + 1] ) << 8 );
+ }
+ }
+ else
+ {
+ aResult.Copy( aRequest.Mid( anOffset + 1, len ) );
+ }
+
+ HTI_LOG_FUNC_OUT( "CHtiAppControl::ParseString" );
+ return nextOffset;
+ }
+
+void CHtiAppControl::ProcessMessageL( const TDesC8& aMessage,
+ THtiMessagePriority /*aPriority*/ )
+ {
+ HTI_LOG_FUNC_IN( "CHtiAppControl::ProcessMessage" );
+ if ( aMessage.Length() < 1 )
+ {
+ // no command
+ SendErrorMsg( KErrArgument, KErrDescrInvalidCmd );
+ return;
+ }
+
+ if ( aMessage.Length() < 2 &&
+ aMessage[0] != EListInstalledApps &&
+ aMessage[0] != EListInstalledApps_u)
+ {
+ // parameter is required with all commands except
+ // listing processes or installed applications
+ SendErrorMsg( KErrArgument, KErrDescrInvalidCmd );
+ return;
+ }
+
+ HTI_LOG_FORMAT( "cmd %d", aMessage[0] );
+
+ if ( aMessage[0] > EProcessLastCommand &&
+ aMessage[0] < EAppLastCommand)
+ {
+ if ( iIsAppCmdsSupported )
+ {
+ HandleAppControlL( aMessage );
+ }
+ else
+ {
+ SendErrorMsg( KErrNotSupported, KErrDescrNotSupported );
+ }
+ }
+ else if ( aMessage[0] > EAppLastCommand &&
+ aMessage[0] < ESisLastCommand )
+ {
+ HandleInstallerControlL( aMessage );
+ }
+ else
+ {
+ SendErrorMsg( KErrArgument, KErrDescrInvalidCmd );
+ }
+ HTI_LOG_FUNC_OUT( "CHtiAppControl::ProcessMessage" );
+ }
+
+void CHtiAppControl::HandleAppControlL( const TDesC8& aMessage )
+ {
+ HTI_LOG_FUNC_IN( "CHtiAppControl::HandleAppControl" );
+
+ TBool unicode = aMessage[0] & KUnicodeMask;
+
+ HTI_LOG_FORMAT( "unicode %d", unicode );
+
+ TApaAppInfo appInfo;
+ TFileName appName;
+ TFileName docName;
+
+ switch ( aMessage[0] )
+ {
+ case EStartApp_uid:
+ case EStartApp_uid_u:
+ {
+ TPtrC8 parameters = aMessage.Mid( 1 );
+ if ( parameters.Length() >= 4 )
+ {
+ TInt32 uid = Parse32<TInt32>( parameters );
+
+ TInt offset = ParseString( parameters, 4, unicode, docName );
+ if ( offset >= 0)
+ {
+ if ( FindAppL( appInfo, uid ) )
+ {
+ HandleStartAppL( appInfo, docName );
+ }
+ }
+ else
+ {
+ SendErrorMsg( offset , KErrDescrInvalidArguments );
+ }
+ }
+ else
+ {
+ SendErrorMsg( KErrArgument , KErrDescrInvalidUid );
+ }
+ }
+ break;
+ case EStartApp:
+ case EStartApp_u:
+ {
+ TInt offset = ParseString( aMessage, 1, unicode, appName );
+ if ( offset >= 0 )
+ {
+ offset = ParseString( aMessage, offset, unicode, docName );
+ if ( offset >= 0 )
+ {
+ //find appInfo by app full name
+ if ( FindAppL( appInfo, appName ) )
+ {
+ HTI_LOG_TEXT( "call HandleStartAppL" );
+ HandleStartAppL( appInfo, docName );
+ }
+ }
+ }
+
+ if ( offset < 0 )
+ {
+ SendErrorMsg( offset , KErrDescrInvalidArguments );
+ }
+ }
+ break;
+ case EStartDoc:
+ case EStartDoc_u:
+ {
+ TInt offset = ParseString( aMessage, 1, unicode, docName );
+ if ( offset >= 0 )
+ {
+ HandleStartAppL( appInfo, docName ); //appInfo is empty
+ }
+ else
+ {
+ SendErrorMsg( offset , KErrDescrInvalidArguments );
+ }
+ }
+ break;
+ case EStatusApp_uid:
+ {
+ TPtrC8 appUid8 = aMessage.Mid( 1 );
+ if ( appUid8.Length() == 4 )
+ {
+ TApaTaskList tl( iWs );
+ TInt32 appUid = Parse32<TInt32>( appUid8 );
+ TApaTask task = tl.FindApp( TUid::Uid( appUid ) );
+ if ( task.Exists() )
+ {
+ SendMessageL( ERunning );
+ }
+ else
+ {
+ SendMessageL( ENotFound );
+ }
+ }
+ else
+ {
+ SendErrorMsg( KErrArgument, KErrDescrInvalidUid );
+ }
+ }
+ break;
+ case EStatusApp:
+ case EStatusApp_u:
+ {
+ TInt offset = ParseString( aMessage, 1, unicode, appName );
+ if ( offset >= 0 )
+ {
+ TApaTaskList tl( iWs );
+ TApaTask task = tl.FindApp( appName );
+ if ( task.Exists() )
+ {
+ SendMessageL( ERunning );
+ break; // we are done
+ }
+
+ // Maybe the user gave path or filename instead of caption
+ if ( FindAppL( appInfo, appName ) )
+ {
+ TApaTask task2 = tl.FindApp( appInfo.iUid );
+ if ( task2.Exists() )
+ {
+ SendMessageL( ERunning );
+ }
+ else
+ {
+ SendMessageL( ENotFound );
+ }
+ }
+ // If app was not found by FindAppL method, a response message
+ // has already been sent there - no need to send anything here.
+ }
+ else
+ {
+ SendErrorMsg( offset , KErrDescrInvalidArguments );
+ }
+ }
+ break;
+ case EStatusDoc:
+ case EStatusDoc_u:
+ {
+ TInt offset = ParseString( aMessage, 1, unicode, docName );
+ if ( offset >= 0 )
+ {
+ TApaTaskList tl( iWs );
+ TApaTask task = tl.FindDoc( docName );
+ if ( task.Exists() )
+ {
+ SendMessageL( ERunning );
+ }
+ else
+ {
+ SendMessageL( ENotFound );
+ }
+ }
+ else
+ {
+ SendErrorMsg( offset , KErrDescrInvalidArguments );
+ }
+ }
+ break;
+ case EStopApp:
+ case EStopApp_u:
+ {
+ TInt offset = ParseString( aMessage, 1, unicode, appName );
+ if ( offset >= 0 )
+ {
+ TApaTaskList tl( iWs );
+ TApaTask task = tl.FindApp( appName );
+ if ( task.Exists() )
+ {
+ task.EndTask();
+ User::After( KCloseTaskDelay );
+ TApaTask task = tl.FindApp( appName );
+ if ( task.Exists() )
+ {
+ task.KillTask();
+ }
+ SendMessageL( EOk );
+ break; // we are done
+ }
+
+ // Maybe the user gave path or filename instead of caption
+ if ( FindAppL( appInfo, appName ) )
+ {
+ TApaTask task2 = tl.FindApp( appInfo.iUid );
+ if ( task2.Exists() )
+ {
+ task2.EndTask();
+ User::After( KCloseTaskDelay );
+ TApaTask task2 = tl.FindApp( appInfo.iUid );
+ if ( task2.Exists() )
+ {
+ task2.KillTask();
+ }
+ SendMessageL( EOk );
+ }
+ else
+ {
+ SendMessageL( ENotFound );
+ }
+ }
+ // If app was not found by FindAppL method, a response message
+ // has already been sent there - no need to send anything here.
+ }
+ else
+ {
+ SendErrorMsg( offset , KErrDescrInvalidArguments );
+ }
+ }
+ break;
+ case EStopDoc:
+ case EStopDoc_u:
+ {
+ TInt offset = ParseString( aMessage, 1, unicode, docName );
+ if ( offset >= 0 )
+ {
+ TApaTaskList tl( iWs );
+ TApaTask task = tl.FindDoc( docName );
+ if ( task.Exists() )
+ {
+ task.EndTask();
+ User::After( KCloseTaskDelay );
+ TApaTask task = tl.FindDoc( docName );
+ if ( task.Exists() )
+ {
+ task.KillTask();
+ }
+ SendMessageL( EOk );
+ }
+ else
+ {
+ SendMessageL( ENotFound );
+ }
+ }
+ else
+ {
+ SendErrorMsg( offset , KErrDescrInvalidArguments );
+ }
+ }
+ break;
+ case EStopApp_uid:
+ {
+ TPtrC8 appUid8 = aMessage.Mid( 1 );
+ if ( appUid8.Length() == 4 )
+ {
+ TApaTaskList tl( iWs );
+ TInt32 appUid = Parse32<TInt32>( appUid8 );
+ TApaTask task = tl.FindApp( TUid::Uid( appUid ) );
+ if ( task.Exists() )
+ {
+ task.EndTask();
+ User::After(KCloseTaskDelay);
+ TApaTask task = tl.FindApp( TUid::Uid( appUid ) );
+ if ( task.Exists() )
+ {
+ task.KillTask();
+ }
+ SendMessageL( EOk );
+ }
+ else
+ {
+ SendMessageL( ENotFound );
+ }
+ }
+ else
+ {
+ SendErrorMsg( KErrArgument , KErrDescrInvalidUid );
+ }
+ }
+ break;
+ case EListApps:
+ case EListApps_u:
+ {
+ if ( aMessage.Length() != 3 )
+ {
+ SendErrorMsg( KErrArgument, KErrDescrInvalidArguments );
+ }
+ else
+ {
+ HandleListAppsL( aMessage[1], aMessage[2], unicode );
+ }
+ }
+ break;
+ case EListInstalledApps:
+ case EListInstalledApps_u:
+ {
+ if ( aMessage.Length() != 1 )
+ {
+ SendErrorMsg( KErrArgument, KErrDescrInvalidArguments );
+ }
+ else
+ {
+ HandleListInstalledAppsL( unicode );
+ }
+ }
+ break;
+ default:
+ {
+ SendErrorMsg( KErrArgument, KErrDescrInvalidCmd );
+ }
+ }
+
+ HTI_LOG_FUNC_OUT("CHtiAppControl::HandleAppControl");
+ }
+
+void CHtiAppControl::HandleInstallerControlL( const TDesC8& aMessage )
+ {
+ HTI_LOG_FUNC_IN( "CHtiAppControl::HandleInstallerControlL" );
+
+ if ( aMessage.Length() < 2 )
+ {
+ HTI_LOG_TEXT( "Command parameters missing" );
+ SendErrorMsg( KErrArgument , KErrDescrInvalidCmd );
+ return;
+ }
+
+ TBool unicode = aMessage[0] & KUnicodeMask;
+ HTI_LOG_FORMAT( "Unicode flag: %d", unicode );
+
+ TFileName path;
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
+ TBuf<SwiUI::KSWInstMaxPasswordLength> login;
+ TBuf<SwiUI::KSWInstMaxPasswordLength> password;
+#endif
+
+ switch ( aMessage[0] )
+ {
+ case EInstall:
+ case EInstall_u:
+ {
+ TPtrC8 parameters = aMessage.Mid( 1 );
+ if ( ValidateInstallParams( parameters, unicode ) )
+ {
+ TInt offset = ParseString( parameters, 0, unicode, path );
+
+ HTI_LOG_TEXT( "Parsed path to install package:" );
+ HTI_LOG_DES( path )
+
+ if ( offset >= 0)
+ {
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
+ iInstOpts = SwiUI::TInstallOptions();
+
+ iInstOpts.iUpgrade = ConvertToPolicy( parameters[offset] ); offset++;
+ iInstOpts.iOptionalItems = ConvertToPolicy( parameters[offset] ); offset++;
+ iInstOpts.iOCSP = ConvertToPolicy( parameters[offset] ); offset++;
+ iInstOpts.iIgnoreOCSPWarnings = ConvertToPolicy( parameters[offset] ); offset++;
+ iInstOpts.iUntrusted = ConvertToPolicy( parameters[offset] ); offset++;
+ iInstOpts.iPackageInfo = ConvertToPolicy( parameters[offset] ); offset++;
+ iInstOpts.iCapabilities = ConvertToPolicy( parameters[offset] ); offset++;
+ iInstOpts.iKillApp = ConvertToPolicy( parameters[offset] ); offset++;
+ iInstOpts.iOverwrite = ConvertToPolicy( parameters[offset] ); offset++;
+ iInstOpts.iDownload = ConvertToPolicy( parameters[offset] ); offset++;
+
+ HTI_LOG_FORMAT( "iUpgrade: %d", iInstOpts.iUpgrade );
+ HTI_LOG_FORMAT( "iOptionalItems: %d", iInstOpts.iOptionalItems );
+ HTI_LOG_FORMAT( "iOCSP: %d", iInstOpts.iOCSP );
+ HTI_LOG_FORMAT( "iIgnoreOCSPWarnings: %d", iInstOpts.iIgnoreOCSPWarnings );
+ HTI_LOG_FORMAT( "iUntrusted: %d", iInstOpts.iUntrusted );
+ HTI_LOG_FORMAT( "iPackageInfo: %d", iInstOpts.iPackageInfo );
+ HTI_LOG_FORMAT( "iCapabilities: %d", iInstOpts.iCapabilities );
+ HTI_LOG_FORMAT( "iKillApp: %d", iInstOpts.iKillApp );
+ HTI_LOG_FORMAT( "iOverwrite: %d", iInstOpts.iOverwrite );
+ HTI_LOG_FORMAT( "iDownload: %d", iInstOpts.iDownload );
+
+ offset = ParseString( parameters, offset, unicode, login );
+ iInstOpts.iLogin.Copy( login );
+ HTI_LOG_TEXT( "Parsed login:" );
+ HTI_LOG_DES( login )
+
+ offset = ParseString( parameters, offset, unicode, password );
+ iInstOpts.iPassword.Copy( password );
+ HTI_LOG_TEXT( "Parsed password:" );
+ HTI_LOG_DES( password )
+
+ iInstOpts.iDrive = (TChar) parameters[offset]; offset++;
+ iInstOpts.iLang = (TLanguage) parameters[offset]; offset++;
+ iInstOpts.iUsePhoneLang = (TBool) parameters[offset]; offset++;
+ iInstOpts.iUpgradeData = ConvertToPolicy( parameters[offset] );
+ offset++;
+ HTI_LOG_FORMAT( "parameters length: %d", parameters.Length());
+ HTI_LOG_FORMAT( "next offset: %d", offset);
+
+ if(parameters.Length() > offset)
+ {
+ TInt language = iInstOpts.iLang;
+ if (parameters.Length() == offset+2)
+ {
+ language = parameters[offset] + (parameters[offset+1]<<8);
+ }
+ if (parameters.Length() == offset+1)
+ {
+ language = parameters[offset];
+ }
+ if ((language > ELangTest) && (language < ELangMaximum))
+ {
+ iInstOpts.iLang = (TLanguage) language;
+ }
+ }
+ HTI_LOG_FORMAT( "iDrive: %c", iInstOpts.iDrive.GetLowerCase() );
+ HTI_LOG_FORMAT( "iLang: %d", iInstOpts.iLang );
+ HTI_LOG_FORMAT( "iUsePhoneLang: %d", iInstOpts.iUsePhoneLang );
+ HTI_LOG_FORMAT( "iUpgradeData: %d", iInstOpts.iUpgradeData );
+
+ iInstOptsPckg = iInstOpts;
+
+ // Connect to silent installer
+ SwiUI::RSWInstSilentLauncher launcher;
+ TInt err = launcher.Connect();
+ if ( err )
+ {
+ HTI_LOG_FORMAT( "Error connecting to silent installer, err: %d", err );
+ SendErrorMsg( err , KErrDescrFailedConnectSilentInstaller );
+ break;
+ }
+
+ err = launcher.SilentInstall( path, iInstOptsPckg );
+ if ( err )
+ {
+ HTI_LOG_FORMAT( "Error installing software, err: %d", err );
+ launcher.Close();
+ SendErrorMsg( err , KErrDescrFailedInstall );
+ break;
+ }
+
+ launcher.Close();
+ SendMessageL( EOk );
+#else
+ HTI_LOG_TEXT( "============RSoftwareInstall::Install=============" );
+ Usif::RSoftwareInstall installer;
+ TInt err = installer.Connect();
+ if(err)
+ {
+ SendErrorMsg( err , KErrDescrFailedConnectSilentInstaller );
+ HTI_LOG_FORMAT("cannot connect to SIF server, err %d", err);
+ User::Leave(err);
+ }
+ CleanupClosePushL(installer);
+ TRequestStatus status;
+ Usif::COpaqueNamedParams *arguments = Usif::COpaqueNamedParams::NewL();
+ CleanupStack::PushL(arguments);
+ Usif::COpaqueNamedParams *results = Usif::COpaqueNamedParams::NewL();
+ CleanupStack::PushL(results);
+
+ arguments->AddIntL(Usif::KSifInParam_InstallSilently, ETrue);
+
+ TInt intValue = ConvertToSifPolicy(parameters[offset]); offset++;
+ if(intValue != Usif::EAllowed)
+ arguments->AddIntL(Usif::KSifInParam_AllowUpgrade, intValue);
+ HTI_LOG_FORMAT( "iUpgrade: %d", intValue );
+ intValue = ConvertToSifPolicy(parameters[offset]); offset++;
+ if(intValue != Usif::EAllowed)
+ arguments->AddIntL(Usif::KSifInParam_InstallOptionalItems, intValue);
+ HTI_LOG_FORMAT( "iOptionalItems: %d", intValue );
+ intValue = ConvertToSifPolicy(parameters[offset]); offset++;
+ if(intValue != Usif::EAllowed)
+ arguments->AddIntL(Usif::KSifInParam_PerformOCSP, intValue);
+ HTI_LOG_FORMAT( "iOCSP: %d", intValue );
+ intValue = ConvertToSifPolicy(parameters[offset]); offset++;
+ if(intValue != Usif::EAllowed)
+ arguments->AddIntL(Usif::KSifInParam_IgnoreOCSPWarnings, intValue);
+ HTI_LOG_FORMAT( "iIgnoreOCSPWarnings: %d", intValue );
+ intValue = ConvertToSifPolicy(parameters[offset]); offset++;
+ if(intValue != Usif::ENotAllowed)
+ arguments->AddIntL(Usif::KSifInParam_AllowUntrusted, intValue);
+ HTI_LOG_FORMAT( "iUntrusted: %d", intValue );
+ intValue = ConvertToSifPolicy(parameters[offset]); offset++;
+ if(intValue != Usif::EAllowed)
+ arguments->AddIntL(Usif::KSifInParam_PackageInfo, intValue);
+ HTI_LOG_FORMAT( "iPackageInfo: %d", intValue );
+ intValue = ConvertToSifPolicy(parameters[offset]); offset++;
+ if(intValue != Usif::EAllowed)
+ arguments->AddIntL(Usif::KSifInParam_GrantCapabilities,intValue);
+ HTI_LOG_FORMAT( "iCapabilities: %d", intValue );
+ intValue = ConvertToSifPolicy(parameters[offset]); offset++;
+ if(intValue != Usif::EAllowed)
+ arguments->AddIntL(Usif::KSifInParam_AllowAppShutdown,intValue);
+ HTI_LOG_FORMAT( "iKillApp: %d", intValue );
+ intValue = ConvertToSifPolicy(parameters[offset]); offset++;
+ if(intValue != Usif::EAllowed)
+ arguments->AddIntL(Usif::KSifInParam_AllowOverwrite,intValue);
+ HTI_LOG_FORMAT( "iOverwrite: %d", intValue );
+ intValue = ConvertToSifPolicy(parameters[offset]); offset++;
+ if(intValue != Usif::EAllowed)
+ arguments->AddIntL(Usif::KSifInParam_AllowDownload, intValue);
+ HTI_LOG_FORMAT( "iDownload: %d", intValue );
+
+ TBuf<32> login;
+ offset = ParseString( parameters, offset, unicode, login );
+ HTI_LOG_FORMAT( "login length: %d", login.Length() );
+ if(login != KNullDesC)
+ {
+ arguments->AddStringL(Usif::KSifInParam_UserName, login);
+ }
+ HTI_LOG_TEXT( "Parsed login:" );
+ HTI_LOG_DES( login )
+
+ TBuf<32> password;
+ offset = ParseString( parameters, offset, unicode, password );
+ HTI_LOG_FORMAT( "password length: %d", password.Length() );
+ if(password != KNullDesC)
+ {
+ arguments->AddStringL(Usif::KSifInParam_Password, password );
+ }
+ HTI_LOG_TEXT( "Parsed password:" );
+ HTI_LOG_DES( password )
+
+ TChar driver = (TChar) parameters[offset]; offset++;
+ if(driver >= 'A' && driver <= 'Z')
+ {
+ intValue = driver - (TChar)'A';
+ arguments->AddIntL(Usif::KSifInParam_Drive, intValue);
+ HTI_LOG_FORMAT( "iDrive: %c", intValue + 'a' );
+ }
+ else if(driver >= 'a' && driver <= 'z')
+ {
+ intValue = driver - (TChar)'a';
+ arguments->AddIntL(Usif::KSifInParam_Drive, intValue);
+ HTI_LOG_FORMAT( "iDrive: %c", intValue + 'a' );
+ }
+
+ TLanguage oldFormatLanuage = (TLanguage)parameters[offset]; offset++;
+
+ TBool usePhoneLang = (TBool)parameters[offset]; offset++;
+ HTI_LOG_FORMAT( "iUsePhoneLang: %d", usePhoneLang );
+
+ intValue = ConvertToSifPolicy( parameters[offset] );offset++;
+ /*if(intValue != Usif::EAllowed)
+ arguments->AddIntL(Usif::KSifInParam_AllowUpgrade, intValue);*/
+ HTI_LOG_FORMAT( "iUpgradeData: %d", intValue );
+
+ HTI_LOG_FORMAT( "parameters length: %d", parameters.Length());
+ HTI_LOG_FORMAT( "next offset: %d", offset);
+
+ if(usePhoneLang == EFalse)
+ {
+ if(parameters.Length() > offset)
+ {
+ TLanguage language = ELangTest;
+ if (parameters.Length() == offset+2)
+ {
+ language = (TLanguage)(parameters[offset] + (parameters[offset+1]<<8));
+ }
+ else if (parameters.Length() == offset+1)
+ {
+ language = (TLanguage)(parameters[offset]);
+ }
+ if ((language > ELangTest) && (language < ELangMaximum))
+ {
+ arguments->AddIntL(Usif::KSifInParam_Languages, language);
+ HTI_LOG_FORMAT( "iLang: %d", language );
+ }
+ }
+ else
+ {
+ arguments->AddIntL(Usif::KSifInParam_Languages, oldFormatLanuage);
+ HTI_LOG_FORMAT( "iLang0: %d", oldFormatLanuage );
+ }
+ }
+
+ installer.Install(path, *arguments, *results, status);
+ User::WaitForRequest(status);
+ HTI_LOG_FORMAT("install status: %d", status.Int());
+ TInt componentId = 0;
+ TBool idExisted = results->GetIntByNameL(Usif::KSifOutParam_ComponentId, componentId);
+ if ( idExisted )
+ {
+ HTI_LOG_FORMAT( "componentId:%d", componentId);
+ }
+ CleanupStack::PopAndDestroy(3);
+ if (status != KErrNone)
+ {
+ SendErrorMsg( status.Int(), KErrDescrFailedInstall );
+ break;
+ }
+ SendMessageL( EOk );
+#endif
+ }
+ else
+ {
+ HTI_LOG_TEXT( "Error parsing path" );
+ SendErrorMsg( offset , KErrDescrInvalidArguments );
+ }
+ }
+ else
+ {
+ SendErrorMsg( KErrArgument, KErrDescrInvalidCmd );
+ }
+ }
+ break;
+
+ case EUnInstall:
+ case EUnInstallName:
+ case EUnInstallName_u:
+ {
+ TPtrC8 parameters = aMessage.Mid( 1 );
+ if ( ( aMessage[0] == EUnInstall && parameters.Length() != 7 ) ||
+ ( aMessage[0] == EUnInstallName &&
+ parameters.Length() != parameters[0] + 4 ) ||
+ ( aMessage[0] == EUnInstallName_u &&
+ parameters.Length() != parameters[0] * 2 + 4 ) )
+ {
+ HTI_LOG_FORMAT( "Invalid command length: %d",
+ parameters.Length() );
+ SendErrorMsg( KErrArgument, KErrDescrInvalidCmd );
+ break;
+ }
+
+ TInt offset = 0;
+ TInt32 uid = KErrNotFound;
+ HBufC* packageName = NULL;
+#if ( SYMBIAN_VERSION_SUPPORT >= SYMBIAN_4 )
+ Usif::TComponentId cid = KErrNotFound;
+ HTI_LOG_TEXT( "============RSoftwareInstall::Uninstall=============" );
+ Usif::RSoftwareInstall installer;
+ TInt err = installer.Connect();
+ if(err)
+ {
+ SendErrorMsg( err , KErrDescrFailedConnectSilentInstaller );
+ HTI_LOG_FORMAT("cannot connect to SIF server, err %d", err);
+ User::Leave(err);
+ }
+ CleanupClosePushL(installer);
+ TRequestStatus status;
+ Usif::COpaqueNamedParams *arguments = Usif::COpaqueNamedParams::NewL();
+ CleanupStack::PushL(arguments);
+ Usif::COpaqueNamedParams *results = Usif::COpaqueNamedParams::NewL();
+ CleanupStack::PushL(results);
+#endif
+ if ( aMessage[0] == EUnInstall )
+ {
+ uid = Parse32<TInt32>( parameters );
+ offset += 4;
+ HTI_LOG_FORMAT( "Uninstall by uid: %d", uid );
+#if ( SYMBIAN_VERSION_SUPPORT >= SYMBIAN_4 )
+ cid = GetComponentIdFromUid(uid);
+ if ( cid == KErrNotFound )
+ {
+ HTI_LOG_FORMAT( "cid: %d", cid );
+ SendErrorMsg( KErrNotFound, KErrDescrBadComponentId );
+ CleanupStack::PopAndDestroy(3); //results, arguments, installer
+ break;
+ }
+#endif
+ }
+ else
+ {
+ packageName = HBufC::NewLC( parameters[offset] );
+ TPtr namePtr = packageName->Des();
+ offset = ParseString( parameters, offset, unicode, namePtr );
+ HTI_LOG_FORMAT( "Uninstall by name: %S", packageName );
+#if ( SYMBIAN_VERSION_SUPPORT >= SYMBIAN_4 )
+ cid = GetComponentIdFromPackageName(*packageName);
+ CleanupStack::PopAndDestroy(); // packageName
+ if ( cid == KErrNotFound )
+ {
+ HTI_LOG_FORMAT( "cid: %d", cid );
+ SendErrorMsg( KErrNotFound, KErrDescrFailedFindPackage );
+ CleanupStack::PopAndDestroy(3); //results, arguments, installer
+ break;
+ }
+#endif
+ }
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
+ iUnInstOpts = SwiUI::TUninstallOptions();
+ iUnInstOpts.iKillApp = ConvertToPolicy( parameters[offset] );
+ offset++;
+ iUnInstOpts.iBreakDependency = ConvertToPolicy( parameters[offset] );
+ offset++;
+ HTI_LOG_FORMAT( "iKillApp: %d", iUnInstOpts.iKillApp );
+ HTI_LOG_FORMAT( "iBreakDependency: %d", iUnInstOpts.iBreakDependency );
+
+ TInt mimeIndex = parameters[offset];
+ if ( mimeIndex > iMimeTypes->Count() - 1 )
+ {
+ HTI_LOG_FORMAT( "Invalid mime type: %d", mimeIndex );
+ SendErrorMsg( KErrArgument, KErrDescrInvalidCmd );
+ break;
+ }
+
+ HTI_LOG_TEXT( "Uninstall mime type:" );
+ HTI_LOG_DES( (*iMimeTypes)[mimeIndex] );
+
+ TInt err = KErrNone;
+ iAugmentationIndex = 0;
+ if ( packageName )
+ {
+ TRAP( err, uid = GetPackageUidL( *packageName, mimeIndex ) );
+ CleanupStack::PopAndDestroy(); // packageName
+ iAugmentations.ResetAndDestroy();
+ if ( err != KErrNone )
+ {
+ SendErrorMsg( err, KErrDescrFailedFindPackage );
+ break;
+ }
+ }
+ HTI_LOG_FORMAT( "UID = %d", uid );
+
+ iUnInstOptsPckg = iUnInstOpts;
+
+ // Connect to silent installer
+ SwiUI::RSWInstSilentLauncher launcher;
+ err = launcher.Connect();
+ if ( err )
+ {
+ HTI_LOG_FORMAT( "Error connecting to silent installer, err: %d", err );
+ SendErrorMsg( err , KErrDescrFailedConnectSilentInstaller );
+ break;
+ }
+
+ if ( iAugmentationIndex > 0 )
+ {
+ SwiUI::TOpUninstallIndexParam params;
+ params.iUid = TUid::Uid( uid );
+ params.iIndex = iAugmentationIndex;
+ SwiUI::TOpUninstallIndexParamPckg paramPckg( params );
+ SwiUI::TOperation operation( SwiUI::EOperationUninstallIndex );
+ err = launcher.SilentCustomUninstall( operation, iUnInstOptsPckg,
+ paramPckg, (*iMimeTypes)[mimeIndex] );
+ }
+ else
+ {
+ err = launcher.SilentUninstall( TUid::Uid( uid ), iUnInstOptsPckg,
+ (*iMimeTypes)[mimeIndex] );
+ }
+
+ if ( err )
+ {
+ HTI_LOG_FORMAT( "Error uninstalling software, err: %d", err );
+ launcher.Close();
+ SendErrorMsg( err , KErrDescrFailedUnInstall );
+ break;
+ }
+
+ launcher.Close();
+#else
+
+ TInt intValue = ConvertToSifPolicy( parameters[offset] );
+ offset++;
+ arguments->AddIntL(Usif::KSifInParam_AllowAppShutdown, intValue);
+ HTI_LOG_FORMAT( "iKillApp: %d", intValue );
+ intValue = ConvertToSifPolicy( parameters[offset] );
+ offset++;
+ arguments->AddIntL(Usif::KSifInParam_AllowAppBreakDependency, intValue);
+ HTI_LOG_FORMAT( "iBreakDependency: %d", intValue );
+
+ TInt mimeIndex = parameters[offset];
+ if ( mimeIndex > iMimeTypes->Count() - 1 )
+ {
+ HTI_LOG_FORMAT( "Invalid mime type: %d", mimeIndex );
+ SendErrorMsg( KErrArgument, KErrDescrInvalidCmd );
+ break;
+ }
+
+ HTI_LOG_TEXT( "Uninstall mime type:" );
+ HTI_LOG_DES( (*iMimeTypes)[mimeIndex] );
+
+ HBufC* buf = HBufC::NewLC((*iMimeTypes)[mimeIndex].Length());
+ TPtr ptr = buf->Des();
+ ptr.Copy((*iMimeTypes)[mimeIndex]);
+ arguments->AddStringL(Usif::KSifInParam_MimeType, *buf);
+ CleanupStack::PopAndDestroy(); // buf
+
+ HTI_LOG_FORMAT( "Component ID = %d", cid );
+
+ arguments->AddIntL(Usif::KSifInParam_InstallSilently, ETrue);
+
+ installer.Uninstall(cid, *arguments, *results, status, EFalse);
+ User::WaitForRequest(status);
+ HTI_LOG_FORMAT("uninstall status:%d", status.Int());
+ CleanupStack::PopAndDestroy(3); //results, arguments, installer
+ if (status != KErrNone)
+ {
+ SendErrorMsg(status.Int(), KErrDescrFailedUnInstall);
+ break;
+ }
+#endif
+ SendMessageL( EOk );
+ }
+ break;
+
+ default:
+ {
+ SendErrorMsg( KErrArgument, KErrDescrInvalidCmd );
+ }
+ }
+
+ HTI_LOG_FUNC_OUT( "CHtiAppControl::HandleInstallerControlL" );
+ }
+
+
+void CHtiAppControl::HandleStartProcessL( const TDesC& aProgramName,
+ const TDesC& aCmdLine,
+ TBool aStoreProcessHandle )
+ {
+ HTI_LOG_FUNC_IN( "CHtiAppControl::HandleStartProcessL" );
+ HTI_LOG_FORMAT( "progr name %d", aProgramName.Length() );
+ HTI_LOG_DES( aProgramName );
+
+ RProcess process;
+ TInt err = process.Create( aProgramName, aCmdLine ); // command parameters
+
+ if ( err == KErrNone )
+ {
+ CleanupClosePushL( process );
+
+ //convert process id to binary des
+ TUint processId = process.Id();
+ HTI_LOG_FORMAT( "process id %d", processId );
+
+ TBuf8<KTUintLength> processIdDes;
+ processIdDes.Append(
+ ( TUint8* )( &processId ), KTUintLength );
+
+ SendMessageL( EOk, processIdDes );
+
+ process.Resume();
+
+ if ( aStoreProcessHandle )
+ {
+ HTI_LOG_TEXT( "Storing the process handle" );
+ iProcessHandleArray.Append( process );
+ CleanupStack::Pop();
+ }
+ else
+ {
+ CleanupStack::PopAndDestroy();
+ }
+ }
+ else if ( err == KErrNotFound )
+ {
+ SendMessageL( ENotFound );
+ }
+ else
+ {
+ SendErrorMsg( err ,KErrDescrFailedCreateProcess );
+ }
+
+ HTI_LOG_FUNC_OUT( "CHtiAppControl::HandleStartProcessL" );
+ }
+
+void CHtiAppControl::HandleStopProcessL( RProcess& aProcess )
+ {
+ if ( aProcess.ExitType() == EExitPending )
+ {
+ aProcess.Kill( KTerminateReason );
+ SendMessageL( EOk );
+ }
+ else
+ {
+ SendMessageL( EAlreadyStopped );
+ }
+ }
+
+void CHtiAppControl::HandleStatusProcessL( RProcess& aProcess )
+ {
+ TExitType exT = aProcess.ExitType();
+
+ switch ( exT )
+ {
+ case EExitPending:
+ {
+ SendMessageL( ERunning );
+ }
+ break;
+ case EExitKill:
+ case EExitTerminate:
+ {
+ SendMessageL( EKilled );
+ }
+ break;
+ case EExitPanic:
+ {
+ SendMessageL( EPanic );
+ }
+ break;
+ };
+ }
+
+
+void CHtiAppControl::HandleListProcessesL( const TDesC& aMatch )
+ {
+ HTI_LOG_FUNC_IN( "CHtiAppControl::HandleListProcessesL" );
+
+ RProcess process;
+ TFullName processName;
+ TUint processId;
+ TBuf8<KTUintLength> processIdDes;
+ TExitType exitType;
+
+ TBuf8<128> buf;
+ CBufFlat* processListBuf = NULL;
+ TRAPD( err, processListBuf = CBufFlat::NewL( 128 ) );
+ if ( err )
+ {
+ SendErrorMsg( err ,KErrDescrNoMemory );
+ return;
+ }
+
+ CleanupStack::PushL( processListBuf );
+
+ // The default match pattern is the single character *
+ TFindProcess finder;
+
+ // if some real match pattern is defined, use it
+ if ( aMatch.Length() > 0 )
+ {
+ HTI_LOG_TEXT( "Match pattern was given:" );
+ HTI_LOG_DES( aMatch );
+ finder.Find( aMatch );
+ }
+
+ TInt pos = 0;
+ TUint numberOfEntries = 0;
+
+ while ( finder.Next( processName ) == KErrNone )
+ {
+ err = process.Open( finder );
+
+ //convert process id to binary des
+ processId = process.Id();
+ processIdDes.Append( ( TUint8* ) ( &processId ), KTUintLength );
+ buf.Append( processIdDes );
+
+ // status
+ exitType = process.ExitType();
+ switch ( exitType )
+ {
+ case EExitPending:
+ {
+ buf.Append( ERunning );
+ }
+ break;
+ case EExitKill:
+ case EExitTerminate:
+ {
+ buf.Append( EKilled );
+ }
+ break;
+ case EExitPanic:
+ {
+ buf.Append( EPanic );
+ }
+ break;
+ };
+
+ // name length
+ buf.Append( processName.Length() );
+
+ // name
+ buf.Append( processName );
+
+ process.Close();
+
+ TRAP( err, processListBuf->ExpandL( pos, buf.Length() ) );
+ if ( err )
+ {
+ SendErrorMsg( err , KErrDescrNoMemory );
+ delete processListBuf;
+ return;
+ }
+ processListBuf->Write( pos, buf, buf.Length() );
+
+ pos += buf.Length();
+ buf.Zero();
+ processIdDes.Zero();
+ numberOfEntries++;
+ }
+
+ // insert the number of entries in the beginning
+ TBuf8<2> entries;
+ entries.Append( ( TUint8* ) ( &numberOfEntries ), 2 );
+ processListBuf->ExpandL( 0, 2 );
+ processListBuf->Write( 0, entries, 2 );
+
+ SendMessageL( EOk, processListBuf->Ptr( 0 ) );
+
+ CleanupStack::PopAndDestroy( processListBuf );
+
+ HTI_LOG_FUNC_OUT( "CHtiAppControl::HandleListProcessesL" );
+ }
+
+
+void CHtiAppControl::HandleStartAppL( TApaAppInfo &aAppInfo,
+ const TDesC& aDocName )
+ {
+ HTI_LOG_FUNC_IN( "CHtiAppControl::HandleStartAppL" );
+
+ // Check if app is running as a root app (not embedded)
+ TApaTask task = FindRunningRootApp( aAppInfo.iUid );
+ if ( task.Exists() )
+ {
+ User::ResetInactivityTime();
+ task.BringToForeground();
+ SendMessageL( EAlreadyRunning );
+ }
+ else
+ {
+ TThreadId threadId;
+ TInt err = KErrNone;
+ if ( aAppInfo.iUid != TUid::Null() )
+ {
+ TApaAppCapabilityBuf capBuf;
+ err = iAppServer.GetAppCapability( capBuf, aAppInfo.iUid );
+ TApaAppCapability& caps = capBuf();
+ CApaCommandLine* cmdLine = CApaCommandLine::NewLC();
+ cmdLine->SetExecutableNameL( aAppInfo.iFullName );
+ if ( caps.iLaunchInBackground )
+ {
+ cmdLine->SetCommandL( EApaCommandBackground );
+ HTI_LOG_TEXT( "Launching in background" );
+ }
+ else
+ {
+ if ( aDocName != KNullDesC )
+ {
+ cmdLine->SetCommandL( EApaCommandOpen );
+ cmdLine->SetDocumentNameL( aDocName );
+ HTI_LOG_TEXT( "Launching with document" );
+ }
+ else
+ {
+ cmdLine->SetCommandL( EApaCommandRun );
+ HTI_LOG_TEXT( "Launching without document" );
+ }
+ }
+ err = iAppServer.StartApp( *cmdLine, threadId );
+ CleanupStack::PopAndDestroy( cmdLine );
+ }
+ else if ( aDocName != KNullDesC )
+ {
+ HTI_LOG_TEXT( "Launching a document" );
+ /*
+ * If the app that should handle the doc is already running, we
+ * try to switch the open file and bring it to foreground. Whether
+ * switching the file works depends on the application: It must
+ * implement CEikAppUi::OpenFileL() or CAknAppUi::OpenFileL() in S60.
+ */
+ TUid appUid;
+ TDataType dataType;
+ err = iAppServer.AppForDocument( aDocName, appUid, dataType );
+ if ( err == KErrNone )
+ {
+ TApaTask task = FindRunningRootApp( appUid );
+ if ( task.Exists() )
+ {
+ HTI_LOG_TEXT( "App for doc already running, switch file" );
+ err = task.SwitchOpenFile( aDocName );
+ task.BringToForeground();
+ }
+ else
+ {
+ err = iAppServer.StartDocument( aDocName, threadId );
+ }
+ }
+ }
+ else
+ {
+ User::Leave( KErrArgument );
+ }
+
+ if ( err == KErrNone )
+ {
+ User::ResetInactivityTime();
+ //convert thread id to string
+ TUint threadIdUint = threadId; //cast to UInt
+ TBuf8<KTUintLength> threadIdDes;
+ threadIdDes.Append( ( TUint8* )( &threadIdUint ), KTUintLength );
+ SendMessageL( EOk, threadIdDes );
+ }
+ else if ( err == KErrNotFound )
+ {
+ SendMessageL( ENotFound );
+ }
+ else
+ {
+ SendErrorMsg( err, KErrDescrFailedStartApp );
+ }
+ }
+ HTI_LOG_FUNC_OUT( "CHtiAppControl::HandleStartAppL" );
+ }
+
+void CHtiAppControl::HandleListInstalledAppsL( TBool aUnicode )
+ {
+ HTI_LOG_FUNC_IN( "CHtiAppControl::HandleListInstalledAppsL" );
+
+ // max file name + max caption + max short caption + 7 constant bytes
+ TInt bufSize = KMaxFileName + 2 * KApaMaxAppCaption + 7;
+ if ( aUnicode )
+ {
+ bufSize *= 2;
+ }
+
+ CBufFlat* appListBuf = CBufFlat::NewL( bufSize );
+ CleanupStack::PushL( appListBuf );
+
+ HBufC8* appsArray = HBufC8::NewLC( bufSize );
+ TPtr8 appsArrayPtr = appsArray->Des();
+
+ TInt err = KErrNone;
+ err = iAppServer.GetAllApps();
+ if ( err != KErrNone )
+ {
+ SendErrorMsg( err, KErrDescrFailedListInstApps );
+ }
+ else
+ {
+ TApaAppInfo appInfo;
+ TInt pos( 0 );
+
+ // Add application count
+ TInt numOfEntries = 0;
+ iAppServer.AppCount( numOfEntries );
+
+ appsArrayPtr.Append( ( TUint8*) ( &numOfEntries ), 2 );
+
+ while ( iAppServer.GetNextApp( appInfo ) == KErrNone )
+ {
+ TUint appUidUint = appInfo.iUid.iUid;
+ appsArrayPtr.Append( ( TUint8* ) &appUidUint, KTUintLength );
+
+ // Add length of full name
+ appsArrayPtr.Append( appInfo.iFullName.Length() );
+ // Add full name if there is one
+ if ( appInfo.iFullName.Length() > 0 )
+ {
+ if ( aUnicode )
+ {
+ appsArrayPtr.Append( ( TUint8* ) appInfo.iFullName.Ptr(),
+ appInfo.iFullName.Length() * 2 );
+ }
+ else
+ {
+ appsArrayPtr.Append( appInfo.iFullName );
+ }
+ }
+
+ // Add length of caption
+ appsArrayPtr.Append( appInfo.iCaption.Length() );
+ // Add caption if there is one
+ if ( appInfo.iCaption.Length() > 0 )
+ {
+ if ( aUnicode )
+ {
+ appsArrayPtr.Append( ( TUint8* ) appInfo.iCaption.Ptr(),
+ appInfo.iCaption.Length() * 2 );
+ }
+ else
+ {
+ appsArrayPtr.Append( appInfo.iCaption );
+ }
+ }
+
+ // Add length of short caption
+ appsArrayPtr.Append( appInfo.iShortCaption.Length() );
+ // Add short caption if there is one
+ if ( appInfo.iShortCaption.Length() > 0 )
+ {
+ if ( aUnicode )
+ {
+ appsArrayPtr.Append( ( TUint8* ) appInfo.iShortCaption.Ptr(),
+ appInfo.iCaption.Length() * 2 );
+ }
+ else
+ {
+ appsArrayPtr.Append( appInfo.iShortCaption );
+ }
+ }
+
+ // Add app info to response buffer
+ appListBuf->ExpandL( pos, appsArray->Length() );
+ appListBuf->Write( pos, *appsArray, appsArray->Length() );
+
+ pos += appsArray->Length();
+ appsArrayPtr.Zero();
+ }
+
+ SendMessageL( EOk, appListBuf->Ptr( 0 ) );
+ }
+
+ CleanupStack::PopAndDestroy( 2 ); //appListBuf, appsArray
+
+ HTI_LOG_FUNC_IN( "CHtiAppControl::HandleListInstalledAppsL" );
+ }
+
+void CHtiAppControl::HandleListAppsL( TBool aIncludeHidden,
+ TBool aIncludeSystem,
+ TBool aUnicode )
+ {
+ HTI_LOG_FUNC_IN( "CHtiAppControl::HandleListAppsL" );
+
+ RArray<RWsSession::TWindowGroupChainInfo>* wgChain = new ( ELeave )
+ RArray<RWsSession::TWindowGroupChainInfo>( 12 );
+ CleanupDeletePushL( wgChain );
+ CleanupClosePushL( *wgChain );
+ User::LeaveIfError( iWs.WindowGroupList( 0, wgChain ) );
+ TInt wgCount = wgChain->Count();
+
+ HTI_LOG_FORMAT( "%d Window Groups in the chain", wgCount );
+
+ TInt bufSize = 2 * KMaxFileName + 11; // caption & document + 11 constant bytes
+ if ( aUnicode )
+ {
+ bufSize *= 2;
+ }
+ CBufFlat* appListBuf = CBufFlat::NewL( bufSize );
+ CleanupStack::PushL( appListBuf );
+ HBufC8* buf = HBufC8::NewLC( bufSize );
+ TPtr8 bufPtr = buf->Des();
+
+ TInt pos = 0;
+ TInt numOfEntries = 0;
+
+ for ( TInt i = 0; i < wgCount; i++ )
+ {
+ const RWsSession::TWindowGroupChainInfo& info = ( *wgChain )[i];
+ CApaWindowGroupName* wgName = CApaWindowGroupName::NewLC( iWs, info.iId );
+
+ HTI_LOG_FORMAT( "WG ID: %d", info.iId );
+ HTI_LOG_DES( wgName->WindowGroupName() );
+
+ // Info is returned only from root tasks and system and hidden tasks
+ // are included only if requested.
+ if ( info.iParentId <= 0 &&
+ ( !wgName->IsSystem() || aIncludeSystem ) &&
+ ( !wgName->Hidden() || aIncludeHidden ) )
+ {
+ // Add application UID
+ TUint appUidUint = wgName->AppUid().iUid;
+ bufPtr.Append( ( TUint8* ) &appUidUint, KTUintLength );
+
+ // Add caption
+ TPtrC caption = wgName->Caption();
+ bufPtr.Append( caption.Length() );
+ if ( caption.Length() > 0 )
+ {
+ if ( aUnicode )
+ {
+ bufPtr.Append(
+ ( TUint8* ) caption.Ptr(), caption.Length() * 2 );
+ }
+ else
+ {
+ bufPtr.Append( caption );
+ }
+ }
+
+ // Add document name
+ TPtrC document = wgName->DocName();
+ bufPtr.Append( document.Length() );
+ if ( document.Length() > 0 )
+ {
+ if ( aUnicode )
+ {
+ bufPtr.Append(
+ ( TUint8* ) document.Ptr(), document.Length() * 2 );
+ }
+ else
+ {
+ bufPtr.Append( document );
+ }
+ }
+
+ // Add Hidden flag
+ if ( wgName->Hidden() )
+ bufPtr.Append( 1 );
+ else
+ bufPtr.Append( 0 );
+
+ // Add System flag
+ if ( wgName->IsSystem() )
+ bufPtr.Append( 1 );
+ else
+ bufPtr.Append( 0 );
+
+ // Add Ready flag
+ if ( wgName->IsAppReady() )
+ bufPtr.Append( 1 );
+ else
+ bufPtr.Append( 0 );
+
+ // Add Busy flag
+ if ( wgName->IsBusy() )
+ bufPtr.Append( 1 );
+ else
+ bufPtr.Append( 0 );
+
+ // Add Shutdown response flag
+ if ( wgName->RespondsToShutdownEvent() )
+ bufPtr.Append( 1 );
+ else
+ bufPtr.Append( 0 );
+
+ // Add this task's info to response buffer
+ appListBuf->ExpandL( pos, buf->Length() );
+ appListBuf->Write( pos, *buf, buf->Length() );
+
+ pos += buf->Length();
+ bufPtr.Zero();
+ numOfEntries++;
+ } // if
+ CleanupStack::PopAndDestroy(); // wgName
+ } // for
+
+ CleanupStack::PopAndDestroy(); // buf
+
+ // Add number of entries to the beginning of the response
+ TBuf8<2> entries;
+ entries.Append( ( TUint8* ) ( &numOfEntries ), 2 );
+ appListBuf->ExpandL( 0, 2 );
+ appListBuf->Write( 0, entries, 2 );
+
+ SendMessageL( EOk, appListBuf->Ptr( 0 ) );
+
+ CleanupStack::PopAndDestroy( 3 ); // appListBuf, wgChain Close, wgChain delete
+
+ HTI_LOG_FUNC_OUT( "CHtiAppControl::HandleListAppsL" );
+ }
+
+TBool CHtiAppControl::FindAppL( TApaAppInfo& aAppInfo,
+ const TDesC& aAppFullName )
+ {
+ HTI_LOG_FUNC_IN( "CHtiAppControl::FindAppL name" );
+ TInt err = KErrNone;
+ err = iAppServer.GetAllApps();
+ if ( err != KErrNone )
+ {
+ SendErrorMsg( err, KErrDescrFailedFindApp );
+ return EFalse;
+ }
+
+ TParse toFind;
+ err = toFind.SetNoWild( aAppFullName, NULL, NULL );
+ if ( err != KErrNone )
+ {
+ SendErrorMsg( err, KErrDescrFailedFindApp );
+ return EFalse;
+ }
+
+ TBool isFullName = ( toFind.DrivePresent() && toFind.PathPresent() );
+
+ while ( ( err = iAppServer.GetNextApp( aAppInfo) ) == KErrNone )
+ {
+ if ( isFullName ) // assume that full path has been given
+ {
+ if ( !aAppFullName.CompareF( aAppInfo.iFullName ) )
+ {
+ return ETrue;
+ }
+ }
+ else // assume that only filename has been given
+ {
+ TParsePtrC current( aAppInfo.iFullName );
+
+ // does the given filename contain extension
+ if ( toFind.ExtPresent() )
+ {
+ // compare with filename + extension
+ if ( !toFind.NameAndExt().CompareF( current.NameAndExt() ) )
+ {
+ return ETrue;
+ }
+ }
+ else
+ {
+ // compare with filename only
+ if ( !toFind.Name().CompareF( current.Name() ) )
+ {
+ return ETrue;
+ }
+ // Try to match the caption.
+ // For Java MIDlets the full name is like C:\270194328.fakeapp
+ // so we have to use caption to find MIDlets.
+ if ( !toFind.Name().CompareF( aAppInfo.iCaption ) )
+ {
+ return ETrue;
+ }
+ }
+ }
+ }
+
+ if ( err == RApaLsSession::ENoMoreAppsInList )
+ {
+ SendMessageL( ENotFound );
+ }
+ else if ( err != KErrNone )
+ {
+ SendErrorMsg( err,KErrDescrFailedFindApp );
+ }
+ HTI_LOG_FUNC_OUT( "CHtiAppControl::FindAppL name" );
+ return EFalse;
+ }
+
+TBool CHtiAppControl::FindAppL( TApaAppInfo &aAppInfo,
+ const TInt32 aUid )
+ {
+ HTI_LOG_FUNC_IN( "CHtiAppControl::FindAppL uid" );
+ TInt err = iAppServer.GetAppInfo( aAppInfo, TUid::Uid( aUid ) );
+ if ( err == KErrNone )
+ {
+ return ETrue;
+ }
+ else if ( err == KErrNotFound )
+ {
+ SendMessageL( ENotFound );
+ }
+ else
+ {
+ SendErrorMsg( err , KErrDescrFailedFindApp );
+ }
+ HTI_LOG_FUNC_OUT( "CHtiAppControl::FindAppL uid" );
+ return EFalse;
+ }
+
+TApaTask CHtiAppControl::FindRunningRootApp( TUid aAppUid )
+ {
+ HTI_LOG_FUNC_IN( "CHtiAppControl::FindRunningRootApp" );
+ TApaTask task( iWs );
+ task.SetWgId( 0 ); // initialize to empty task
+
+ TInt wgId = 0; // on first call to FindByAppUid wgId must be zero
+ CApaWindowGroupName::FindByAppUid( aAppUid, iWs, wgId );
+ HTI_LOG_FORMAT( "FindByAppUid returned WG ID: %d", wgId );
+
+ RArray<RWsSession::TWindowGroupChainInfo> wgs;
+ TInt err = KErrNone;
+ TInt wgCount = 0;
+ if ( wgId != KErrNotFound )
+ {
+ // Get a list of Window Group Chain Infos
+ err = iWs.WindowGroupList( 0, &wgs ); // get only priority 0 WGs
+ wgCount = wgs.Count();
+ HTI_LOG_FORMAT( "WindowGroupList returned %d WGs", wgCount );
+ }
+ while ( wgId != KErrNotFound && task.WgId() == 0 && err == KErrNone )
+ {
+ // App was found - check if it is root by looping through the
+ // WG chain infos to find the one with out wgId
+ TInt i = 0;
+ while ( task.WgId() == 0 && i < wgCount )
+ {
+ const RWsSession::TWindowGroupChainInfo& info = wgs[i];
+ if ( info.iId == wgId && info.iParentId <= 0 )
+ {
+ // This is the one and it is root (does not have parent)
+ task.SetWgId( wgId );
+ }
+ i++;
+ }
+ if ( task.WgId() == 0 )
+ {
+ // This was not root - check if there's more instances of the app
+ CApaWindowGroupName::FindByAppUid( aAppUid, iWs, wgId );
+ HTI_LOG_FORMAT( "FindByAppUid returned WG ID: %d", wgId );
+ }
+ }
+
+ wgs.Close();
+ HTI_LOG_FORMAT( "Returning task with WG ID %d", task.WgId() );
+ HTI_LOG_FUNC_OUT( "CHtiAppControl::FindRunningRootApp" );
+ return task;
+ }
+
+TInt CHtiAppControl::OpenProcessL( RProcess& aProcess,
+ const TDesC& aMatch )
+ {
+ HTI_LOG_FUNC_IN( "CHtiAppControl::OpenProcessL" );
+ TFullName processName;
+ TInt err = KErrNone;
+ TFindProcess finder( aMatch );
+
+ err = finder.Next( processName );
+ if ( err == KErrNone )
+ {
+ err = aProcess.Open( finder );
+ }
+
+ HTI_LOG_FUNC_OUT( "CHtiAppControl::OpenProcessL" );
+ return err;
+ }
+
+template<class T> T CHtiAppControl::Parse32(
+ const TDesC8& a32int )
+ {
+ //manually construct TUint or TInt32
+ return T( a32int[0] + ( a32int[1] << 8 ) +
+ ( a32int[2] << 16) + ( a32int[3] << 24) );
+ }
+
+void CHtiAppControl::SendMessageL( TAppCommand aResponseCode,
+ const TDesC8& aMsg )
+ {
+ HTI_LOG_FORMAT( "SendMessage %d", aResponseCode );
+ HTI_LOG_FORMAT( "Message len %d", aMsg.Length() );
+ HBufC8* sendMsg = HBufC8::NewL( 1 + aMsg.Length() );
+ CleanupStack::PushL( sendMsg );
+ sendMsg->Des().Append( aResponseCode );
+ sendMsg->Des().Append( aMsg );
+
+ User::LeaveIfError( iDispatcher->DispatchOutgoingMessage(
+ sendMsg,
+ KAppServiceUid ) );
+ CleanupStack::Pop();
+ }
+
+inline TInt CHtiAppControl::SendErrorMsg( TInt anError,
+ const TDesC8& aMsg )
+ {
+ return iDispatcher->DispatchOutgoingErrorMessage( anError,
+ aMsg,
+ KAppServiceUid );
+ }
+
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
+SwiUI::TPolicy CHtiAppControl::ConvertToPolicy( const TInt8 aValue )
+ {
+ if ( aValue == 0 ) return SwiUI::EPolicyNotAllowed;
+
+ return SwiUI::EPolicyAllowed;
+ }
+#else
+Usif::TSifPolicy CHtiAppControl::ConvertToSifPolicy( const TInt8 aValue )
+ {
+ if ( aValue == 0 ) return Usif::ENotAllowed;
+
+ return Usif::EAllowed;
+ }
+#endif
+
+TBool CHtiAppControl::ValidateInstallParams( const TDesC8& aParams, TBool aIsUnicode )
+ {
+ HTI_LOG_FORMAT( "ValidateInstallParams => length: %d", aParams.Length() );
+ if ( aParams.Length() > 0 )
+ {
+ TInt offset = 0;
+ TInt length = aParams[offset]; // inst package path length;
+ if ( aIsUnicode ) length *= 2;
+ offset++;
+ if ( aParams.Length() < offset + length )
+ {
+ HTI_LOG_TEXT( "ValidateInstallParams: Failed, data missing in inst pkg path" );
+ return EFalse;
+ }
+
+ offset += length; // skip over inst package path
+ offset += 10; // skip over the following one byte params
+
+ if ( aParams.Length() < offset )
+ {
+ HTI_LOG_TEXT( "ValidateInstallParams: Failed, data missing in one byte params" );
+ return EFalse;
+ }
+
+ length = aParams[offset]; // login username length;
+ if ( aIsUnicode ) length *= 2;
+ offset++;
+ if ( aParams.Length() < offset + length )
+ {
+ HTI_LOG_TEXT( "ValidateInstallParams: Failed, data missing in username" );
+ return EFalse;
+ }
+
+ offset += length; // skip over login username
+
+ length = aParams[offset]; // password length;
+ if ( aIsUnicode ) length *= 2;
+ offset++;
+ if ( aParams.Length() < offset + length )
+ {
+ HTI_LOG_TEXT( "ValidateInstallParams: Failed, data missing in password" );
+ return EFalse;
+ }
+
+ offset += length; // skip over password
+ offset += 4; // the last one byte params
+
+ if ( aParams.Length() < offset || aParams.Length() > offset + 2)
+ {
+ HTI_LOG_TEXT( "ValidateInstallParams: Failed, final length incorrect" );
+ return EFalse;
+ }
+
+ return ETrue;
+ }
+
+ return EFalse;
+ }
+
+#if ( SYMBIAN_VERSION_SUPPORT < SYMBIAN_4 )
+TInt CHtiAppControl::GetPackageUidL( const TDesC& aPackageName,
+ TInt aMimeIndex )
+ {
+ HTI_LOG_FUNC_IN( "CHtiAppControl::GetPackageUidL" );
+
+ if ( aMimeIndex >= 0 && aMimeIndex < 2 ) // SIS
+ {
+ Swi::RSisRegistrySession regSession;
+ User::LeaveIfError( regSession.Connect() );
+ CleanupClosePushL( regSession );
+
+ RArray<TUid> uids;
+ CleanupClosePushL( uids );
+ regSession.InstalledUidsL( uids );
+ TInt count = uids.Count();
+ HTI_LOG_FORMAT( "Found %d SISx installations", count );
+ for ( TInt i = 0; i < count; i++ )
+ {
+ Swi::RSisRegistryEntry entry;
+ CleanupClosePushL( entry );
+ User::LeaveIfError( entry.Open( regSession, uids[i] ) );
+ if ( !entry.IsInRomL() && entry.IsPresentL() )
+ {
+ if ( aPackageName.Compare( *( entry.PackageNameL() ) ) == 0 )
+ {
+ HTI_LOG_TEXT( "Matching SIS package found" );
+ TInt uid = entry.UidL().iUid;
+ CleanupStack::PopAndDestroy( 3 ); // entry, uids, regSession
+ return uid;
+ }
+ }
+ // Check augmentations of this entry
+ entry.AugmentationsL( iAugmentations );
+ TInt augCount = iAugmentations.Count();
+ for ( TInt j = 0; j < augCount; j++ )
+ {
+ Swi::RSisRegistryEntry augmentation;
+ CleanupClosePushL( augmentation );
+ augmentation.OpenL( regSession, *iAugmentations[j] );
+ if ( aPackageName.Compare(
+ *( augmentation.PackageNameL() ) ) == 0 )
+ {
+ if ( !augmentation.IsInRomL() && augmentation.IsPresentL() )
+ {
+ HTI_LOG_TEXT( "Matching SIS augmentation found" );
+ TInt uid = augmentation.UidL().iUid;
+ Swi::CSisRegistryPackage* pkg = augmentation.PackageL();
+ iAugmentationIndex = pkg->Index();
+ delete pkg;
+ HTI_LOG_FORMAT( "Aug. index %d", iAugmentationIndex );
+ CleanupStack::PopAndDestroy( 4 ); // augmentation, entry, uids, regSession
+ return uid;
+ }
+ }
+ CleanupStack::PopAndDestroy(); // augmentation
+ } // for j
+ iAugmentations.ResetAndDestroy();
+ CleanupStack::PopAndDestroy(); // entry
+ } // for i
+ User::Leave( KErrNotFound );
+ }
+
+ else if ( aMimeIndex > 2 && aMimeIndex < 7 ) // Java
+ {
+ RArray<TUid> uids;
+ CleanupClosePushL( uids );
+
+ CJavaRegistry* javaRegistry = CJavaRegistry::NewLC();
+ javaRegistry->GetRegistryEntryUidsL( uids );
+
+ TInt uid = KErrNotFound;
+ TInt count = uids.Count();
+ HTI_LOG_FORMAT( "Found %d Java installations", count );
+ for ( TInt i = 0; i < count; i++ )
+ {
+ CJavaRegistryEntry* entry = javaRegistry->RegistryEntryL( uids[i] );
+ if ( entry )
+ {
+ CleanupStack::PushL( entry );
+ if ( entry->Type() >= EGeneralPackage &&
+ entry->Type() < EGeneralApplication )
+ {
+ // entry was a package (MIDlet suite)
+ CJavaRegistryPackageEntry* packageEntry =
+ ( CJavaRegistryPackageEntry* ) entry;
+ if ( aPackageName.Compare( packageEntry->Name() ) == 0 )
+ {
+ HTI_LOG_TEXT( "Matching Java installation found" );
+ uid = packageEntry->Uid().iUid;
+ CleanupStack::PopAndDestroy( entry );
+ break;
+ }
+ }
+ CleanupStack::PopAndDestroy( entry );
+ }
+ }
+ CleanupStack::PopAndDestroy( javaRegistry );
+ CleanupStack::PopAndDestroy( &uids );
+ User::LeaveIfError( uid );
+ return uid;
+ }
+
+ else if ( aMimeIndex == 7 ) // Widget
+ {
+ RWidgetRegistryClientSession widgetRegistry;
+ User::LeaveIfError( widgetRegistry.Connect() );
+
+ RWidgetInfoArray widgets;
+ TRAPD( err, widgetRegistry.InstalledWidgetsL( widgets ) );
+ if ( err != KErrNone )
+ {
+ HTI_LOG_FORMAT( "Failed to get installed widgets %d", err );
+ widgets.ResetAndDestroy();
+ widgetRegistry.Disconnect();
+ User::Leave( err );
+ }
+
+ TInt uid = KErrNotFound;
+ TInt count = widgets.Count();
+ HTI_LOG_FORMAT( "Found %d Widget installations", count );
+ for ( TInt i = 0; i < count; i++ )
+ {
+ CWidgetInfo* widgetInfo = widgets[i];
+ HTI_LOG_DES( *( widgetInfo->iBundleName ) );
+ if ( aPackageName.Compare( *( widgetInfo->iBundleName ) ) == 0 )
+ {
+ HTI_LOG_TEXT( "Matching Widget installation found" );
+ uid = widgetInfo->iUid.iUid;
+ break;
+ }
+ }
+ widgets.ResetAndDestroy();
+ widgetRegistry.Disconnect();
+ User::LeaveIfError( uid );
+ return uid;
+ }
+
+ else // invalid mime index
+ {
+ User::Leave( KErrArgument );
+ }
+
+ return KErrNone; // never returns from here
+ }
+#else
+TInt CHtiAppControl::GetComponentIdFromUid(const TInt32 aUid)
+ {
+ TInt cid = KErrNotFound;
+ Usif::RSoftwareComponentRegistry registry;
+ User::LeaveIfError(registry.Connect());
+ CleanupClosePushL(registry);
+ RArray<TUid> uidList;
+ CleanupClosePushL(uidList);
+ RArray<Usif::TComponentId> componentIdList;
+ CleanupClosePushL(componentIdList);
+ registry.GetComponentIdsL(componentIdList);
+ for(TInt i = 0; i < componentIdList.Count(); i++)
+ {
+ Usif::TComponentId compId = componentIdList[i];
+ Usif::CComponentEntry *compEntry = Usif::CComponentEntry::NewLC();
+ if(registry.GetComponentL(compId, *compEntry))
+ {
+ /*if(compEntry->IsRemovable() &&
+ compEntry->SoftwareType() == Usif::KSoftwareTypeNative)*/
+ if(compEntry->IsRemovable())
+ {
+ _LIT(KCompUid, "CompUid");
+ Usif::CPropertyEntry *property =
+ registry.GetComponentPropertyL(compId, KCompUid);
+ CleanupStack::PushL(property);
+ Usif::CIntPropertyEntry* intProperty =
+ dynamic_cast<Usif::CIntPropertyEntry*>(property);
+ uidList.AppendL(TUid::Uid(intProperty->IntValue()));
+ CleanupStack::PopAndDestroy(property);
+ }
+ else
+ {
+ uidList.AppendL(KNullUid);
+ }
+ }
+ CleanupStack::PopAndDestroy( compEntry );
+ }
+ TUid tuid(TUid::Uid(aUid));
+ if(tuid != KNullUid)
+ {
+ TInt index = uidList.Find(tuid);
+ if(index >= 0 && index < componentIdList.Count())
+ {
+ cid = componentIdList[index];
+ }
+ }
+ CleanupStack::PopAndDestroy( 3, ®istry );// componentIdList, uidList, registry
+ return cid;
+ }
+
+TInt CHtiAppControl::GetComponentIdFromPackageName(const TDesC& aPackageName)
+ {
+ TInt cid = KErrNotFound;
+ Usif::RSoftwareComponentRegistry registry;
+ User::LeaveIfError(registry.Connect());
+ CleanupClosePushL(registry);
+ RArray<Usif::TComponentId> componentIdList;
+ CleanupClosePushL(componentIdList);
+ registry.GetComponentIdsL(componentIdList);
+ TInt count = componentIdList.Count();
+ for(TInt i = 0; i < count; i++)
+ {
+ Usif::TComponentId compId = componentIdList[i];
+ Usif::CComponentEntry *compEntry = Usif::CComponentEntry::NewLC();
+ if(registry.GetComponentL(compId, *compEntry))
+ {
+ if(compEntry->IsRemovable())
+ {
+ if ( aPackageName.Compare( compEntry->Name() ) == 0 )
+ {
+ cid = compId;
+ CleanupStack::PopAndDestroy( compEntry );
+ break;
+ }
+ }
+ }
+ CleanupStack::PopAndDestroy( compEntry );
+ }
+ CleanupStack::PopAndDestroy( 2, ®istry );// componentIdList, registry
+ return cid;
+ }
+
+#endif
+// End of File