# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1273584028 -10800 # Node ID 741e5bba2bd1853cce6d19328fe757dc6a7b7747 # Parent 98a43fae6e2b8fe81d6b4ade1f461bbd6b77c88f Revision: 201016 Kit: 201019 diff -r 98a43fae6e2b -r 741e5bba2bd1 appinstaller/AppMngr2/Sisx/src/appmngr2sisxappinfo.cpp --- a/appinstaller/AppMngr2/Sisx/src/appmngr2sisxappinfo.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/appinstaller/AppMngr2/Sisx/src/appmngr2sisxappinfo.cpp Tue May 11 16:20:28 2010 +0300 @@ -297,26 +297,39 @@ DRM::CDrmUtility* utility = DRM::CDrmUtility::NewLC(); for ( TInt fileIndex = 0; fileIndex < files.Count(); fileIndex++ ) - { + { +#ifdef _DEBUG + HBufC* tempName = files[ fileIndex ]; + FLOG( "CAppMngr2SisxAppInfo::ConstructL, File name: %S", tempName ); +#endif RFile fileHandle; TInt error = fileHandle.Open( iFs, *files[ fileIndex ], EFileRead ); FLOG( "CAppMngr2SisxAppInfo::ConstructL, File open error %d", error ); - + if ( error == KErrNone ) { - CleanupClosePushL( fileHandle ); + CleanupClosePushL( fileHandle ); + TInt err = KErrNone; + // We need to tarp this function since it may leave with some + // files which do not have enough data. If ConstrucL leaves + // package is not shown in UI. + TRAP( err, iIsDRMProtected = utility->IsProtectedL( fileHandle ) ); + + if ( err ) + { + // If we have leave let's handle this as not DRM procteded. + iIsDRMProtected = EFalse; + FLOG( "CAppMngr2SisxAppInfo, IsProtectedL error: %d", err ); + } - iIsDRMProtected = utility->IsProtectedL( fileHandle ); - CleanupStack::PopAndDestroy( &fileHandle ); if ( iIsDRMProtected ) - { - HBufC* fileName = files[ fileIndex ]; - FLOG( "CAppMngr2SisxAppInfo::ConstructL, iProtectedFile %S", - fileName ); - + { + FLOG( "CAppMngr2SisxAppInfo: File is DRM protected" ); + + HBufC* fileName = files[ fileIndex ]; iProtectedFile = fileName; // takes ownership files.Remove( fileIndex ); @@ -327,7 +340,7 @@ CDRMHelperRightsConstraints* printconst = NULL; TBool sendingallowed = EFalse; - FLOG( "CAppMngr2SisxAppInfo::ConstructL: GetRightsDetailsL" ); + FLOG( "CAppMngr2SisxAppInfo: GetRightsDetailsL" ); error = KErrNone; TRAP( error, helper->GetRightsDetailsL( *fileName, ContentAccess::EView, diff -r 98a43fae6e2b -r 741e5bba2bd1 appinstaller/AppMngr2/group/appmngr2.mmp --- a/appinstaller/AppMngr2/group/appmngr2.mmp Tue Apr 27 16:46:15 2010 +0300 +++ b/appinstaller/AppMngr2/group/appmngr2.mmp Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2003-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" @@ -20,6 +20,7 @@ #include TARGET appmngr2.exe +EPOCHEAPSIZE 0x1000 0x200000 // min 4kB (default), max 2MB (2*default) EPOCSTACKSIZE 0x5000 TARGETTYPE exe UID 0x100039CE 0x101F8512 diff -r 98a43fae6e2b -r 741e5bba2bd1 iaupdate/IAD/loc/iaupdate.loc --- a/iaupdate/IAD/loc/iaupdate.loc Tue Apr 27 16:46:15 2010 +0300 +++ b/iaupdate/IAD/loc/iaupdate.loc Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007-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" @@ -304,6 +304,11 @@ // l: None #define qtn_swupdate_main_device_fw "DEVICE SOFTWARE" +// d: Second row in double graphic style list +// d: Firmware update with PC +// l: list_double_graphic_pane_t2 +#define qtn_swupdate_update_with_pc "Use your PC to update" + //HISTORY VIEW LIST diff -r 98a43fae6e2b -r 741e5bba2bd1 iaupdate/IAD/ui/group/iaupdate.rss --- a/iaupdate/IAD/ui/group/iaupdate.rss Tue Apr 27 16:46:15 2010 +0300 +++ b/iaupdate/IAD/ui/group/iaupdate.rss Tue May 11 16:20:28 2010 +0300 @@ -157,6 +157,11 @@ { buf = qtn_swupdate_normal_update_mb; } + +RESOURCE TBUF r_iaupdate_update_with_pc + { + buf = qtn_swupdate_update_with_pc; + } RESOURCE TBUF r_iaupdate_text_no_updates { diff -r 98a43fae6e2b -r 741e5bba2bd1 iaupdate/IAD/ui/inc/iaupdateagreement.h --- a/iaupdate/IAD/ui/inc/iaupdateagreement.h Tue Apr 27 16:46:15 2010 +0300 +++ b/iaupdate/IAD/ui/inc/iaupdateagreement.h Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-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" @@ -74,6 +74,8 @@ * @return True value if agreement accepted */ TBool AgreementAcceptedL(); + + void SetAgreementAcceptedL(); private: diff -r 98a43fae6e2b -r 741e5bba2bd1 iaupdate/IAD/ui/inc/iaupdateappui.h --- a/iaupdate/IAD/ui/inc/iaupdateappui.h Tue Apr 27 16:46:15 2010 +0300 +++ b/iaupdate/IAD/ui/inc/iaupdateappui.h Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007-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" @@ -85,7 +85,8 @@ * are filtered for the UI list. */ void CheckUpdatesRequestL( MIAUpdateRequestObserver& aObserver, - CIAUpdateParameters* aFilterParams ); + CIAUpdateParameters* aFilterParams, + TBool aForcedRefresh ); /** * When the show update operation is started through diff -r 98a43fae6e2b -r 741e5bba2bd1 iaupdate/IAD/ui/inc/iaupdateuicontroller.h --- a/iaupdate/IAD/ui/inc/iaupdateuicontroller.h Tue Apr 27 16:46:15 2010 +0300 +++ b/iaupdate/IAD/ui/inc/iaupdateuicontroller.h Tue May 11 16:20:28 2010 +0300 @@ -230,7 +230,10 @@ * Ownership is not transferred. */ CIAUpdateParameters* ParamsReadAndRemoveFileL(); - + + TBool ForcedRefresh() const; + + void SetForcedRefresh( TBool aForcedRefresh ); /** * Is client role "testing" * @@ -596,6 +599,8 @@ TBool iRefreshFromNetworkDenied; TBool iOffConfigurated; + + TBool iForcedRefresh; TBool iTestRole; diff -r 98a43fae6e2b -r 741e5bba2bd1 iaupdate/IAD/ui/src/iaupdateagreement.cpp --- a/iaupdate/IAD/ui/src/iaupdateagreement.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/iaupdate/IAD/ui/src/iaupdateagreement.cpp Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-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" @@ -121,6 +121,22 @@ } // --------------------------------------------------------------------------- +// CIAUpdateAgreement::SetAgreementAcceptedL +// +// --------------------------------------------------------------------------- +// +void CIAUpdateAgreement::SetAgreementAcceptedL() + { + CIAUpdateFirstTimeInfo* firstTimeInfo = CIAUpdateFirstTimeInfo::NewLC(); + firstTimeInfo->SetAgreementAcceptedL(); + CleanupStack::PopAndDestroy( firstTimeInfo ); + } + + + + + +// --------------------------------------------------------------------------- // CIAUpdateAgreement::ShowAgreementL // // --------------------------------------------------------------------------- diff -r 98a43fae6e2b -r 741e5bba2bd1 iaupdate/IAD/ui/src/iaupdateappui.cpp --- a/iaupdate/IAD/ui/src/iaupdateappui.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/iaupdate/IAD/ui/src/iaupdateappui.cpp Tue May 11 16:20:28 2010 +0300 @@ -65,6 +65,7 @@ #include "iaupdategloballockhandler.h" #include "iaupdatenodefilter.h" #include "iaupdateuitimer.h" +#include "iaupdateagreement.h" #include "iaupdatedebug.h" @@ -164,7 +165,8 @@ // ----------------------------------------------------------------------------- // void CIAUpdateAppUi::CheckUpdatesRequestL( MIAUpdateRequestObserver& aObserver, - CIAUpdateParameters* aFilterParams ) + CIAUpdateParameters* aFilterParams, + TBool aForcedRefresh ) { IAUPDATE_TRACE("[IAUPDATE] CIAUpdateAppUi::CheckUpdatesRequestL() begin"); @@ -184,7 +186,8 @@ iRequestObserver = &aObserver; iRequestType = IAUpdateUiDefines::ECheckUpdates; iController->SetRequestType( iRequestType ); - + IAUPDATE_TRACE_1("[IAUPDATE] CIAUpdateAppUi::CheckUpdatesRequestL() Forced refresh: %d", aForcedRefresh ); + iController->SetForcedRefresh( aForcedRefresh ); iController->CheckUpdatesDeferredL( aFilterParams, EFalse ); IAUPDATE_TRACE("[IAUPDATE] CIAUpdateAppUi::CheckUpdatesRequestL() end"); @@ -593,8 +596,11 @@ { if ( iController->Filter()->FilterParams()->Refresh() ) { - //from bgchecker, make it silent - totalSilent = ETrue; + if ( !iController->ForcedRefresh() ) + { + //from bgchecker, make it silent + totalSilent = ETrue; + } } } } @@ -683,7 +689,16 @@ { ActivateLocalViewL( TUid::Uid( EIAUpdateMainViewId ) ); } - + CIAUpdateAgreement* agreement = CIAUpdateAgreement::NewLC(); + TBool agreementAccepted = agreement->AgreementAcceptedL(); + if ( iController->ForcedRefresh() ) + { + if ( !agreementAccepted ) + { + agreement->SetAgreementAcceptedL(); + } + } + CleanupStack::PopAndDestroy( agreement ); // By calling CIdle possible waiting dialog can be closed before // automatic check where a new dialog may be launched delete iIdleAutCheck; @@ -974,13 +989,6 @@ //the bgchecker will try again later after 1 month. //The LEAVE will be catched up later and complete the request from background checker. User::LeaveIfError( KErrNotFound ); - - //the following code will pop up dialog to ask from user, just for proto - /* connectionMethodId = 0; - TIAUpdateConnectionMethod connectionMethod( - connectionMethodId, TIAUpdateConnectionMethod::EConnectionMethodTypeDefault ); - - iController->SetDefaultConnectionMethodL( connectionMethod );*/ } diff -r 98a43fae6e2b -r 741e5bba2bd1 iaupdate/IAD/ui/src/iaupdatehistorycontainer.cpp --- a/iaupdate/IAD/ui/src/iaupdatehistorycontainer.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/iaupdate/IAD/ui/src/iaupdatehistorycontainer.cpp Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007-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" @@ -124,6 +124,7 @@ iListBox->ConstructFromResourceL( reader ); CleanupStack::PopAndDestroy(); + iListBox->EnableStretching( EFalse ); iListBox->ItemDrawer()->ColumnData()->EnableMarqueeL( ETrue ); // Setup scroll bars diff -r 98a43fae6e2b -r 741e5bba2bd1 iaupdate/IAD/ui/src/iaupdatemaincontainer.cpp --- a/iaupdate/IAD/ui/src/iaupdatemaincontainer.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/iaupdate/IAD/ui/src/iaupdatemaincontainer.cpp Tue May 11 16:20:28 2010 +0300 @@ -343,9 +343,15 @@ } } - if ( !size || isNSU ) + if ( isNSU ) { - //for firmware when size info is not provided by server + //for NSU firmware + importanceDescription = StringLoader::LoadLC( + R_IAUPDATE_UPDATE_WITH_PC ); + } + else if ( size == 0 ) + { + //for FOTA firmware when size info is not provided by server importanceDescription = StringLoader::LoadLC( R_IAUPDATE_DES_CRITICAL_UPDATE_NO_SIZE ); } diff -r 98a43fae6e2b -r 741e5bba2bd1 iaupdate/IAD/ui/src/iaupdatesession.cpp --- a/iaupdate/IAD/ui/src/iaupdatesession.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/iaupdate/IAD/ui/src/iaupdatesession.cpp Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007-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" @@ -36,6 +36,7 @@ // CONSTANTS const TSecureId KSIDBackgroundChecker = 0x200211f4; +const TSecureId KSIDCwrtWidget = 0x200267C0; const TSecureId KSIDLauncher = KIAUpdateLauncherUid; // ============================ MEMBER FUNCTIONS =============================== @@ -323,7 +324,7 @@ CleanupStack::Pop( params ); CleanupStack::PopAndDestroy( data ); - if ( aMessage.SecureId() != KSIDBackgroundChecker ) + if ( ( aMessage.SecureId() != KSIDBackgroundChecker ) && ( aMessage.SecureId() != KSIDCwrtWidget ) ) { // other processes than backroundchecker are not allowed to cause refresh from network params->SetRefresh( EFalse ); @@ -331,7 +332,7 @@ switch( functionId ) { case IAUpdateClientDefines::EIAUpdateServerCheckUpdates: - appUi->CheckUpdatesRequestL( *this, params ); + appUi->CheckUpdatesRequestL( *this, params, params->Refresh() && aMessage.SecureId() == KSIDCwrtWidget ); break; case IAUpdateClientDefines::EIAUpdateServerShowUpdates: diff -r 98a43fae6e2b -r 741e5bba2bd1 iaupdate/IAD/ui/src/iaupdateuicontroller.cpp --- a/iaupdate/IAD/ui/src/iaupdateuicontroller.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/iaupdate/IAD/ui/src/iaupdateuicontroller.cpp Tue May 11 16:20:28 2010 +0300 @@ -323,20 +323,22 @@ } TBool agreementAccepted( EFalse ); - CIAUpdateAgreement* agreement = CIAUpdateAgreement::NewLC(); - agreementAccepted = agreement->AgreementAcceptedL(); - if ( ( !agreementAccepted )&& ( iRequestType != IAUpdateUiDefines::ECheckUpdates ) ) + if ( !ForcedRefresh() ) { - // agreement (disclaimer) dialog is not prompted when CheckUpdates is called - // - // Refresh from network is allowed when first time case - iRefreshFromNetworkDenied = EFalse; - agreementAccepted = agreement->AcceptAgreementL(); + CIAUpdateAgreement* agreement = CIAUpdateAgreement::NewLC(); + agreementAccepted = agreement->AgreementAcceptedL(); + if ( ( !agreementAccepted )&& ( iRequestType != IAUpdateUiDefines::ECheckUpdates ) ) + { + // agreement (disclaimer) dialog is not prompted when CheckUpdates is called + // + // Refresh from network is allowed when first time case + iRefreshFromNetworkDenied = EFalse; + agreementAccepted = agreement->AcceptAgreementL(); + } + CleanupStack::PopAndDestroy( agreement ); } - - CleanupStack::PopAndDestroy( agreement ); - - if ( !agreementAccepted ) + + if ( !agreementAccepted && !ForcedRefresh() ) { if ( iRequestType == IAUpdateUiDefines::ECheckUpdates ) { @@ -2290,25 +2292,32 @@ { if ( params->Refresh() ) { - // Check from the central repocitory what are the automatic checking and - // roaming settings. - TInt autoUpdateCheckValue( 0 ); - CRepository* cenrep( + if ( ForcedRefresh() ) + { + allowRefresh = ETrue; + } + else + { + // Check from the central repocitory what are the automatic checking and + // roaming settings. + TInt autoUpdateCheckValue( 0 ); + CRepository* cenrep( CRepository::NewLC( KCRUidIAUpdateSettings ) ); - // Notice, that KIAUpdateSettingAutoUpdateCheck can give following values - // 0 = No automatic update check - // 1 = Automatic update check enabled when not roaming - // 2 = Automatic update enabled + // Notice, that KIAUpdateSettingAutoUpdateCheck can give following values + // 0 = No automatic update check + // 1 = Automatic update check enabled when not roaming + // 2 = Automatic update enabled - User::LeaveIfError( cenrep->Get( KIAUpdateAutoUpdateCheck, - autoUpdateCheckValue ) ); - CleanupStack::PopAndDestroy( cenrep ); - if ( ( autoUpdateCheckValue == EIAUpdateSettingValueEnable ) || - ( autoUpdateCheckValue == EIAUpdateSettingValueDisableWhenRoaming && - !iRoamingHandler->IsRoaming() ) ) - { - allowRefresh = ETrue; - } + User::LeaveIfError( cenrep->Get( KIAUpdateAutoUpdateCheck, + autoUpdateCheckValue ) ); + CleanupStack::PopAndDestroy( cenrep ); + if ( ( autoUpdateCheckValue == EIAUpdateSettingValueEnable ) || + ( autoUpdateCheckValue == EIAUpdateSettingValueDisableWhenRoaming && + !iRoamingHandler->IsRoaming() ) ) + { + allowRefresh = ETrue; + } + } } } } @@ -2626,6 +2635,26 @@ return params; } +// --------------------------------------------------------------------------- +// CIAUpdateUiController::ForcedRefresh +// +// --------------------------------------------------------------------------- +// +TBool CIAUpdateUiController::ForcedRefresh() const + { + return iForcedRefresh; + } + + +// --------------------------------------------------------------------------- +// CIAUpdateUiController::SetForcedRefresh +// +// --------------------------------------------------------------------------- +// +void CIAUpdateUiController::SetForcedRefresh( TBool aForcedRefresh ) + { + iForcedRefresh = aForcedRefresh; + } // --------------------------------------------------------------------------- // CIAUpdateUiController::ParamsWriteFileL diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swi/inc/integrityservices.h --- a/installationservices/swi/inc/integrityservices.h Tue Apr 27 16:46:15 2010 +0300 +++ b/installationservices/swi/inc/integrityservices.h Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -275,13 +275,6 @@ */ static void NormalizeDirectoryName(TDes& aFileName); - /** - Creates a backup file by copying the source to a defined backup name. This MUST be used for executables. - The source files will then be deleted by invoking RLoader::Delete - @param aSource the file to backup - @param aBackup the name of the backup file - */ - void CopyToBackupL(const TDesC& aSource, const TDesC& aBackup); private: diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swi/source/integrityservices/integrityservices.cpp --- a/installationservices/swi/source/integrityservices/integrityservices.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/installationservices/swi/source/integrityservices/integrityservices.cpp Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -138,41 +138,6 @@ CleanupStack::PopAndDestroy(localFilenameHeap); } -void CIntegrityServices::CopyToBackupL(const TDesC& aSource, const TDesC& aBackup) - { - // Copying a file isn't atomic so we create a temporary backup file first - RBuf backupTmpName; - backupTmpName.Create(aBackup.Length() + 4); - CleanupClosePushL(backupTmpName); - backupTmpName.Copy(aBackup); - _LIT(KTmpExt, ".tmp"); - backupTmpName.Append(KTmpExt); - - // Copying a file is not an atomic operation so add the temporary - // file to the journal to enable cleanup if a power failure occurs before - // the rename - SimulatePowerFailureL(EFailAddingTempFile, EBeforeJournal, backupTmpName); - iJournal->TemporaryL(backupTmpName); - SimulatePowerFailureL(EFailAddingTempFile, EAfterJournal, backupTmpName); - - CFileMan* fileMan = CFileMan::NewL(iFs); - CleanupStack::PushL(fileMan); - - TInt err = fileMan->Copy(aSource, backupTmpName); - DEBUG_PRINTF4(_L("CopyToBackupL: Copying %S to %S, err %d"), &aSource, &backupTmpName, err); - User::LeaveIfError(err); - - // Backup is complete, use RFs::Rename as atomic 'commit' of backup - err = iFs.Rename(backupTmpName, aBackup); - DEBUG_PRINTF2(_L("CopyToBackupL: Commit backup returned error %d"), err); - User::LeaveIfError(err); - CleanupStack::PopAndDestroy(2, &backupTmpName); // backupTmpName, fileMan - - // Now the backup is safe the original can be deleted - err = iLoader.Delete(aSource); - DEBUG_PRINTF3(_L("CopyToBackupL: RLoader::Delete %S returned error %d"), &aSource, err); - User::LeaveIfError(err); - } EXPORT_C void CIntegrityServices::RemoveL(const TDesC& aFileName) { @@ -213,20 +178,11 @@ } SimulatePowerFailureL(EFailRemovingFile, EBeforeAction, aFileName); - - _LIT(KSysBinMatch, "?:\\sys\\bin\\*"); - if (localFilename.MatchF(KSysBinMatch) == 0) - { - // A copy is slower than a rename to only use the - // demand paging safe API for files in sys\bin - CopyToBackupL(localFilename, backupFileName); - } - else - { - err = iFs.Rename(localFilename, backupFileName); - DEBUG_PRINTF4(_L("Renamed %S as %S error %d"), &localFilename, &backupFileName, err); - User::LeaveIfError(err); - } + + err = iFs.Rename(localFilename, backupFileName); + DEBUG_PRINTF4(_L("Renamed %S as %S error %d"), &localFilename, &backupFileName, err); + User::LeaveIfError(err); + SimulatePowerFailureL(EFailRemovingFile, EAfterAction, aFileName); } else diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swi/source/integrityservices/operationfunctions.cpp --- a/installationservices/swi/source/integrityservices/operationfunctions.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/installationservices/swi/source/integrityservices/operationfunctions.cpp Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -29,9 +29,15 @@ using namespace Swi; +TBool IsBinary(const TEntry& aEntry) + { + return (aEntry[0].iUid == KExecutableImageUidValue || aEntry[0].iUid == KDynamicLibraryUidValue) ? ETrue : EFalse; + } + void Swi::IntegrityDeleteFileL(const TDesC& aPath, CIntegrityTreeLeaf* aLeaf, RFs& aFs, RLoader& aLoader, CFileMan& aFileMan) { + _LIT(KSysBin, "\\sys\\bin"); RBuf name; name.CreateL(aPath, KMaxFileName); CleanupClosePushL(name); @@ -56,9 +62,42 @@ } else { - TInt err = aLoader.Delete(name); - DEBUG_PRINTF3(_L("Integrity Services - Delete File %S err = %d"), &name, err); - User::LeaveIfError(err); + if ( aLeaf->Type() == EBackupFile ) // Implies a commit operation is in progress + { + + if ( IsBinary(entry) ) + { + // Forming the file name so the renamed file can be under sys/bin + // for special delete mechanism using RLoader::Delete + RBuf tmpName; + TParsePtrC fileName(name); + tmpName.CreateL(name.Length() + KSysBin.iTypeLength); + CleanupClosePushL(tmpName); + + tmpName.Append(fileName.Drive()); + tmpName.Append(KSysBin); + tmpName.Append(fileName.Path()); + tmpName.Append(fileName.NameAndExt()); + + DEBUG_PRINTF3(_L("Integrity Services - Renaming %S to %S"), &name, &tmpName); + aFileMan.Rename(name,tmpName,CFileMan::EOverWrite); + User::LeaveIfError(aLoader.Delete(tmpName)); // Using RLoader delete for paged binaries + DEBUG_PRINTF2(_L("Integrity Services - Deleted renamed file %S"), &tmpName); + + // prune the directory tree if possible + RemoveDirectoryTreeL(aFs, tmpName); + CleanupStack::PopAndDestroy(&tmpName); + } + else + { + User::LeaveIfError(aFileMan.Delete(name)); + } + } + else + { + // Need to use RLoader Delete which can be used during deletion of Added files during Rollback + User::LeaveIfError(aLoader.Delete(name)); + } } // prune the directory tree if possible @@ -69,6 +108,29 @@ DEBUG_PRINTF3(_L("Integrity Services - error %d removing %S"), err, &name); User::Leave(err); } + else + { + + DEBUG_PRINTF3(_L("Integrity Services - error %d removing %S"), err, &name); + + // Check for any renamed files to move it to sys/bin for special delete mechanism + RBuf tmpName; + TParsePtrC fileName(name); + tmpName.CreateL(name.Length() + KSysBin.iTypeLength); + CleanupClosePushL(tmpName); + + tmpName.Append(fileName.Drive()); + tmpName.Append(KSysBin); + tmpName.Append(fileName.Path()); + tmpName.Append(fileName.NameAndExt()); + DEBUG_PRINTF2(_L("Integrity Services - Removing %S renamed binary files if any"), &tmpName); + + aLoader.Delete(tmpName); + // prune the directory tree if possible + RemoveDirectoryTreeL(aFs, tmpName); + CleanupStack::PopAndDestroy(&tmpName); + } + CleanupStack::PopAndDestroy(&name); } diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swi/source/integrityservices/operationfunctions.h --- a/installationservices/swi/source/integrityservices/operationfunctions.h Tue Apr 27 16:46:15 2010 +0300 +++ b/installationservices/swi/source/integrityservices/operationfunctions.h Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -28,6 +28,7 @@ #include #include #include +#include namespace Swi { diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swi/source/pkgremover/pkgremover.cpp --- a/installationservices/swi/source/pkgremover/pkgremover.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/installationservices/swi/source/pkgremover/pkgremover.cpp Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -25,6 +25,7 @@ #include "installclientserver.h" #include #include +#include "cleanuputils.h" // Maximum buffer size const TInt KMaxBufferSize = 1024; @@ -43,6 +44,7 @@ /*static*/ EXPORT_C void UninstalledSisPackages::ListL(TDriveNumber aDrive, RPointerArray& aPackageList) { + CleanupResetAndDestroyPushL(aPackageList); aPackageList.ResetAndDestroy(); // Check if SWIS is busy @@ -150,6 +152,7 @@ // Shutdown InstallServer and SisHelper CleanupStack::PopAndDestroy(2, &server); + CleanupStack::Pop(&aPackageList); } /*static*/ diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swi/source/securitymanager/securitymanager.cpp --- a/installationservices/swi/source/securitymanager/securitymanager.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/installationservices/swi/source/securitymanager/securitymanager.cpp Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 1997-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -41,7 +41,7 @@ #include "hashcontainer.h" #include "certchainconstraints.h" #include "devinfosupportclient.h" - +#include "cleanuputils.h" #include "log.h" // PKIX dependencies @@ -711,6 +711,7 @@ RPointerArray& aCertOut, TRequestStatus& aStatus) { + CleanupResetAndDestroyPushL(aCertOut); Cancel(); DEBUG_PRINTF2(_L8("Security Manager - Performing OCSP with revocation server at %S."), @@ -727,7 +728,7 @@ aCertOut.AppendL(certOut); CleanupStack::Pop(certOut); } - + DEBUG_PRINTF2(_L8("Security Manager - Validating %d certificate chains for this controller."), numChains); iClientStatus = &aStatus; @@ -748,6 +749,7 @@ iRevocationHandler->SendRequestL(iValidPkixChains, aIap, iStatus); + CleanupStack::Pop(&aCertOut); SetActive(); } @@ -1144,6 +1146,7 @@ const Sis::CController& aController, RPointerArray& aCerts) { + CleanupResetAndDestroyPushL(aCerts); // Go through all SIS chains and extract end certificates from them. const RPointerArray& chains= aController.SignatureCertificateChains(); @@ -1165,6 +1168,7 @@ // Cleanup. CleanupStack::PopAndDestroy(pkixChain); } + CleanupStack::Pop(&aCerts); } EXPORT_C void CSecurityManager::FillCertInfoArrayL( diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swi/source/sisfile/swtypereginfo.cpp --- a/installationservices/swi/source/sisfile/swtypereginfo.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/installationservices/swi/source/sisfile/swtypereginfo.cpp Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -230,6 +230,7 @@ EXPORT_C void SoftwareTypeRegInfoUtils::UnserializeArrayL(RReadStream& aStream, RPointerArray& aSwTypeRegInfoArray) { + CleanupResetAndDestroyPushL(aSwTypeRegInfoArray); const TInt numElems = aStream.ReadInt32L(); for (TInt i=0; i& aSwTypeRegInfoArray, RBuf& aSerializedNames) @@ -263,6 +265,7 @@ EXPORT_C void SoftwareTypeRegInfoUtils::UnserializeUniqueSwTypeNamesL(const TDesC& aSerializedNames, RArray& aUniqueSwTypeNames) { + CleanupClosePushL(aUniqueSwTypeNames); TPtrC buf(aSerializedNames); for (;;) { @@ -281,6 +284,7 @@ break; } } + CleanupStack::Pop(&aUniqueSwTypeNames); } EXPORT_C void SoftwareTypeRegInfoUtils::ExtractMimeTypesL(const RPointerArray& aSwTypeRegInfoArray, RPointerArray& aMimeTypes) diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swi/source/sishelper/sishelper.cpp --- a/installationservices/swi/source/sishelper/sishelper.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/installationservices/swi/source/sishelper/sishelper.cpp Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 1997-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -511,6 +511,8 @@ void CSisHelperSession::FillDrivesAndSpacesL(RArray& aDriveLetters, RArray& aDriveSpaces) { + CleanupClosePushL(aDriveLetters); + CleanupClosePushL(aDriveSpaces); // This is the LFSS free space threshold TInt freeSpaceAdjustment = 1024 * 128; // Bytes @@ -566,6 +568,7 @@ User::LeaveIfError(aDriveSpaces.Append(volSpace)); } CleanupStack::PopAndDestroy(&fs); + CleanupStack::Pop(2, &aDriveLetters); } diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swi/source/sishelper/sishelperclient.cpp --- a/installationservices/swi/source/sishelper/sishelperclient.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/installationservices/swi/source/sishelper/sishelperclient.cpp Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -104,6 +104,9 @@ EXPORT_C void RSisHelper::FillDrivesAndSpacesL(RArray& aDriveLetters, RArray& aDriveSpaces) { + CleanupClosePushL(aDriveLetters); + CleanupClosePushL(aDriveSpaces); + // calculate the likely size of the data transfer buffer const TInt KMaxBufSize= sizeof(TInt)+ // number of entries @@ -143,6 +146,7 @@ // cleanup CleanupStack::PopAndDestroy(2, buf); // ins, buf + CleanupStack::Pop(2, &aDriveLetters); } EXPORT_C void RSisHelper::OpenDrmContentL(ContentAccess::TIntent aIntent) @@ -264,6 +268,7 @@ #endif void RSisHelper::GetEquivalentLanguageListL(TLanguage aLangId,RArray& aEquivLangs) { + CleanupClosePushL(aEquivLangs); // calculate the likely size of the data transfer buffer const TInt KMaxBufSize= sizeof(TInt)+ // number of entries @@ -291,4 +296,5 @@ } // cleanup CleanupStack::PopAndDestroy(2, buf); // buf + CleanupStack::Pop(&aEquivLangs); } diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swi/source/sishelper/uissclienthandler.cpp --- a/installationservices/swi/source/sishelper/uissclienthandler.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/installationservices/swi/source/sishelper/uissclienthandler.cpp Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -51,130 +51,140 @@ #include "commands/textdialog.h" #include "log.h" +#include "cleanuputils.h" #ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK -#include "cleanuputils.h" #include const TInt KCompInfoBufferSize=4*1024; #endif + + namespace Swi { + +//Temporary error logging solution. +void LogSwiErrorsToFileL(TInt aErrorCode, const TDesC& aAppName); + // // A cancel handler // class InternalCancelHandler : public MCancelHandler - { + { public: - InternalCancelHandler(CUissClientHandler& aUissClientHandler); - void HandleCancel(); + InternalCancelHandler(CUissClientHandler& aUissClientHandler); + void HandleCancel(); private: - CUissClientHandler& iUissClientHandler; - }; + CUissClientHandler& iUissClientHandler; + }; InternalCancelHandler::InternalCancelHandler( - CUissClientHandler& aUissClientHandler) -: iUissClientHandler(aUissClientHandler) - { - } + CUissClientHandler& aUissClientHandler) +: iUissClientHandler(aUissClientHandler) + { + } void InternalCancelHandler::HandleCancel() - { - iUissClientHandler.CancelOperation(); - } + { + iUissClientHandler.CancelOperation(); + } CUissClientHandler* CUissClientHandler::NewLC(MUiHandler& aUiHandler, TBool aActiveObjectMode) - { - CUissClientHandler* self=new(ELeave) CUissClientHandler(aUiHandler, aActiveObjectMode); - CleanupStack::PushL(self); - self->ConstructL(); - return self; - } + { + CUissClientHandler* self=new(ELeave) CUissClientHandler(aUiHandler, aActiveObjectMode); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } CUissClientHandler* CUissClientHandler::NewL(MUiHandler& aUiHandler, TBool aActiveObjectMode) - { - CUissClientHandler* self=NewLC(aUiHandler, aActiveObjectMode); - CleanupStack::Pop(self); - return self; - } + { + CUissClientHandler* self=NewLC(aUiHandler, aActiveObjectMode); + CleanupStack::Pop(self); + return self; + } CUissClientHandler::CUissClientHandler(MUiHandler& aUiHandler, TBool aActiveObjectMode) : CActive(EPriorityStandard), iUiHandler(aUiHandler), - iPtrIntoBuf(0,0), + iPtrIntoBuf(0,0), iActiveObjectMode(aActiveObjectMode), - iPtrIntoArgsStream(0,0) - #ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK - ,iCompInfoBufPtr(0,0) - #endif - { + iPtrIntoArgsStream(0,0) + #ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK + ,iCompInfoBufPtr(0,0) + #endif + { if (iActiveObjectMode) - { - CActiveScheduler::Add(this); - } - } + { + CActiveScheduler::Add(this); + } + } void CUissClientHandler::WaitForSisHelperShutdown() - { - if(iSisHelper.Handle() > 0) - { - TRequestStatus reqStatus; - iSisHelper.Logon(reqStatus); - User::WaitForRequest(reqStatus); - iSisHelper.Close(); - } - } - + { + if(iSisHelper.Handle() > 0) + { + TRequestStatus reqStatus; + iSisHelper.Logon(reqStatus); + User::WaitForRequest(reqStatus); + iSisHelper.Close(); + } + } + CUissClientHandler::~CUissClientHandler() - { - //Cancel any outstanding request - CancelOperation(); + { + //Cancel any outstanding request + CancelOperation(); - WaitForSisHelperShutdown(); + WaitForSisHelperShutdown(); if (iActiveObjectMode) - { - CActive::Cancel(); // Make sure we are cancelled before deletion - } + { + CActive::Cancel(); // Make sure we are cancelled before deletion + } - delete iCancelHandler; + delete iCancelHandler; delete iArgsStream; - iUissSession.Close(); - delete iBuf; - #ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK + iUissSession.Close(); + delete iBuf; + delete iBufLogger; + #ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK delete iCompInfoBuffer; - #endif - } + #endif + } /** * Allocates a buffer for reverse-completion commands. The buffer is going to * be resized in case it is not sufficient for a dialog command. */ void CUissClientHandler::ConstructL() - { - iCancelHandler=new(ELeave) InternalCancelHandler(*this); - AllocBufL(KBufSize);// Allocate the initial r/c buffer - User::LeaveIfError(StartUiss()); // Start UISS - User::LeaveIfError(iUissSession.Connect()); // Connect to UISS - } + { + iCancelHandler=new(ELeave) InternalCancelHandler(*this); + AllocBufL(KBufSize);// Allocate the initial r/c buffer + + //Logger buffer. + iBufLogger = KNullDesC8().AllocL(); + User::LeaveIfError(StartUiss()); // Start UISS + User::LeaveIfError(iUissSession.Connect()); // Connect to UISS + } void CUissClientHandler::AllocBufL(TInt aSize) - { + { HBufC8* buf=HBufC8::NewL(aSize); delete iBuf; iBuf=buf; } void CUissClientHandler::HandleOverflowL() - { - // Reallocate the buffer to the size received in parameter 1 - TInt size=0; - TPckg theSize(size); - theSize.Copy(iBuf->Left(sizeof(TInt))); - AllocBufL(size); - } - + { + // Reallocate the buffer to the size received in parameter 1 + TInt size=0; + TPckg theSize(size); + theSize.Copy(iBuf->Left(sizeof(TInt))); + AllocBufL(size); + } + #ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK void CUissClientHandler::AllocCompInfoBufL(TInt aSize) - { + { HBufC8* buf = HBufC8::NewL(aSize); delete iCompInfoBuffer; iCompInfoBuffer = buf; @@ -183,132 +193,132 @@ ///\short Creates a command handler object for the specified dialog request CUissCmdHandler* CUissClientHandler::UissCmdHandlerFactoryL(TInt aCommand) const - { - switch (aCommand) - { - case CUissSession::KMessageApplicationsInUseDialog: - return new(ELeave) CApplicationsInUseDialogCmdHandler(iUiHandler); - case CUissSession::KMessageCannotOverwriteFileDialog: - return new(ELeave) CCannotOverwriteFileDialogCmdHandler(iUiHandler); - - case CUissSession::KMessageDependencyBreakDialog: - return new(ELeave) CDependencyBreakDialogCmdHandler(iUiHandler); - case CUissSession::KMessageDeviceIncompatibility: - return new(ELeave) CDeviceIncompatibilityDialogCmdHandler(iUiHandler); - case CUissSession::KMessageMissingDependency: - return new(ELeave) CMissingDependencyDialogCmdHandler(iUiHandler); - case CUissSession::KMessageDriveDialog: - return new(ELeave) CDriveDialogCmdHandler(iUiHandler); - case CUissSession::KMessageErrorDialog: - return new(ELeave) CErrorDialogCmdHandler(iUiHandler); - case CUissSession::KMessageGrantCapabilitiesDialog: - return new(ELeave) CGrantCapabilitiesDialogCmdHandler(iUiHandler); - case CUissSession::KMessageHandleCancellableInstallEvent: - return new(ELeave) CHandleCancellableInstallEventCmdHandler(iUiHandler, - *iCancelHandler); - case CUissSession::KMessageHandleInstallEvent: - return new(ELeave) CHandleInstallEventCmdHandler(iUiHandler); - case CUissSession::KMessageInstallDialog: - return new(ELeave) CInstallDialogCmdHandler(iUiHandler); - case CUissSession::KMessageLanguageDialog: - return new(ELeave) CLanguageDialogCmdHandler(iUiHandler); - case CUissSession::KMessageOcspResultDialog: - return new(ELeave) COcspResultDialogCmdHandler(iUiHandler); - case CUissSession::KMessageOptionsDialog: - return new(ELeave) COptionsDialogCmdHandler(iUiHandler); - case CUissSession::KMessageQuestionDialog: - return new(ELeave) CQuestionDialogCmdHandler(iUiHandler); - case CUissSession::KMessageSecurityWarningDialog: - return new(ELeave) CSecurityWarningDialogCmdHandler(iUiHandler); - case CUissSession::KMessageUninstallDialog: - return new(ELeave) CUninstallDialogCmdHandler(iUiHandler); - - case CUissSession::KMessageUpgradeDialog: - return new(ELeave) CUpgradeDialogCmdHandler(iUiHandler); - - case CUissSession::KMessageTextDialog: - return new(ELeave) CTextDialogCmdHandler(iUiHandler); - - default: - return NULL; - } - } + { + switch (aCommand) + { + case CUissSession::KMessageApplicationsInUseDialog: + return new(ELeave) CApplicationsInUseDialogCmdHandler(iUiHandler); + case CUissSession::KMessageCannotOverwriteFileDialog: + return new(ELeave) CCannotOverwriteFileDialogCmdHandler(iUiHandler); + + case CUissSession::KMessageDependencyBreakDialog: + return new(ELeave) CDependencyBreakDialogCmdHandler(iUiHandler); + case CUissSession::KMessageDeviceIncompatibility: + return new(ELeave) CDeviceIncompatibilityDialogCmdHandler(iUiHandler); + case CUissSession::KMessageMissingDependency: + return new(ELeave) CMissingDependencyDialogCmdHandler(iUiHandler); + case CUissSession::KMessageDriveDialog: + return new(ELeave) CDriveDialogCmdHandler(iUiHandler); + case CUissSession::KMessageErrorDialog: + return new(ELeave) CErrorDialogCmdHandler(iUiHandler); + case CUissSession::KMessageGrantCapabilitiesDialog: + return new(ELeave) CGrantCapabilitiesDialogCmdHandler(iUiHandler); + case CUissSession::KMessageHandleCancellableInstallEvent: + return new(ELeave) CHandleCancellableInstallEventCmdHandler(iUiHandler, + *iCancelHandler); + case CUissSession::KMessageHandleInstallEvent: + return new(ELeave) CHandleInstallEventCmdHandler(iUiHandler); + case CUissSession::KMessageInstallDialog: + return new(ELeave) CInstallDialogCmdHandler(iUiHandler); + case CUissSession::KMessageLanguageDialog: + return new(ELeave) CLanguageDialogCmdHandler(iUiHandler); + case CUissSession::KMessageOcspResultDialog: + return new(ELeave) COcspResultDialogCmdHandler(iUiHandler); + case CUissSession::KMessageOptionsDialog: + return new(ELeave) COptionsDialogCmdHandler(iUiHandler); + case CUissSession::KMessageQuestionDialog: + return new(ELeave) CQuestionDialogCmdHandler(iUiHandler); + case CUissSession::KMessageSecurityWarningDialog: + return new(ELeave) CSecurityWarningDialogCmdHandler(iUiHandler); + case CUissSession::KMessageUninstallDialog: + return new(ELeave) CUninstallDialogCmdHandler(iUiHandler); + + case CUissSession::KMessageUpgradeDialog: + return new(ELeave) CUpgradeDialogCmdHandler(iUiHandler); + + case CUissSession::KMessageTextDialog: + return new(ELeave) CTextDialogCmdHandler(iUiHandler); + + default: + return NULL; + } + } void CUissClientHandler::InitializeArgStreamL(const CInstallPrefs& aInstallPrefs) - { - // Stream out install parameters. Cannot do this in UISSCLIENT because - // the code is in LAUNCHER which depends on UISSCLIENT. + { + // Stream out install parameters. Cannot do this in UISSCLIENT because + // the code is in LAUNCHER which depends on UISSCLIENT. delete iArgsStream; iArgsStream = 0; - iArgsStream = CWriteStream::NewL(); - *iArgsStream << aInstallPrefs; + iArgsStream = CWriteStream::NewL(); + *iArgsStream << aInstallPrefs; // Save ptr for args (must persist whilst server is processing) - iPtrIntoArgsStream.Set(iArgsStream->Ptr()); - } - + iPtrIntoArgsStream.Set(iArgsStream->Ptr()); + } + void CUissClientHandler::InstallL(const CInstallPrefs& aInstallPrefs, const RArray& aDeviceSupportedLanguages, TRequestStatus& aRequestStatus, RThread& aServer) - { + { iState = KUissClientInstalling; iClientStatus = &aRequestStatus; // Save ptr for data returned by request (must persist whilst server is processing) - iPtrIntoBuf.Set(iBuf->Des()); + iPtrIntoBuf.Set(iBuf->Des()); - InitializeArgStreamL(aInstallPrefs); - iArgsStream->Stream().WriteInt32L(aDeviceSupportedLanguages.Count()); - //Streaming set of languages that device supports - TInt noOfDeviceSupportedLanguages = aDeviceSupportedLanguages.Count(); - for(TInt i=0;iStream().WriteInt32L(aDeviceSupportedLanguages[i]); - } - // Save ptr for args (must persist whilst server is processing) - iPtrIntoArgsStream.Set(iArgsStream->Ptr()); - + InitializeArgStreamL(aInstallPrefs); + iArgsStream->Stream().WriteInt32L(aDeviceSupportedLanguages.Count()); + //Streaming set of languages that device supports + TInt noOfDeviceSupportedLanguages = aDeviceSupportedLanguages.Count(); + for(TInt i=0;iStream().WriteInt32L(aDeviceSupportedLanguages[i]); + } + // Save ptr for args (must persist whilst server is processing) + iPtrIntoArgsStream.Set(iArgsStream->Ptr()); + // Issue initial request iUissSession.Install(iPtrIntoArgsStream, iPtrIntoBuf, iStatus); if (iActiveObjectMode) - { - SetActive(); - } + { + SetActive(); + } // Update client's TRequestStatus object *iClientStatus = KRequestPending; iSisHelper = aServer; - } + } #ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK void CUissClientHandler::GetComponentInfoL(const CInstallPrefs& aInstallPrefs, Usif::CComponentInfo& aComponentInfo, TRequestStatus& aRequestStatus, RThread& aServer) - { + { iState = KUissClientGettingCompInfo; iClientStatus = &aRequestStatus; - + // Store the component info reference to the class reference. So that, the same will be // populated after getting the asynchronous method completed. iComponentInfo = &aComponentInfo; - InitializeArgStreamL(aInstallPrefs); - - AllocCompInfoBufL(KCompInfoBufferSize); - - // Save the pointer for component info collection buffer - iCompInfoBufPtr.Set(iCompInfoBuffer->Des()); + InitializeArgStreamL(aInstallPrefs); + + AllocCompInfoBufL(KCompInfoBufferSize); + + // Save the pointer for component info collection buffer + iCompInfoBufPtr.Set(iCompInfoBuffer->Des()); // Issue get component info request iUissSession.GetComponentInfo(iPtrIntoArgsStream, iCompInfoBufPtr, iStatus); - // There is no synchronous API for GetComponentInfo - __ASSERT_ALWAYS(iActiveObjectMode, User::Invariant()); - SetActive(); + // There is no synchronous API for GetComponentInfo + __ASSERT_ALWAYS(iActiveObjectMode, User::Invariant()); + SetActive(); // Update client's TRequestStatus object *iClientStatus = KRequestPending; - iSisHelper = aServer; - } + iSisHelper = aServer; + } #endif void CUissClientHandler::UninstallL(const CSisRegistryPackage& aPackage, TRequestStatus& aRequestStatus) - { + { iState = KUissClientUninstalling; iClientStatus = &aRequestStatus; @@ -317,241 +327,264 @@ delete iArgsStream; iArgsStream = 0; - iArgsStream = CWriteStream::NewL(); + iArgsStream = CWriteStream::NewL(); *iArgsStream << aPackage; // Save ptr for args (must persist whilst server is processing) - iPtrIntoArgsStream.Set(iArgsStream->Ptr()); + iPtrIntoArgsStream.Set(iArgsStream->Ptr()); - // Issue initial request + // Issue initial request iUissSession.Uninstall(iPtrIntoArgsStream, iPtrIntoBuf, iStatus); if (iActiveObjectMode) - { - SetActive(); - } + { + SetActive(); + } // Update client's TRequestStatus object *iClientStatus = KRequestPending; - } + } void CUissClientHandler::CancelOperation() - { - if (iState == KUissClientIdle) - { - return; - } - - // User called this so must have an outstanding request with us. + { + if (iState == KUissClientIdle) + { + return; + } + + // User called this so must have an outstanding request with us. - // First tell the Uiss that we want to cancel the current - // operation. - // - // If we have an outstanding Uiss request, this will complete (with - // KErrCancel) when the operation has terminated. - // - // If we are called inside a dialog callback, then there is no - // outstanding Uiss request at the moment. When the dialog - // returns, we will issue a request, which will complete (with - // KErrCancel) when the operation has terminated. - (void)iUissSession.Cancel(); - } + // First tell the Uiss that we want to cancel the current + // operation. + // + // If we have an outstanding Uiss request, this will complete (with + // KErrCancel) when the operation has terminated. + // + // If we are called inside a dialog callback, then there is no + // outstanding Uiss request at the moment. When the dialog + // returns, we will issue a request, which will complete (with + // KErrCancel) when the operation has terminated. + (void)iUissSession.Cancel(); + } void CUissClientHandler::WorkUntilCompleteL() - { - // Keep processing UISS responses and issuing new requests - // until we update the client status to non-pending. - while(iClientStatus && *iClientStatus == KRequestPending) - { - User::WaitForRequest(iStatus); - TRAPD(err,RunL()); - if(err != KErrNone) - { - RunError(err); - } - } - } + { + // Keep processing UISS responses and issuing new requests + // until we update the client status to non-pending. + while(iClientStatus && *iClientStatus == KRequestPending) + { + User::WaitForRequest(iStatus); + TRAPD(err,RunL()); + if(err != KErrNone) + { + RunError(err); + } + } + } TBool CUissClientHandler::IsBusy() - { - return iState != KUissClientIdle; - } + { + return iState != KUissClientIdle; + } // // Code necessary to run UISS in the same process but in a different thread // TInt CUissClientHandler::StartUiss() - { - const TInt KUissServerStackSize=0x2000; - const TInt KUissServerInitHeapSize=0x1000; - const TInt KUissServerMaxHeapSize=0x1000000; - - - TThreadFunction entryPoint=UissThreadFunction; - //TUiSupportStartParams uiSupportParams(aUiHandler); - // The owner of the new thread will be the process, otherwise if the - // current thread dies, the server thread will die, too. - RThread server; - TInt err = KErrNone; - - for (TInt retry=0; retry < 2; ++retry) - { - err = server.Create(KUissServerName, entryPoint, - KUissServerStackSize, KUissServerInitHeapSize, KUissServerMaxHeapSize, - NULL, EOwnerThread); - - if (err == KErrAlreadyExists) - { - User::After(30000); - } - else - { - break; - } - } - - if (err==KErrAlreadyExists) - { - return KErrServerBusy; - } - if (err != KErrNone) - { - return err; - } - - // Synchronise with the process to make sure it hasn't died straight away - TRequestStatus stat; - server.Rendezvous(stat); - if (stat != KRequestPending) - { - // logon failed - server is not yet running, so cannot have terminated - server.Kill(0); // Abort startup - } - else - { - // logon OK - start the server - server.Resume(); - } - // Wait to synchronise with server - if it dies in the meantime, it - // also gets completed - User::WaitForRequest(stat); - // We can't use the 'exit reason' if the server panicked as this - // is the panic 'reason' and may be '0' which cannot be distinguished - // from KErrNone - TInt r=(server.ExitType()==EExitPanic) ? KErrGeneral : stat.Int(); - server.Close(); - return r; - } + { + const TInt KUissServerStackSize=0x2000; + const TInt KUissServerInitHeapSize=0x1000; + const TInt KUissServerMaxHeapSize=0x1000000; + + + TThreadFunction entryPoint=UissThreadFunction; + //TUiSupportStartParams uiSupportParams(aUiHandler); + // The owner of the new thread will be the process, otherwise if the + // current thread dies, the server thread will die, too. + RThread server; + TInt err = KErrNone; + + for (TInt retry=0; retry < 2; ++retry) + { + err = server.Create(KUissServerName, entryPoint, + KUissServerStackSize, KUissServerInitHeapSize, KUissServerMaxHeapSize, + NULL, EOwnerThread); + + if (err == KErrAlreadyExists) + { + User::After(30000); + } + else + { + break; + } + } + + if (err==KErrAlreadyExists) + { + return KErrServerBusy; + } + if (err != KErrNone) + { + return err; + } + + // Synchronise with the process to make sure it hasn't died straight away + TRequestStatus stat; + server.Rendezvous(stat); + if (stat != KRequestPending) + { + // logon failed - server is not yet running, so cannot have terminated + server.Kill(0); // Abort startup + } + else + { + // logon OK - start the server + server.Resume(); + } + // Wait to synchronise with server - if it dies in the meantime, it + // also gets completed + User::WaitForRequest(stat); + // We can't use the 'exit reason' if the server panicked as this + // is the panic 'reason' and may be '0' which cannot be distinguished + // from KErrNone + TInt r=(server.ExitType()==EExitPanic) ? KErrGeneral : stat.Int(); + server.Close(); + return r; + } // Entry point for the thread the UISS runs in TInt CUissClientHandler::UissThreadFunction(TAny *) - { - __UHEAP_MARK; - CTrapCleanup* cleanup = CTrapCleanup::New(); // get clean-up stack - - CActiveScheduler* scheduler=new(ELeave) CActiveScheduler; - CActiveScheduler::Install(scheduler); - CUissServer* server=NULL; - - TRAPD(err, server=CUissServer::NewL()); - if (err==KErrNone) - { - RThread::Rendezvous(KErrNone); - scheduler->Start(); - } - - delete server; - - CActiveScheduler::Install(NULL); - delete scheduler; - delete cleanup; // destroy clean-up stack - __UHEAP_MARKEND; - return KErrNone; - } + { + __UHEAP_MARK; + CTrapCleanup* cleanup = CTrapCleanup::New(); // get clean-up stack + + CActiveScheduler* scheduler=new(ELeave) CActiveScheduler; + CActiveScheduler::Install(scheduler); + CUissServer* server=NULL; + + TRAPD(err, server=CUissServer::NewL()); + if (err==KErrNone) + { + RThread::Rendezvous(KErrNone); + scheduler->Start(); + } + + delete server; + + CActiveScheduler::Install(NULL); + delete scheduler; + delete cleanup; // destroy clean-up stack + __UHEAP_MARKEND; + return KErrNone; + } void CUissClientHandler::RunL() { TInt err = iStatus.Int(); - iPtrIntoBuf.Set(iBuf->Des()); // Get ptr to our return buffer - + iPtrIntoBuf.Set(iBuf->Des()); // Get ptr to our return buffer + DEBUG_PRINTF2(_L8("Sis Helper - UISS Client Handler, RunL(). Status: %d."), err); - - + if(err > 0) + { + // For Logging purpose, store the buffer to retrieve + // application info later. + delete iBufLogger; + iBufLogger = 0; + iBufLogger = iBuf->AllocL(); + } + if (err==KErrOverflow -#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK - && iState != KUissClientGettingCompInfo // We don't support overflow management for component info +#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK + && iState != KUissClientGettingCompInfo // We don't support overflow management for component info #endif - ) + ) { // Grow the respective buffer buffer and re-issue "request". // There should now be space for the UISS server to copy in its dialogue message. HandleOverflowL(); iPtrIntoBuf.Set(iBuf->Des()); - iUissSession.BufferReallocated(iPtrIntoBuf, iStatus); + iUissSession.BufferReallocated(iPtrIntoBuf, iStatus); - if (iActiveObjectMode) - { - SetActive(); - } - return; - } - else - { - if (err>CUissSession::KMsgSeparatorMinimumSwisMessage && - errCUissSession::KMsgSeparatorMinimumSwisMessage && + errHandleMessageL(iPtrIntoBuf, iPtrIntoBuf); + CleanupStack::PopAndDestroy(cmdHandler); + } + else + { + #ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK + // Request has been completed successfully. So, now construct the + // component info from the buffer which is populated from the SWI server. + if (err == KErrNone && iState == KUissClientGettingCompInfo) + { + ConstructCompInfoFromBufferL(); + } + #endif + // Either KErrNone or some sort of error status - in any case the processing has finished + iState = KUissClientIdle; + } + } + + // Re-issue request, if we are still installing/uninstalling + switch(iState) + { + case KUissClientInstalling: + case KUissClientUninstalling: + iUissSession.CompleteDialog(KErrNone, iPtrIntoBuf, iStatus); + if (iActiveObjectMode) + { + SetActive(); + } + return; + + case KUissClientIdle: + // All done, or failed... + delete iArgsStream; + iArgsStream = 0; + //Wait for the death of SisHelper + WaitForSisHelperShutdown(); + // Complete user request (also sets iClientStatus to 0) + ASSERT(iClientStatus); + User::RequestComplete(iClientStatus, err); + + // Logging the error to a file + // Temporary solution, should be removed once instrumentation is fully operational. + if(err != KErrNone) + { + TRAP_IGNORE( + RDesReadStream readStream(iBufLogger->Des()); + CleanupClosePushL(readStream); - CleanupStack::PushL(cmdHandler); - // Note that the callback might call CancelOperation which - // would update iState... - cmdHandler->HandleMessageL(iPtrIntoBuf, iPtrIntoBuf); - CleanupStack::PopAndDestroy(cmdHandler); - } - else - { - #ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK - // Request has been completed successfully. So, now construct the - // component info from the buffer which is populated from the SWI server. - if (err == KErrNone && iState == KUissClientGettingCompInfo) - { - ConstructCompInfoFromBufferL(); - } - #endif - // Either KErrNone or some sort of error status - in any case the processing has finished - iState = KUissClientIdle; - } - } - - // Re-issue request, if we are still installing/uninstalling - switch(iState) - { - case KUissClientInstalling: - case KUissClientUninstalling: - iUissSession.CompleteDialog(KErrNone, iPtrIntoBuf, iStatus); - if (iActiveObjectMode) - { - SetActive(); - } - return; - - case KUissClientIdle: - // All done, or failed... - delete iArgsStream; - iArgsStream = 0; - //Wait for the death of SisHelper - WaitForSisHelperShutdown(); - // Complete user request (also sets iClientStatus to 0) - ASSERT(iClientStatus); - User::RequestComplete(iClientStatus, err); - return; - } - ASSERT(false); + //Retrieve package name. + CAppInfo* appInfo=CAppInfo::NewLC(readStream); + LogSwiErrorsToFileL(err, appInfo->AppName()); + + CleanupStack::PopAndDestroy(2, &readStream); + ); + } + return; + } + ASSERT(false); } @@ -562,11 +595,11 @@ iPtrIntoBuf.Zero(); iUissSession.CompleteDialog(aError, iPtrIntoBuf, iStatus); if (iActiveObjectMode) - { - SetActive(); - } - return KErrNone; // Do not crash the CActiveScheduler. - } + { + SetActive(); + } + return KErrNone; // Do not crash the CActiveScheduler. + } void CUissClientHandler::DoCancel() { @@ -580,91 +613,164 @@ // iStatus, which would stop the active scheduler and hence stop // the CancelOperation from being actioned. - // Do an emergency abort..... + // Do an emergency abort..... - // First kill our helper threads - - // SIS helper thread/server - CSisHelperServer::Abort(); - - // UI helper thread/server - TFullName fullName = RProcess().FullName(); - fullName.Append(':'); - fullName.Append(':'); - fullName.Append(KUissServerName); + // First kill our helper threads + + // SIS helper thread/server + CSisHelperServer::Abort(); + + // UI helper thread/server + TFullName fullName = RProcess().FullName(); + fullName.Append(':'); + fullName.Append(':'); + fullName.Append(KUissServerName); - RThread server; - TInt err = server.Open(fullName); - if (err == KErrNone) - { - server.Terminate(KErrAbort); - server.Close(); - } - - // Now complete any client request - if (iClientStatus) - { - User::RequestComplete(iClientStatus, err); - } + RThread server; + TInt err = server.Open(fullName); + if (err == KErrNone) + { + server.Terminate(KErrAbort); + server.Close(); + } + + // Now complete any client request + if (iClientStatus) + { + User::RequestComplete(iClientStatus, err); + } } #ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK void CUissClientHandler::ConstructCompInfoFromBufferL() { // create a stream based on the buffer - RDesReadStream stream(*iCompInfoBuffer); - CleanupClosePushL(stream); - - CNativeComponentInfo* nativeCompInfo = CNativeComponentInfo::NewLC(); - nativeCompInfo->InternalizeL(stream); - - // UISS and SWI cannot use Usif::CComponentInfo directly, as it is implemented in a non-TCB DLL. For this reason, a private structure maintained (CNativeComponentInfo), - // which is returned by SWI and is converted here to the CComponentInfo according to the USIF interface - Usif::CComponentInfo::CNode* rootNode = MapToComponentInfoL(*nativeCompInfo); - iComponentInfo->SetRootNodeL(rootNode); + RDesReadStream stream(*iCompInfoBuffer); + CleanupClosePushL(stream); + + CNativeComponentInfo* nativeCompInfo = CNativeComponentInfo::NewLC(); + nativeCompInfo->InternalizeL(stream); + + // UISS and SWI cannot use Usif::CComponentInfo directly, as it is implemented in a non-TCB DLL. For this reason, a private structure maintained (CNativeComponentInfo), + // which is returned by SWI and is converted here to the CComponentInfo according to the USIF interface + Usif::CComponentInfo::CNode* rootNode = MapToComponentInfoL(*nativeCompInfo); + iComponentInfo->SetRootNodeL(rootNode); - CleanupStack::PopAndDestroy(nativeCompInfo); - CleanupStack::PopAndDestroy(&stream); + CleanupStack::PopAndDestroy(nativeCompInfo); + CleanupStack::PopAndDestroy(&stream); } Usif::CComponentInfo::CNode* CUissClientHandler::MapToComponentInfoL(CNativeComponentInfo& aNativeComponentInfo) - { - // Create the array to store the children nodes. - RPointerArray children; - CleanupResetAndDestroyPushL(children); - - // If there is any child for the current node, call this method with that child object. - // Continue this (recursively) until we get the leaf node in the embedded tree (with no children) - // and add the resultant node as one of the children and pass it to create the parent node further. - TInt count = aNativeComponentInfo.iChildren.Count(); - for (TInt i = 0; i < count; ++i) - { - Usif::CComponentInfo::CNode* node = MapToComponentInfoL(*aNativeComponentInfo.iChildren[i]); - CleanupStack::PushL(node); - children.AppendL(node); - CleanupStack::Pop(node); - } - - // Create the CNode object using the appropriate parameters. - // children for leaf nodes (bottom most nodes in the embedded tree) will be null. - Usif::CComponentInfo::CNode* node = Usif::CComponentInfo::CNode::NewLC( - Usif::KSoftwareTypeNative(), - *(aNativeComponentInfo.iComponentName), - *(aNativeComponentInfo.iVersion), - *(aNativeComponentInfo.iVendor), - static_cast(aNativeComponentInfo.iScomoState), - static_cast(aNativeComponentInfo.iInstallStatus), - aNativeComponentInfo.iComponentId, - *(aNativeComponentInfo.iGlobalComponentId), - static_cast(aNativeComponentInfo.iAuthenticity), - aNativeComponentInfo.iUserGrantableCaps, - aNativeComponentInfo.iMaxInstalledSize, - aNativeComponentInfo.iHasExe, - &children); - CleanupStack::Pop(node); - CleanupStack::Pop(&children); - children.Close(); - return (node); - } + { + // Create the array to store the children nodes. + RPointerArray children; + CleanupResetAndDestroyPushL(children); + + // If there is any child for the current node, call this method with that child object. + // Continue this (recursively) until we get the leaf node in the embedded tree (with no children) + // and add the resultant node as one of the children and pass it to create the parent node further. + TInt count = aNativeComponentInfo.iChildren.Count(); + for (TInt i = 0; i < count; ++i) + { + Usif::CComponentInfo::CNode* node = MapToComponentInfoL(*aNativeComponentInfo.iChildren[i]); + CleanupStack::PushL(node); + children.AppendL(node); + CleanupStack::Pop(node); + } + + // Create the CNode object using the appropriate parameters. + // children for leaf nodes (bottom most nodes in the embedded tree) will be null. + Usif::CComponentInfo::CNode* node = Usif::CComponentInfo::CNode::NewLC( + Usif::KSoftwareTypeNative(), + *(aNativeComponentInfo.iComponentName), + *(aNativeComponentInfo.iVersion), + *(aNativeComponentInfo.iVendor), + static_cast(aNativeComponentInfo.iScomoState), + static_cast(aNativeComponentInfo.iInstallStatus), + aNativeComponentInfo.iComponentId, + *(aNativeComponentInfo.iGlobalComponentId), + static_cast(aNativeComponentInfo.iAuthenticity), + aNativeComponentInfo.iUserGrantableCaps, + aNativeComponentInfo.iMaxInstalledSize, + aNativeComponentInfo.iHasExe, + &children); + CleanupStack::Pop(node); + CleanupStack::Pop(&children); + children.Close(); + return (node); + } #endif + + +void LogSwiErrorsToFileL(TInt aErrorCode, const TDesC& aAppName) + { + _LIT(KErrorString, "%S : Failed with %d"); + _LIT(KLogFile, "c:\\data\\swilog.log"); + + //Format Output string + HBufC* outputString = HBufC::NewLC(aAppName.Length()+ 30); + outputString->Des().Format(KErrorString, &aAppName, aErrorCode); + + //Maximum number of log file entries. + const TUint KLogFileSize = 10; + + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + + RFile logFile; + TInt err = logFile.Open(fs, KLogFile, EFileWrite); + if(err != KErrNone) + { + //Attempt to create the file. + err = logFile.Create(fs, KLogFile, EFileWrite); + User::LeaveIfError(err); + } + CleanupClosePushL(logFile); + + + //Read the entire log file. + RPointerArray linesArray; + CleanupResetAndDestroyPushL(linesArray); + + TFileText logFileManipulator; + logFileManipulator.Set(logFile); + + TBuf<200>buffer; + err = logFileManipulator.Read(buffer); + TInt count(0); + while(err == KErrNone && ++count <= KLogFileSize) + { + HBufC* line = buffer.AllocLC(); + linesArray.AppendL(line); + CleanupStack::Pop(line); + err = logFileManipulator.Read(buffer); + } + + // If the log file contains less than KLogFileSize entries, + // write the new log entry. + if(count < KLogFileSize) + { + logFileManipulator.Seek(ESeekEnd); + logFileManipulator.Write(*outputString); + } + else + { + // Contains KLogFileSize entries. + // Replicate the last KLogFileSize - 1 entries and add the + // new log at the end. + logFile.Close(); + logFile.Replace(fs, KLogFile, EFileWrite); + logFileManipulator.Set(logFile); + for(TInt i = linesArray.Count()- KLogFileSize +1; i& aPackageNames, RPointerArray& aVendorNames) { + CleanupResetAndDestroyPushL(aPackageNames); + CleanupResetAndDestroyPushL(aVendorNames); + HBufC8* buffer = RSisRegistryEntry::SendReceiveBufferLC(EPackageAugmentations); // create a stream based on the buffer @@ -340,6 +343,8 @@ CleanupStack::Pop(2, vendor); //vendor package, } CleanupStack::PopAndDestroy(3, buffer);// buffer, stream, packages + + CleanupStack::Pop(2, &aPackageNames); } EXPORT_C void RSisRegistryEntry::AugmentationsL(RPointerArray& aPackages) @@ -392,6 +397,7 @@ EXPORT_C void RSisRegistryEntry::ControllersL(RPointerArray& aControllers) { + CleanupResetAndDestroyPushL(aControllers); HBufC8* buffer = SendReceiveBufferLC(EControllers); // this call returns pure data, so we don't incur the overheads of the streamstore @@ -413,6 +419,7 @@ } CleanupStack::PopAndDestroy(buffer); + CleanupStack::Pop(&aControllers); } EXPORT_C TChar RSisRegistryEntry::SelectedDriveL() diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swi/source/sisregistry/client/sisregistrysession.cpp --- a/installationservices/swi/source/sisregistry/client/sisregistrysession.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/installationservices/swi/source/sisregistry/client/sisregistrysession.cpp Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -35,7 +35,7 @@ #include "hashcontainer.h" #include "dessisdataprovider.h" #include "siscontroller.h" - +#include "cleanuputils.h" using namespace Swi; @@ -380,6 +380,7 @@ EXPORT_C void RSisRegistrySession::RetrieveLogFileL(RPointerArray& aLogEntry) { + CleanupResetAndDestroyPushL(aLogEntry); HBufC8* buffer = SendReceiveBufferLC(EloggingFile); RDesReadStream stream(*buffer); @@ -408,6 +409,7 @@ } CleanupStack::PopAndDestroy(2,buffer); //buffer,stream + CleanupStack::Pop(&aLogEntry); } HBufC8* RSisRegistrySession::SendReceiveBufferLC(TInt aMessage, TPtrC8 aInputBuffer, TInt aThirdArgument) diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swi/source/sisregistry/common/sisregistryhelperclient.cpp --- a/installationservices/swi/source/sisregistry/common/sisregistryhelperclient.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/installationservices/swi/source/sisregistry/common/sisregistryhelperclient.cpp Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -42,6 +42,7 @@ EXPORT_C void RSisRegistryHelper::GetEquivalentLanguagesL(TLanguage aLangId,RArray& aEquivLangs) { + CleanupClosePushL(aEquivLangs); // calculate the likely size of the data transfer buffer const TInt KMaxBufSize= sizeof(TInt)+ // number of entries @@ -69,4 +70,5 @@ } // cleanup CleanupStack::PopAndDestroy(2, buf); // buf + CleanupStack::Pop(&aEquivLangs); } diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swi/source/sisregistry/server_legacy/sisregistrycache.cpp --- a/installationservices/swi/source/sisregistry/server_legacy/sisregistrycache.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/installationservices/swi/source/sisregistry/server_legacy/sisregistrycache.cpp Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -183,13 +183,16 @@ void CSisRegistryCache::PackageListL(RPointerArray& aPackages) const { + CleanupResetAndDestroyPushL(aPackages); aPackages.ResetAndDestroy(); + for (TInt i = 0; i < iTokens.Count(); i++) { CSisRegistryPackage *package = CSisRegistryPackage::NewLC(*iTokens[i]); aPackages.AppendL(package); CleanupStack::Pop(package); } + CleanupStack::Pop(&aPackages); } RFs& CSisRegistryCache::RFsHandle() @@ -715,19 +718,22 @@ void CSisRegistryCache::SidToPackageL(const TUid aSid, RArray& aListMatchingPackages) const { - for (TInt i = 0; i < iTokens.Count(); i++) + CleanupClosePushL(aListMatchingPackages); + for (TInt i = 0; i < iTokens.Count(); i++) + { + if (iTokens[i]->SidPresent(aSid)) { - if (iTokens[i]->SidPresent(aSid)) - { - aListMatchingPackages.AppendL(*iTokens[i]); - } + aListMatchingPackages.AppendL(*iTokens[i]); } + } DEBUG_PRINTF2(_L("SidToPackageL ListMatchingPackages->Count = %d"), aListMatchingPackages.Count()); if(aListMatchingPackages.Count() == 0 ) { User::Leave(KErrNotFound); } + + CleanupStack::Pop(&aListMatchingPackages); } TBool CSisRegistryCache::ModifiableL(const TDesC& aFileName) @@ -835,6 +841,7 @@ void CSisRegistryCache::PackageAugmentationsL(const TUid aUid, RPointerArray& aPackages) const { + CleanupResetAndDestroyPushL(aPackages); for (TInt i = 0; i < iTokens.Count(); i++) { if ((iTokens[i]->Uid() == aUid) && (iTokens[i]->Index() != CSisRegistryPackage::PrimaryIndex)) @@ -844,6 +851,7 @@ CleanupStack::Pop(tmp); } } + CleanupStack::Pop(&aPackages); } TInt CSisRegistryCache::PackageAugmentationsNumber(const TUid aUid) const @@ -1006,11 +1014,13 @@ RPointerArray& aDependents ) { + CleanupResetAndDestroyPushL(aDependents); aDependents.ResetAndDestroy(); // if it is an augmentation - nothing depends on it if (aObject.InstallType() == Sis::EInstAugmentation || aObject.InstallType() == Sis::EInstPreInstalledPatch) { + CleanupStack::Pop(&aDependents); return; } @@ -1062,11 +1072,13 @@ CleanupStack::PopAndDestroy(2, &stream);// &stream, tmpObject } } + CleanupStack::Pop(&aDependents); } void CSisRegistryCache::EmbeddingPackagesL(const CSisRegistryObject& aObject, RPointerArray& aEmbeddingPackages) { + CleanupResetAndDestroyPushL(aEmbeddingPackages); aEmbeddingPackages.ResetAndDestroy(); TUid matchingUid = aObject.Uid(); @@ -1091,12 +1103,14 @@ } // delete entry & stream CleanupStack::PopAndDestroy(2, &stream);// &stream, tmpObject - } + } + CleanupStack::Pop(&aEmbeddingPackages); } void CSisRegistryCache::GenerateChainListL(const CSisRegistryObject& aObject, RPointerArray& aChainList) { + CleanupResetAndDestroyPushL(aChainList); aChainList.ResetAndDestroy(); // read the controller for every member of the list for (TInt i = 0; i < aObject.ControllerInfo().Count(); i++) @@ -1118,6 +1132,7 @@ // release the data CleanupStack::PopAndDestroy(3, name); // fileProvider, controller } + CleanupStack::Pop(&aChainList); } HBufC8* CSisRegistryCache::LoadControllerLC(const CSisRegistryObject& aObject, TUint aIndex) @@ -1147,6 +1162,7 @@ void CSisRegistryCache::GenerateControllersArrayL(const CSisRegistryObject& aObject, RPointerArray& aControllers) { + CleanupResetAndDestroyPushL(aControllers); aControllers.ResetAndDestroy(); // read the controller for every member of the list @@ -1158,6 +1174,7 @@ aControllers.AppendL(buffer); CleanupStack::Pop(buffer); } + CleanupStack::Pop(&aControllers); } void CSisRegistryCache::AddControllerL(const CSisRegistryObject& aObject, @@ -1392,6 +1409,7 @@ void CSisRegistryCache::ControllerDriveListL(const CSisRegistryObject& aObject, RArray& aDriveList) { + CleanupClosePushL(aDriveList); aDriveList.Reset(); // a copy of the controller is always kept on drive C aDriveList.Append(iSystemDrive); @@ -1402,21 +1420,22 @@ TUint fixedDrives = FixedDrives(); TUint remainingDrives = installationDrives & ~fixedDrives; - if (remainingDrives) + if (remainingDrives) + { + TInt index = 0; + // reuse the path but change drive letter + while (remainingDrives) { - TInt index = 0; - // reuse the path but change drive letter - while (remainingDrives) + // compare a single drive digit + if (remainingDrives & 0x00000001) { - // compare a single drive digit - if (remainingDrives & 0x00000001) - { - User::LeaveIfError(aDriveList.Append(index)); - } - remainingDrives>>=1; - index++; + User::LeaveIfError(aDriveList.Append(index)); } + remainingDrives>>=1; + index++; } + } + CleanupStack::Pop(&aDriveList); } @@ -2046,6 +2065,8 @@ CSisRegistryObject* obj = 0; TUint id = 0; + CleanupResetAndDestroyPushL(aPackages); + aPackages.ResetAndDestroy(); for (TInt i = 0; i < iTokens.Count(); i++) { @@ -2062,6 +2083,7 @@ CloseReadHandleL(id); } + CleanupStack::Pop(&aPackages); } void CSisRegistryCache::RecoverL() diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swi/source/swis/server/adornedutilities.cpp --- a/installationservices/swi/source/swis/server/adornedutilities.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/installationservices/swi/source/swis/server/adornedutilities.cpp Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -23,6 +23,7 @@ #include "adornedutilities.h" #include "log.h" +#include "cleanuputils.h" _LIT(KAdornedWildCharString, "{????????}"); const TInt Swi::FileNameUnadornedPartLength = 10; @@ -75,6 +76,7 @@ void Swi::FindAllAdornedVariantsL(RFs& aFs, const TDesC& aSearchNameWild, const TDesC& aSearchPath, RPointerArray& aAdornedFileNamesFound) { + CleanupResetAndDestroyPushL(aAdornedFileNamesFound); TFindFile finder(aFs); CDir* dirList=0; TBool matchFound = (finder.FindWildByDir( aSearchNameWild, aSearchPath, *&dirList) == KErrNone); @@ -104,6 +106,7 @@ CleanupStack::PushL(dirList); } CleanupStack::PopAndDestroy(dirList); + CleanupStack::Pop(&aAdornedFileNamesFound); } void Swi::GenerateSearchNameWildL(const TDesC& aFileName, TDes& aSearchNameWild) diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swi/source/swis/server/planner.cpp --- a/installationservices/swi/source/swis/server/planner.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/installationservices/swi/source/swis/server/planner.cpp Tue May 11 16:20:28 2010 +0300 @@ -231,6 +231,11 @@ // tree. RPointerArray plannedPackages; CleanupResetAndDestroy >::PushL(plannedPackages); + + // Add the root node in the planned packages, so that it is not added again (as a node in the tree) + // in case of a cyclic dependency. + CSisRegistryPackage* rootPackage = CSisRegistryPackage::NewL(currentNode->PackageL()); + plannedPackages.AppendL(rootPackage); while(ETrue) { @@ -350,6 +355,7 @@ { // We are removing items from array (aProcessPackages)and thus require index // adjustment. But if loop run in reverse order there is no need to adjust the index + CleanupResetAndDestroyPushL(aPlannedPackages); for (TInt i = aProcessPackages.Count() - 1; i >= 0; --i) { // Ignore already added package @@ -392,6 +398,7 @@ aProcessPackages.Remove(i); CleanupStack::PopAndDestroy(®istryEntry); } + CleanupStack::Pop(&aPlannedPackages); } /** @@ -514,6 +521,7 @@ User::Leave(err); } } + CleanupStack::Pop(rootApplication); return rootApplication; @@ -528,13 +536,14 @@ */ void CPlanner::ConfirmForUninstallL(CUninstallationNode& aNode, RPointerArray& aPlannedPackages) { + CleanupResetAndDestroyPushL(aPlannedPackages); aNode.SetIsPlanned(ETrue); // aNode owns package therefore to transfer the ownership // a copy of CSisRegistryPackage is made. CSisRegistryPackage* package = CSisRegistryPackage::NewLC(aNode.PackageL()); aPlannedPackages.AppendL(package); - CleanupStack::Pop(package); + CleanupStack::Pop(2, &aPlannedPackages); } /** diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swi/source/swis/server/sidcache.cpp --- a/installationservices/swi/source/swis/server/sidcache.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/installationservices/swi/source/swis/server/sidcache.cpp Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -170,7 +170,7 @@ { // Count() will increase if a subdirectory is encountered so don't 'optimise' // the loop invariant ! - + CleanupResetAndDestroyPushL(aSearchDirs); for (TInt i = 0; i < aSearchDirs.Count(); ++i) { CDir* entries(0); @@ -197,6 +197,7 @@ } CleanupStack::PopAndDestroy(subDirs); } + CleanupStack::Pop(&aSearchDirs); } void CSidCache::ScanFileSystemL(RFs& aFs) diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swi/test/testexes/embed/cyclic_dependency_base.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/installationservices/swi/test/testexes/embed/cyclic_dependency_base.pkg Tue May 11 16:20:28 2010 +0300 @@ -0,0 +1,13 @@ +; This test file tests embedded cyclic dependencies. + +;Languages +&EN + +;Header +#{"cyclic_dependency_base"}, (0x811118FD), 1, 2, 3,TYPE=SA + +%{"Vendor"} +:"Unique Vendor Name" + +@"cyclic_dependency_embedded.sis",(0x811111E0) + diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swi/test/testexes/packages/cyclic_dependency_embedded.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/installationservices/swi/test/testexes/packages/cyclic_dependency_embedded.pkg Tue May 11 16:20:28 2010 +0300 @@ -0,0 +1,15 @@ +; This test file tests cyclic dependencies. + +;Languages +&EN + +;Header +#{"cyclic_dependency_embedded"}, (0x811111E0), 1, 2, 3,TYPE=SA + +%{"Vendor"} +:"Unique Vendor Name" + +(0x811118FD), 1, 2, 3, {"cyclic_dependency_base"} + + + diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swi/test/tuiscriptadaptors/scripts/tuiscriptadaptors.ini --- a/installationservices/swi/test/tuiscriptadaptors/scripts/tuiscriptadaptors.ini Tue Apr 27 16:46:15 2010 +0300 +++ b/installationservices/swi/test/tuiscriptadaptors/scripts/tuiscriptadaptors.ini Tue May 11 16:20:28 2010 +0300 @@ -1382,4 +1382,19 @@ [u_smlsyncagent] uid=10009f46 -script=z:\tswi\tuiscriptadaptors\scripts\uninstall.xml \ No newline at end of file +script=z:\tswi\tuiscriptadaptors\scripts\uninstall.xml + +[cyclicDependency_A] +sis=z:\tswi\tsis\data\cyclic_dependency_base.sis +script=z:\tswi\tuiscriptadaptors\scripts\simple.xml + +[cyclicDependency_B] +sis=z:\tswi\tsis\data\cyclic_dependency_embedded.sis +script=z:\tswi\tuiscriptadaptors\scripts\simple.xml + +[cyclicDependency_U_B] +uid=811111E0 +script=z:\tswi\tuiscriptadaptors\scripts\uninstall.xml + +[cyclicDependency_Uid] +packageUid=811118FD diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swi/test/tuiscriptadaptors/scripts/tuiscriptadaptors.script --- a/installationservices/swi/test/tuiscriptadaptors/scripts/tuiscriptadaptors.script Tue Apr 27 16:46:15 2010 +0300 +++ b/installationservices/swi/test/tuiscriptadaptors/scripts/tuiscriptadaptors.script Tue May 11 16:20:28 2010 +0300 @@ -1326,6 +1326,20 @@ END_TESTCASE API-SEC-SWIREG-Hidden-0004 +//! @SYMTestCaseID SEC-cyclicDependency-def145326 +//! @SYMTestCaseDesc User installs a package(A) with dependency on package (B), then installs package B with dependency on A, then unistalls pkg B +//! @SYMDEF INC +//! @SYMTestPriority High +//! @SYMTestActions Install SA pkg and then Install another SA package, Uninstall second SA +//! @SYMTestExpectedResults The SIS gets installed and uninstalled successfully + + +START_TESTCASE cyclicDependency +RUN_TEST_STEP 100 tuiscriptadaptors InstallStep z:\tswi\tuiscriptadaptors\scripts\tuiscriptadaptors.ini cyclicDependency_A +RUN_TEST_STEP 100 tuiscriptadaptors InstallStep z:\tswi\tuiscriptadaptors\scripts\tuiscriptadaptors.ini cyclicDependency_B +RUN_TEST_STEP 100 tuiscriptadaptors RemoveWithLastDependent z:\tswi\tuiscriptadaptors\scripts\tuiscriptadaptors.ini cyclicDependency_Uid +RUN_TEST_STEP 100 tuiscriptadaptors UninstallStep z:\tswi\tuiscriptadaptors\scripts\tuiscriptadaptors.ini cyclicDependency_U_B +END_TESTCASE cyclicDependency // Ensure that SWIS shuts down after the above tests to make sure heap checks run RUN_TEST_STEP 5 tuiscriptadaptors SwisNotRunning diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swi/test/tuiscriptadaptors/tswisserver.cpp --- a/installationservices/swi/test/tuiscriptadaptors/tswisserver.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/installationservices/swi/test/tuiscriptadaptors/tswisserver.cpp Tue May 11 16:20:28 2010 +0300 @@ -234,7 +234,9 @@ else if (aStepName == KSwisGetPackageDetails) // Get Package Details testStep = new CSwisUninstallPkgsStep(CSwisUninstallPkgsStep::EPkgDetails); else if (aStepName == KSwisGetPublishedUidArrayStep) // Get Published Package Uid's Array - testStep = new CSwisCheckPublishUidStep(); + testStep = new CSwisCheckPublishUidStep(); + else if (aStepName == KSwisRemoveWithLastDependent) // Set RemoveWithLastDependent + testStep = new CSwisSetRemoveWithLastDependent(); #ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK else if (aStepName == KCheckSCRFieldStep) // Check the SCR components' 'Origin Verified', 'Known Revoked', 'DRM Ptotected' field values. testStep = new CCheckScrFieldStep(); diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swi/test/tuiscriptadaptors/tswisstep.cpp --- a/installationservices/swi/test/tuiscriptadaptors/tswisstep.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/installationservices/swi/test/tuiscriptadaptors/tswisstep.cpp Tue May 11 16:20:28 2010 +0300 @@ -2973,4 +2973,40 @@ return reinterpret_cast(ptr); } #endif + +///// +//Step to Set RemoveWithLastDependent property +///// + +CSwisSetRemoveWithLastDependent::CSwisSetRemoveWithLastDependent() + { + } + +CSwisSetRemoveWithLastDependent::~CSwisSetRemoveWithLastDependent() + { + } + +TVerdict CSwisSetRemoveWithLastDependent::doTestStepL() + { + RSisRegistrySession registrySession; + User::LeaveIfError(registrySession.Connect()); + CleanupClosePushL(registrySession); + + TInt packageUid = 0; + GetHexFromConfig(ConfigSection(),_L("packageUid"),packageUid); + TUid expectedPkgUid = TUid::Uid(packageUid); + RSisRegistryEntry regEntry; + CleanupClosePushL(regEntry); + User::LeaveIfError(regEntry.Open(registrySession, expectedPkgUid)); + TRAPD(err, regEntry.SetRemoveWithLastDependentL(expectedPkgUid)); + if(KErrNone == err) + SetTestStepResult(EPass); + else + SetTestStepResult(EFail); + + CleanupStack::PopAndDestroy(2, ®istrySession); + return TestStepResult(); + + } + // End of file diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swi/test/tuiscriptadaptors/tswisstep.h --- a/installationservices/swi/test/tuiscriptadaptors/tswisstep.h Tue Apr 27 16:46:15 2010 +0300 +++ b/installationservices/swi/test/tuiscriptadaptors/tswisstep.h Tue May 11 16:20:28 2010 +0300 @@ -370,6 +370,7 @@ _LIT(KSwisRemoveUninstallPkgsStep, "RemoveUninstallPkgsStep"); _LIT(KSwisGetPackageDetails, "GetPackageDetails"); _LIT(KSwisGetPublishedUidArrayStep, "GetPublishedUidArrayStep"); +_LIT(KSwisRemoveWithLastDependent, "RemoveWithLastDependent"); #ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK _LIT(KCheckSCRFieldStep, "CheckSCRFieldStep"); _LIT(KCheckSCRCompPropertyStep, "CheckSCRCompPropertyStep"); @@ -513,4 +514,12 @@ TBool iJustDefineProperty; }; +class CSwisSetRemoveWithLastDependent : public CSwisTestStep + { +public: + CSwisSetRemoveWithLastDependent(); + ~CSwisSetRemoveWithLastDependent(); + virtual TVerdict doTestStepL(); + }; + #endif // __TSWISSTEP_H__ diff -r 98a43fae6e2b -r 741e5bba2bd1 installationservices/swidevicetools/source/swicertstoretool/CSWICertStoreTool.cpp --- a/installationservices/swidevicetools/source/swicertstoretool/CSWICertStoreTool.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/installationservices/swidevicetools/source/swicertstoretool/CSWICertStoreTool.cpp Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -400,6 +400,7 @@ void CSWICertStoreTool::ParseApplicationsL(const CTestConfigSection& aSection, RArray& aApplications) { + CleanupClosePushL(aApplications); for (TInt index = 0 ; ; ++index) { const CTestConfigItem* item = aSection.Item(KItemApplication, index); @@ -424,6 +425,7 @@ LogL(KLogNoApplications); User::Leave(KErrArgument); } + CleanupStack::Pop(&aApplications); } void CSWICertStoreTool::OpenInputFileL(const TDesC& aInputFile) diff -r 98a43fae6e2b -r 741e5bba2bd1 secureswitools/swisistools/source/interpretsislib/expressionevaluator.cpp --- a/secureswitools/swisistools/source/interpretsislib/expressionevaluator.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/secureswitools/swisistools/source/interpretsislib/expressionevaluator.cpp Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -95,14 +95,14 @@ } -ExpressionResult ExpressionEvaluator::Evaluate(const CSISExpression* aExpression) +ExpressionResult ExpressionEvaluator::Evaluate(const CSISExpression* aExpression, bool aLogInfo ) { Require(aExpression); - return Evaluate(*aExpression); + return Evaluate(*aExpression, aLogInfo); } -ExpressionResult ExpressionEvaluator::Evaluate(const CSISExpression& aExpression) +ExpressionResult ExpressionEvaluator::Evaluate(const CSISExpression& aExpression, bool aLogInfo) { if (++iExpressionDepth > KMaxExpressionDepth) { @@ -122,8 +122,8 @@ case CSISExpression::EBinOpGreaterThanOrEqual: case CSISExpression::EBinOpLessThanOrEqual: { - const ExpressionResult resultLeft = Evaluate( aExpression.LHS() ); - const ExpressionResult resultRight = Evaluate( aExpression.RHS() ); + const ExpressionResult resultLeft = Evaluate( aExpression.LHS(), aLogInfo ); + const ExpressionResult resultRight = Evaluate( aExpression.RHS(), aLogInfo ); // switch (aExpression.Operator()) { @@ -152,41 +152,41 @@ case CSISExpression::ELogOpAnd: { - ExpressionResult tmp1 = Evaluate(aExpression.LHS()); - ExpressionResult tmp2 = Evaluate(aExpression.RHS()); + ExpressionResult tmp1 = Evaluate(aExpression.LHS(), aLogInfo ); + ExpressionResult tmp2 = Evaluate(aExpression.RHS(), aLogInfo ); iTempResult = ExpressionResult(tmp1.BoolValue() && tmp2.BoolValue()); break; } case CSISExpression::ELogOpOr: { - ExpressionResult tmp1 = Evaluate(aExpression.LHS()); + ExpressionResult tmp1 = Evaluate(aExpression.LHS(), aLogInfo ); if (tmp1.BoolValue()) { iTempResult = ExpressionResult(true); } else { - iTempResult = ExpressionResult(Evaluate(aExpression.RHS())).BoolValue(); + iTempResult = ExpressionResult(Evaluate(aExpression.RHS(), aLogInfo)).BoolValue(); } break; } case CSISExpression::EUnaryOpNot: - iTempResult=!Evaluate(aExpression.RHS()); + iTempResult=!Evaluate(aExpression.RHS(), aLogInfo ); break; case CSISExpression::EFuncAppProperties: { - const TUint32 resultLeft = Evaluate( aExpression.LHS() ).IntegerValue(); - const TUint32 resultRight = Evaluate( aExpression.RHS() ).IntegerValue(); + const TUint32 resultLeft = Evaluate( aExpression.LHS(), aLogInfo ).IntegerValue(); + const TUint32 resultRight = Evaluate( aExpression.RHS(), aLogInfo ).IntegerValue(); // iTempResult = iExpEnv.ApplicationProperty( resultLeft, resultRight ); break; } case CSISExpression::EFuncDevProperties: - iTempResult = ExpressionResult(iExpEnv.Package(Evaluate(aExpression.RHS()).IntegerValue())); + iTempResult = ExpressionResult(iExpEnv.Package(Evaluate(aExpression.RHS(), aLogInfo ).IntegerValue())); break; case CSISExpression::EFuncExists: @@ -218,7 +218,7 @@ } else { - iTempResult = ExpressionResult(iExpEnv.FindFile(pS.GetString())); + iTempResult = ExpressionResult(iExpEnv.FindFile(pS.GetString(), aLogInfo)); } } break; @@ -238,7 +238,7 @@ case CSISExpression::EPrimTypeVariable: { const int variableId = aExpression.IntValue(); - const int variableValue = iExpEnv.Variable( variableId ); + const int variableValue = iExpEnv.Variable( variableId, aLogInfo); // iTempResult = ExpressionResult( variableValue ); break; @@ -292,7 +292,7 @@ } -bool ExpressionEnvironment::FindFile( const std::wstring& aFileName ) +bool ExpressionEnvironment::FindFile( const std::wstring& aFileName, bool aLogInfo ) { bool fileExists = false; @@ -308,7 +308,10 @@ if ( fileName.length() >= 1 && fileName[ 0 ] == L'\\' ) { // Bad file name? - LWARN(L"\tAssuming file path \'" << aFileName << L"\' refers to Z:" ); + if( aLogInfo ) + { + LWARN(L"\tAssuming file path \'" << aFileName << L"\' refers to Z:" ); + } fileName = L"Z:" + fileName; } @@ -355,11 +358,14 @@ throw InvalidSis( "", error, INVALID_SIS ); } // - std::ostringstream stream; - stream << "\tIF EXISTS(\'" << narrowFileName << "\') => " << fileExists; - std::string msg = stream.str(); - std::wstring finalMessage = Utf8ToUcs2( msg ); - LINFO( finalMessage ); + if(aLogInfo) + { + std::ostringstream stream; + stream << "\tIF EXISTS(\'" << narrowFileName << "\') => " << fileExists; + std::string msg = stream.str(); + std::wstring finalMessage = Utf8ToUcs2( msg ); + LINFO( finalMessage ); + } // return fileExists; } @@ -396,7 +402,7 @@ } -int ExpressionEnvironment::Variable( int aVariableId ) +int ExpressionEnvironment::Variable( int aVariableId, bool aLogInfo ) { int result = 0; @@ -417,23 +423,32 @@ if (!iSisFile.IsSupportedLanguage((TUint32)result)) { int firstLanguage = iSisFile.GetLanguage(); // get the first language - std::ostringstream stream; - stream << "Input language " << result << " is not supported by SIS file. Using first language " <& ifs = aInstallBlock.Ifs(); + for (int i = 0; i < ifs.size(); ++i) + { + const CSISIf& ifBlock = ifs[i]; + + if (ifBlock.WasteOfSpace()) + { + return; + } + + // Main expression + if ( aEvaluator.Evaluate(ifBlock.Expression(),false).BoolValue() ) + { + ProcessInstallBlockWarnings(ifBlock.InstallBlock(), aFile); + ProcessConditionalBlockWarnings(ifBlock.InstallBlock(), aEvaluator, aFile); + continue; + } + + int elseCount = ifBlock.ElseIfCount(); + for (int i = 0; i < elseCount; ++i) + { + const CSISElseIf& elseIfBlock = ifBlock.ElseIf(i) ; + if ( aEvaluator.Evaluate(elseIfBlock.Expression(),false).BoolValue()) + { + ProcessInstallBlockWarnings(elseIfBlock.InstallBlock(), aFile); + ProcessConditionalBlockWarnings(elseIfBlock.InstallBlock(), aEvaluator, aFile); + break; // Stop processing else if blocks + } + } + } + } + +void Installer::ProcessInstallBlockWarnings(const CSISInstallBlock& aInstallBlock, const SisFile& aFile) + { + aFile.ProcessEmbeddedFileWarning(aInstallBlock); + + std::string error; + bool result = aFile.ProcessInstallOptionsWarning(aInstallBlock,error); + if(result == false) + { + std::string x; + throw InvalidSis(Ucs2ToUtf8(aFile.GetPackageName(),x), + error, SIS_NOT_SUPPORTED); + } + } TInt Installer::Install(const InstallSISFile& aInstallSISFile) { @@ -270,6 +320,9 @@ // check file is acceptable file.CheckValid(); + const CSISController& ctrl = file.GetController(); + ProcessConditionalBlockWarnings(ctrl.InstallBlock(), *iExpressionEvaluator, file); + if (!DependenciesOk(file)) { return MISSING_DEPENDENCY; diff -r 98a43fae6e2b -r 741e5bba2bd1 secureswitools/swisistools/source/interpretsislib/installer.h --- a/secureswitools/swisistools/source/interpretsislib/installer.h Tue Apr 27 16:46:15 2010 +0300 +++ b/secureswitools/swisistools/source/interpretsislib/installer.h Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -115,6 +115,12 @@ void FilterNonBlockingFilesOfFilename(const SisFile& aFile, const std::wstring& target); void WarnEclipseOverWrite(const SisFile& aFile); + void ProcessConditionalBlockWarnings(const CSISInstallBlock& aInstallBlock, + ExpressionEvaluator& aEvaluator, + const SisFile& aFile + ); + void ProcessInstallBlockWarnings(const CSISInstallBlock& aInstallBlock, const SisFile& aFile); + // Adorned methods void AdornedProcessingOfFile(const std::wstring& aTarget, std::wstring& aUnadornedName, std::list& aAdornedFileNamesFound); diff -r 98a43fae6e2b -r 741e5bba2bd1 secureswitools/swisistools/source/interpretsislib/sisfile.cpp --- a/secureswitools/swisistools/source/interpretsislib/sisfile.cpp Tue Apr 27 16:46:15 2010 +0300 +++ b/secureswitools/swisistools/source/interpretsislib/sisfile.cpp Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -169,7 +169,7 @@ } void SisFile::CheckValid() const - { +{ std::string error; CSISInfo::TSISInstallationType installType = iContents.Controller().SISInfo().InstallationType(); @@ -198,11 +198,26 @@ failed = failed || !success; const CSISInstallBlock& blk = iContents.Controller().InstallBlock(); + success = ProcessInstallOptionsWarning( blk, error); - int fileCount = blk.FileCount(); + failed = failed || !success; + + if (failed) + { + std::string x; + throw InvalidSis(Ucs2ToUtf8(this->GetPackageName(),x), + error, SIS_NOT_SUPPORTED); + } + } + +bool SisFile::ProcessInstallOptionsWarning(const CSISInstallBlock& aInstallBlock, std::string& aError) + { + bool success = true; + + int fileCount = aInstallBlock.FileCount(); for(int i = 0; i < fileCount; ++i) { - const CSISFileDescription& fD = blk.FileDescription(i); + const CSISFileDescription& fD = aInstallBlock.FileDescription(i); const CSISFileDescription::TSISFileOperation operation = fD.Operation(); std::wstring target(fD.Target().GetString()); // @@ -257,19 +272,12 @@ // if (!success) { - error += "SIS File contains install options : "+operation; + aError += "SIS File contains install options : "+operation; break; } } - failed = failed || !success; + } - if (failed) - { - std::string x; - throw InvalidSis(Ucs2ToUtf8(this->GetPackageName(),x), - error, SIS_NOT_SUPPORTED); - } - } std::wstring SisFile::GetVendorName() const { @@ -458,6 +466,18 @@ return pkgs; } +void SisFile::ProcessEmbeddedFileWarning(const CSISInstallBlock& aInstallBlock) const + { + TControllerMap embeddedCtls; + aInstallBlock.GetEmbeddedControllers(embeddedCtls, false); + for (TControllerMapConstIter iter = embeddedCtls.begin(); iter != embeddedCtls.end(); ++iter) + { + const CSISController* ctrl = iter->second; + const CSISInfo& info = ctrl->SISInfo(); + LWARN(L" Embedded Package not installed: UID " << std::hex << info.UID1() ); + } + } + bool SisFile::IsSupportedLanguage(TUint32 aLanguage) const { bool result = false; diff -r 98a43fae6e2b -r 741e5bba2bd1 secureswitools/swisistools/source/interpretsislib/sisfile.h --- a/secureswitools/swisistools/source/interpretsislib/sisfile.h Tue Apr 27 16:46:15 2010 +0300 +++ b/secureswitools/swisistools/source/interpretsislib/sisfile.h Tue May 11 16:20:28 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -96,6 +96,10 @@ void MakeSISStub(std::wstring& aFileName); const CSISController& GetController(); + + void ProcessEmbeddedFileWarning(const CSISInstallBlock& aInstallBlock) const; + + bool ProcessInstallOptionsWarning(const CSISInstallBlock& aInstallBlock, std::string& aError); private: void GetInstallableFiles( InstallableFiles& aFiles,