--- /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 <s32file.h>
+#include <s32mem.h>
+#include <sysutil.h>
+
+#include "hsps_builds_cfg.hrh"
+
+#include "hspsthememanagement.h"
+#include "hspsdefinitionrepository.h"
+#include "hspsodt.h"
+
+#ifdef HSPS_LOG_ACTIVE
+#include <hspslogbus.h>
+#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<HBufC8>& 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<ChspsResource>& 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; i<aResourceList.Count(); i++ )
+ {
+ ChspsResource* res = aResourceList.At(i);
+
+ aODT.SetOdtLanguage( res->Language() );
+
+ 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<ChspsResource>& 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 )
+ {
+ // <ver> locales <language>
+ AppendDesCIntoPathL( pathPtr, KLocaleFolder );
+ AppendDesCIntoPathL( pathPtr, KDoubleBackSlash );
+ AddLocalePathL( pathPtr, aODT.OdtLanguage() );
+ }
+ else
+ {
+ // <ver> 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