diff -r 1b207dd38b72 -r ace62b58f4b2 menucontentsrv/srvsrc/mcssuitehandler.cpp --- a/menucontentsrv/srvsrc/mcssuitehandler.cpp Tue May 25 13:01:39 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,699 +0,0 @@ -/* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* -*/ - -// INCLUDE FILES -#include -#include - -#include "mcssuitehandler.h" -#include "menueng.h" -#include "mcsinstallnotifier.h" -#include "mcssuiteparser.h" -#include "mcssuiteobject.h" -#include "menusrvengutils.h" -#include "mcsmenuitem.h" - -// ================= LOCAL FUNCTIONS ======================= - -/** -* Cleanup support method. Call ResetAndDestroy() on the array. -* @param RMenuItemArray* as TAny* -*/ -LOCAL_C void ResetAndDestroy( TAny* aArray ) - { - ((RPointerArray*)aArray)->ResetAndDestroy(); - } - -// --------------------------------------------------------- -// CleanupResetAndDestroyPushL -// --------------------------------------------------------- -// -LOCAL_C void CleanupResetAndDestroyPushL( RPointerArray& aArray ) - { - CleanupStack::PushL( TCleanupItem( ResetAndDestroy, &aArray ) ); - } - -// ================= MEMBER FUNCTIONS ======================= - -// --------------------------------------------------------- -// CMcsSuiteHandler::NewL -// --------------------------------------------------------- -// -CMcsSuiteHandler* CMcsSuiteHandler::NewL( CMenuEng& aEng, const TDesC& aDirName ) - { - CMcsSuiteHandler* self = new( ELeave ) CMcsSuiteHandler( aEng ); - CleanupStack::PushL( self ); - self->ConstructL(aDirName); - CleanupStack::Pop( self ); - return self; - } - - -// --------------------------------------------------------- -// CMcsSuiteHandler::~CMcsSuiteHandler -// --------------------------------------------------------- -// -CMcsSuiteHandler::~CMcsSuiteHandler() - { - iSuites.ResetAndDestroy(); - delete iMmcObserver; - delete iFreeSpaceObserver; - delete iInstallNotifier; - iTimestamps.Close(); - iNewTimestamps.Close(); - iEng.DequeueOperation( *this ); - delete iInstalledFileList; - delete iFileNewList; - iDirPath.Close(); - iFs.Close(); - } - - -// --------------------------------------------------------- -// CMcsSuiteHandler::HaveSuite -// --------------------------------------------------------- -// -TBool CMcsSuiteHandler::HaveSuite(const TDesC& aSuiteName) - { - return iSuites.Exist(aSuiteName); - } - -void CMcsSuiteHandler::GetAttribute( const TDesC& aSuiteName, const TDesC& aAttrName, - TBool& aAttrExists, TDes& aAttrVal ) - { - TInt suitePos = iSuites.FindLastSuite(aSuiteName); - if (suitePos != KErrNotFound) - { - iSuites[suitePos]->GetAttribute(aAttrName, aAttrExists, aAttrVal); - } - } - -// --------------------------------------------------------- -// CMcsSuiteHandler::CMcsSuiteHandler -// --------------------------------------------------------- -// -CMcsSuiteHandler::CMcsSuiteHandler( CMenuEng& aEng ) : - iEng(aEng) - { - } - -// --------------------------------------------------------- -// CMcsSuiteHandler::ConstructL -// --------------------------------------------------------- -// -void CMcsSuiteHandler::ConstructL(const TDesC& aDirName) - { - User::LeaveIfError( iFs.Connect( ) ); - iDirPath.CreateL( KMaxPath ); - User::LeaveIfError( iFs.PrivatePath( iDirPath ) ); - iDirPath.Append(KImportDir); - iDirPath.Append(KBackSlash); - iDirPath.Append(aDirName); - iDirPath.Append(KBackSlash); - iFileNewList = new (ELeave) CDesCArrayFlat(KDefaultGranularity); - iInstalledFileList = new (ELeave) CDesCArrayFlat(KDefaultGranularity); - iInstallNotifier = CMcsInstallNotifier::NewL(*this, KSAUidSoftwareInstallKeyValue); - iMmcObserver = CMcsMmcObserver::NewL( *this ); - iFreeSpaceObserver = CMcsFreeSpaceObserver::NewL( *this ); - // Import suites form suite dir - CheckSuiteDirL(); - iEvent = EInstOpRestore; - iEng.QueueOperationL( *this ); - } - - -// --------------------------------------------------------- -// CMcsSuiteHandler::HandleInstallNotifyL -// --------------------------------------------------------- -// -void CMcsSuiteHandler::HandleInstallNotifyL(TInt aEvent) - { - // Look for new files - CheckSuiteDirL(); - iEvent = aEvent; - iEng.QueueOperationL( *this ); - } - -// --------------------------------------------------------- -// CMcsSuiteHandler::HandleMmcEventL -// --------------------------------------------------------- -// -void CMcsSuiteHandler::HandleMmcEventL(TInt aEvent) - { - CheckSuiteDirL(); - if (aEvent == EMmcInsert) - { - iEvent = EInstOpInstall; - } - else if (aEvent == EMmcRemove) - { - iEvent = EInstOpUninstall; - } - iEng.QueueOperationL( *this ); - } - -// --------------------------------------------------------- -// CMcsSuiteHandler::HandleFreeSpaceEventL -// --------------------------------------------------------- -// -void CMcsSuiteHandler::HandleFreeSpaceEventL() - { - CheckSuiteDirL(); - iEvent = EInstOpUninstall; - iEng.QueueOperationL( *this ); - } - -// --------------------------------------------------------- -// CMcsSuiteHandler::CheckSuiteDirL -// --------------------------------------------------------- -// -void CMcsSuiteHandler::CheckSuiteDirL() - { - // Get file list - iFileNewList->Reset(); - iNewTimestamps.Reset(); - - TDriveList driveList; - TChar driveLetter; - User::LeaveIfError(iFs.DriveList(driveList)); - for (TInt driveNumber = EDriveA; driveNumber <= EDriveZ; driveNumber++) - { - if (driveList[driveNumber]) - { - User::LeaveIfError(iFs.DriveToChar(driveNumber, driveLetter)); - RBuf filePath; - filePath.CreateL(KMaxPath); - CleanupClosePushL(filePath); - filePath.Append(driveLetter); - filePath.Append(KColen); - filePath.Append(iDirPath); - CDir* fileList; - - iFs.GetDir(filePath, KEntryAttMaskSupported, - ESortByName, fileList); - - CleanupStack::PopAndDestroy(&filePath); - if (fileList) - { - CleanupStack::PushL(fileList); - for (TInt i = 0; i < fileList->Count(); i++) - { - // Not dir, xml file - if (!(*fileList)[i].IsDir() && ValidExtansion( - (*fileList)[i].iName)) - { - // Don't add same file names more then once - // Or else it will case trouble during update - TInt dummy; - if ( iFileNewList->Find((*fileList)[i].iName, dummy) ) - { - iFileNewList->AppendL((*fileList)[i].iName); - iNewTimestamps.AppendL((*fileList)[i].iModified); - } - } - } - CleanupStack::PopAndDestroy(fileList); - } - } - } - } - -// --------------------------------------------------------- -// CMcsSuiteHandler::AddNewL -// --------------------------------------------------------- -// -void CMcsSuiteHandler::AddNew() - { - for ( TInt i = 0; i < iFileNewList->Count(); i++ ) - { - TPtrC fileNewName = (*iFileNewList)[i]; - TTime fileTimestamp = iNewTimestamps[i]; - - if ( !FileInstalled(fileNewName) ) - { - // Not yet installed, install it - TRAP_IGNORE( InstallFileL(fileNewName, fileTimestamp) ); - } - else if (FileNeedUpdate(fileNewName, fileTimestamp) ) - { - //Installed, but needs update - TRAP_IGNORE( UpdateFileL( fileNewName, fileTimestamp) ); - } - } - } - -// --------------------------------------------------------- -// CMcsSuiteHandler::RemoveOldL -// --------------------------------------------------------- -// -void CMcsSuiteHandler::RemoveOld() - { - for ( TInt i = 0; i < iInstalledFileList->Count(); i++ ) - { - TPtrC fileNewName = (*iInstalledFileList)[i]; - - // File was removed, unistall it - if ( FileUninstalled(fileNewName) ) - { - TRAP_IGNORE( UninstallFileL(fileNewName) ); - } - } - iInstalledFileList->Compress(); - } - -// --------------------------------------------------------- -// CMcsSuiteHandler::ScanSuitesL -// --------------------------------------------------------- -// -void CMcsSuiteHandler::ScanSuitesL() - { - RArray suiteItems; - CleanupClosePushL( suiteItems ); - GetMenuSuitesL( suiteItems, KMenuAttSuiteAdded(), KMenuTrue() ); - - for ( TInt i = 0; i < suiteItems.Count(); i++ ) - { - TBool dummy(EFalse); - TPtrC suiteName(KNullDesC); - iEng.ObjectL( suiteItems[i].Id() ). - FindAttribute( KMenuAttSuiteName, suiteName, dummy ); - - if ( !HaveSuite( suiteName ) ) - { - iEng.RemoveL( suiteItems[i].Id() ); - } - } - CleanupStack::PopAndDestroy(&suiteItems); - } - -// --------------------------------------------------------- -// CMcsSuiteHandler::FileExistL -// --------------------------------------------------------- -// -TBool CMcsSuiteHandler::FileInstalled(const TDesC& aFileName) - { - TInt posInArray; - // uses Folded Comparing - if (iInstalledFileList->Find(aFileName, posInArray) == KErrNone) - { - return ETrue; - } - return EFalse; - } - -// --------------------------------------------------------- -// CMcsSuiteHandler::FileUninstalled -// --------------------------------------------------------- -// -TBool CMcsSuiteHandler::FileUninstalled(const TDesC& aFileName) - { - for (TInt j = 0 ; j < iFileNewList->Count(); j++) - { - if ( !(*iFileNewList)[j].Compare( aFileName ) ) - { - // Wasn't removed but maybe needs to be updated (rom case) - return FileNeedUpdate(aFileName, iNewTimestamps[j]); - } - } - return ETrue; - } - -// --------------------------------------------------------- -// CMcsSuiteHandler::FileNeedUpdate -// --------------------------------------------------------- -// -TBool CMcsSuiteHandler::FileNeedUpdate(const TDesC& aFileName, const TTime& aTimestamp) - { - TInt posInArray; - // uses Folded Comparing - if (iInstalledFileList->Find(aFileName, posInArray) == KErrNone) - { - // If timestamps mach then it's the same file - return (iTimestamps[posInArray] != aTimestamp); - } - return EFalse; - } - -// --------------------------------------------------------- -// CMcsSuiteHandler::ValidExtansion -// --------------------------------------------------------- -// -TBool CMcsSuiteHandler::ValidExtansion(const TDesC& aFileName) - { - TPtrC fileExt = - aFileName.Mid( aFileName.LocateReverse( KDot ) + 1 ); - - return ( fileExt.CompareF(KXmlExt) == 0 ); - } - - -// --------------------------------------------------------- -// CMcsSuiteHandler::InstallFile -// --------------------------------------------------------- -// -void CMcsSuiteHandler::InstallFileL(const TDesC& aFileName, const TTime& aTimestam) - { - RPointerArray suiteArray; - CleanupResetAndDestroyPushL(suiteArray); - - // Get suite from suite file - GetSuitesL(aFileName, suiteArray); - - //Add filename to installed suites files array - //If Leave occured during GetSuitesL filename wont be added - iInstalledFileList->AppendL(aFileName); - iTimestamps.AppendL(aTimestam); - - // Take the ownership of suite items - for (TInt i = 0; i < suiteArray.Count(); i++ ) - { - User::LeaveIfError( iSuites.Append( suiteArray[i] ) ); - TRAPD( err, AddSuiteL( suiteArray[i]->SuiteName() ) ); - if( err!=KErrNone ) - { - if( i==0 ) - { - iInstalledFileList->Delete( iInstalledFileList->Count()-1 ); - iTimestamps.Remove( iTimestamps.Count()-1 ); - } - iSuites.Remove( iSuites.Count()-1 ); - User::Leave( err ); - } - suiteArray[i] = NULL; - } - CleanupStack::Pop(&suiteArray); - suiteArray.Close(); - } - -// --------------------------------------------------------- -// CMcsSuiteHandler::UninstallFile -// --------------------------------------------------------- -// -void CMcsSuiteHandler::UninstallFileL(const TDesC& aFileName) - { - TInt pos(KErrNotFound); - if ( !iInstalledFileList->Find(aFileName, pos)) - { - - // Need to know what suites are beeing removed - CDesCArrayFlat* removedSuites = - new (ELeave) CDesCArrayFlat(KDefaultGranularity); - CleanupStack::PushL(removedSuites); - for (TInt i = 0; i < iSuites.Count(); i++) - { - if ( aFileName.Compare( iSuites[i]->FileName() ) == KErrNone ) - { - removedSuites->AppendL( iSuites[i]->SuiteName() ); - } - } - - // We know what suites are beeing removed, we can remove those safly - iSuites.RemoveByFileName(aFileName); - - // Remove uninstalled file from our list - iInstalledFileList->Delete(pos); - iTimestamps.Remove(pos); - - // And reopen removed suites defined in other files - for (TInt i = 0; i < removedSuites->Count(); i++) - { - TInt suitePos = iSuites.FindLastSuite( (*removedSuites)[i] ); - if (suitePos != KErrNotFound) - { - ReopenSuiteL(suitePos); - } - else - { - RemoveSuiteFromXmlL( (*removedSuites)[i] ); - } - } - - CleanupStack::PopAndDestroy(removedSuites); - } - } - -// --------------------------------------------------------- -// CMcsSuiteHandler::UpdateFileL -// --------------------------------------------------------- -// -void CMcsSuiteHandler::UpdateFileL(const TDesC& aFileName, const TTime& aTimestam) - { - TInt pos; - if (iInstalledFileList->Find(aFileName, pos) == KErrNone) - { - // Get rid of out of date suites - iSuites.RemoveByFileName(aFileName); - iInstalledFileList->Delete(pos); - //iInstalledFileList->Compress(); - iTimestamps.Remove(pos); - - // Instal suites form file name - InstallFileL(aFileName, aTimestam); - } - } - -// --------------------------------------------------------- -// CMcsSuiteHandler::GetSuites -// --------------------------------------------------------- -// -void CMcsSuiteHandler::GetSuitesL(const TDesC& aFileName, - RPointerArray& aSuiteArray) - { - TDriveList driveList; - TChar driveLetter; - User::LeaveIfError( iFs.DriveList( driveList ) ); - for ( TInt driveNumber = EDriveZ; driveNumber >= EDriveA; driveNumber-- ) - { - if ( driveList[driveNumber] ) - { - User::LeaveIfError( iFs.DriveToChar( driveNumber, driveLetter ) ); - RBuf file; - file.CleanupClosePushL(); - file.CreateL( KMaxPath ); - file.Append( driveLetter ); - file.Append( KColen ); - file.Append( iDirPath ); - file.Append( aFileName ); - CSuiteParser* suiteParser = CSuiteParser::NewL(file); - CleanupStack::PushL(suiteParser); - TRAP_IGNORE( suiteParser->GetSuitsArrayL( aSuiteArray ) ); - CleanupStack::PopAndDestroy(suiteParser); - CleanupStack::PopAndDestroy( &file ); - } - } - } - -// --------------------------------------------------------- -// CMcsSuiteHandler::ReopenSuite -// --------------------------------------------------------- -// -void CMcsSuiteHandler::ReopenSuiteL(TInt aSuiteArrayPos) - { - RPointerArray suiteArray; - CleanupResetAndDestroyPushL(suiteArray); - - TPtrC suiteName = iSuites[aSuiteArrayPos]->SuiteName(); - TPtrC fileName = iSuites[aSuiteArrayPos]->FileName(); - - // Get suite from suite file - GetSuitesL(fileName, suiteArray); - - // Find our suite in suites from specified file - CSuiteObject* neededSuite = NULL; - for (TInt j = 0; j < suiteArray.Count(); j++) - { - if (suiteArray[j]->SuiteName().Compare(suiteName) == KErrNone) - { - // Take ownership of Suite Object - neededSuite = suiteArray[j]; - suiteArray.Remove(j); - break; - } - } - - if ( neededSuite ) - { - // Replace Suite Object in suiteArray - delete iSuites[aSuiteArrayPos]; - iSuites[aSuiteArrayPos] = neededSuite; - } - else - { - // Must be some error, delete that suite - delete iSuites[aSuiteArrayPos]; - iSuites.Remove( aSuiteArrayPos ); - } - - CleanupStack::PopAndDestroy(&suiteArray); - } - -// --------------------------------------------------------- -// CMcsSuiteHandler::GetMenuSuitesL -// --------------------------------------------------------- -// -void CMcsSuiteHandler::GetMenuSuitesL( - RArray& aItemArray, - const TDesC& aAttrName, - const TDesC& aAttrValue ) - { - TInt root( 0 ); - iEng.RootFolderL( root ); - TMenuSrvTypeAttrFilter suiteFilter; - suiteFilter.SetType( KMenuTypeSuite() ); - suiteFilter.SetAttr( aAttrName, aAttrValue ); - iEng.GetItemsL( aItemArray, root, &suiteFilter, ETrue ); - } - -// --------------------------------------------------------- -// CMcsSuiteHandler::AddSuiteL -// --------------------------------------------------------- -// -void CMcsSuiteHandler::AddSuiteL( const TPtrC& aSuiteName ) - { - RArray mcsItems; - CleanupClosePushL( mcsItems ); - GetMenuSuitesL( mcsItems, KMenuAttSuiteName(), aSuiteName ); - - if( mcsItems.Count() == KErrNone ) - { - AddSuiteToXmlL( aSuiteName ); - } - else - { - UpdateItemsL( mcsItems ); - } - CleanupStack::PopAndDestroy(&mcsItems); - } - - -// --------------------------------------------------------- -// CMcsSuiteHandler::AddSuiteL -// --------------------------------------------------------- -// -void CMcsSuiteHandler::RemoveSuiteFromXmlL( const TPtrC& aSuiteName ) - { - RArray mcsItems; - CleanupClosePushL( mcsItems ); - GetMenuSuitesL( mcsItems, KMenuAttSuiteName(), aSuiteName ); - - for( TInt i( 0 ); i < mcsItems.Count(); i++ ) - { - UpdateSuiteInXmlL( mcsItems, i ); - } - - CleanupStack::PopAndDestroy(&mcsItems); - } - -// --------------------------------------------------------- -// CMcsSuiteHandler::UpdateSuiteInXmlL -// --------------------------------------------------------- -// -void CMcsSuiteHandler::UpdateSuiteInXmlL( - RArray & aMcsItems, TInt aIndex ) - { - TBool dummy(EFalse); - TPtrC val(KNullDesC); - if( iEng.ObjectL(aMcsItems[aIndex].Id()). - FindAttribute( KMenuAttSuiteAdded, val, dummy ) ) - { - if ( val.Compare(KMenuTrue) == KErrNone ) - { - iEng.RemoveL(aMcsItems[aIndex].Id()); - } - else if ( val.Compare(KMenuFalse) == KErrNone ) - { - iEng.ModifiableObjectL(aMcsItems[aIndex].Id()). - RemoveAttribute( KMenuAttSuiteAdded ); - } - } - } - -// --------------------------------------------------------- -// CMcsSuiteHandler::RunMenuEngOperationL -// --------------------------------------------------------- -// -void CMcsSuiteHandler::RunMenuEngOperationL() - { - if ( iEvent & EInstOpInstall ) - { - // Add new suites - AddNew(); - } - else if ( ( iEvent & EInstOpUninstall ) ) - { - // Remove old suites, andd new if needed (stub sis case) - RemoveOld(); - AddNew(); - } - else if( ( iEvent & EInstOpRestore ) ) - { - AddNew(); - ScanSuitesL(); - } - } - -// --------------------------------------------------------- -// CMcsSuiteHandler::CompletedMenuEngOperation -// --------------------------------------------------------- -// -void CMcsSuiteHandler::CompletedMenuEngOperation( TInt /*aErr*/ ) - { - - } -// --------------------------------------------------------- -// CMcsSuiteHandler::AddSuiteToXmlL -// --------------------------------------------------------- -// -void CMcsSuiteHandler::AddSuiteToXmlL( const TPtrC& aSuiteName ) - { - TInt root( 0 ); - iEng.RootFolderL( root ); - - CMenuEngObject* obj = iEng.NewObjectL( KMenuTypeSuite ); - CleanupStack::PushL( obj ); - obj->SetAttributeL( KMenuAttSuiteName, aSuiteName, EFalse ); - obj->SetAttributeL( KMenuAttSuiteAdded, KMenuTrue, EFalse ); - iEng.AddL( *obj, root, 0 ); - CleanupStack::Pop( obj ); - } - -// --------------------------------------------------------- -// CMcsSuiteHandler::UpdateItemsL -// --------------------------------------------------------- -// -void CMcsSuiteHandler::UpdateItemsL( - const RArray& aItemArray ) - { - for( TInt i( 0 ); i < aItemArray.Count(); ++i ) - { - TPtrC val(KNullDesC); - TBool dummy( EFalse ); - iEng.ObjectL( aItemArray[i].Id() ). - FindAttribute( KMenuAttSuiteAdded, val, dummy ); - if( val.Compare( KMenuTrue ) != KErrNone ) - { - iEng.ModifiableObjectL( aItemArray[i].Id() ). - SetAttributeL( KMenuAttSuiteAdded, KMenuFalse, EFalse); - } - else - { - iEng.ModifiableObjectL( aItemArray[i].Id() ). - SetAttributeL( KMenuAttSuiteAdded, KMenuTrue, EFalse); - } - } - } -