diff -r 000000000000 -r 79c6a41cd166 homescreenpluginsrv/hspspluginregistry/src/hspsdefinitionrepository.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenpluginsrv/hspspluginregistry/src/hspsdefinitionrepository.cpp Thu Dec 17 08:54:17 2009 +0200 @@ -0,0 +1,1536 @@ +/* +* 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: Service for maintaining contents of the "themes" folder +* +*/ + + +// INCLUDE FILES +#include +#include +#include + +#include "hsps_builds_cfg.hrh" + +#include "hspsthememanagement.h" +#include "hspsdefinitionrepository.h" +#include "hspsodt.h" + +#ifdef HSPS_LOG_ACTIVE +#include +#endif + +// CONSTANTS +const TInt KDefRepArrayGranularity = 5; + +_LIT(KImportFolder, "import"); +_LIT(KThemesFolder, "themes"); +_LIT(KSourceFolder, "sources"); +_LIT(KSourceFolderWithSeperators, "\\sources\\"); +_LIT(KLocaleFolder, "locales"); +_LIT(KBackupFolder, "backup"); + + +_LIT(KDoubleBackSlash,"\\"); + +_LIT(KFolderFormat,"%d"); // folder format for localized resources + +_LIT(KMatchAll, "*"); + + +_LIT(KMatchSkeleton, ".o0000"); + +const TInt KTIntMahspsumbers( 11 ); + +// ============================= LOCAL FUNCTIONS =============================== + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::ChspsDefinitionRepository +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +ChspsDefinitionRepository::ChspsDefinitionRepository() + { + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void ChspsDefinitionRepository::ConstructL() + { + User::LeaveIfError( iFs.Connect() ); + //Create private path if it doesn't exist already + TInt err=iFs.CreatePrivatePath(EDriveC); + if (err!=KErrNone && err!=KErrAlreadyExists) + { + User::Leave(err); + } + HBufC* path = HBufC::NewLC( KMaxFileName ); + TPtr pathPtr = path->Des(); + User::LeaveIfError( iFs.PrivatePath( pathPtr )); + AppendDesCIntoPathL( pathPtr, KImportFolder ); + AppendDesCIntoPathL( pathPtr, KDoubleBackSlash ); + iFs.MkDir( pathPtr ); + CleanupStack::PopAndDestroy( path ); + User::LeaveIfError(iFs.SetSessionToPrivate(EDriveC)); + iLicenseDefault = EFalse; + iLockSemaphore = 0; + + iTempFileName1 = KNullDesC; + iTempFileName2 = KNullDesC; + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C ChspsDefinitionRepository* ChspsDefinitionRepository::NewL() + { + ChspsDefinitionRepository* self = new( ELeave ) ChspsDefinitionRepository; + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// Destructor +ChspsDefinitionRepository::~ChspsDefinitionRepository() + { + iFs.Close(); + iRepositoryInfoQueue.Reset(); + iRepositoryInfoQueue.Close(); + iObservers.Reset(); + iObservers.Close(); + delete iPath; + + iTempFileName1 = KNullDesC; + iTempFileName2 = KNullDesC; + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::SetLocaleL +// Saves the dtd-file into the repository. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +EXPORT_C TInt ChspsDefinitionRepository::SetLocaleL( ChspsODT& aODT, ChspsResource& aResource ) + { + // Populate a path based on ODT attributes and file extension of the resource file + GetPathL( aODT, EResourceDTD ); + + // Results are in iPath, copy resouce file from temp path to a new path in the repository + TInt errorCode = CopyFileL( aResource.FileName() ); + if ( !errorCode ) + { + // Store the new path + aResource.SetFileNameL( iPath->Des() ); + } + return errorCode; + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::MakeODTPathL +// Creates a path for given ODT. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +EXPORT_C void ChspsDefinitionRepository::MakeODTPathL( ChspsODT& aODT, ChspsResource& aResource ) + { + // make sure the temporary buffer is empty + iTempFileName1.Zero(); + + // get the path for ODT-resource to store + GetPathL( aODT, EResourceODT ); + + TPtr ptrPath = iPath->Des(); + TParsePtr p( ptrPath ); + aODT.SetThemeShortNameL(p.Name()); + + // iPath is modified + TPtrC pathPtr = iPath->Des(); + iTempFileName1.Format( _L("%S%S"), &KCDrive, &pathPtr ); + aResource.SetFileNameL( iTempFileName1 ); + + iTempFileName1.Zero(); + } + + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::SetOdtL +// Saves the odt-structure into the repository. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt ChspsDefinitionRepository::SetOdtL( const ChspsODT &aODT ) + { + TInt ret = KErrGeneral; + +#ifdef HSPS_LOG_ACTIVE + if( iLogBus ) + { + iLogBus->LogText( _L( "ChspsDefinitionRepository::SetOdtL(): - rewriting the binary file." ) ); + } +#endif + + GetPathL( aODT, EResourceODT ); + ret = WriteToFileL( aODT); + + +#ifdef HSPS_LOG_ACTIVE + if( iLogBus ) + { + iLogBus->LogText( _L( "ChspsDefinitionRepository::SetOdtL(): - rewriting done. return code: %d." ), ret ); + } +#endif + + return ret; + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::GetOdtL +// Retrieves the odt-structure from the repository as a reference. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt ChspsDefinitionRepository::GetOdtL( ChspsODT& aODT ) + { + TInt errorCode = KErrNone; + if ( aODT.Flags() & EhspsThemeStatusLicenceeDefault ) + { + iLicenseDefault = ETrue; + } + else + { + iLicenseDefault = EFalse; + } + + TRAP( errorCode, GetPathL( aODT, EResourceODT )); + if ( !errorCode ) + { + errorCode = ReadFromFileL( *iPath, aODT ); + } + iLicenseDefault = EFalse; + return errorCode; + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::GetOdtHeaderL +// Retrieves the odt-structure from the repository as a reference. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt ChspsDefinitionRepository::GetOdtHeaderL( TDes& aPath, TLanguage /*aLang*/, ChspsODT& aODT ) + { + TInt err( KErrNotFound ); + + CDesCArraySeg* themeList = new ( ELeave ) CDesCArraySeg( KDefRepArrayGranularity ); + CleanupStack::PushL( themeList ); + + SelectFilesFromPathL( *themeList, aPath, ESortByDate, KMatchSkeleton ); + + if( themeList->MdcaCount() > 0 ) + { + + TPtrC name = themeList->MdcaPoint( 0 ); + if ( name.FindF( KSourceFolderWithSeperators ) == KErrNotFound ) + { + HBufC8* header( StreamHeaderFromFileL( name ) ); + CleanupStack::PushL( header ); + + if( header ) + { + aODT.UnMarshalHeaderL( *header ); + err = KErrNone; + } + + CleanupStack::PopAndDestroy( header ); + } + } + + CleanupStack::PopAndDestroy( themeList ); + + User::LeaveIfError( err ); + + return err; + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::GetODTPathL +// Retrieves the path of given ODT. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void ChspsDefinitionRepository::GetResourcePathL( const ChspsODT& aODT, ThspsResourceType aResourceType, TDes& aFilePath ) + { + // get the path for source resources to store + GetPathL( aODT, aResourceType ); + TPtrC ptr = iPath->Des(); + // modifying the resource file path on the resource + aFilePath.Format( _L("%S%S"), &KCDrive, &ptr ); + } + + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::GetThemePathListL +// Retrieves the list of installed themes. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +EXPORT_C void ChspsDefinitionRepository::GetThemePathListL( CDesCArraySeg& aThemeList, const ChspsODT& aODT ) + { + CDesCArraySeg* pathList = new( ELeave ) CDesCArraySeg(KDefRepArrayGranularity); + CleanupStack::PushL( pathList ); + + CDesCArraySeg* tempPathList = new( ELeave ) CDesCArraySeg(KDefRepArrayGranularity); + CleanupStack::PushL( tempPathList ); + + // The "themes" folder must exist at this point (C drive) + _LIT( KDriveC, "C:" ); + TFileName themesPath; + User::LeaveIfError( iFs.PrivatePath( themesPath )); + HBufC* path = HBufC::NewLC( KMaxFileName ); + TPtr pathPtr = path->Des(); + AppendDesCIntoPathL( pathPtr, KDriveC ); + AppendDesCIntoPathL( pathPtr, themesPath ); + AppendDesCIntoPathL( pathPtr, KThemesFolder ); + AppendDesCIntoPathL( pathPtr, KDoubleBackSlash ); + + // Allocate memory for the folder name to be found (uid folder) + HBufC* match = HBufC::NewLC( KTIntMahspsumbers ); + TPtr matchPtr = match->Des(); + + // Setup a mask from the search criterias + TInt8 rootUid = aODT.RootUid() ? 1 : 0; + TInt8 provUid = aODT.ProviderUid() ? 2 : 0; + TInt8 themeUid = aODT.ThemeUid() ? 4 : 0; + TInt8 mask = rootUid | provUid | themeUid; + + TInt index( 0 ); + + switch ( mask ) + { + case 0://No data in ODT. + { + MatchingFoldersFromAllDrivesL( KMatchAll, pathPtr, *pathList ); + } + break; + case 1://AppUid given. + case 3://AppUid and ProviderUid given. + case 7://AppUid, ProviderUid and ThemeUid given. + { + if ( aODT.RootUid() ) + { + AppendNumIntoPathL( pathPtr, aODT.RootUid() ); + AppendDesCIntoPathL( pathPtr, KDoubleBackSlash ); + } + if ( aODT.ProviderUid() ) + { + AppendNumIntoPathL( pathPtr, aODT.ProviderUid() ); + AppendDesCIntoPathL( pathPtr, KDoubleBackSlash ); + } + if ( aODT.ThemeUid() ) + { + AppendNumIntoPathL( pathPtr, aODT.ThemeUid() ); + AppendDesCIntoPathL( pathPtr, KDoubleBackSlash ); + } + MatchingFoldersFromAllDrivesL( KMatchAll, pathPtr, *pathList ); + } + break; + case 2://ProviderUid given. + { + MatchingFoldersFromAllDrivesL( KMatchAll, pathPtr, *tempPathList ); + matchPtr.Zero(); + matchPtr.AppendNum( aODT.ProviderUid() ); + for ( index = 0; index < tempPathList->Count(); index++ ) + { + MatchingFoldersL( *match, tempPathList->MdcaPoint( index ), *pathList ); + } + } + break; + case 4://ThemeUid given. + { + MatchingFoldersFromAllDrivesL( KMatchAll, pathPtr, *pathList ); + for ( index = 0; index < pathList->Count(); index++ ) + { + MatchingFoldersL( *match, pathList->MdcaPoint( index ), *tempPathList ); + } + matchPtr.Zero(); + matchPtr.AppendNum( aODT.ThemeUid() ); + pathList->Reset(); + for ( index = 0; index < tempPathList->Count(); index++ ) + { + MatchingFoldersL( *match, tempPathList->MdcaPoint( index ), *pathList ); + } + } + break; + case 6://ProviderUid and ThemeUid given. + { + MatchingFoldersFromAllDrivesL( KMatchAll, pathPtr, *pathList ); + matchPtr.Zero(); + matchPtr.AppendNum( aODT.ProviderUid() ); + for ( index = 0; index < pathList->Count(); index++ ) + { + MatchingFoldersL( *match, pathList->MdcaPoint( index ), *tempPathList ); + } + matchPtr.Zero(); + matchPtr.AppendNum( aODT.ThemeUid() ); + pathList->Reset(); + for ( index = 0; index < tempPathList->Count(); index++ ) + { + MatchingFoldersL( *match, tempPathList->MdcaPoint( index ), *pathList ); + } + } + break; + case 5://AppUid and ThemeUid given. + { + // Get paths matching the 1st argument into pathList array + matchPtr.Zero(); + matchPtr.AppendNum( aODT.RootUid() ); + MatchingFoldersFromAllDrivesL( *match, pathPtr, *pathList ); + // From previous results, match and store results into tempPathList array + matchPtr.Zero(); + matchPtr = KMatchAll; + for ( index = 0; index < pathList->Count(); index++ ) + { + MatchingFoldersL( *match, pathList->MdcaPoint( index ), *tempPathList ); + } + // From previous results, find mathing plugins and store them back to the pathList + matchPtr.Zero(); + matchPtr.AppendNum( aODT.ThemeUid() ); + pathList->Reset(); + for ( index = 0; index < tempPathList->Count(); index++ ) + { + MatchingFoldersL( *match, tempPathList->MdcaPoint( index ), *pathList ); + } + } + break; + default: + { + pathList->AppendL( pathPtr ); + } + break; + } + + TInt err( KErrNotFound ); + for ( TInt i = 0; i < pathList->MdcaCount(); i++ ) + { + err = MatchingFoldersL( KMatchAll, pathList->MdcaPoint(i), *pathList ); + if ( err == KErrNotFound ) + { + TPtrC pathPtr = pathList->MdcaPoint(i); + aThemeList.AppendL( pathPtr ); + } + } + CleanupStack::PopAndDestroy( 4, pathList );//path, match, pathList, tempPathList + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::GetThemeListAsStreamL +// Retrieves the headers of installed themes as an array of streams. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void ChspsDefinitionRepository::GetThemeListAsStreamL( CArrayPtrSeg& aHeaderList, const ChspsODT& aODT ) + { + CDesCArraySeg* pathList = new( ELeave ) CDesCArraySeg(KDefRepArrayGranularity); + CleanupStack::PushL( pathList ); + GetThemePathListL( *pathList, aODT ); + CDesCArraySeg* themeList = new( ELeave ) CDesCArraySeg(KDefRepArrayGranularity); + CleanupStack::PushL( themeList ); + + for ( TInt i = 0; i < pathList->MdcaCount(); i++ ) + { + SelectFilesFromPathL( *themeList, pathList->MdcaPoint( i ), ESortByDate, KMatchSkeleton ); + } + + for ( TInt j = 0; j < themeList->MdcaCount(); j++ ) + { + TPtrC ptr( themeList->MdcaPoint( j ) ); + if ( ptr.FindF( KSourceFolderWithSeperators ) == KErrNotFound ) + { + HBufC8* temp = StreamHeaderFromFileL( themeList->MdcaPoint( j ) ); + if ( temp ) + { + aHeaderList.AppendL( temp ); + } + } + } + CleanupStack::PopAndDestroy( 2, pathList );//themeList, pathList + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::RemoveThemeL +// Removes the specified theme. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +EXPORT_C void ChspsDefinitionRepository::RemoveThemeL( const ChspsODT& aODT ) + { + GetPathL( aODT, EResourceNone ); + RemoveDirectoryL(); + // theme removal is not informed to the clients through RepositoryInfoArray + // because this function is used also by the theme server's clean up functions - + // and it not necessary inform about them. + // insteads, maintenance handler does inform the removal. + } + + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::MakeResourcePathL +// Makes a path in the repository that can be used to store the resource file. +// The path is written back into aResource +// The path depends on the locale under which the resource belongs. +// The path information will be used to retrieve the source later. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +EXPORT_C void ChspsDefinitionRepository::MakeResourcePathL( const ChspsODT& aODT, ChspsResource& aResource ) + { + // get the path for source resources to store (results are stored into the iPath instance) + GetPathL( aODT, aResource.ResourceType() ); + TPtr pathPtr = iPath->Des(); + + // If the resource is of type "Other" then skip renaming of the file extension + if ( aResource.ResourceType() == EResourceOther ) + { + if ( aResource.Language() != ELangNone ) + { + AddLocalePathL( pathPtr, aODT.OdtLanguage() ); + AppendDesCIntoPathL( pathPtr, KDoubleBackSlash ); + } + + // Append the iPath with the resource name + AppendDesCIntoPathL( pathPtr, aResource.ResourceId() ); + + // Append with original file extension or fix it + const TDesC& name = aResource.FileName(); + TParsePtr parsePtr( (TDes&)name ); + TPtrC fileExtension = parsePtr.Ext(); + if ( fileExtension.Length() > 2 && fileExtension.Left(2).CompareF( _L(".o") ) == 0 ) + { + // Strip the first letter + TInt odtIndex(0); + TLex lex( fileExtension.Mid(3) ); + if ( lex.Val( odtIndex ) == KErrNone && odtIndex >= 0 ) + { + fileExtension.Set( KMatchSkeleton ); + } + } + AppendDesCIntoPathL( pathPtr, fileExtension ); + } + else + { + // If replaceable resource + if ( aResource.LockingPolicy() == EhspsUnlocked ) + { + AppendDesCIntoPathL( pathPtr, aResource.ResourceId() ); + FileExtensionL( aResource.ResourceType(), aODT.OdtLanguage() ); + } + else + { + // make phycical path + User::LeaveIfError(iFs.SetSessionToPrivate(EDriveC)); + // create the directory structure on the path + TInt err = iFs.MkDirAll( *iPath ); + if ( err != KErrNone && err != KErrAlreadyExists ) + { + User::Leave( err ); + } + AppendDesCIntoPathL( pathPtr, aResource.ResourceId() ); + FileExtensionL( aResource.ResourceType(), aODT.OdtLanguage() ); + } + } + aResource.SetFileNameL( iPath->Des() ); + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::SetResourceListL +// Stores the resource list to the repository. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +EXPORT_C TInt ChspsDefinitionRepository::SetResourceListL( ChspsODT& aODT, const CArrayPtrSeg& aResourceList ) + { + // make sure the temporary buffers are empty. + iTempFileName1.Zero(); + iTempFileName2.Zero(); + + TInt errorCode = KErrNone; + + TInt tempLanguage = aODT.OdtLanguage(); + + // Loop provided resources and copy them to correct places in the repository + for ( TInt i=0; iLanguage() ); + + if ( res->ResourceType() == EResourceDTD ) + { + SetLocaleL( aODT, *res ); + } + else + { + // save source path because res->FileName() will be modified by MakeResourcePath but + // the original path is still needed + HBufC* fileName = HBufC::NewLC( KMaxFileName ); + TPtr fileNamePtr = fileName->Des(); + fileNamePtr.Append( res->FileName() ); + + // strip the extension temporarily + TParsePtr k( fileNamePtr ); + TPtrC name = k.Name(); + res->SetResourceIdL(name); + + // copy a non-cacheable resource from its location into the repository + MakeResourcePathL( aODT, *res ); + + // restore the file extension + TPtrC nameAndExt = k.NameAndExt(); + res->SetResourceIdL(nameAndExt); + + // copy the resource file to the repository + errorCode = CopyFileL( *fileName, iPath->Des() ); + if ( errorCode ) + { +#ifdef HSPS_LOG_ACTIVE + if( iLogBus ) + { + iLogBus->LogText( _L( "ChspsDefinitionRepository::SetResourceListL() - resource copying failed" ) ); + } +#endif + } + + CleanupStack::PopAndDestroy( fileName ); + + + // Set drive information + iTempFileName1.Format( _L("%S"), &res->FileName() ); + TParsePtr f( iTempFileName1 ); + TPtrC path = f.Path(); + TPtrC file = f.NameAndExt(); + iTempFileName2.Format(_L("%S%S%S"), &KCDrive, &path, &file ); + res->SetFileNameL( iTempFileName2 ); + } + aODT.AddResourceL( res ); + } + + aODT.SetOdtLanguage( tempLanguage ); + iTempFileName1.Zero(); + iTempFileName2.Zero(); + + return errorCode; + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::GetResourceListL +// Retrieves the resource list from the repository. ODT-header given is a search mask. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +EXPORT_C TInt ChspsDefinitionRepository::GetResourceListL( const ChspsODT& aODT, CArrayPtrSeg& aResourceList ) + { + TInt errorCode = KErrNone; + GetPathL( aODT, EResourceODT ); + CFileStore* store = OpenFileStoreLC( *iPath ); + + if( !store ) + { + errorCode = KErrNotFound; + } + // Construct and open the root stream which contains the representation of our objects. + if( !errorCode ) + { + RStoreReadStream instream; + CleanupClosePushL( instream ); + + instream.OpenLC( *store, store->Root() ); + + ChspsODT* odt = ChspsODT::NewL(); + CleanupStack::PushL( odt ); + + odt->InternalizeHeaderL( instream ); + // consumes header delimiter + instream.ReadInt16L(); + odt->InternalizeResourceListL( instream ); + // destroy the direct file store object (closes the file) + for ( TInt i = 0; i < odt->ResourceCount(); i++ ) + { + aResourceList.AppendL( odt->ResourceL( i ).CloneL()); + } + + CleanupStack::PopAndDestroy( odt ); + + // Destroy the stream object and close the intstream + CleanupStack::PopAndDestroy( 2, &instream ); + + // Destroy the direct file store object (closes the file) + CleanupStack::PopAndDestroy( store ); + } + + return errorCode; + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::GetRepositoryInfo +// Returns a refrence to a RArray-object containing changes in the repository system. +// It is a responsibilty of the caller to lock the repository for modifications. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +EXPORT_C void ChspsDefinitionRepository::RegisterNotification( ThspsRepositoryInfo aRepositoryInfo ) + { + iRepositoryInfoQueue.Append( aRepositoryInfo ); + + for ( TInt i=0; i < iRepositoryInfoQueue.Count(); i++ ) + { + // take an info from the queue + ThspsRepositoryInfo info = iRepositoryInfoQueue[i]; + TBool consumed = EFalse; + // notify the observers until someone consumes the info + for ( TInt j=0; !consumed && j < iObservers.Count(); j++ ) + { + if ( iObservers[j]->HandleDefinitionRespositoryEvent( info ) ) + { + // observer has handled the event, stop this loop + consumed = ETrue; + } + } + // delete info from the queue + iRepositoryInfoQueue.Remove( i ); + } + iRepositoryInfoQueue.Compress(); + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::RegisterObserverL +// Registers an observer. Observers will be notified when there are definition repository +// events available. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +EXPORT_C void ChspsDefinitionRepository::RegisterObserverL + ( const MhspsDefinitionRepositoryObserver& aObserver ) + { + iObservers.Append( &aObserver ); + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::UnregisterObserver +// When an observer stops observation of definition repository events, it must +// unregister itself. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +EXPORT_C void ChspsDefinitionRepository::UnregisterObserver + ( const MhspsDefinitionRepositoryObserver& aObserver ) + { + TInt found = iObservers.Find( &aObserver ); + if ( !( found == KErrNotFound )) + { + iObservers.Remove( found ); + } + } + + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::Lock +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +EXPORT_C void ChspsDefinitionRepository::Lock() + { + iLockSemaphore++; + +#ifdef HSPS_LOG_ACTIVE + if( iLogBus ) + { + iLogBus->LogText( _L( "ChspsDefinitionRepository::Lock() - semaphore increased to %d" ), + iLockSemaphore ); + } +#endif + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::Unlock +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +EXPORT_C void ChspsDefinitionRepository::Unlock() + { + if (iLockSemaphore ) + { + iLockSemaphore--; + +#ifdef HSPS_LOG_ACTIVE + if( iLogBus ) + { + iLogBus->LogText( _L( "ChspsDefinitionRepository::Unlock() - semaphore decreased to %d" ), + iLockSemaphore ); + } +#endif + } + } + + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::Locked +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +EXPORT_C TBool ChspsDefinitionRepository::Locked() const + { + return iLockSemaphore; + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::GetODTPathLC +// Creates a path from the theme header information. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +EXPORT_C void ChspsDefinitionRepository::GetODTPathL( const ChspsODT& aODT, TDes& aPath ) + { + GetPathL( aODT, EResourceODT ); + if ( iPath ) + { + aPath.Copy( iPath->Des() ); + } + else + User::Leave( KErrNotFound ); + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::SetLogBus +// Set log bus. +// ----------------------------------------------------------------------------- +#ifdef HSPS_LOG_ACTIVE +EXPORT_C void ChspsDefinitionRepository::SetLogBus( void* aLogBus ) + { + iLogBus = (ChspsLogBus*)aLogBus; + } +#else +EXPORT_C void ChspsDefinitionRepository::SetLogBus( void* /*aLogBus*/ ) + { + } +#endif + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::GetPathL +// Creates a path from the theme header information. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +void ChspsDefinitionRepository::GetPathL( const ChspsODT& aODT, ThspsResourceType aResourceType ) + { + delete iPath; + iPath = NULL; + iPath = HBufC::NewL( KMaxFileName ); + TPtr pathPtr = iPath->Des(); + + TInt rootUid( aODT.RootUid() ); + TInt providerUid( aODT.ProviderUid() ); + TInt themeUid( aODT.ThemeUid() ); + + const TDesC& providerName = aODT.ProviderName(); + const TDesC& themeShortName = aODT.ThemeShortName(); + const TDesC& fileVersion = aODT.ThemeVersion(); + + User::LeaveIfError( iFs.PrivatePath( pathPtr )); + + AppendDesCIntoPathL( pathPtr, KThemesFolder ); + AppendDesCIntoPathL( pathPtr, KDoubleBackSlash ); + + if ( rootUid ) + { + // Append root uid + AppendNumIntoPathL( pathPtr, rootUid ); + AppendDesCIntoPathL( pathPtr, KDoubleBackSlash ); + } + if ( providerUid ) + { + // Append provider uid + AppendNumIntoPathL( pathPtr, providerUid ); + AppendDesCIntoPathL( pathPtr, KDoubleBackSlash ); + } + if ( themeUid ) + { + // Append configuration uid + AppendNumIntoPathL( pathPtr, themeUid ); + AppendDesCIntoPathL( pathPtr, KDoubleBackSlash ); + } + if ( fileVersion.Length() ) + { + // Append version + AppendDesCIntoPathL( pathPtr, fileVersion ); + AppendDesCIntoPathL( pathPtr, KDoubleBackSlash ); + } + + // path for source files + if ( aResourceType > EResourceODT ) + { + if ( aResourceType != EResourceXML ) + { + if ( aResourceType == EResourceDTD ) + { + // locales + AppendDesCIntoPathL( pathPtr, KLocaleFolder ); + AppendDesCIntoPathL( pathPtr, KDoubleBackSlash ); + AddLocalePathL( pathPtr, aODT.OdtLanguage() ); + } + else + { + // sources + AppendDesCIntoPathL( pathPtr, KSourceFolder ); + } + AppendDesCIntoPathL( pathPtr, KDoubleBackSlash ); + } + + } + + // resource source files do not need full path and filename + // because they must be stored as is + if ( aResourceType > EResourceNone && aResourceType < EResourceRES ) + { + if ( themeShortName.Length() ) + { + // Append configuration name + AppendDesCIntoPathL( pathPtr, themeShortName ); + } + else if ( themeUid ) + { + AppendNumIntoPathL( pathPtr, themeUid ); + } + + FileExtensionL( aResourceType, aODT.OdtLanguage() ); + } + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::AppendDesCIntoPathL +// Appends a descriptor into path. Leaves if fails. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +void ChspsDefinitionRepository::AppendDesCIntoPathL( TDes& aPath, const TDesC& aText ) + { + if ( ( KMaxFileName - aPath.Length() ) >= aText.Length() ) + { + aPath.Append( aText ); + } + else + { + User::Leave( KErrOverflow ); + } + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::AppendNumIntoPathL +// Appends a number into path. Leaves if fails. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +void ChspsDefinitionRepository::AppendNumIntoPathL( TDes& aPath, const TUint aNum ) + { + TInt len = 8; + if ( ( KMaxFileName - aPath.Length() ) >= len ) + { + aPath.AppendNum( aNum ); + } + else + { + User::Leave( KErrOverflow ); + } + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::FileExtensionL +// Returns a file extension for the given TDefRepFileExtension. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +void ChspsDefinitionRepository::FileExtensionL( ThspsResourceType aResourceType, + TInt /*aLanguage*/ ) + { + TPtr pathPtr = iPath->Des(); + switch ( aResourceType ) + { + case EResourceNone: + { + } + break; + case EResourceODT: + { + TBuf<6> extension( KODTFileExtension ); + AppendDesCIntoPathL( pathPtr, extension ); + } + break; + case EResourceDTD: + { + AppendDesCIntoPathL( pathPtr, KDTDFileExtension ); + } + break; + case EResourceXML: + { + AppendDesCIntoPathL( pathPtr, KXMLFileExtension ); + } + break; + case EResourceDAT: + { + AppendDesCIntoPathL( pathPtr, KDATFileExtension ); + } + break; + default: + { + User::Leave( KErrArgument ); + } + break; + }; + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::PathExtensionL +// Returns a file extension for the given TDefRepFileExtension. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +void ChspsDefinitionRepository::AddLocalePathL( TDes& aPath, TInt aLanguage ) + { + TBuf<6> extension; + extension.AppendFormat( KFolderFormat, aLanguage ); + AppendDesCIntoPathL( aPath, extension ); + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::WriteToFileL +// Writes the ODT structure into file. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +TInt ChspsDefinitionRepository::WriteToFileL( const ChspsODT& aODT ) + { + TInt errorCode = KErrNone; + errorCode = iFs.SetSessionToPrivate( EDriveC ); + if ( SysUtil::DiskSpaceBelowCriticalLevelL( &iFs, 0, EDriveC ) ) + { + errorCode = KErrDiskFull; + +#ifdef HSPS_LOG_ACTIVE + if( iLogBus ) + { + iLogBus->LogText( _L( "ChspsDefinitionRepository::WriteToFileL(): - disk full." ) ); + } +#endif + } + + if ( !errorCode ) + { + // Create the directory structure + TInt err = iFs.MkDirAll( *iPath ); + if ( err != KErrNone && err != KErrAlreadyExists ) + { + errorCode = err; + +#ifdef HSPS_LOG_ACTIVE + if( iLogBus ) + { + iLogBus->LogText( _L( "ChspsDefinitionRepository::WriteToFileL(): - error %d." ), + err ); + } +#endif + } + + if ( !errorCode ) + { + // Create (replace) the direct file store + CFileStore* store = CDirectFileStore::ReplaceLC( iFs, *iPath, EFileWrite); + + // Must say what kind of file store. + store->SetTypeL( KDirectFileStoreLayoutUid ); + + // Construct the output stream. + RStoreWriteStream outstream; + CleanupClosePushL( outstream ); + + TStreamId id = outstream.CreateLC(*store); + + // Stream out the ChspsODT + outstream << aODT; + outstream.CommitL(); + + // Destroy the stream object and close the outstream + CleanupStack::PopAndDestroy( 2, &outstream ); + + // Set this stream id as the root + store->SetRootL(id); + store->CommitL(); + + // Destroy the direct file store object (closes the file), + CleanupStack::PopAndDestroy( store ); + } + } + return errorCode; + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::ReadFromFileL +// Reads the ODT structure from the file. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +TInt ChspsDefinitionRepository::ReadFromFileL( const TDesC& aPath, ChspsODT& aODT ) + { + TInt errorCode = KErrNone; + CFileStore* store = OpenFileStoreLC( aPath ); + if ( !store ) + { + errorCode = KErrNotFound; + } + // Construct and open the root stream which + // contains the representation of our objects. + if ( !errorCode ) + { + RStoreReadStream instream; + CleanupClosePushL( instream ); + + instream.OpenLC(*store,store->Root()); + + // Stream in the ODT + instream >> aODT; + + // Destroy the stream object and close the instream + CleanupStack::PopAndDestroy( 2, &instream ); + + // Destroy the direct file store object (closes the file), + CleanupStack::PopAndDestroy( store ); + } + + return errorCode; + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::StreamHeaderFromFileL +// Streams the ODT header from the file into descriptor. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +HBufC8* ChspsDefinitionRepository::StreamHeaderFromFileL( const TDesC& aPath ) + { + HBufC8* dataStream( NULL ); + CFileStore* store( NULL ); + + store = OpenFileStoreLC( aPath ); + + if( store ) + { + // Construct and open the root stream, which + // contains the representation of our objects. + RStoreReadStream instream; + CleanupClosePushL( instream ); + + instream.OpenLC( *store, store->Root() ); + + ChspsODT* odt = ChspsODT::NewL(); + CleanupStack::PushL( odt ); + + odt->InternalizeHeaderL( instream ); + + + dataStream = odt->MarshalHeaderL(); + + CleanupStack::PopAndDestroy( odt ); + + // Destroy the stream object and close the instream + CleanupStack::PopAndDestroy( 2, &instream ); + + // Destroy the direct file store object (closes the file) + CleanupStack::PopAndDestroy( store ); + } + + return dataStream; + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::OpenFileStoreLC +// Searches and opens the CFileStore from the any drive. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +CFileStore* ChspsDefinitionRepository::OpenFileStoreLC( const TDesC& aPath ) + { + RFile file; + TDriveList drivelist; + CFileStore* store = NULL; + + TInt err( KErrNotFound ); + iFs.SetSessionToPrivate( EDriveC ); + err = file.Open(iFs, aPath, EFileShareReadersOnly ); + if ( !err ) + { + // if the file is empty CDirectFileStore::FromLC leaves. + TInt size(0); + file.Size(size); + if(size) + { + // Oownership of the file passes to the store + store = CDirectFileStore::FromLC( file ); + } + } + + if( err || !store ) + { + // Just for sanity + file.Close(); + } + + iLicenseDefault = EFalse; + + return store; + } + + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::SelectFilesFromPathL +// Retrieves all the files from the given path. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +void ChspsDefinitionRepository::SelectFilesFromPathL( CDesCArraySeg& aFileList, const TDesC& aPath, + TEntryKey aSortFlag, const TDesC& aFileExtension ) + { + CDir* dirList; + User::LeaveIfError( iFs.GetDir( aPath, KEntryAttMaskSupported, aSortFlag, dirList )); + for ( TInt i = 0; i < dirList->Count(); i++) + { + if ( !(*dirList)[i].IsDir() ) + { + HBufC* path = HBufC::NewLC( aPath.Length() + (*dirList)[i].iName.Length() ); + TPtr pathPtr = path->Des(); + AppendDesCIntoPathL( pathPtr, aPath ); + AppendDesCIntoPathL( pathPtr, (*dirList)[i].iName ); + TParse p; + p.Set(pathPtr,NULL,NULL); + + // If the path is not pointing to the sources folder (e.g. is not a resource file) + if ( pathPtr.FindF( KSourceFolderWithSeperators ) == KErrNotFound ) + { + // If requested and parsed file extensions match + if ( !p.Ext().CompareF( aFileExtension ) ) + { + aFileList.AppendL( pathPtr ); + } + } + CleanupStack::PopAndDestroy( path ); + } + } + delete dirList; + } + + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::CopyFileL +// Copies a file from the given location into path, +// which is stored in the iPath member variable. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +TInt ChspsDefinitionRepository::CopyFileL( const TDesC& aSourceFile, const TDesC& aDestinationFile ) + { + TInt errorCode = KErrNone; + iFs.SetSessionToPrivate( EDriveC ); + // create the directory structure if one does not exist + TInt err = iFs.MkDirAll( aDestinationFile ); + if ( err != KErrNone && err != KErrAlreadyExists ) + { + errorCode = err; + } + if ( !errorCode ) + { + + TEntry entry; + errorCode = iFs.Entry( aSourceFile, entry ); + if ( !errorCode && SysUtil::DiskSpaceBelowCriticalLevelL( &iFs, entry.iSize, EDriveC ) ) + { + errorCode = KErrDiskFull; + } + + if ( !errorCode ) + { + CFileMan* fileMan = CFileMan::NewL( iFs ); + CleanupStack::PushL( fileMan ); + errorCode = fileMan->Copy( aSourceFile, aDestinationFile, ( CFileMan::ERecurse | CFileMan::EOverWrite ) ); + errorCode = fileMan->Attribs( *iPath, KEntryAttNormal, + KEntryAttReadOnly | KEntryAttHidden, TTime(0) ); + CleanupStack::PopAndDestroy( fileMan ); + } + } + return errorCode; + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::MatchingFoldersFromAllDrivesL +// Retrieves all the matching folders from the given path from every drive. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +void ChspsDefinitionRepository::MatchingFoldersFromAllDrivesL( const TDesC& aWildName, + const TDesC& aScanDir, CDesCArraySeg& aPathList ) + { + TFindFile fileFinder( iFs ); + CDir* fileList; + + // Exclude external and ROM drives from the following search + fileFinder.SetFindMask( KDriveAttExclude | KDriveAttRemovable |KDriveAttRemote |KDriveAttRom ); + + // Searches, using wildcards, for one or more files/directories in a specified directory. + // If no matching file is found in that directory, all available drives are searched in + // descending alphabetical order, from Y: to A:, and ending with the Z: drive. + // The search ends when one or more matching filenames are found, or when every available + // drive has been unsuccessfully searched. + // To begin searching again after a successful match has been made, use FindWild(). + TInt err = fileFinder.FindWildByDir( aWildName, aScanDir, fileList ); + while ( err == KErrNone ) + { + TInt i; + for ( i = 0; i < fileList->Count(); i++ ) + { + TPtrC name( (*fileList)[i].iName ); + if( (*fileList)[i].IsDir() + && KSourceFolder().CompareF( name ) != 0 + && KLocaleFolder().CompareF( name ) != 0 ) + { + TParse fullentry; + fullentry.Set( name, &fileFinder.File(), NULL); + + HBufC* path = HBufC::NewLC( fullentry.FullName().Length() + KDoubleBackSlash().Length() ); + TPtr pathPtr = path->Des(); + pathPtr.Append( fullentry.FullName() ); + pathPtr.Append( KDoubleBackSlash ); + aPathList.AppendL( pathPtr ); + CleanupStack::PopAndDestroy( path ); + } + }//for + delete fileList; + //Go trough all the drives a->z + err = fileFinder.FindWild( fileList ); + }//while + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::MatchingFoldersL +// Retrieves all the matching folders from the given path and drive. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +TInt ChspsDefinitionRepository::MatchingFoldersL( const TDesC& aWildName, + const TDesC& aScanDir, CDesCArraySeg& aPathList ) + { + TInt foldersExists( KErrCancel ); + TFindFile fileFinder( iFs ); + CDir* fileList; + + TInt err = fileFinder.FindWildByDir( aWildName, aScanDir, fileList ); + if ( err == KErrNone ) + { + TInt i; + for ( i = 0; i < fileList->Count(); i++ ) + { + TPtrC name( (*fileList)[i].iName ); + if( (*fileList)[i].IsDir() + && KSourceFolder().CompareF( name ) != 0 + && KLocaleFolder().CompareF( name ) != 0 ) + { + foldersExists = KErrNone; + TParse fullentry; + fullentry.Set( name, &fileFinder.File(), NULL); + + HBufC* path = HBufC::NewLC( fullentry.FullName().Length() + KDoubleBackSlash().Length() ); + TPtr pathPtr = path->Des(); + pathPtr.Append( fullentry.FullName() ); + pathPtr.Append( KDoubleBackSlash ); + aPathList.AppendL( pathPtr ); + CleanupStack::PopAndDestroy( path ); + } + else + { + foldersExists = KErrNotFound; + } + }//for + delete fileList; + }//if + + return foldersExists; + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::CopyFileL +// Copies a file from the given location into path, +// which is stored in the iPath member variable. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +TInt ChspsDefinitionRepository::CopyFileL( const TDesC& aSourceFile ) + { + TInt errorCode = KErrNone; + iFs.SetSessionToPrivate( EDriveC ); + // create the directory structure if one does not exist + TInt err = iFs.MkDirAll( *iPath ); + if ( err != KErrNone && err != KErrAlreadyExists ) + { + errorCode = err; + } + if ( !errorCode ) + { + TEntry entry; + errorCode = iFs.Entry( aSourceFile, entry ); + if ( !errorCode && SysUtil::DiskSpaceBelowCriticalLevelL( &iFs, entry.iSize, EDriveC ) ) + { + errorCode = KErrDiskFull; + } + if ( !errorCode ) + { + CFileMan* fileMan = CFileMan::NewL( iFs ); + CleanupStack::PushL( fileMan ); + errorCode = fileMan->Copy( aSourceFile, *iPath, CFileMan::EOverWrite ); + errorCode = fileMan->Attribs( *iPath, KEntryAttNormal, + KEntryAttReadOnly | KEntryAttHidden, TTime(0) ); + CleanupStack::PopAndDestroy( fileMan ); + } + } + return errorCode; + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::RemoveDirectoryL +// Deletes the files and folders beneath the path, +// which is stored in the iPath member variable. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +void ChspsDefinitionRepository::RemoveDirectoryL() + { + TInt errorCode = KErrNone; + iFs.SetSessionToPrivate( EDriveC ); + CFileMan* fileMan = CFileMan::NewL( iFs ); + CleanupStack::PushL( fileMan ); + TPtr pathPtr = iPath->Des(); + TInt err = fileMan->RmDir( pathPtr ); + if ( err != KErrNone && err != KErrPathNotFound ) + { + errorCode = err; // probably KErrInUse + } + else + { + //If the folder is empty -> remove it + TParsePtr path( pathPtr ); + TInt flag( ETrue ); + do + { + TInt err = path.PopDir(); + if ( !err ) + { + CDir* dirList; + err = iFs.GetDir( path.Path(), KEntryAttMaskSupported,ESortByName, dirList ); + if ( !err && dirList->Count() == 0 ) + { + err = fileMan->RmDir( path.Path() ); + } + else + { + flag = EFalse; + } + delete dirList; + } + } + while ( flag ); + } + CleanupStack::PopAndDestroy( fileMan ); + User::LeaveIfError( errorCode ); + } + + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::RestoreBackupConfiguration +// Restores defined configuration from backup folder +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +EXPORT_C TInt ChspsDefinitionRepository::RestoreBackupConfiguration( + const ChspsODT& /*aODT*/ ) + { + TInt err( KErrNotFound ); + + return err; + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::BackupConfigurationL +// Copies defined configuration to theme backup folder +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +EXPORT_C void ChspsDefinitionRepository::BackupConfigurationL( + const ChspsODT& aODT ) + { + HBufC* backupPath = HBufC::NewL( KMaxFileName ); + CleanupStack::PushL( backupPath ); + TPtr backupPathPtr = backupPath->Des(); + + User::LeaveIfError( iFs.PrivatePath( backupPathPtr )); + + AppendDesCIntoPathL( backupPathPtr, KBackupFolder ); + AppendDesCIntoPathL( backupPathPtr, KDoubleBackSlash ); + AppendDesCIntoPathL( backupPathPtr, KThemesFolder ); + AppendDesCIntoPathL( backupPathPtr, KDoubleBackSlash ); + + // Backup configuration file + GetPathL( aODT, EResourceODT ); + CopyFileL( iPath->Des(), backupPathPtr ); + + CleanupStack::PopAndDestroy( backupPath ); + + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::ClearBackupsL +// Clears previous backup data +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +EXPORT_C void ChspsDefinitionRepository::ClearBackupsL() + { + + HBufC* backupPath = HBufC::NewL( KMaxFileName ); + CleanupStack::PushL( backupPath ); + TPtr backupPathPtr = backupPath->Des(); + + User::LeaveIfError( iFs.PrivatePath( backupPathPtr )); + + AppendDesCIntoPathL( backupPathPtr, KBackupFolder ); + AppendDesCIntoPathL( backupPathPtr, KDoubleBackSlash ); + + RemoveDirectoryL( backupPathPtr ); + + CleanupStack::PopAndDestroy( backupPath ); + + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::GetOdtL +// Retrieves the odt-structure from the repository as a reference. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void ChspsDefinitionRepository::GetOdtL( + const TDes& aPath, + ChspsODT& aODT ) + { + User::LeaveIfError( ReadFromFileL( aPath, aODT ) ); + } + +// ----------------------------------------------------------------------------- +// ChspsDefinitionRepository::RemoveDirectoryL +// Deletes the defined directory ( files and folders recursively ) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +void ChspsDefinitionRepository::RemoveDirectoryL( + TDesC& aDirPath ) + { + + iFs.SetSessionToPrivate( EDriveC ); + CFileMan* fileMan = CFileMan::NewL( iFs ); + CleanupStack::PushL( fileMan ); + TInt err = fileMan->RmDir( aDirPath ); + CleanupStack::PopAndDestroy( fileMan ); + + } + +// End of File