diff -r 0aa8cc770c8a -r 4a793f564d72 connectivitymodules/SeCon/services/pcd/src/sconinstaller.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/services/pcd/src/sconinstaller.cpp Wed Sep 01 12:20:56 2010 +0100 @@ -0,0 +1,528 @@ +/* +* Copyright (c) 2005-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: CSConAppInstaller implementation +* +*/ + + +// INCLUDE FILES + +#include +#include +#include +#include +#include +#include +#include + +using namespace Java; + +#include "debug.h" +#include "sconinstaller.h" +#include "sconpcdconsts.h" +#include "sconpcdutility.h" + +_LIT8( KWidgetMimeType, "application/x-nokia-widget"); + +const TInt KSConSeConUidValue = 0x101f99f6; +const TUid KSConSeConUid = {KSConSeConUidValue}; + +// ============================= MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// CSConAppInstaller::CSConAppInstaller( CSConInstallerQueue* aQueue ) +// Constructor +// ----------------------------------------------------------------------------- +// +CSConAppInstaller::CSConAppInstaller( CSConInstallerQueue* aQueue, RFs& aFs ) : + CActive( EPriorityStandard ), iQueue( aQueue ), iFs( aFs ) + { + TRACE_FUNC; + } + +// ----------------------------------------------------------------------------- +// CSConAppInstaller::~CSConAppInstaller() +// Destructor +// ----------------------------------------------------------------------------- +// +CSConAppInstaller::~CSConAppInstaller() + { + TRACE_FUNC; + iSWInst.Close(); + } + +// ----------------------------------------------------------------------------- +// CSConAppInstaller::StartInstaller( TInt& aTaskId ) +// Starts the installer task +// ----------------------------------------------------------------------------- +// +void CSConAppInstaller::StartInstaller( TInt& aTaskId ) + { + TRACE_FUNC_ENTRY; + CSConTask* task = NULL; + TRequestStatus* status = NULL; + TInt err( KErrNone ); + + TInt ret = iQueue->GetTask( aTaskId, task ); + + if( aTaskId > 0 && ret != KErrNotFound ) + { + if ( iInstallerState != EIdle || IsActive() ) + { + LOGGER_WRITE("WARNING! SConAppInstaller was not on idle state!"); + iQueue->CompleteTask( aTaskId, KErrInUse ); + TRACE_FUNC_EXIT; + return; + } + + + iCurrentTask = aTaskId; + iQueue->SetTaskProgress( aTaskId, KSConCodeProcessingStarted ); + + switch( task->GetServiceId() ) + { + case EInstall : + iQueue->ChangeQueueProcessStatus(); + err = iSWInst.Connect(); + + if( err == KErrNone ) + { + if ( task->iInstallParams->iMode == ESilentInstall ) + { + LOGGER_WRITE( "Begin silent installation.. " ); + iOptions.iUntrusted = SwiUI::EPolicyNotAllowed; + iOptions.iOCSP = SwiUI::EPolicyNotAllowed; + iOptionsPckg = iOptions; + iInstallerState = ESilentInstalling; + iSWInst.SilentInstall( iStatus, task->iInstallParams->iPath, iOptionsPckg ); + } + else + { + LOGGER_WRITE( "Begin to install.. " ); + iInstallerState = EInstalling; + iSWInst.Install( iStatus, task->iInstallParams->iPath ); + } + } + + break; + case EUninstall : + iQueue->ChangeQueueProcessStatus(); + err = iSWInst.Connect(); + + if( err == KErrNone ) + { + LOGGER_WRITE( "Begin to uninstall.. " ); + + TRAP( err, ProcessUninstallL( *task->iUninstallParams ) ); + if( err != KErrNone ) + { + LOGGER_WRITE_1( "StartInstaller ProcessUninstallL err: %d", err ); + status = &iStatus; + User::RequestComplete( status, err ); + } + } + + break; + case EListInstalledApps : + iQueue->ChangeQueueProcessStatus(); + iInstallerState = EListingInstalledApps; + TRAP( err, ProcessListInstalledAppsL() ); + status = &iStatus; + User::RequestComplete( status, err ); + break; + default : + break; + } + + SetActive(); + } + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CSConAppInstaller::StopInstaller( TInt& aTaskId ) +// Stops the installer task +// ----------------------------------------------------------------------------- +// +void CSConAppInstaller::StopInstaller( TInt& aTaskId ) + { + TRACE_FUNC_ENTRY; + //If the task is the current task, cancel it first + if( iCurrentTask == aTaskId ) + { + Cancel(); + iSWInst.Close(); + } + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// TBool CSConAppInstaller::InstallerActive() +// returns installer activity status +// ----------------------------------------------------------------------------- +// +TBool CSConAppInstaller::InstallerActive() const + { + if ( iInstallerState == EIdle ) + { + return EFalse; + } + else + { + return ETrue; + } + } + +// ----------------------------------------------------------------------------- +// CSConAppInstaller::DoCancel() +// Implementation of CActive::DoCancel() +// ----------------------------------------------------------------------------- +// +void CSConAppInstaller::DoCancel() + { + TRACE_FUNC_ENTRY; + + switch (iInstallerState) + { + case EInstalling: + LOGGER_WRITE("Cancel normal install"); + iSWInst.CancelAsyncRequest( SwiUI::ERequestInstall ); + break; + case ESilentInstalling: + LOGGER_WRITE("Cancel silent install"); + iSWInst.CancelAsyncRequest( SwiUI::ERequestSilentInstall ); + break; + case EUninstalling: + LOGGER_WRITE("Cancel normal uninstall"); + iSWInst.CancelAsyncRequest( SwiUI::ERequestUninstall ); + break; + case ESilentUninstalling: + LOGGER_WRITE("Cancel silent uninstall"); + iSWInst.CancelAsyncRequest( SwiUI::ERequestSilentUninstall ); + break; + case ECustomUninstalling: + LOGGER_WRITE("Cancel custom uninstall"); + iSWInst.CancelAsyncRequest( SwiUI::ERequestCustomUninstall ); + break; + case ESilentCustomUnistalling: + LOGGER_WRITE("Cancel silent custom uninstall"); + iSWInst.CancelAsyncRequest( SwiUI::ERequestSilentCustomUninstall ); + break; + default: + LOGGER_WRITE("WARNING! Unknown state"); + break; + } + iInstallerState = EIdle; + + // find and complete current task + CSConTask* task = NULL; + TInt ret = iQueue->GetTask( iCurrentTask, task ); + + if ( iCurrentTask > 0 && ret != KErrNotFound ) + { + + switch( task->GetServiceId() ) + { + case EInstall : + iQueue->CompleteTask( iCurrentTask, KErrCancel ); + break; + case EUninstall : + iQueue->CompleteTask( iCurrentTask, KErrCancel ); + break; + default : + break; + } + } + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CSConAppInstaller::RunL() +// Implementation of CActive::RunL() +// ----------------------------------------------------------------------------- +// +void CSConAppInstaller::RunL() + { + TRACE_FUNC_ENTRY; + iInstallerState = EIdle; + iSWInst.Close(); + iQueue->ChangeQueueProcessStatus(); + TInt err( iStatus.Int() ); + LOGGER_WRITE_1( "CSConAppInstaller::RunL() iStatus.Int() : returned %d", err ); + + CSConTask* task = NULL; + TInt taskErr = iQueue->GetTask( iCurrentTask, task ); + + LOGGER_WRITE_1( "CSConAppInstaller::RunL() GetTask %d", taskErr ); + + if( taskErr == KErrNone ) + { + if( task->GetServiceId() == EInstall && err == KErrNone ) + { + LOGGER_WRITE( "CSConAppInstaller::RunL() : before DeleteFile" ); + //delete sis after succesfull install + DeleteFile( task->iInstallParams->iPath ); + } + } + + iQueue->CompleteTask( iCurrentTask, err ); + TRACE_FUNC_EXIT; + } + + +// ----------------------------------------------------------------------------- +// CSConAppInstaller::ProcessUninstallL( const CSConUninstall& aUninstallParams ) +// Execures UnInstall task +// ----------------------------------------------------------------------------- +// +void CSConAppInstaller::ProcessUninstallL( const CSConUninstall& aUninstallParams ) + { + TRACE_FUNC_ENTRY; + LOGGER_WRITE_1( "aUid: 0x%08x", aUninstallParams.iUid.iUid ); + LOGGER_WRITE_1( "aName: %S", &aUninstallParams.iName ); + LOGGER_WRITE_1( "aVendor: %S", &aUninstallParams.iVendor ); + LOGGER_WRITE_1( "aType: %d", aUninstallParams.iType ); + LOGGER_WRITE_1( "aMode: %d", aUninstallParams.iMode ); + switch ( aUninstallParams.iType ) + { + case ESisApplication: + case ESisAugmentation: + UninstallSisL( aUninstallParams ); + break; + case EJavaApplication: + UninstallJavaL( aUninstallParams.iUid, + aUninstallParams.iMode); + break; + case EWidgetApplication: + UninstallWidget( aUninstallParams.iUid, + aUninstallParams.iMode ); + break; + default: + User::Leave( KErrNotSupported ); + } + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CSConAppInstaller::UninstallSisL( const CSConUninstall& aUninstallParams ) +// Uninstall sis package or augmentation +// ----------------------------------------------------------------------------- +// +void CSConAppInstaller::UninstallSisL( const CSConUninstall& aUninstallParams ) + { + TRACE_FUNC_ENTRY; + + if ( aUninstallParams.iUid == KSConSeConUid ) + { + LOGGER_WRITE("Cannot uninstall itself, leave"); + // cannot uninstall itself + User::Leave( SwiUI::KSWInstErrFileInUse ); + } + + Swi::RSisRegistrySession sisRegistry; + User::LeaveIfError( sisRegistry.Connect() ); + CleanupClosePushL( sisRegistry ); + //Check if uid belongs to SIS package + if( !sisRegistry.IsInstalledL( aUninstallParams.iUid ) ) + { + CleanupStack::PopAndDestroy( &sisRegistry ); + User::Leave( KErrNotFound ); + } + + Swi::RSisRegistryEntry entry; + CleanupClosePushL(entry); + User::LeaveIfError( entry.Open( sisRegistry, aUninstallParams.iUid ) ); + if ( aUninstallParams.iType == ESisAugmentation ) + { + // augmentation pkg + LOGGER_WRITE( "CSConAppInstaller::ProcessUninstallL ESisAugmentation" ); + + TBool augmentationFound(EFalse); + // Get possible augmentations + RPointerArray augPackages; + CleanupResetAndDestroyPushL( augPackages ); + entry.AugmentationsL( augPackages ); + for ( TInt j( 0 ); j < augPackages.Count() && !augmentationFound; j++ ) + { + Swi::RSisRegistryEntry augmentationEntry; + CleanupClosePushL( augmentationEntry ); + augmentationEntry.OpenL( sisRegistry, *augPackages[j] ); + + HBufC* augPackageName = augmentationEntry.PackageNameL(); + CleanupStack::PushL( augPackageName ); + HBufC* augUniqueVendorName = augmentationEntry.UniqueVendorNameL(); + CleanupStack::PushL( augUniqueVendorName ); + + if ( !augmentationEntry.IsInRomL() + && augmentationEntry.IsPresentL() + && aUninstallParams.iName.Compare( *augPackageName ) == 0 + && aUninstallParams.iVendor.Compare( *augUniqueVendorName ) == 0 ) + { + // Correct augmentation found, uninstall it. + augmentationFound = ETrue; + TInt augmentationIndex = augPackages[j]->Index(); + LOGGER_WRITE_1( "CSConAppInstaller::ProcessUninstallL augmentationIndex %d", augmentationIndex ); + + SwiUI::TOpUninstallIndexParam params; + params.iUid = aUninstallParams.iUid; + params.iIndex = augmentationIndex; + SwiUI::TOpUninstallIndexParamPckg pckg( params ); + SwiUI::TOperation operation( SwiUI::EOperationUninstallIndex ); + if( aUninstallParams.iMode == ESilentInstall ) + { + LOGGER_WRITE( "CSConAppInstaller::ProcessUninstallL : silent aug-sis-uninstall" ); + SwiUI::TUninstallOptionsPckg options; + iInstallerState = ESilentCustomUnistalling; + iSWInst.SilentCustomUninstall( iStatus, operation, options, pckg, KSISMIMEType ); + } + else + { + LOGGER_WRITE( "CSConAppInstaller::ProcessUninstallL : unsilent aug-sis-uninstall" ) + iInstallerState = ECustomUninstalling; + iSWInst.CustomUninstall( iStatus, operation, pckg, KSISMIMEType ); + } + } + CleanupStack::PopAndDestroy( augUniqueVendorName ); + CleanupStack::PopAndDestroy( augPackageName ); + CleanupStack::PopAndDestroy( &augmentationEntry ); + } + CleanupStack::PopAndDestroy( &augPackages ); + + if ( !augmentationFound ) + { + LOGGER_WRITE( "CSConAppInstaller::ProcessUninstallL augmentation not found -> Leave" ); + User::Leave( KErrNotFound ); + } + } + else + { + // Only uninstall if not in rom and is present + if ( !entry.IsInRomL() && entry.IsPresentL() ) + { + if ( aUninstallParams.iMode == ESilentInstall ) + { + LOGGER_WRITE( "CSConAppInstaller::ProcessUninstallL : silent sis-uninstall" ); + SwiUI::TUninstallOptionsPckg options; + iInstallerState = ESilentUninstalling; + iSWInst.SilentUninstall( iStatus, aUninstallParams.iUid, options, KSISMIMEType ); + } + else + { + LOGGER_WRITE( "CSConAppInstaller::ProcessUninstallL : unsilent sis-uninstall" ) + iInstallerState = EUninstalling; + iSWInst.Uninstall( iStatus, aUninstallParams.iUid, KSISMIMEType ); + } + } + else + { + LOGGER_WRITE( "CSConAppInstaller::ProcessUninstallL sis not present -> Leave" ); + User::Leave( KErrNotFound ); + } + } + + CleanupStack::PopAndDestroy( &entry ); + CleanupStack::PopAndDestroy( &sisRegistry ); + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CSConAppInstaller::UninstallJavaL( const TUid& aUid, const TSConInstallMode aMode ) +// Uninstall java package +// ----------------------------------------------------------------------------- +// +void CSConAppInstaller::UninstallJavaL( const TUid& aUid, const TSConInstallMode aMode ) + { + TRACE_FUNC_ENTRY; + CJavaRegistry* javaRegistry = CJavaRegistry::NewLC( ); + TBool entryExist = javaRegistry->RegistryEntryExistsL( aUid ); + CleanupStack::PopAndDestroy( javaRegistry ); + + if( entryExist ) + { + if( aMode == ESilentInstall ) + { + LOGGER_WRITE( "CSConAppInstaller::UninstallJavaL : silent midlet-uninstall" ) + SwiUI::TUninstallOptionsPckg options; + iInstallerState = ESilentUninstalling; + iSWInst.SilentUninstall( iStatus, aUid, options, KMidletMIMEType ); + } + else + { + LOGGER_WRITE( "CSConAppInstaller::UninstallJavaL : unsilent midlet-uninstall" ) + iInstallerState = EUninstalling; + iSWInst.Uninstall( iStatus, aUid, KMidletMIMEType ); + } + } + else + { + LOGGER_WRITE( "CSConAppInstaller::UninstallJavaL java entry does not exist -> Leave" ) + User::Leave( KErrNotFound ); + } + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CSConAppInstaller::UninstallWidget( const TUid& aUid, const TSConInstallMode aMode ) +// Uninstall widget +// ----------------------------------------------------------------------------- +// +void CSConAppInstaller::UninstallWidget( const TUid& aUid, const TSConInstallMode aMode ) + { + TRACE_FUNC_ENTRY; + if( aMode == ESilentInstall ) + { + LOGGER_WRITE( "CSConAppInstaller::UninstallWidget : silent uninstall" ) + SwiUI::TUninstallOptionsPckg options; + iInstallerState = ESilentUninstalling; + iSWInst.SilentUninstall( iStatus, aUid, options, KWidgetMimeType ); + } + else + { + LOGGER_WRITE( "CSConAppInstaller::UninstallWidget : unsilent uninstall" ) + iInstallerState = EUninstalling; + iSWInst.Uninstall( iStatus, aUid, KWidgetMimeType ); + } + TRACE_FUNC_EXIT; + } + + +//-------------------------------------------------------------------------------- +//void CSConAppInstaller::ProcessListInstalledAppsL() +//-------------------------------------------------------------------------------- +// +void CSConAppInstaller::ProcessListInstalledAppsL() + { + TRACE_FUNC_ENTRY; + + CSConTask* task = NULL; + User::LeaveIfError( iQueue->GetTask( iCurrentTask, task ) ); + + SConPcdUtility::ProcessListInstalledAppsL( task ); + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CSConAppInstaller::DeleteFile( const TDesC& aPath ) +// Deletes a file +// ----------------------------------------------------------------------------- +// +void CSConAppInstaller::DeleteFile( const TDesC& aPath ) + { + TRACE_FUNC; + iFs.Delete( aPath ); + } +// End of file