--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenpluginsrv/hspsmanager/tools/hspsthemeinstallercons.cpp Thu Dec 17 08:54:17 2009 +0200
@@ -0,0 +1,610 @@
+/*
+* Copyright (c) 2004,2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#include "hspsthemeinstallercons.h"
+#include <e32svr.h>
+#include <flogger.h>
+#include <f32file.h>
+#include "hspsthememanagement.h"
+#include <e32base.h>
+#include <bacline.h>
+#include <bautils.h>
+
+#include "hspsodt.h"
+#include "hspsclient.h"
+
+_LIT(KDATFileExtension,".dat");
+_LIT(KLogFile,"hspsthemeinstallercons.log");
+_LIT(KLogFolder,"hspsthemeinstallercons");
+_LIT(KLogFilePath,"c:\\logs\\hspsthemeinstallercons\\hspsthemeinstallercons.log");
+_LIT(KThemeSourcePath,"c:\\data\\installs\\test\\");
+_LIT(KDefaultInput, "install.dat");
+
+#define _WRITELOG(aDescription) RFileLogger::Write( KLogFolder,KLogFile,EFileLoggingModeOverwrite, aDescription );
+#define _WRITE_ERRORLOG(aErrCode) WriteErrorLog(aErrCode);
+
+
+
+class CThemeInstaller:public CBase, public MhspsThemeManagementServiceObserver
+ {
+ public:
+ ~CThemeInstaller();
+ static CThemeInstaller* NewL(TInt aAppUid);
+ static CThemeInstaller* NewLC(TInt aAppUid);
+ void StartL();
+
+ private:
+ void InstallThemeL(const TDesC& aManifestFileName);
+ void InstallFilesL(CDesCArraySeg& aManifestFile);
+ void GetFilesL(RFs& aFs, CDesCArraySeg& aFileList, const TDesC& aDirectory);
+ void DeleteDirL(RFs& aFs, const TDesC& aDir);
+ void HandlehspsClientMessage(ThspsServiceCompletedMessage aMessage);
+ void ConstructL(TInt aAppUid);
+ void GetDirectoriesL(
+ RFs& aFs,
+ TPtrC aPath,
+ TPtrC aPluginsFile,
+ CDesCArrayFlat& aDirectoryList );
+ void InstallFilesFromL(
+ RFs& aFs,
+ TPtrC aDirectory );
+ private:
+ TBuf8<KMaxHeaderDataLength8> iHeaderData;
+ TRequestStatus iStatus;
+ ChspsClient *ihspsClient;
+ ChspsResult* iResult;
+ TInt iConvertedResourceCount;
+ ChspsODT* iHeader;
+ TInt iListCount;
+ CDesCArraySeg* iThemeList;
+ TInt iAppUid;
+ };
+
+CThemeInstaller* themeinstaller;
+CActiveScheduler* scheduler;
+
+
+
+
+
+// -----------------------------------------------------------------------------
+// E32Main
+// -----------------------------------------------------------------------------
+//
+GLDEF_C TInt E32Main() // main function called by E32
+ {
+ CTrapCleanup* cleanup = CTrapCleanup::New(); // get clean-up stack
+ TRAPD( error, startupL() ); // more initialization, then do example
+
+ delete scheduler;
+ delete themeinstaller;
+ delete cleanup; // destroy clean-up stack
+
+ // Forward errors to be catched with ERRORLEVEL method in batch files
+ return error; // and return
+ }
+
+// -----------------------------------------------------------------------------
+// WriteErrorLog
+//
+// Writes error to log
+// -----------------------------------------------------------------------------
+//
+void WriteErrorLog(TInt error)
+ {
+ if (error == ENoFilesNotFound)
+ {
+ _WRITELOG( _L("ERROR::Theme files not found") );
+ }
+ else if (error == EErrorDeletingDir)
+ {
+ _WRITELOG( _L("ERROR::Could not delete themes") );
+ }
+ else if (error == EErrorDirNotExists)
+ {
+ _WRITELOG( _L("ERROR::Source directory does not exist") );
+ }
+ else
+ {
+ _WRITELOG( _L("ERROR::Unknown error") );
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// startup
+//
+//
+// -----------------------------------------------------------------------------
+//
+void startupL()
+ {
+ TInt errorCode = KErrNone;
+
+ // Start active scheduler
+ scheduler = new ( ELeave ) CActiveScheduler;
+ CleanupStack::PushL( scheduler );
+ CActiveScheduler::Install( scheduler );
+
+ TUid appuid = KUidhspsThemeInstallerCons;
+ themeinstaller = CThemeInstaller::NewL( appuid.iUid );
+ CleanupStack::PushL( themeinstaller );
+
+ TRAP( errorCode, themeinstaller->StartL() );
+
+ _WRITELOG( _L("") );
+
+ if( errorCode )
+ {
+ _WRITE_ERRORLOG( errorCode );
+ _WRITELOG( _L("Failed to start an installation!") );
+ }
+
+ _WRITELOG( _L("Installer done") );
+
+ CleanupStack::Pop( themeinstaller );
+ CleanupStack::Pop( scheduler );
+
+ User::LeaveIfError( errorCode );
+ }
+
+// -----------------------------------------------------------------------------
+// CThemeInstaller::NewL()
+//
+//
+// -----------------------------------------------------------------------------
+//
+CThemeInstaller* CThemeInstaller::NewL( TInt aAppUid )
+ {
+ CThemeInstaller* self = NewLC( aAppUid );
+ CleanupStack::Pop( self );
+ return( self );
+ }
+
+// -----------------------------------------------------------------------------
+// CThemeInstaller::NewLC()
+//
+//
+// -----------------------------------------------------------------------------
+//
+CThemeInstaller* CThemeInstaller::NewLC( TInt aAppUid )
+ {
+ CThemeInstaller* self = new ( ELeave ) CThemeInstaller();
+ CleanupStack::PushL( self );
+ self->ConstructL( aAppUid );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CThemeInstaller::ConstructL()
+//
+//
+// -----------------------------------------------------------------------------
+//
+void CThemeInstaller::ConstructL( TInt aAppUid )
+ {
+ iResult = ChspsResult::NewL();
+ ihspsClient = ChspsClient::NewL( *this );
+ iHeader = NULL;
+ iListCount = 0;
+ iConvertedResourceCount = 0;
+ iAppUid = aAppUid;
+ iThemeList = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CThemeInstaller::~CThemeInstaller()
+//
+//
+// -----------------------------------------------------------------------------
+//
+CThemeInstaller:: ~CThemeInstaller()
+ {
+ delete ihspsClient;
+ delete iResult;
+ delete iHeader;
+ delete iThemeList;
+ }
+
+// -----------------------------------------------------------------------------
+// Gets program arguments and starts the installer
+// -----------------------------------------------------------------------------
+//
+void CThemeInstaller::StartL()
+ {
+ // Init
+ RFs fs;
+ User::LeaveIfError( fs.Connect() );
+ CleanupClosePushL( fs );
+
+ // Set logging
+ fs.MkDirAll( KLogFilePath );
+ _WRITELOG(_L("Starting installer"));
+
+ // Check arguments
+ CCommandLineArguments* args = CCommandLineArguments::NewLC();
+ TInt argsCount = args->Count();
+ TPtrC inputFile;
+ const TInt firstArgIndex = 2;
+ if ( argsCount < firstArgIndex )
+ {
+ _WRITELOG(_L("Missing an argument!"));
+// User::LeaveIfError( KErrArgument );
+ inputFile.Set( KDefaultInput );
+ }
+ else
+ {
+ inputFile.Set( args->Arg(1) );
+ }
+
+ // Setup an array for directory names
+ const TInt KGranularity = 10;
+ CDesCArrayFlat* directoryList = new ( ELeave ) CDesCArrayFlat( KGranularity );
+ CleanupStack::PushL( directoryList );
+
+ // Get directory names
+ GetDirectoriesL( fs, KThemeSourcePath().Ptr(), inputFile, *directoryList );
+
+ // Install manifest files from the directories
+ TInt count = directoryList->MdcaCount();
+ for( TInt i=0; i<count; i++ )
+ {
+ TPtrC dirPtr( directoryList->MdcaPoint(i) );
+ InstallFilesFromL( fs, dirPtr );
+ }
+
+ CleanupStack::PopAndDestroy( 3, &fs ); // directoryList, args, Fs
+ }
+
+// -----------------------------------------------------------------------------
+// Installs a new configuration from the provided manifest file.
+// -----------------------------------------------------------------------------
+//
+void CThemeInstaller::InstallFilesFromL(
+ RFs& aFs,
+ TPtrC aDirectory )
+ {
+ TInt errorCode = EErrorDirNotExists;
+
+ // Check if the dir exists
+ BaflUtils baf;
+ if( baf.PathExists( aFs, aDirectory ) )
+ {
+ errorCode = KErrNone;
+
+ // Setup an array for manifests (member variable)
+ if ( iThemeList )
+ {
+ delete iThemeList;
+ iThemeList = NULL;
+ }
+ iThemeList = new( ELeave ) CDesCArraySeg( KArrGranularity );
+
+ // Get manifests located at the directory
+ GetFilesL( aFs, *iThemeList, aDirectory );
+ if( iThemeList->Count() > 0 )
+ {
+ // Install first manifest
+ InstallThemeL( iThemeList->MdcaPoint( 0 ) );
+
+ // Handle asynch messages
+ scheduler->Start();
+ }
+ else
+ {
+ errorCode = ENoFilesNotFound;
+ }
+ }
+
+ User::LeaveIfError( errorCode );
+ }
+
+// -----------------------------------------------------------------------------
+// Reads directory names from the input file and appends names into the provided array
+// -----------------------------------------------------------------------------
+//
+void CThemeInstaller::GetDirectoriesL(
+ RFs& aFs,
+ TPtrC aPath,
+ TPtrC aPluginsFile,
+ CDesCArrayFlat& aDirectoryList )
+ {
+ TFileName directoryFile;
+ directoryFile.Copy( aPath );
+ directoryFile.Append( aPluginsFile );
+
+ // Convert into a 8-bit descriptor
+ _LIT8(KLogPrefix, "Reading directory names from the " );
+ _LIT8(KLogSuffix, " file.." );
+ const TInt lineLength = KLogPrefix().Length() + directoryFile.Length() + KLogSuffix().Length();
+ HBufC8* line = HBufC8::NewLC(lineLength );
+ TPtr8 linePtr( line->Des() );
+ linePtr.Append( KLogPrefix );
+ linePtr.Append( directoryFile );
+ linePtr.Append( KLogSuffix );
+ _WRITELOG( linePtr );
+ CleanupStack::PopAndDestroy( line );
+ line = NULL;
+
+ // Check if the f exists
+ BaflUtils baf;
+ if( !baf.FileExists( aFs, directoryFile ) )
+ {
+ _WRITELOG(_L("File not found!"));
+ User::LeaveIfError( KErrNotFound );
+ }
+
+ // Open a file handle
+ RFile file;
+ User::LeaveIfError( file.Open(aFs, directoryFile, EFileRead|EFileShareReadersOnly) );
+ CleanupClosePushL(file);
+
+ // Get size of the file
+ TInt fileSize;
+ User::LeaveIfError( file.Size(fileSize) );
+
+ // Get file content
+ HBufC8* buf8 = HBufC8::NewLC( fileSize );
+ TPtr8 ptr8( buf8->Des() );
+ User::LeaveIfError( file.Read(ptr8) );
+
+ // Convert from a 8bit to 16bit descriptor
+ HBufC16* buf16 = HBufC16::NewLC( ptr8.MaxLength() );
+ TPtr16 ptr16 = buf16->Des();
+ ptr16.Copy( ptr8 );
+
+ // Parse directories from the string
+ TInt offset = 0;
+ _LIT(KLineSeperator, "\r\n");
+ _LIT(KDirectorySuffix, "\\");
+ do
+ {
+ offset = ptr16.Find( KLineSeperator );
+ TPtrC ptr;
+ if ( offset < 1 )
+ {
+ ptr.Set( ptr16 );
+ }
+ else
+ {
+ ptr.Set( ptr16.Left( offset ) );
+ }
+ if ( ptr.Length() )
+ {
+ HBufC* nameBuf = HBufC::NewLC( aPath.Length() + ptr.Length() + KDirectorySuffix().Length() );
+ TPtr fullPtr( nameBuf->Des() );
+ fullPtr.Copy( aPath );
+ fullPtr.Append( ptr );
+ fullPtr.Append( KDirectorySuffix );
+ aDirectoryList.AppendL( fullPtr );
+ CleanupStack::PopAndDestroy( nameBuf );
+ }
+ if ( offset > 0 )
+ {
+ ptr16 = ptr16.Mid( offset + KLineSeperator().Length() );
+ }
+ }
+ while ( offset > 0 );
+
+ // Cleanup
+ CleanupStack::PopAndDestroy( buf16 );
+ CleanupStack::PopAndDestroy( buf8 );
+ CleanupStack::PopAndDestroy( ); // file
+ }
+
+// -----------------------------------------------------------------------------
+// Deletes theme installation path
+// -----------------------------------------------------------------------------
+//
+void CThemeInstaller::DeleteDirL( RFs& aFs, const TDesC& aDir )
+ {
+ _WRITELOG( _L("Deleting existing themes") );
+
+ HBufC* path = HBufC::NewLC( KMaxFileName );
+ TPtr pathPtr = path->Des();
+ pathPtr.Append( aDir );
+
+ CFileMan* fileMan = CFileMan::NewL( aFs );
+ CleanupStack::PushL( fileMan );
+ TInt err = fileMan->RmDir( pathPtr );
+
+ CleanupStack::PopAndDestroy( fileMan );
+ CleanupStack::PopAndDestroy( path );
+
+ if( err )
+ {
+ _WRITE_ERRORLOG( EErrorDeletingDir );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// Searches for theme files from path and adds them to list
+// -----------------------------------------------------------------------------
+//
+void CThemeInstaller::GetFilesL( RFs& aFs, CDesCArraySeg& aFileList, const TDesC& aDirectory )
+ {
+ CDir* dirList;
+ User::LeaveIfError( aFs.GetDir( aDirectory,
+ KEntryAttMaskSupported, ESortByDate, dirList ) );
+
+ CleanupStack::PushL( dirList );
+
+ for( TInt i = 0; i < dirList->Count(); i++ )
+ {
+ if ( !( *dirList )[i].IsDir() )
+ {
+ HBufC* path = HBufC::NewLC( aDirectory.Length() + ( *dirList )[i].iName.Length() );
+ TPtr pathPtr = path->Des();
+ pathPtr.Copy( aDirectory );
+ TEntry entry = ( *dirList )[i];
+ pathPtr.Append( entry.iName );
+ TParse p;
+ p.Set( pathPtr, NULL, NULL );
+
+ if ( p.Ext().CompareF( KDATFileExtension ) == 0 )
+ {
+ aFileList.AppendL( pathPtr );
+ }
+
+ CleanupStack::PopAndDestroy( path );
+ }
+ }
+
+ CleanupStack::PopAndDestroy( dirList );
+ }
+
+// -----------------------------------------------------------------------------
+// Initiates installing of a confgiruation from the provided manifest file
+// -----------------------------------------------------------------------------
+//
+void CThemeInstaller::InstallThemeL( const TDesC& aManifestFileName )
+ {
+
+ TBuf<KMaxHeaderDataLength8> tmp;
+ _WRITELOG(_L(""));
+ tmp.Format( _L("Manifest: %S"), &aManifestFileName );
+ _WRITELOG(tmp);
+
+ if ( iHeader )
+ {
+ delete iHeader;
+ iHeader = NULL;
+ }
+ iHeader = ChspsODT::NewL();
+
+ TParse p;
+ p.Set( aManifestFileName, NULL, NULL );
+ TPtrC ptr = p.NameAndExt();
+
+ ThspsServiceCompletedMessage ret = ihspsClient->hspsInstallTheme( aManifestFileName, *iHeader );
+
+ if( ret == EhspsInstallThemeSuccess )
+ {
+ ihspsClient->GethspsResult( *iResult );
+ }
+ else if( ret == EhspsInstallPhaseSuccess )
+ {
+ ihspsClient->GethspsResult( *iResult );
+ iConvertedResourceCount = 0;
+
+ tmp.Format( _L("Installing ..") );
+ _WRITELOG(tmp);
+ ihspsClient->hspsInstallNextPhaseL( *iHeader );
+ }
+ else if( ret == EhspsInstallThemeFailed )
+ {
+ ihspsClient->GethspsResult(*iResult);
+ TBuf<KMaxHeaderDataLength8> tmp2;
+ TInt syserr = iResult->iSystemError;
+ TInt hspserr = iResult->iXuikonError;
+ tmp.Format(_L("Installation of \'%S\' failed. System error: %d, HSPS error: %d."), &ptr, syserr, hspserr );
+ _WRITELOG(tmp);
+ User::Leave( KErrGeneral );
+ }
+ else if( ret == EhspsServiceNotSupported )
+ {
+ _WRITELOG(_L("EhspsServiceNotSupported"));
+ }
+ else if( ret == EhspsServiceRequestError )
+ {
+ _WRITELOG(_L("EhspsServiceRequestError"));
+ }
+ else if( ret == EhspsServiceRequestCanceled )
+ {
+ _WRITELOG(_L("EhspsServiceRequestCanceled"));
+ }
+ else
+ {
+ tmp.Format(_L("Undefined response: %d"), ret);
+ _WRITELOG(tmp);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CThemeInstaller::HandlehspsClientMessage()
+//
+// Handles events received from themeserver via hspsClient
+// -----------------------------------------------------------------------------
+
+void CThemeInstaller::HandlehspsClientMessage(ThspsServiceCompletedMessage aEvent)
+ {
+ TInt errorCode = KErrNone;
+
+ TBuf<KMaxHeaderDataLength8> tmp;
+ ihspsClient->GethspsResult(*iResult);
+
+ if( aEvent == EhspsInstallThemeSuccess )
+ {
+ iListCount++;
+
+ if ( iListCount < iThemeList->MdcaCount() )
+ {
+ TRAP( errorCode, InstallThemeL( iThemeList->MdcaPoint( iListCount ) ) );
+
+ if( errorCode )
+ {
+ tmp.Format( _L("InstallThemeL() failed...") );
+ _WRITELOG( tmp );
+ }
+ }
+ else
+ {
+ scheduler->Stop();
+ }
+ }
+ else if( aEvent == EhspsInstallPhaseSuccess )
+ {
+
+ TBuf<KMaxHeaderDataLength8> tmp;
+
+ if( iResult->iIntValue1 == EhspsPhaseCleanup )
+ {
+ tmp.Format(_L("Removing previous configuration .."));
+ }
+ else if( iResult->iIntValue1 == EhspsPhaseInstallSkeleton )
+ {
+ tmp.Format(_L("Installing a new configuration .."));
+ }
+ else
+ {
+ tmp.Format(_L("Processing phase %d .."), iResult->iIntValue1 );
+ }
+
+ _WRITELOG(tmp);
+
+ }
+ else if( aEvent == EhspsInstallThemeFailed )
+ {
+
+ TBuf<KMaxHeaderDataLength8> tmp2;
+ TInt syserr = iResult->iSystemError;
+ TInt hspserr = iResult->iXuikonError;
+ TInt defengerr = iResult->iIntValue1;
+ TInt subcomperr = iResult->iIntValue2;
+ tmp.Format(_L("Installation of /'%S/' failed. Sys.err: %d, hsps.err: %d, Def.eng.err: %d, subcomp.err: %d."),
+ &iHeader->ThemeFullName(), syserr, hspserr, defengerr, subcomperr );
+ _WRITELOG(tmp);
+ scheduler->Stop();
+ }
+ else
+ {
+ tmp.Format(_L("Unknown event received: %d"), aEvent );
+ _WRITELOG(tmp);
+ }
+ }
+