diff -r d1838696558c -r 9dcba1ee99f7 appinstaller/AppinstUi/Plugin/SisxUI/Src/SisxUIOperationWatcher.cpp --- a/appinstaller/AppinstUi/Plugin/SisxUI/Src/SisxUIOperationWatcher.cpp Thu Oct 14 14:11:30 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1409 +0,0 @@ -/* -* Copyright (c) 2002-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: This module contains the implementation of CSisxUIOperationWatcher -* class member functions. -* -*/ - - -// INCLUDE FILES - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include // KOmaDrm2AgentName -#include -#include // ContentAccess::CManager -#include // ContentAccess::TAgent - -#include // JPAA-7GEB7P -#include // JPAA-7GEB7P - -#include "SisxUIOperationWatcher.h" -#include "SisxUIHandler.h" -#include "SisxUIResult.h" -#include "SisxUIAppInfo.h" -#include "SisxUIStartupFile.h" -#include "SWInstDebug.h" -#include "SisxUISilentHandler.h" -#include "SisxUICleanupUtils.h" // JPAA-7GEB7P - -_LIT( KTempDir, "piptemp\\" ); -_LIT( KPipFileMatch, "*" ); -const TUint KSisxFileUidPosition = 8; -const TUint KDot = 0x2E; // Dot -_LIT(KSisString, "sis"); -_LIT( KSkinExtension, "*.skn" ); // JPAA-7GEB7P - -using namespace SwiUI; -using namespace ContentAccess; - -// ============================ MEMBER FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::CSisxUIOperationWatcher -// C++ default constructor can NOT contain any code, that -// might leave. -// ----------------------------------------------------------------------------- -// -CSisxUIOperationWatcher::CSisxUIOperationWatcher() - : CActive( CActive::EPriorityStandard ), - iIsSilent( EFalse ), - iDoSilentOcsp( EFalse ) - { - CActiveScheduler::Add( this ); - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::ConstructL -// Symbian 2nd phase constructor can leave. -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::ConstructL() - { - iTaskManager = CTaskManager::NewL(); - User::LeaveIfError( iRfs.Connect() ); - iRfs.ShareProtected(); - FeatureManager::InitializeLibL(); - iLauncher = Swi::CAsyncLauncher::NewL(); - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::NewL -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -CSisxUIOperationWatcher* CSisxUIOperationWatcher::NewL() - { - CSisxUIOperationWatcher* self = new( ELeave ) CSisxUIOperationWatcher(); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - return self; - } - -// Destructor -CSisxUIOperationWatcher::~CSisxUIOperationWatcher() - { - iDeletionOngoing = ETrue; - if ( iCanceller ) - { - iCanceller->Cancel(); - delete iCanceller; - } - - delete iLauncher; - iLauncher = NULL; - CActive::Cancel(); - - iSupportedLanguages.Close(); - delete iUIHandler; - delete iTaskManager; - delete iMIME; - - NotifyEndUninstall(); - - iInstalledFiles.ResetAndDestroy(); - iAugmentations.ResetAndDestroy(); - - iTempFile.Close(); - iRfs.Close(); - - FeatureManager::UnInitializeLib(); - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::InstallL -// Handle install request. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::InstallL( RFile& aFile, - const TDesC8& aMIME, - TBool aIsDRM, - TRequestStatus& aRequestStatus ) - { - // Set client request to pending state - iRequestStatus = &aRequestStatus; - *iRequestStatus = KRequestPending; - - iSourceFile = aFile; - iMIME = aMIME.AllocL(); - - // Create the ui - iUIHandler = CSisxUIHandler::NewL( CSisxUIHandler::EModeInstall, this ); - if ( aIsDRM ) - { - // We need to pass the handle to ui handler, so that it can shown - // details of drm - iUIHandler->SetFileForDrm( aFile ); - } - - iPreparing = ETrue; - // Kick off the RunL - TRequestStatus* stat = &iStatus; - User::RequestComplete( stat, KErrNone ); - SetActive(); - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::SilentInstallL -// Handle silentinstall request. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::SilentInstallL( RFile& aFile, - const TDesC8& aMIME, - TBool aIsDRM, - TInstallOptions& aOptions, - TRequestStatus& aRequestStatus ) - { - // Set client request to pending state - iRequestStatus = &aRequestStatus; - *iRequestStatus = KRequestPending; - - iIsSilent = ETrue; - iSourceFile = aFile; - iMIME = aMIME.AllocL(); - if ( aOptions.iOCSP == EPolicyAllowed ) - { - iDoSilentOcsp = ETrue; - } - - // Create the ui - iUIHandler = CSisxUISilentHandler::NewL( aOptions, this ); - if ( aIsDRM ) - { - // We need to pass the handle to ui handler, so that it can shown - // details of drm - iUIHandler->SetFileForDrm( aFile ); - } - - iPreparing = ETrue; - // Kick off the RunL - TRequestStatus* stat = &iStatus; - User::RequestComplete( stat, KErrNone ); - SetActive(); - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::UninstallL -// Handle uninstall request. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::UninstallL( const TUid& aUid, TRequestStatus& aRequestStatus ) - { - // Set client request to pending state - iRequestStatus = &aRequestStatus; - *iRequestStatus = KRequestPending; - - iUninstalledUid = aUid; - - TRAP_IGNORE( NotifyStartUninstallL(aUid ) ); - iUIHandler = CSisxUIHandler::NewL( CSisxUIHandler::EModeUninstall, this ); - - iLauncher->UninstallL( *iUIHandler, aUid, iStatus ); - SetActive(); - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::UninstallL -// Handle uninstall request. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::SilentUninstallL( const TUid& aUid, - TUninstallOptions& aOptions, - TRequestStatus& aRequestStatus ) - { - // Set client request to pending state - iRequestStatus = &aRequestStatus; - *iRequestStatus = KRequestPending; - - iIsSilent = ETrue; - iUninstalledUid = aUid; - - iUIHandler = CSisxUISilentHandler::NewL( aOptions, this ); - - TRAP_IGNORE( NotifyStartUninstallL(aUid ) ); - iLauncher->UninstallL( *iUIHandler, aUid, iStatus ); - SetActive(); - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::UninstallAugmentationL -// Uninstalls only a specific augmentation (sispatch) -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::UninstallAugmentationL( const TUid& aUid, - TInt aIndex, - TRequestStatus& aRequestStatus ) - { - // Set client request to pending state - iRequestStatus = &aRequestStatus; - *iRequestStatus = KRequestPending; - - iUninstalledUid = aUid; - - TRAP_IGNORE( NotifyStartUninstallL(aUid ) ); - iUIHandler = CSisxUIHandler::NewL( CSisxUIHandler::EModeUninstall, this ); - - DoUninstallAugmentationL( aUid, aIndex ); - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::SilentUninstallAugmentationL -// Uninstalls only a specific augmentation (sispatch) -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::SilentUninstallAugmentationL( const TUid& aUid, - TUninstallOptions& aOptions, - TInt aIndex, - TRequestStatus& aRequestStatus ) - { - // Set client request to pending state - iRequestStatus = &aRequestStatus; - *iRequestStatus = KRequestPending; - - iIsSilent = ETrue; - iUninstalledUid = aUid; - - TRAP_IGNORE( NotifyStartUninstallL(aUid ) ); - iUIHandler = CSisxUISilentHandler::NewL( aOptions, this ); - - DoUninstallAugmentationL( aUid, aIndex ); - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::FinalCompleteL -// Informs the UI, about final completion. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::FinalCompleteL() - { - iTempFile.Close(); - - if ( iUIHandler ) - { - iUIHandler->ShowFinalNoteL(); - } - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::Cancel -// Override of CActive::Cancel -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::Cancel() - { - if ( !iCancelOngoing ) - { - iUIHandler->ProcessResult( KSWInstErrUserCancel ); - - if ( iPreparing ) - { - CActive::Cancel(); - iUIHandler->DoNotShowFinalNote(); - // Just complete the client request - CompleteRequest( KSWInstErrUserCancel ); - } - else - { - // If we are installing/uninstalling we may have a dialog waiting - // for user input. We need to use this special method to cancel - // the operation. - TRAPD( err, - iCanceller = CommonUI::CCUICancelTimer::NewL( this ); - iCanceller->StartCancelling(); - ); - if ( err != KErrNone ) - { - // Complete the original request from client - CompleteRequest( KSWInstErrUserCancel ); - } - } - - iCancelOngoing = ETrue; - } - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::RunL -// Called by framework when request is finished. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::RunL() - { - FLOG_1( _L("SisxUI: RunL() status: %d"), iStatus.Int() ); - - // If we got here, we don't need the canceller anymore - if ( iCanceller ) - { - iCanceller->Cancel(); - delete iCanceller; - iCanceller = NULL; - } - - if ( iPreparing ) - { - // Do all the necessary preparations - PrepareInstallL(); - return; - } - - // Let the UI know about the result - iUIHandler->ProcessResult( iStatus.Int() ); - - if ( iUIHandler->GetResult().iResult == EUiResultOk ) - { - // Install case - if ( iUIHandler->InstallMode() == CSisxUIHandler::EModeInstall ) - { - TRAP_IGNORE( CompleteInstallationL() ); - } - // Uninstall case - else - { - TRAP_IGNORE( CompleteUninstallationL() ); - } - } - - CompleteRequest( iUIHandler->GetResult().CommonResult() ); - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::DoCancelL -// Called by framework when request is cancelled. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::DoCancel() - { - // This function is usually not used because of overridden Cancel(). - // Usually CActive::Cancel() followed by CompleteRequest() is used to - // cancel active CSisxUIOperationWatcher. However, when active operation - // watcher is deleted, this function must complete the client request - // (to avoid deadlock when client calls CActive::Cancel() later). - if( iDeletionOngoing && iRequestStatus ) - { - CompleteRequest( KErrCancel ); - } - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::DoCancelL -// Handles a leave occurring in the request completion event handler RunL(). -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -TInt CSisxUIOperationWatcher::RunError( TInt aError ) - { - // Report the error to the UI - iUIHandler->ProcessResult( aError ); - // Complete client request - CompleteRequest( aError ); - return KErrNone; - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::UserCancelL -// Called when user has cancelled the operation. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::UserCancelL( TBool aCancelImmediately ) - { - iIsUserCancel = ETrue; - if ( !aCancelImmediately ) - { - Cancel(); - } - else - { - CancelEngine(); - } - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::IsShowingDialog -// Indicates if a modal dialog is currently shown. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -TBool CSisxUIOperationWatcher::IsShowingDialog() - { - return iUIHandler->IsShowingDialog(); - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::CancelEngine -// Cancels the installation engine. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::CancelEngine() - { - if ( iLauncher ) - { - iLauncher->CancelOperation(); - } - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::ForceCancel -// Called when nothing else has worked. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::ForceCancel() - { - // We need to make a dirty cancel - // Kill the async launcher - delete iLauncher; - iLauncher = NULL; - - // We can cancel the AO, launcher has completed the request - CActive::Cancel(); - - // Complete the client request - CompleteRequest( KSWInstErrUserCancel ); - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::StartedCancellingL -// Called to indicate that the cancelling progress has been started. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::StartedCancellingL() - { - // Show the dialog only if this is user initiated cancel. - if ( iIsUserCancel ) - { - iUIHandler->ShowCancellingL(); - } - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::DoCancelL -// Completes the pending request. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::CompleteRequest( TInt aResult ) - { - iTempFile.Close(); - - if ( iRequestStatus ) - { - FLOG_1( _L("SisxUI: Completing with: %d"), aResult ); - User::RequestComplete( iRequestStatus, aResult ); - iRequestStatus = NULL; - } - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::AddStartupItemsL -// Add files to startup list. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::AddStartupItemsL( RArray& aParams ) - { - if ( FeatureManager::FeatureSupported( KFeatureIdExtendedStartup ) ) - { - if ( aParams.Count() > 0 ) - { - CTask* task = CTask::NewL( KSTartupTaskAddImplUid, ETrue ); - CleanupStack::PushL( task ); - for ( TInt index = 0; index < aParams.Count(); index++ ) - { - TStartupTaskParamPckg pckg( aParams[index] ); - task->SetParameterL( pckg, index ); - } - - iTaskManager->AddTaskL( task ); - CleanupStack::Pop( task ); - } - } - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::RemoveStartupItemsL -// Remove files from the startup list. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::RemoveStartupItemsL( RArray& aParams ) - { - if ( FeatureManager::FeatureSupported( KFeatureIdExtendedStartup ) ) - { - if ( aParams.Count() > 0 ) - { - CTask* task = CTask::NewL( KSTartupTaskRemoveImplUid, ETrue ); - CleanupStack::PushL( task ); - for ( TInt index = 0; index < aParams.Count(); index++ ) - { - TStartupTaskParamPckg pckg( aParams[index] ); - task->SetParameterL( pckg, index ); - } - - iTaskManager->AddTaskL( task ); - CleanupStack::Pop( task ); - } - } - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::RemoveStartupFileL -// Checks if the given uid has installed a startup file. If it finds one -// it removes it and creates a task to remove the items as well. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::RemoveStartupFileL( TUid aUid ) - { - if ( FeatureManager::FeatureSupported( KFeatureIdExtendedStartup ) ) - { - // Handle startup list - CSisxUIStartupFile* startupFile = CSisxUIStartupFile::NewL( aUid ); - CleanupStack::PushL( startupFile ); - if ( !startupFile->NewFileExists() ) - { - FLOG( _L("SisxUI: Removal of import file") ); - - // First see if we have a control file for this package - if ( startupFile->PrivateFileExists() ) - { - RArray params; - startupFile->RemovePrivateFile( params ); - CleanupClosePushL( params ); - RemoveStartupItemsL( params ); - CleanupStack::PopAndDestroy(); // params - iInstalledFiles.ResetAndDestroy(); - - // Put the flag on that we did modify the startup list - iStartupModified = ETrue; - } - } - - CleanupStack::PopAndDestroy( startupFile ); - } - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::HandleLogL -// Handles the log entry addition. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::HandleLogL( const CSisxUIAppInfo& aAppInfo, - const TLogTaskAction& aAction, - TBool aIsStartup ) - { - // Create a log task object, non-persistent - CTask* task = CTask::NewL( KLogTaskImplUid, EFalse ); - CleanupStack::PushL( task ); - - // Construct log task parameters - TLogTaskParam params; - - // Make sure that we don't copy over limits - params.iName.Copy( aAppInfo.Name().Left( KMaxLogNameLength ) ); - params.iVendor.Copy( aAppInfo.Vendor().Left( KMaxLogNameLength ) ); - - params.iVersion = aAppInfo.Version(); - params.iUid = aAppInfo.Uid(); - // The time must be in universal time - TTime time; - time.UniversalTime(); - params.iTime = time; - params.iAction = aAction; - params.iIsStartup = aIsStartup; - - TLogTaskParamPckg pckg( params ); - task->SetParameterL( pckg, 0 ); - - // Add the log task to the task list - iTaskManager->AddTaskL( task ); - - CleanupStack::Pop( task ); - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::HandlePipFileL -// Helper to handle the case of pip file. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::HandlePipFileL( RFile& aPipFileHandle, RFile& aSisFileHandle ) - { - FLOG( _L("SisxUI: Handle pip file") ); - - // PIP package, we need to use license manager to extract the sis file - // First construct the temp path - iRfs.PrivatePath( iTempDir ); - iTempDir.Insert( 0, TParsePtrC( PathInfo::PhoneMemoryRootPath() ).Drive() ); - iTempDir.Append( KTempDir ); - iRfs.MkDir( iTempDir ); - - // Add task to delete the extracted sis file - HBufC* pipFileMatch = HBufC::NewLC( KMaxFileName ); - pipFileMatch->Des().Copy( iTempDir ); - pipFileMatch->Des().Append( KPipFileMatch ); - - // Create a delete file task - CTask* task = CTask::NewL( KFileTaskDeleteImplUid, ETrue ); - CleanupStack::PushL( task ); - - // Construct file task parameters - TFileTaskDeleteParam params; - params.iFile = *pipFileMatch; - TFileTaskDeleteParamPckg pckg( params ); - task->SetParameterL( pckg, 0 ); - - // Add the task to the task list - iTaskManager->AddTaskL( task ); - CleanupStack::Pop( task ); - iTaskManager->CommitL(); - - CleanupStack::PopAndDestroy( pipFileMatch ); - - // Use license manager to extract files from the pip package - CDRMLicenseManager* licenseMgr = CDRMLicenseManager::NewL(); - CleanupStack::PushL( licenseMgr ); - User::LeaveIfError( licenseMgr->ExtractSISFileL( aPipFileHandle, iTempDir ) ); - - // Get the sis file name and open temporary handle to it. - // HLEI-7EGFRE - CZipFileMember* sisMember( licenseMgr->GetSISMemberL() ); - CleanupStack::PushL( sisMember ); - iTempDir.Append( *sisMember->Name() ); - CleanupStack::PopAndDestroy( sisMember ); - sisMember = NULL; - - User::LeaveIfError( aSisFileHandle.Open( iRfs, iTempDir, EFileShareAny ) ); - iIsPipFile = ETrue; - - CleanupStack::PopAndDestroy( licenseMgr ); - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::PrepareOCSPL -// Helper to read ocsp values from central repository and prepare the ui. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::PrepareOCSPL( CSisxUIHandler* aUIHandler, - Swi::CInstallPrefs* aPrefs ) - { - TSWInstallerOcspProcedure ocspProc( ESWInstallerOcspProcedureOff ); - - if ( !iIsSilent || iDoSilentOcsp ) - { - CRepository* repository = CRepository::NewL( KCRUidSWInstallerSettings ); - CleanupStack::PushL( repository ); - - if ( !iIsSilent ) - { - // In case of normal installation we check the ocsp value from central rep - TInt value( 0 ); - repository->Get( KSWInstallerOcspProcedure, value ); - ocspProc = TSWInstallerOcspProcedure( value ); - } - else - { - // In case of silent install, the client sets the value - ocspProc = ESWInstallerOcspProcedureOn; - } - - // Get default OCSP URL - HBufC* ocspURL = HBufC::NewLC( NCentralRepositoryConstants::KMaxUnicodeStringLength ); - TPtr ptr( ocspURL->Des() ); - repository->Get( KSWInstallerOcspDefaultURL, ptr ); - - // Convert to 8 byte - HBufC8* ocspURL8 = HBufC8::NewLC( ocspURL->Length() ); - ocspURL8->Des().Copy( *ocspURL ); - - aPrefs->SetRevocationServerUriL( *ocspURL8 ); - CleanupStack::PopAndDestroy( 3, repository ); - } - - if ( ocspProc == ESWInstallerOcspProcedureOn || - ocspProc == ESWInstallerOcspProcedureMust ) - { - if ( ocspProc == ESWInstallerOcspProcedureOn ) - { - aUIHandler->SetOcspProcedure( ESisxUIOcspProcOn ); - } - else - { - aUIHandler->SetOcspProcedure( ESisxUIOcspProcMust ); - } - - aPrefs->SetPerformRevocationCheck( ETrue ); - } - else - { - aUIHandler->SetOcspProcedure( ESisxUIOcspProcOff ); - aPrefs->SetPerformRevocationCheck( EFalse ); - } - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::GetInstalledPackagesL -// Helper to get the packages that were installed in this session. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::GetInstalledPackagesL( RPointerArray& aPackages ) - { - ContentAccess::CContent* content = NULL; - if ( iIsPipFile ) - { - // The source file is a pip file, we need to use the extracted sis file instead. - content = ContentAccess::CContent::NewLC( iTempFile ); - } - else - { - content = ContentAccess::CContent::NewLC( iSourceFile ); - } - - ContentAccess::CData* data = content->OpenContentLC( ContentAccess::EExecute ); - - // Read the uid from the package - TInt32 uid( 0 ); - TPckg uidpkg( uid ); - TInt pos( KSisxFileUidPosition ); - data->Seek( ESeekStart, pos ); - data->Read( uidpkg, sizeof( TInt32 ) ); - - CleanupStack::PopAndDestroy( 2, content ); - - iUIHandler->ProcessedPackages( aPackages ); - - // Currently we can only get the parent package - for ( TInt index = 0; index < 1 && index < aPackages.Count(); index++ ) - { - aPackages[index]->SetUid( TUid::Uid( uid ) ); - } - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::HandleStartupAdditionL -// Helper to handle startup list addition. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::HandleStartupAdditionL( const CSisxUIAppInfo& aAppInfo ) - { - FLOG( _L("SisxUI: Handle startup") ); - - if ( FeatureManager::FeatureSupported( KFeatureIdExtendedStartup ) ) - { - CSisxUIStartupFile* startupFile = CSisxUIStartupFile::NewL( aAppInfo.Uid() ); - CleanupStack::PushL( startupFile ); - - // First check if there is a control file in import dir - if ( startupFile->NewFileExists() ) - { - FLOG( _L("SisxUI: Processing control file") ); - - // Get all files installed by this package - Swi::RSisRegistrySession regSession; - CleanupClosePushL( regSession ); - User::LeaveIfError( regSession.Connect() ); - - Swi::RSisRegistryEntry regEntry; - CleanupClosePushL( regEntry ); - User::LeaveIfError( regEntry.Open( regSession, aAppInfo.Uid() ) ); - - regEntry.FilesL( iInstalledFiles ); - - CleanupStack::PopAndDestroy( 2 ); // regEntry, regSession - - RArray params; - - // See if there are some old items, if so remove them - if ( startupFile->PrivateFileExists() ) - { - startupFile->RemovePrivateFile( params ); - CleanupClosePushL( params ); - RemoveStartupItemsL( params ); - CleanupStack::Pop(); // params - params.Reset(); - } - - startupFile->ProcessNewFile( params, iInstalledFiles ); - - CleanupClosePushL( params ); - AddStartupItemsL( params ); - CleanupStack::PopAndDestroy(); // params - iInstalledFiles.ResetAndDestroy(); - } - - iTaskManager->CommitL(); - - CleanupStack::PopAndDestroy( startupFile ); - } - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::PrepareInstallL -// Prepares the installation. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::PrepareInstallL() - { - Swi::CInstallPrefs* prefs = Swi::CInstallPrefs::NewL(); - CleanupStack::PushL( prefs ); - - // Prepare for possible OCSP - PrepareOCSPL( iUIHandler, prefs ); - - // Check if we allow untrusted SW to be installed - CRepository* repository = CRepository::NewL( KCRUidSWInstallerSettings ); - CleanupStack::PushL( repository ); - TInt value( 1 ); - repository->Get( KSWInstallerAllowUntrusted, value ); - if ( !value ) - { - iUIHandler->SetAllowUntrusted( EFalse ); - } - else - { - iUIHandler->SetAllowUntrusted( ETrue ); - } - CleanupStack::PopAndDestroy( repository ); - - // Get supported language ids in a RArray for Swi::CAsyncLauncher::InstallL() - iSupportedLanguages.Reset(); - CArrayFixFlat* installedLanguages = NULL; - TInt err = SysLangUtil::GetInstalledLanguages( installedLanguages, &iRfs ); - CleanupStack::PushL( installedLanguages ); - User::LeaveIfError( err ); - if( installedLanguages ) - { - for( TInt lang = 0; lang < installedLanguages->Count(); lang++ ) - { - iSupportedLanguages.AppendL( (*installedLanguages)[ lang ] ); - } - } - CleanupStack::PopAndDestroy( installedLanguages ); - - if ( *iMIME == KPipMimeType ) - { - // Handle the pip file - HandlePipFileL( iSourceFile, iTempFile ); - - // Start installation - iLauncher->InstallL( *iUIHandler, iTempFile, *prefs, iSupportedLanguages, iStatus ); - } - else - { - // Start installation - iLauncher->InstallL( *iUIHandler, iSourceFile, *prefs, iSupportedLanguages, iStatus ); - } - - CleanupStack::PopAndDestroy( prefs ); - - // Preparing done - iPreparing = EFalse; - SetActive(); - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::CompleteInstallationL -// Completes the installation -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::CompleteInstallationL() - { - FLOG( _L("SisxUI: CompleteInstallationL ->") ); - // If this was a pip file, process it - if ( iIsPipFile ) - { - FLOG( _L("SisxUI: PIP file") ); - - CDRMLicenseManager* licenseMgr = CDRMLicenseManager::NewL(); - CleanupStack::PushL( licenseMgr ); - TInt err = licenseMgr->ProcessL( iSourceFile, KNullDesC() ); - if ( err != KErrNone ) - { - // Reset the OK result so that we can show the error. - iUIHandler->ResetResult(); - User::Leave( KSWInstErrFileCorrupted ); - } - - CleanupStack::PopAndDestroy( licenseMgr ); - -// RVIN-6JUGWH - HBufC* fileName = HBufC::NewLC( 100 ); - TPtr fileNamePtr( fileName->Des() ); - TInt err2 = iSourceFile.Name( fileNamePtr ); - - FLOG_1( _L("Original file name: %S"), &fileNamePtr ); - - TInt i = 0; - for ( ; i < fileNamePtr.Length(); i++ ) - { - if ( fileNamePtr[i] == KDot ) - { - break; - } - } - - HBufC* tmpFile = HBufC::NewLC( i + 4 ); - TPtr tmpFilePtr( tmpFile->Des() ); - tmpFilePtr = fileNamePtr.Left( i + 1 ); - tmpFilePtr.Append( KSisString ); - - FLOG_1( _L( "Changed file name: %S" ), &tmpFilePtr ); - - // Create data supplier - CContent* content = CContent::NewLC( iSourceFile ); - - HBufC* contentID = HBufC::NewLC( KMaxCafContentName ); - TPtr contPtr(NULL, NULL); - - // create attribute set - ContentAccess::RStringAttributeSet stringAttSet; - //RStringAttributeSet stringAttSet; - CleanupClosePushL( stringAttSet ); - - stringAttSet.AddL( EContentID ); - - content->GetStringAttributeSet( stringAttSet ); - - // pass on values of string attributes - contPtr.Set( contentID->Des() ); - - err = stringAttSet.GetValue( EContentID, contPtr ); - - if ( err != KErrNone ) - { - FLOG_1( _L("SisxUI: ContentID error = %d"), err ); - // Reset the OK result so that we can show the error. - iUIHandler->ResetResult(); - User::Leave( KSWInstErrGeneralError ); - } - - HBufC8* contentID8 = HBufC8::NewLC( contentID->Length() ); - TPtr8 cont8Ptr = contentID8->Des(); - - // Copy 8bit data from contentID buffer. - // Note that AgentSpecificCommand function take's only 8bit data. - cont8Ptr.Copy( contPtr ); - - HBufC8* buffer = HBufC8::NewMaxLC( sizeof( TInt ) + - contentID8->Size() + - tmpFilePtr.Size() ); - TUint8* bptr = const_cast( buffer->Ptr() ); - - TUint length = tmpFilePtr.Length(); - TPtr8 temp( NULL, 0, 0 ); - TPtr8 buf( buffer->Des() ); - Mem::Copy(bptr, &length, sizeof(TInt)); - Mem::Copy(bptr+sizeof( TInt ), tmpFilePtr.Ptr(), length * 2 ); - Mem::Copy(bptr+sizeof( TInt )+( length * 2 ), contentID8->Ptr(), contentID8->Size()); - - ContentAccess::CManager* manager = NULL; - ContentAccess::TAgent agent; - - // Find the caf agent and create manager - manager = GetCafDataL( agent ); - - // ignore any error, we couldn't do anything about it anyway - length = manager->AgentSpecificCommand( agent, ContentAccess::ESetContentName, - buf, temp); - - FLOG( _L("SisxUI: PopAndDestroy") ); - // buffer, tmpfile, fileName, content, contentID, stringAttSet, contentID8 - CleanupStack::PopAndDestroy( 7 ); - delete manager; -// RVIN-6JUGWH - } - - FLOG( _L("SisxUI: GetInstalledPackagesL") ); - - // Here we get only the first package in case of embedded packages - // as currently there is no means to get the sub packages - RPointerArray packages; - GetInstalledPackagesL( packages ); - CleanupClosePushL( packages ); - - // Create log entry for every installed package and handle possible - // startup list addition. - for ( TInt index = 0; index < packages.Count(); index++ ) - { - // Handle startup list - // Currently, if embedded sis, only the first package can contain - // startup items - if ( !index && packages[index]->IsTrusted() ) - { - HandleStartupAdditionL( *packages[index] ); - - // Handle log - HandleLogL( *packages[index], ELogTaskActionInstall, ETrue ); - } - else - { - // Handle log - HandleLogL( *packages[index], ELogTaskActionInstall, EFalse ); - } - } - -// JPAA-7GEB7P - // Register PIP file content to DRM DCF server. - if ( iIsPipFile ) - { - TInt siscount = packages.Count(); - FLOG_1( _L("SisxUI: packages.Count() = %d"), siscount ); - - if ( siscount ) - { - TUid pkgUid( packages[0]->Uid() ); - FLOG_1( _L("SisxUI: package UID: 0x%x"), pkgUid.iUid ); - RegisterContentToDCF( pkgUid ); - } - } -// JPAA-7GEB7P - - FLOG( _L("SisxUI: PopAndDestroy") ); - CleanupStack::PopAndDestroy(); // packages - - FLOG( _L("SisxUI: CompleteInstallationL <-") ); - - // Make sure that all other control files are removed. - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::CompleteUninstallationL -// Completes the uninstallation -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::CompleteUninstallationL() - { - NotifyEndUninstall(); - - RemoveStartupFileL( iUninstalledUid ); - iTaskManager->CommitL(); - - RPointerArray packages; - iUIHandler->ProcessedPackages( packages ); - CleanupClosePushL( packages ); - - if ( packages.Count() > 0 ) - { - packages[0]->SetUid( iUninstalledUid ); - - HandleLogL( *packages[0], ELogTaskActionUninstall, iStartupModified ); - } - CleanupStack::PopAndDestroy(); // packages - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::DoUninstallAugmentationL -// Performs the uninstallation of augmentation. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::DoUninstallAugmentationL( TUid aUid, TInt aIndex ) - { - // Find the augmentation - Swi::RSisRegistrySession regSession; - CleanupClosePushL( regSession ); - User::LeaveIfError( regSession.Connect() ); - - Swi::RSisRegistryEntry regEntry; - CleanupClosePushL( regEntry ); - User::LeaveIfError( regEntry.Open( regSession, aUid ) ); - - regEntry.AugmentationsL( iAugmentations ); - - for ( TInt i( 0 ); i < iAugmentations.Count(); i++ ) - { - if ( iAugmentations[i]->Index() == aIndex ) - { - iIsAugmentation = ETrue; - // We found the correct package, now uninstall it - iLauncher->UninstallL( *iUIHandler, *iAugmentations[i], iStatus ); - SetActive(); - break; - } - if ( i == iAugmentations.Count() + 1 ) - { - // We have gone through the whole list and couldn't find the package - User::Leave( KErrNotFound ); - } - } - - iAugmentations.ResetAndDestroy(); - CleanupStack::PopAndDestroy( 2, ®Session ); - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::NotifyStartUninstallL -// Notifies that uninstallation is about to start. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::NotifyStartUninstallL( TUid aUid ) - { - _LIT_SECURITY_POLICY_PASS( KPropReadPolicy ); - _LIT_SECURITY_POLICY_C1( KPropWritePolicy, ECapabilityWriteDeviceData ); - - // Try to define the property if this is the first time - TInt err = RProperty::Define( KPSUidSWInstallerUiNotification, - KSWInstallerUninstallation, - RProperty::EInt, - KPropReadPolicy, - KPropWritePolicy ); - if ( err != KErrNone && err != KErrAlreadyExists ) - { - User::Leave( err ); - } - - // Set the package uid as the value - err = RProperty::Set( KPSUidSWInstallerUiNotification, - KSWInstallerUninstallation, - aUid.iUid ); - User::LeaveIfError( err ); - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::NotifyEndUninstall -// Notifies that uninstallation has been completed. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::NotifyEndUninstall() - { - RProperty::Set( KPSUidSWInstallerUiNotification, - KSWInstallerUninstallation, - 0 ); - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::GetCafDataL -// Handles searching correct DRM agent and manager. -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -ContentAccess::CManager* CSisxUIOperationWatcher::GetCafDataL( ContentAccess::TAgent& aAgent ) - { - RArray agents; - - CleanupClosePushL( agents ); - CManager* manager = CManager::NewLC(); - - manager->ListAgentsL( agents ); - - for ( TInt i = 0; i < agents.Count(); i++ ) - { - if (agents[i].Name().Compare(KOmaDrm2AgentName) == 0) - { - aAgent = agents[i]; - break; - } - } - CleanupStack::Pop( manager ); - CleanupStack::PopAndDestroy( &agents ); - return manager; - } - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::RegisterContentToDCF -// This function does register PIP packages content to DCF server. -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::RegisterContentToDCF( TUid aUid ) - { - // Note that currently we do register only skin (*.skn) - // files since there is not way to SisxUI plugin to know - // which files should be registerd to DCF. It is not reasonable - // to push all files to DCF and hope that some is correct one. - - FLOG( _L("SisxUI: RegisterContentToDCF") ); - Swi::RSisRegistrySession sisRegSession; - User::LeaveIfError( sisRegSession.Connect() ); - CleanupClosePushL( sisRegSession ); - - // Get current package UID and open the entry. - Swi::RSisRegistryEntry entry; - // Open entry - TInt error = entry.Open( sisRegSession, aUid ); - FLOG_1( _L("SisxUI: SisEntry open error: %d"), error ); - - if ( error == KErrNone ) - { - CleanupClosePushL( entry ); - // Get all files to array for DCF update. - RPointerArray fileArray; - CleanupResetAndDestroyPushL( fileArray ); - TInt index = 0; - // It seems that some PIP pkg do not have files in - // main pacakge, but let's make sure that we do not - // miss any files. - FLOG( _L("SisxUI: Get files from main pkg") ); - RPointerArray sisFileArray; - entry.FilesL( sisFileArray ); - CleanupResetAndDestroyPushL( sisFileArray ); - - // Add main package's file paths to file array. - SearchFilesForDCFL( sisFileArray, fileArray ); - - // Let's see if there is augmentations to this main pkg. - RPointerArray augPackages; - entry.AugmentationsL( augPackages ); - CleanupResetAndDestroyPushL( augPackages ); - - TInt augCount = augPackages.Count(); - FLOG_1( _L("SisxUI: augmentations count = %d"), augCount ); - - if ( augCount ) - { - // There may be several augmentaion pkgs and we need - // check them all. - for ( TInt augInd = 0; augInd < augCount; augInd++ ) - { - FLOG_1( _L("SisxUI: augm. index = %d"), augInd ); - Swi::RSisRegistryEntry augEntry; - - error = augEntry.OpenL( - sisRegSession, - *augPackages[augInd] ); - FLOG_1( _L("SisxUI: Open augm. error = %d"), error ); - - if ( !error ) - { - CleanupClosePushL( augEntry ); - - RPointerArray augFileArray; - augEntry.FilesL( augFileArray ); - CleanupResetAndDestroyPushL( augFileArray ); - - // Add file paths to file array. - SearchFilesForDCFL( augFileArray, fileArray ); - - // augEntry, augFileArray - CleanupStack::PopAndDestroy( 2, &augEntry ); - } - }//for - } - // sisFileArray, augPackages - CleanupStack::PopAndDestroy( 2, &sisFileArray ); - - // Ok let's start to register files to DCF server. - TInt fileCount = fileArray.Count(); - - if ( fileCount ) - { - FLOG( _L("SisxUI: Create DCF entry") ); - CDcfEntry* dcfEntry = CDcfEntry::NewL(); - CleanupStack::PushL( dcfEntry ); - - CDcfRep* dcfRep = CDcfRep::NewL(); - CleanupStack::PushL( dcfRep ); - - for (index = 0; index < fileCount; index++ ) - { - TPtr fileBufPtr = fileArray[index]->Des(); - FLOG_1( _L("SisxUI: DCF SetLocationL with file: %S"), &fileBufPtr ); - - TRAP( error, dcfEntry->SetLocationL( fileBufPtr, 0 ) ); - FLOG_1( _L("SisxUI: SetLocationL err = %d"), error ); - // Note UpdateL function needs to be TRAPed. It - // does leave if file type is not supported. - TRAP( error, dcfRep->UpdateL( dcfEntry ) ); - FLOG_1( _L("SisxUI: UpdateL err = %d"), error ); - } - // dcfRep, dcfEntry - CleanupStack::PopAndDestroy( 2 ); - } - // fileArray - CleanupStack::PopAndDestroy( 1, &fileArray ); - // sisRegSession, sisRegEntry - CleanupStack::PopAndDestroy( 2, &sisRegSession ); - } - } - - -// ----------------------------------------------------------------------------- -// CSisxUIOperationWatcher::SearchFilesForDCFL -// This function finds files for DCF server. -// ----------------------------------------------------------------------------- -// -void CSisxUIOperationWatcher::SearchFilesForDCFL( - RPointerArray& aSourceArray, - RPointerArray& aTargetArray ) - { - FLOG( _L("SisxUI: SearchFilesForDCFL") ); - // Currently we do register only skin files. - // Note for now there is no way to get list from file types - // which DCF server will accecpt. PIP package contais - // some txt file which specifies files to be registred, - // but SisxUI do not have acceess to that file since DRM - // has extracts the pip content. - - TInt fileCount = aSourceArray.Count(); - FLOG_1( _L("SisxUI: package file count = %d"), fileCount ); - - if ( fileCount ) - { - for ( TInt index = 0; index < fileCount; index++ ) - { - HBufC* tempPath = aSourceArray[index]; - // Search extension - FLOG( _L("SisxUI: Search extension") ); - if ( tempPath->Match( KSkinExtension ) != KErrNotFound ) - { - // Ok correct file extension found. Alloc memory - // because source may be deleted. - HBufC* filePath = tempPath->AllocL(); - aTargetArray.Append( filePath ); -#ifdef _DEBUG - TPtr tempPtr = filePath->Des(); - FLOG_1( _L("SisxUI: Add file to array: %S"), &tempPtr ); -#endif - } - } - } - } - -// End of File