--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/appinstaller/AppinstUi/sisxsifplugin/src/sisxsifpluginactiveimpl.cpp Tue Aug 31 15:21:33 2010 +0300
@@ -0,0 +1,1045 @@
+/*
+* Copyright (c) 2010 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: Native SISX SIF (Software Install Framework) plugin.
+*
+*/
+
+#include "sisxsifpluginactiveimpl.h" // CSisxSifPluginActiveImpl
+#include "sisxsifpluginuihandlerbase.h" // CSisxSifPluginUiHandlerBase
+#include "sisxsifpluginuihandler.h" // CSisxSifPluginUiHandler
+#include "sisxsifpluginuihandlersilent.h" // CSisxSifPluginUiHandlerSilent
+#include "sisxsifplugininstallparams.h" // CSisxSifPluginInstallParams
+#include "sisxsifpluginerrorhandler.h" // CSisxSifPluginErrorHandler
+#include "sisxsifcleanuputils.h" // CleanupResetAndDestroyPushL
+#include "sisxsifpluginerrors.h" // Error codes
+#include "sisxsifplugin.pan" // Panic codes
+#include <usif/sif/sifcommon.h> // Usif::CComponentInfo
+#include <usif/scr/scr.h> // RSoftwareComponentRegistry
+#include <swi/asynclauncher.h> // Swi::CAsyncLauncher
+#include <swi/sisregistrysession.h> // RSisRegistrySession
+#include "sisregistrywritablesession.h" // RSisRegistryWritableSession
+#include <e32property.h> // RProperty
+#include <centralrepository.h> // CRepository
+#include <sacls.h> // KUidSwiLatestInstallation
+#include <SWInstallerInternalCRKeys.h> // KCRUidSWInstallerSettings
+#include <featmgr.h> // FeatureManager
+#include <syslangutil.h> // GetInstalledLanguages
+
+// TODO: replace with proper logging
+#ifdef _DEBUG
+#define FLOG(x) RDebug::Print(x);
+#define FLOG_1(x,y) RDebug::Print(x, y);
+#define FLOG_2(x,y,z) RDebug::Print(x, y, z);
+#define FLOG_3(x,y,z,v) RDebug::Print(x, y, z, v);
+#else
+#define FLOG(x)
+#define FLOG_1(x,y)
+#define FLOG_2(x,y,z)
+#define FLOG_3(x,y,z,v)
+#endif
+
+using namespace Usif;
+
+_LIT( KCompUid, "CompUid" );
+_LIT( KStartupListUpdaterExecutable, "z:\\sys\\bin\\startuplistupdater.exe" );
+_LIT( KStartupListUpdaterName, "StartupListUpdater" );
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::NewL()
+// ---------------------------------------------------------------------------
+//
+CSisxSifPluginActiveImpl* CSisxSifPluginActiveImpl::NewL()
+ {
+ FLOG( _L("Constructing CSisxSifPluginActiveImpl") );
+ CSisxSifPluginActiveImpl *self = new( ELeave ) CSisxSifPluginActiveImpl;
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::~CSisxSifPluginActiveImpl()
+// ---------------------------------------------------------------------------
+//
+CSisxSifPluginActiveImpl::~CSisxSifPluginActiveImpl()
+ {
+ FLOG( _L("Destructing CSisxSifPluginActiveImpl") );
+ Cancel();
+ delete iAsyncLauncher;
+ delete iUiHandler;
+ delete iInstallPrefs;
+ iDeviceSupportedLanguages.Reset();
+ iInputParams = NULL; // not owned
+ iOutputParams = NULL; // not owned
+ delete iInstallParams;
+ delete iComponentInfo;
+ delete iFileName;
+ delete iErrorHandler;
+ FeatureManager::UnInitializeLib();
+ iFs.Close();
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::DoCancel()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::DoCancel()
+ {
+ FLOG( _L("CSisxSifPluginActiveImpl::DoCancel") );
+
+ if( iClientStatus )
+ {
+ if( iAsyncLauncher )
+ {
+ iAsyncLauncher->CancelOperation();
+ delete iAsyncLauncher;
+ iAsyncLauncher = NULL;
+ }
+
+ CompleteClientRequest( KErrCancel );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::RunL()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::RunL()
+ {
+ FLOG_3( _L("CSisxSifPluginActiveImpl::RunL(), operation %d, phase %d, result %d"),
+ iOperation, iPhase, iStatus.Int() );
+
+ User::LeaveIfError( iStatus.Int() );
+ switch( iOperation )
+ {
+ case EGetComponentInfo:
+ __ASSERT_DEBUG( iPhase == ERunningOperation, Panic( ESisxSifInternalError ) );
+ CompleteClientRequest( KErrNone );
+ break;
+
+ case EInstall:
+ switch( iPhase )
+ {
+ case EPreprocessing:
+ if( IsSilentMode() )
+ {
+ StartSilentInstallingL();
+ }
+ else
+ {
+ StartInstallingL();
+ }
+ break;
+
+ case ERunningOperation:
+ FinalizeInstallationL();
+ CompleteClientRequest( KErrNone );
+ break;
+
+ // TODO: KSifInParam_InstallInactive
+
+ default:
+ Panic( ESisxSifInternalError );
+ break;
+ }
+ break;
+
+ case EUninstall:
+ __ASSERT_DEBUG( iPhase == ERunningOperation, Panic( ESisxSifInternalError ) );
+ UpdateStartupListL();
+ iUiHandler->PublishCompletionL();
+ CompleteClientRequest( KErrNone );
+ break;
+
+ case EActivate:
+ case EDeactivate:
+ __ASSERT_DEBUG( iPhase == ERunningOperation, Panic( ESisxSifInternalError ) );
+ CompleteClientRequest( KErrNone );
+ break;
+
+ default:
+ Panic( ESisxSifInternalError );
+ break;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::RunError()
+// ---------------------------------------------------------------------------
+//
+TInt CSisxSifPluginActiveImpl::RunError( TInt aError )
+ {
+ FLOG_1( _L("CSisxSifPluginActiveImpl::RunError(), aError %d"), aError );
+
+ TRAP_IGNORE( DoHandleErrorL( aError ) );
+ CompleteClientRequest( aError );
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::GetComponentInfo()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::GetComponentInfo(
+ const TDesC& aFileName,
+ const TSecurityContext& /*aSecurityContext*/,
+ CComponentInfo& aComponentInfo,
+ TRequestStatus& aStatus )
+ {
+ FLOG_1( _L("CSisxSifPluginActiveImpl::GetComponentInfo: %S"), &aFileName );
+
+ if( IsActive() )
+ {
+ FLOG( _L("CSisxSifPluginActiveImpl::GetComponentInfo, KErrInUse") );
+ CompleteClientRequest( KErrInUse );
+ return;
+ }
+
+ TRAPD( error, SetFileL( aFileName ) );
+ if( error )
+ {
+ FLOG_1( _L("CSisxSifPluginActiveImpl::GetComponentInfo, set file error %d"), error );
+ CompleteClientRequest( error );
+ return;
+ }
+
+ TRAP( error, DoGetComponentInfoL( aComponentInfo, aStatus ) );
+ if( error )
+ {
+ FLOG_1( _L("CSisxSifPluginActiveImpl::GetComponentInfo ERROR %d"), error );
+ CompleteClientRequest( error );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::GetComponentInfo()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::GetComponentInfo(
+ RFile& aFileHandle,
+ const TSecurityContext& /*aSecurityContext*/,
+ CComponentInfo& aComponentInfo,
+ TRequestStatus& aStatus )
+ {
+ FLOG( _L("CSisxSifPluginActiveImpl::GetComponentInfo(RFile)") );
+
+ if( IsActive() )
+ {
+ FLOG( _L("CSisxSifPluginActiveImpl::GetComponentInfo, KErrInUse") );
+ CompleteClientRequest( KErrInUse );
+ return;
+ }
+
+ SetFile( aFileHandle );
+
+ TRAPD( error, DoGetComponentInfoL( aComponentInfo, aStatus ) );
+ if( error )
+ {
+ FLOG_1( _L("CSisxSifPluginActiveImpl::GetComponentInfo ERROR %d"), error );
+ CompleteClientRequest( error );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::Install()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::Install(
+ const TDesC& aFileName,
+ const TSecurityContext& aSecurityContext,
+ const COpaqueNamedParams& aInputParams,
+ COpaqueNamedParams& aOutputParams,
+ TRequestStatus& aStatus )
+ {
+ FLOG_1( _L("CSisxSifPluginActiveImpl::Install: %S"), &aFileName );
+
+ if( IsActive() )
+ {
+ FLOG( _L("CSisxSifPluginActiveImpl::Install, KErrInUse") );
+ CompleteClientRequest( KErrInUse );
+ return;
+ }
+
+ iHasAllFilesCapability = aSecurityContext.HasCapability( ECapabilityAllFiles );
+
+ TRAPD( error, SetFileL( aFileName ) );
+ if( error )
+ {
+ FLOG_1( _L("CSisxSifPluginActiveImpl::Install, set file error %d"), error );
+ CompleteClientRequest( error );
+ return;
+ }
+
+ TRAP( error, DoInstallL( aSecurityContext, aInputParams, aOutputParams, aStatus ) );
+ if( error )
+ {
+ FLOG_1( _L("CSisxSifPluginActiveImpl::Install, DoInstallL error %d"), error );
+ CompleteClientRequest( error );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::Install()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::Install(
+ RFile& aFileHandle,
+ const TSecurityContext& aSecurityContext,
+ const COpaqueNamedParams& aInputParams,
+ COpaqueNamedParams& aOutputParams,
+ TRequestStatus& aStatus )
+ {
+ FLOG( _L("CSisxSifPluginActiveImpl::Install(RFile)") );
+
+ if( IsActive() )
+ {
+ FLOG( _L("CSisxSifPluginActiveImpl::Install KErrInUse") );
+ CompleteClientRequest( KErrInUse );
+ return;
+ }
+
+ iHasAllFilesCapability = aSecurityContext.HasCapability( ECapabilityAllFiles );
+
+ SetFile( aFileHandle );
+
+ TRAPD( error, DoInstallL( aSecurityContext, aInputParams, aOutputParams, aStatus ) );
+ if( error )
+ {
+ FLOG_1( _L("CSisxSifPluginActiveImpl::Install, DoInstallL error %d"), error );
+ CompleteClientRequest( error );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::Uninstall()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::Uninstall(
+ TComponentId aComponentId,
+ const TSecurityContext& aSecurityContext,
+ const COpaqueNamedParams& aInputParams,
+ COpaqueNamedParams& aOutputParams,
+ TRequestStatus& aStatus )
+ {
+ FLOG_1( _L("CSisxSifPluginActiveImpl::Uninstall, aComponentId %d"), aComponentId );
+
+ if( IsActive() )
+ {
+ FLOG( _L("CSisxSifPluginActiveImpl::Uninstall KErrInUse") );
+ CompleteClientRequest( KErrInUse );
+ return;
+ }
+
+ iHasAllFilesCapability = aSecurityContext.HasCapability( ECapabilityAllFiles );
+
+ // Uninstall is always silent. TrustedUI capability is required.
+ if( !aSecurityContext.HasCapability( ECapabilityTrustedUI ) )
+ {
+ FLOG( _L( "CSisxSifPluginActiveImpl::Uninstall, missing ECapabilityTrustedUI") );
+ iErrorHandler->SetExtendedErrorCode( ESifUiTrustedUICapabilityRequired );
+ CompleteClientRequest( KErrPermissionDenied );
+ return;
+ }
+
+ TRAPD( error, DoUninstallL( aComponentId, aInputParams, aOutputParams, aStatus ) );
+ if( error )
+ {
+ FLOG_1( _L("CSisxSifPluginActiveImpl::Uninstall, DoUninstallL ERROR %d"), error );
+ CompleteClientRequest( error );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::Activate()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::Activate(
+ TComponentId aComponentId,
+ const TSecurityContext& aSecurityContext,
+ TRequestStatus& aStatus )
+ {
+ FLOG_1( _L("CSisxSifPluginActiveImpl::Activate, aComponentId %d"), aComponentId );
+
+ if( IsActive() )
+ {
+ FLOG( _L("CSisxSifPluginActiveImpl::Activate KErrInUse") );
+ CompleteClientRequest( KErrInUse );
+ return;
+ }
+
+ iHasAllFilesCapability = aSecurityContext.HasCapability( ECapabilityAllFiles );
+
+ TRAPD( error, DoActivateL( aComponentId, aStatus ) );
+ if( error )
+ {
+ FLOG_1( _L("CSisxSifPluginActiveImpl::Activate, DoActivateL ERROR %d"), error );
+ CompleteClientRequest( error );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::Deactivate()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::Deactivate(
+ TComponentId aComponentId,
+ const TSecurityContext& aSecurityContext,
+ TRequestStatus& aStatus )
+ {
+ FLOG_1( _L("CSisxSifPluginActiveImpl::Deactivate, aComponentId %d"), aComponentId );
+
+ if( IsActive() )
+ {
+ FLOG( _L("CSisxSifPluginActiveImpl::Deactivate KErrInUse") );
+ CompleteClientRequest( KErrInUse );
+ return;
+ }
+
+ iHasAllFilesCapability = aSecurityContext.HasCapability( ECapabilityAllFiles );
+
+ TRAPD( error, DoDeactivateL( aComponentId, aStatus ) );
+ if( error )
+ {
+ FLOG_1( _L("CSisxSifPluginActiveImpl::Deactivate, DoDeactivateL ERROR %d"), error );
+ CompleteClientRequest( error );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::CSisxSifPluginActiveImpl()
+// ---------------------------------------------------------------------------
+//
+CSisxSifPluginActiveImpl::CSisxSifPluginActiveImpl() : CActive( CActive::EPriorityStandard )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::ConstructL()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::ConstructL()
+ {
+ User::LeaveIfError( iFs.Connect() );
+ FeatureManager::InitializeLibL();
+
+ iAsyncLauncher = Swi::CAsyncLauncher::NewL();
+ iInstallPrefs = Swi::CInstallPrefs::NewL();
+ iComponentInfo = CComponentInfo::NewL();
+ iErrorHandler = CSisxSifPluginErrorHandler::NewL();
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::CommonRequestPreambleL()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::CommonRequestPreambleL( TRequestStatus& aStatus )
+ {
+ aStatus = KRequestPending;
+ iClientStatus = &aStatus;
+
+ if( iInstallParams )
+ {
+ delete iInstallParams;
+ iInstallParams = NULL;
+ }
+ CreateUiHandlerL();
+
+ iInputParams = NULL;
+ iOutputParams = NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::CommonRequestPreambleL()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::CommonRequestPreambleL(
+ const COpaqueNamedParams& aInputParams,
+ COpaqueNamedParams& aOutputParams,
+ TRequestStatus& aStatus )
+ {
+ aStatus = KRequestPending;
+ iClientStatus = &aStatus;
+
+ if( iInstallParams )
+ {
+ delete iInstallParams;
+ iInstallParams = NULL;
+ }
+ iInstallParams = CSisxSifPluginInstallParams::NewL( aInputParams );
+ CreateUiHandlerL();
+
+ iInputParams = &aInputParams;
+ iOutputParams = &aOutputParams;
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::CompleteSelf()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::CompleteSelf( TInt aResult )
+ {
+ iStatus = KRequestPending;
+ TRequestStatus* status = &iStatus;
+ User::RequestComplete( status, aResult );
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::CreateUiHandlerL()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::CreateUiHandlerL()
+ {
+ if( iUiHandler )
+ {
+ delete iUiHandler;
+ iUiHandler = NULL;
+ }
+ if( IsSilentMode() )
+ {
+ iUiHandler = CSisxSifPluginUiHandlerSilent::NewL( iFs, *iErrorHandler );
+ }
+ else
+ {
+ iUiHandler = CSisxSifPluginUiHandler::NewL( iFs, *iErrorHandler );
+ }
+ if( iInstallParams )
+ {
+ iUiHandler->SetInstallParamsL( *iInstallParams );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::IsSilentMode()
+// ---------------------------------------------------------------------------
+//
+TBool CSisxSifPluginActiveImpl::IsSilentMode()
+ {
+ return( iInstallParams && iInstallParams->IsSilentMode() );
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::CompleteClientRequest()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::CompleteClientRequest( TInt aResult )
+ {
+ if( iClientStatus )
+ {
+ User::RequestComplete( iClientStatus, aResult );
+ iClientStatus = NULL;
+ }
+ __ASSERT_DEBUG( !IsActive(), Panic( ESisxSifInternalError ) );
+ iOperation = ENoOperation;
+ iPhase = ENotActive;
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::DoGetComponentInfoL()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::DoGetComponentInfoL( CComponentInfo& aComponentInfo,
+ TRequestStatus& aStatus )
+ {
+ CommonRequestPreambleL( aStatus );
+
+ if( iFileName )
+ {
+ iAsyncLauncher->GetComponentInfoL( *iUiHandler, *iFileName, *iInstallPrefs,
+ aComponentInfo, iStatus );
+ }
+ else if( iFileHandle )
+ {
+ iAsyncLauncher->GetComponentInfoL( *iUiHandler, *iFileHandle, *iInstallPrefs,
+ aComponentInfo, iStatus );
+ }
+ else
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iOperation = EGetComponentInfo;
+ iPhase = ERunningOperation;
+ SetActive();
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::DoInstallL()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::DoInstallL( const TSecurityContext& aSecurityContext,
+ const COpaqueNamedParams& aInputParams, COpaqueNamedParams& aOutputParams,
+ TRequestStatus& aStatus )
+ {
+ CommonRequestPreambleL( aInputParams, aOutputParams, aStatus );
+ FLOG_1( _L("CSisxSifPluginActiveImpl::DoInstall, IsSilentMode=%d"), IsSilentMode() );
+
+ if( IsSilentMode() )
+ {
+ if( !aSecurityContext.HasCapability( ECapabilityTrustedUI ) )
+ {
+ FLOG( _L("CSisxSifPluginActiveImpl::Install, missing ECapabilityTrustedUI") );
+ iErrorHandler->SetExtendedErrorCode( ESifUiTrustedUICapabilityRequired );
+ CompleteClientRequest( KErrPermissionDenied );
+ return;
+ }
+ }
+
+ if( iFileName )
+ {
+ iUiHandler->DisplayPreparingInstallL( *iFileName );
+ iAsyncLauncher->GetComponentInfoL( *iUiHandler, *iFileName, *iInstallPrefs,
+ *iComponentInfo, iStatus );
+ }
+ else if( iFileHandle )
+ {
+ TFileName fileName;
+ iFileHandle->Name( fileName );
+ iUiHandler->DisplayPreparingInstallL( fileName );
+ iAsyncLauncher->GetComponentInfoL( *iUiHandler, *iFileHandle, *iInstallPrefs,
+ *iComponentInfo, iStatus );
+ }
+ else
+ {
+ User::Leave( KErrGeneral );
+ }
+
+ iOperation = EInstall;
+ iPhase = EPreprocessing;
+ SetActive();
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::DoUninstallL()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::DoUninstallL( TComponentId aComponentId,
+ const COpaqueNamedParams& aInputParams, COpaqueNamedParams& aOutputParams,
+ TRequestStatus& aStatus )
+ {
+ CommonRequestPreambleL( aInputParams, aOutputParams, aStatus );
+
+ TUid uid;
+ CComponentEntry *entry = CComponentEntry::NewLC();
+ GetComponentAndUidL( aComponentId, *entry, uid );
+ iUiHandler->PublishStartL( *entry );
+ CleanupStack::PopAndDestroy( entry );
+
+ iAsyncLauncher->UninstallL( *iUiHandler, uid, iStatus );
+
+ iOperation = EUninstall;
+ iPhase = ERunningOperation;
+ SetActive();
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::DoActivateL()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::DoActivateL( TComponentId aComponentId,
+ TRequestStatus& aStatus )
+ {
+ CommonRequestPreambleL( aStatus );
+
+ Swi::RSisRegistryWritableSession sisRegSession;
+ User::LeaveIfError( sisRegSession.Connect() );
+ CleanupClosePushL( sisRegSession );
+ sisRegSession.ActivateComponentL( aComponentId );
+ CleanupStack::PopAndDestroy( &sisRegSession );
+
+ CompleteSelf( KErrNone );
+
+ iOperation = EActivate;
+ iPhase = ERunningOperation;
+ SetActive();
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::DoDeactivateL()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::DoDeactivateL( TComponentId aComponentId,
+ TRequestStatus& aStatus )
+ {
+ CommonRequestPreambleL( aStatus );
+
+ Swi::RSisRegistryWritableSession sisRegSession;
+ User::LeaveIfError( sisRegSession.Connect() );
+ CleanupClosePushL( sisRegSession );
+ sisRegSession.DeactivateComponentL( aComponentId );
+ CleanupStack::PopAndDestroy( &sisRegSession );
+
+ CompleteSelf( KErrNone );
+
+ iOperation = EDeactivate;
+ iPhase = ERunningOperation;
+ SetActive();
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::DoHandleErrorL()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::DoHandleErrorL( TInt aError )
+ {
+ FLOG_1( _L("CSisxSifPluginActiveImpl::DoHandleErrorL(), aError=%d"), aError );
+
+ iErrorHandler->SetErrorCode( aError );
+ if( iOutputParams )
+ {
+ iErrorHandler->FillOutputParamsL( *iOutputParams );
+ }
+ iUiHandler->PublishCompletionL();
+
+ if( aError != KErrNone && aError != KErrCancel )
+ {
+ iUiHandler->DisplayFailedL( *iErrorHandler );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::SetFileL()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::SetFileL( const TDesC& aFileName )
+ {
+ if( iFileName )
+ {
+ delete iFileName;
+ iFileName = NULL;
+ }
+ iFileName = aFileName.AllocL();
+ iFileHandle = NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::SetFile()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::SetFile( RFile& aFileHandle )
+ {
+ if( iFileName )
+ {
+ delete iFileName;
+ iFileName = NULL;
+ }
+ iFileHandle = &aFileHandle;
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::GetLastInstalledComponentIdL()
+// ---------------------------------------------------------------------------
+//
+TComponentId CSisxSifPluginActiveImpl::GetLastInstalledComponentIdL()
+ {
+ __ASSERT_DEBUG( iOperation == EInstall, Panic( ESisxSifInternalError ) );
+
+ // Find the id of the last installed component and return it
+ TInt uid;
+ User::LeaveIfError( RProperty::Get( KUidSystemCategory, KUidSwiLatestInstallation, uid ) );
+
+ Swi::RSisRegistrySession sisRegistrySession;
+ User::LeaveIfError( sisRegistrySession.Connect() );
+ CleanupClosePushL( sisRegistrySession );
+
+ TUid tuid( TUid::Uid( uid ) );
+ TComponentId componentId = sisRegistrySession.GetComponentIdForUidL( tuid );
+ CleanupStack::PopAndDestroy( &sisRegistrySession );
+
+ return componentId;
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::GetComponentAndUidL()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::GetComponentAndUidL( TComponentId aComponentId,
+ CComponentEntry& aEntry, TUid& aUid ) const
+ {
+ FLOG_1( _L("CSisxSifPluginActiveImpl::GetComponentAndUidL, component %d"), aComponentId );
+
+ RSoftwareComponentRegistry scrSession;
+ User::LeaveIfError( scrSession.Connect() );
+ CleanupClosePushL( scrSession );
+
+ if( scrSession.GetComponentL( aComponentId, aEntry ) )
+ {
+ FLOG( _L("CSisxSifPluginActiveImpl::GetComponentAndUidL, entry found") );
+
+ CPropertyEntry* propertyEntry = scrSession.GetComponentPropertyL( aComponentId, KCompUid );
+ CleanupStack::PushL( propertyEntry );
+
+ CIntPropertyEntry* intPropertyEntry = dynamic_cast< CIntPropertyEntry* >( propertyEntry );
+ if( !intPropertyEntry )
+ {
+ FLOG( _L("CSisxSifPluginActiveImpl::GetComponentUidL, UID property not found") );
+ User::Leave( KErrNotFound );
+ }
+ aUid = TUid::Uid( intPropertyEntry->IntValue() );
+
+ CleanupStack::PopAndDestroy( propertyEntry );
+ }
+ else
+ {
+ FLOG( _L("CSisxSifPluginActiveImpl::GetComponentAndUidL, entry not found") );
+ User::Leave( KErrNotFound );
+ }
+
+ CleanupStack::PopAndDestroy( &scrSession );
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::RequiresUserCapabilityL()
+// ---------------------------------------------------------------------------
+//
+TBool CSisxSifPluginActiveImpl::RequiresUserCapabilityL(
+ const CComponentInfo::CNode& aRootNode )
+ {
+ // Silent install is not allowed when the package requires additional capabilities
+ // than what it is signed for (package may request for some capability that is not
+ // granted by the certificate used to sign it).
+ const TCapabilitySet& componentUserCaps( aRootNode.UserGrantableCaps() );
+ for( TInt cap = 0; cap < ECapability_Limit; cap++ )
+ {
+ if( componentUserCaps.HasCapability( TCapability( cap ) ) )
+ {
+ FLOG_1( _L("CSisxSifPluginActiveImpl::RequiresUserCapabilityL - %d"), cap );
+ return ETrue;
+ }
+ }
+ return EFalse;
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::SetInstallPrefsRevocationServerUriL()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::SetInstallPrefsRevocationServerUriL( const TDesC& aUri )
+ {
+ if( aUri.Length() )
+ {
+ HBufC8* uriBuf = HBufC8::NewLC( aUri.Length() );
+ TPtr8 uri( uriBuf->Des() );
+ uri.Copy( aUri );
+ iInstallPrefs->SetRevocationServerUriL( uri );
+ CleanupStack::PopAndDestroy( uriBuf );
+ }
+ else
+ {
+ iInstallPrefs->SetRevocationServerUriL( KNullDesC8 );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::UpdateInstallPrefsForPerformingOcspL()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::UpdateInstallPrefsForPerformingOcspL()
+ {
+ if( IsSilentMode() )
+ {
+ TBool performOcsp( iInstallParams->PerformOCSP() != ENotAllowed );
+ iInstallPrefs->SetPerformRevocationCheck( performOcsp );
+
+ if( performOcsp )
+ {
+ SetInstallPrefsRevocationServerUriL( iInstallParams->OCSPUrl() );
+ }
+ }
+ else
+ {
+ CRepository* cenRep = CRepository::NewLC( KCRUidSWInstallerSettings );
+
+ TInt ocspProcedure = ESWInstallerOcspProcedureOff;
+ (void)cenRep->Get( KSWInstallerOcspProcedure, ocspProcedure );
+ TBool performOcsp( ocspProcedure != ESWInstallerOcspProcedureOff );
+ iInstallPrefs->SetPerformRevocationCheck( performOcsp );
+
+ if( performOcsp )
+ {
+ HBufC* ocspUrlBuf = HBufC::NewLC(
+ NCentralRepositoryConstants::KMaxUnicodeStringLength );
+ TPtr ocspUrl( ocspUrlBuf->Des() );
+ (void)cenRep->Get( KSWInstallerOcspDefaultURL, ocspUrl );
+ SetInstallPrefsRevocationServerUriL( ocspUrl );
+ CleanupStack::PopAndDestroy( ocspUrlBuf );
+ }
+
+ CleanupStack::PopAndDestroy( cenRep );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::StartInstallingL()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::StartInstallingL()
+ {
+ const CComponentInfo::CNode& rootNode( iComponentInfo->RootNodeL() );
+ TBool driveSelection = rootNode.DriveSeletionRequired();
+ iUiHandler->SetDriveSelectionRequired( driveSelection );
+ TInt maxInstalledSize = rootNode.MaxInstalledSize();
+ iUiHandler->SetMaxInstalledSize( maxInstalledSize );
+
+ iUiHandler->PublishStartL( rootNode );
+
+ UpdateInstallPrefsForPerformingOcspL();
+ FillDeviceSupportedLanguagesL();
+
+ if( iFileHandle )
+ {
+ iAsyncLauncher->InstallL( *iUiHandler, *iFileHandle, *iInstallPrefs,
+ iDeviceSupportedLanguages, iStatus );
+ }
+ else if( iFileName )
+ {
+ iAsyncLauncher->InstallL( *iUiHandler, *iFileName, *iInstallPrefs,
+ iDeviceSupportedLanguages, iStatus );
+ }
+ else
+ {
+ Panic( ESisxSifInternalError );
+ }
+
+ iPhase = ERunningOperation;
+ SetActive();
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::StartSilentInstallingL()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::StartSilentInstallingL()
+ {
+ // TODO: fix this, removed temporarily to allow installations
+#ifdef _NOT_DEFINED_
+ const CComponentInfo::CNode& rootNode( iComponentInfo->RootNodeL() );
+ TBool isAuthenticated = ( rootNode.Authenticity() == EAuthenticated );
+
+ // AllowUntrusted option is needed to install untrusted packages.
+ if( !isAuthenticated && ( iInstallParams->AllowUntrusted() != EAllowed ) )
+ {
+ FLOG( _L("Attempt to install unsigned package silently without AllowUntrusted option") );
+ iErrorHandler->SetExtendedErrorCode( ENeedsAllowUntrustedParameter );
+ CompleteClientRequest( KErrPermissionDenied );
+ }
+ // GrantCapabilities option is needed to install packages that require user capabilities
+ else if( RequiresUserCapabilityL( rootNode ) &&
+ ( iInstallParams->GrantCapabilities() != EAllowed ) )
+ {
+ FLOG( _L("Attempt to grant user capabilities silently without GrantCapabilities option") );
+ iErrorHandler->SetExtendedErrorCode( ENeedsGrantCapabilitiesParameter );
+ CompleteClientRequest( KErrPermissionDenied );
+ }
+ // AllFiles capability is needed to install untrusted packages that contains exe/dll binaries
+ else if( !isAuthenticated && rootNode.HasExecutable() && !iHasAllFilesCapability )
+ {
+ FLOG( _L("Attempt to install untrusted binaries silently without AllFiles capability") );
+ iErrorHandler->SetExtendedErrorCode( EAllFilesCapabilityRequired );
+ CompleteClientRequest( KErrPermissionDenied );
+ }
+ else
+#endif
+ {
+ StartInstallingL();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::FinalizeInstallationL()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::FinalizeInstallationL()
+ {
+ UpdateStartupListL();
+
+ if( iOutputParams )
+ {
+ TComponentId componentId = GetLastInstalledComponentIdL();
+ iOutputParams->AddIntL( KSifOutParam_ComponentId, componentId );
+ }
+
+ iUiHandler->PublishCompletionL();
+ iUiHandler->DisplayCompleteL();
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::UpdateStartupListL()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::UpdateStartupListL()
+ {
+ if( FeatureManager::FeatureSupported( KFeatureIdExtendedStartup ) )
+ {
+ TFullName name( KStartupListUpdaterName );
+ name.Append( '*' );
+ TFindProcess findProcess( name );
+ if( findProcess.Next( name ) == KErrNone )
+ {
+ // already running, no need to do anything
+ return;
+ }
+
+ RProcess process;
+ CleanupClosePushL( process );
+
+ TInt result = process.Create( KStartupListUpdaterExecutable, KNullDesC );
+ if( result == KErrNone )
+ {
+ TRequestStatus rendezvousStatus;
+ process.Rendezvous( rendezvousStatus );
+
+ // start process and wait until it is started
+ process.Resume();
+ User::WaitForRequest( rendezvousStatus );
+
+ // ignore possible errors
+ result = rendezvousStatus.Int();
+ }
+
+ CleanupStack::PopAndDestroy( &process );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CSisxSifPluginActiveImpl::FillDeviceSupportedLanguagesL()
+// ---------------------------------------------------------------------------
+//
+void CSisxSifPluginActiveImpl::FillDeviceSupportedLanguagesL()
+ {
+ FLOG( _L("CSisxSifPluginActiveImpl::FillDeviceSupportedLanguagesL, begin") );
+
+ CArrayFixFlat<TInt>* installedLanguages = NULL;
+ TInt err = SysLangUtil::GetInstalledLanguages( installedLanguages, &iFs );
+ CleanupStack::PushL( installedLanguages );
+ User::LeaveIfError( err );
+ if( installedLanguages )
+ {
+ iDeviceSupportedLanguages.Reset();
+ for( TInt index = 0; index < installedLanguages->Count(); index++ )
+ {
+ TInt language = (*installedLanguages)[ index ];
+ FLOG_1( _L("CSisxSifPluginActiveImpl::FillDeviceSupportedLanguagesL: %d"), language );
+ iDeviceSupportedLanguages.AppendL( language );
+ }
+ }
+ CleanupStack::PopAndDestroy( installedLanguages );
+
+ FLOG( _L("CSisxSifPluginActiveImpl::FillDeviceSupportedLanguagesL, end") );
+ }
+