diff -r 000000000000 -r f72a12da539e menufw/hierarchynavigator/hnmetadatamodel/src/hnxmlsuitefilesreg.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/menufw/hierarchynavigator/hnmetadatamodel/src/hnxmlsuitefilesreg.cpp Thu Dec 17 08:40:49 2009 +0200 @@ -0,0 +1,290 @@ +/* +* Copyright (c) 2007-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: +* Version : %version: 9 % << Don't touch! Updated by Synergy at check-out. +* +*/ + +#include +#include "hnxmlsuitefilesreg.h" +#include "hnglobals.h" +#include "hnconvutils.h" +#include "menudebug.h" +#include "hnhelper.inl" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CHnXmlSuiteFilesReg::SynchronizeL( RFs & aFs, const TDesC &aSuiteName ) + { + CHnXmlSuiteFilesReg* self = new (ELeave) CHnXmlSuiteFilesReg( aFs ); + CleanupStack::PushL(self); + self->ConstructL( aSuiteName ); + TBool ret = self->SynchronizeSuiteFilesL(); + CleanupStack::PopAndDestroy( self ); + return ret; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CHnXmlSuiteFilesReg::~CHnXmlSuiteFilesReg() + { + iSuiteName.Close(); + DestroySuiteFilesMaps(); + delete iFileMan; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CHnXmlSuiteFilesReg::CHnXmlSuiteFilesReg( RFs & aFs ) : iFs(aFs), + iSuiteFiles(&TDesC16Hash, &TDesC16Ident) + { + + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +HBufC* CHnXmlSuiteFilesReg::GetSuiteInstallPathL() + { + TBuf installPath; + User::LeaveIfError( iFs.PrivatePath(installPath) ); + TChar drive; + TBuf<1> driveLetter; + iFs.DriveToChar( EDriveC, drive ); + installPath.Insert(0, KColon ); + driveLetter.Append( drive ); + installPath.Insert(0, driveLetter ); + installPath.Append(KEntriesSuffix); + installPath.Append( iSuiteName ); + installPath.Append( Kbackslash ); + return installPath.AllocL(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnXmlSuiteFilesReg::ConstructL( const TDesC &aSuiteName ) + { + iSuiteName.CreateL( aSuiteName ); + iFileMan = CFileMan::NewL(iFs); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnXmlSuiteFilesReg::DestroySuiteFilesMaps() + { + DestroyMapValue( iSuiteFiles ); + iSuiteFiles.Close(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +HBufC* CHnXmlSuiteFilesReg::GetSuiteImportDirL( TInt aDriveNumber ) const + { + TBuf outputDir; + + TChar driveLetter; + User::LeaveIfError( iFs.DriveToChar( aDriveNumber, driveLetter ) ); + + TBuf< KSingleChar > driveLetterConst; + driveLetterConst.Append( driveLetter ); + + User::LeaveIfError( iFs.PrivatePath( outputDir ) ); + + outputDir.Insert( 0, driveLetterConst ); + outputDir.Insert( 1, KColon ); + outputDir.Append( KSuitesDir ); + outputDir.Append( iSuiteName ); + outputDir.Append( Kbackslash ); + + return outputDir.AllocL(); + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnXmlSuiteFilesReg::SearchDrivesForSuiteFilesL() + { + DestroySuiteFilesMaps(); + + TDriveList driveList; + User::LeaveIfError( iFs.DriveList( driveList ) ); + TFixedArray< TInt, KMaxDrives > driveSearchOrder( KDriveSearchOrder, KMaxDrives ); + + for(TInt iterator(0); iterator < driveSearchOrder.Count(); iterator++ ) + { + if ( driveList[ driveSearchOrder[ iterator ] ] ) + { + RBuf filePath( GetSuiteImportDirL( driveSearchOrder[ iterator ] ) ); + CleanupClosePushL( filePath ); + SearchDirForSuiteFilesL(filePath); + CleanupStack::PopAndDestroy( &filePath ); + } + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnXmlSuiteFilesReg::SearchDirForSuiteFilesL( const TDesC& aSuitePath ) + { + CDir* fileList = NULL; + if (!iFs.GetDir( aSuitePath, KEntryAttMaskSupported, ESortByName, fileList )) + { + CleanupStack::PushL( fileList ); + for( TInt i( 0 ); i < fileList->Count(); i++ ) + { + if (! (*fileList)[i].IsDir() ) + { + AddSuiteFileToMapL( aSuitePath, (*fileList)[i] ); + } + } + CleanupStack::PopAndDestroy( fileList ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnXmlSuiteFilesReg::AddSuiteFileToMapL( const TDesC& aDir, const TEntry& aFile ) + { + THnFileInfo fileInfo = { aFile.iName, aDir, aFile.iModified, aFile.iSize }; + fileInfo.iFilePath.Append( aFile.iName ); + + THnFileInfo** existingFileInfo = iSuiteFiles.Find( &aFile.iName ); + + TInt newFileDrive( KErrNotFound ); + iFs.CharToDrive( fileInfo.iFilePath[0], newFileDrive ); + + TBool newerThanExisting( EFalse ); + TInt existingFileDrive( KErrNotFound ); + if ( existingFileInfo ) + { + iFs.CharToDrive( (*existingFileInfo)->iFilePath[0], existingFileDrive); + newerThanExisting = + (*existingFileInfo)->iLastModified < fileInfo.iLastModified && + newFileDrive != EDriveZ; + } + + if ( !existingFileInfo || newerThanExisting || existingFileDrive == EDriveZ ) + { + if( existingFileInfo ) + { + iSuiteFiles.Remove( &aFile.iName ); + } + THnFileInfo* fileInfoPointer = new (ELeave) THnFileInfo( fileInfo ); + iSuiteFiles.InsertL( &fileInfo.iFileName, fileInfoPointer ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CHnXmlSuiteFilesReg::CalculateCurrentSuiteSizeL() + { + RBuf suiteInstallDir( GetSuiteInstallPathL() ); + CleanupClosePushL( suiteInstallDir ); + CDir* suiteFileList; + iFs.GetDir( suiteInstallDir, KEntryAttMaskSupported, ESortByName, suiteFileList); + CleanupStack::PushL(suiteFileList); + + TInt suiteSize(0); + for( TInt i(0); suiteFileList && i< suiteFileList->Count(); i++ ) + { + suiteSize+= (*suiteFileList)[i].iSize; + } + CleanupStack::PopAndDestroy( suiteFileList ); + CleanupStack::PopAndDestroy( &suiteInstallDir ); + return suiteSize; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CHnXmlSuiteFilesReg::CalculateSynchronizationSuiteSize() + { + TInt retSize( 0 ); + + THashMapIter< const TDesC*, THnFileInfo* > iter( iSuiteFiles ); + + while ( iter.NextKey() ) + { + const THnFileInfo& fileInfo = **(iter.CurrentValue()); + retSize += fileInfo.iSize; + } + + return retSize; + } +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CHnXmlSuiteFilesReg::SynchronizeSuiteFilesL() + { + TBool ret( EFalse ); + SearchDrivesForSuiteFilesL(); + + TInt spaceNeeded = CalculateSynchronizationSuiteSize() - + CalculateCurrentSuiteSizeL(); + + RBuf suiteInstallationDir( GetSuiteInstallPathL() ); + CleanupClosePushL( suiteInstallationDir ); + iFileMan->RmDir( suiteInstallationDir ); + if( iSuiteFiles.Count() && ( spaceNeeded < 0 || !SysUtil::DiskSpaceBelowCriticalLevelL( + &iFs, spaceNeeded , EDriveC ) ) ) + { + THashMapIter< const TDesC*, THnFileInfo* > iter( iSuiteFiles ); + iFs.MkDirAll( suiteInstallationDir ); + while( iter.NextKey() ) + { + const THnFileInfo& fileInfo = **(iter.CurrentValue()); + TBuf filePath( suiteInstallationDir ); + filePath.Append( fileInfo.iFileName ); + if( filePath.Compare( fileInfo.iFilePath ) ) + { + if( BaflUtils::FileExists( iFs, filePath ) ) + { + iFs.SetAtt( filePath, NULL, KEntryAttReadOnly ); + iFs.Delete( filePath ); + } + iFileMan->Copy( + fileInfo.iFilePath, + filePath, CFileMan::EOverWrite ); + ret = ETrue; + } + } + } + CleanupStack::PopAndDestroy( &suiteInstallationDir ); + return ret; + }