--- a/imgtools/sisutils/src/sis2iby.cpp Wed Jun 16 16:51:40 2010 +0300
+++ b/imgtools/sisutils/src/sis2iby.cpp Wed Jun 23 16:56:47 2010 +0800
@@ -1,675 +1,589 @@
-/*
-* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "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 "sisutils.h"
-#include "sis2iby.h"
-
-/**
-Constructor: Sis2Iby class
-Initilize the parameters to data members.
-
-@internalComponent
-@released
-
-@param aFile - SIS file name
-*/
-Sis2Iby::Sis2Iby(char* aFile) : SisUtils(aFile)
-{
-}
-
-/**
-Destructor: Sis2Iby class
-Deallocates the memory for data members
-
-@internalComponent
-@released
-*/
-Sis2Iby::~Sis2Iby()
-{
- PKGFILE_MAP::iterator begin = iPkgFileMap.begin();
- PKGFILE_MAP::iterator end = iPkgFileMap.end();
- while(begin != end)
- {
- PPKGPARSER ptemp = 0;
- ptemp = (*begin).second;
-
- if(ptemp)
- delete ptemp;
- ++begin;
- }
- iPkgFileMap.clear();
-}
-
-/**
-ProcessSisFile: Processes the input sis file
- Invoke the DUMPSIS tool to extract the sis file contents
- Creates package parser object for each of the package file
-
-@internalComponent
-@released
-*/
-void Sis2Iby::ProcessSisFile()
-{
- TUint32 retStatus = STAT_SUCCESS;
- String sisFile = SisFileName();
-
- if(IsVerboseMode())
- {
- std::cout << "Processing " << (char*)sisFile.data() << std::endl;
- }
-
- if(IsFileExist(sisFile))
- {
- retStatus = InvokeExtractTool(sisFile);
-
- switch(retStatus)
- {
- case STAT_SUCCESS:
- {
- UpdatePkgFileMap(iExtractPath, sisFile);
- }
- break;
- case STAT_FAILURE:
- {
- throw SisUtilsException((char*)sisFile.data(), "Failed to extract SIS file");
- }
- }
- }
- else
- throw SisUtilsException((char*)sisFile.data(), "File not found");
-}
-
-/**
-GenerateOutput: Generates IBY for each of the package file
-
-@internalComponent
-@released
-*/
-void Sis2Iby::GenerateOutput()
-{
- PKGFILE_MAP::iterator begin = iPkgFileMap.begin();
- PKGFILE_MAP::iterator end = iPkgFileMap.end();
- while(begin != end)
- {
- GenerateIby((*begin).first, (*begin).second);
- ++begin;
- }
-}
-
-/**
-GenerateOutput: Generates IBY file for the given package file
-
-@internalComponent
-@released
-
-@param aPkgFile - package file name
-@param aParser - corresponding package file reader object
-*/
-void Sis2Iby::GenerateIby(String aPkgFile, PPKGPARSER aParser)
-{
- String ibyFile = iOutputPath;
-
- AppendFileName(ibyFile, aPkgFile);
- ibyFile.append(".iby");
-
- if( !MakeDirectory(iOutputPath) )
- throw SisUtilsException((char*)iOutputPath.data(), "Failed to create path");
-
- if(IsVerboseMode())
- {
- std::cout << "Generating IBY file " << (char*)ibyFile.data() << std::endl;
- }
-
- ibyHandle.open((char*)ibyFile.data(),(std::ios::out));
-
- if(!ibyHandle.good())
- {
- throw SisUtilsException((char*)ibyFile.data(), "Failed to create IBY file");
- }
-
- // Generating Header
- MakeFullPath(aPkgFile);
- ibyHandle << "\n// Generated IBY file for the package file: ";
- ibyHandle << aPkgFile;
-
- // Language Supported
- WriteLanguages(aParser);
-
- // Package Header
- WritePackageHeader(aParser);
-
- // Install options list
- WriteInstallOptions(aParser);
-
- // Package Body
- WritePackageBody(aParser);
-
- ibyHandle.close();
-}
-
-/**
-InvokeExtractTool: Invokes the SIS file extraction tool and returns the status
-
-@internalComponent
-@released
-
-@param sisFile - SIS file name
-*/
-TUint32 Sis2Iby::InvokeExtractTool(String sisFile)
-{
- String cmdLine;
-
- cmdLine.append(SISEXTRACT_TOOL_NAME SISEXTRACT_TOOL_DEFOPT);
-
- AppendFileName(iExtractPath, sisFile);
-
- cmdLine.append(SISEXTRACT_TOOL_EXTOPT);
- cmdLine.append("\"" + iExtractPath + "\" ");
- cmdLine.append(sisFile);
-
- if(IsVerboseMode())
- {
- std::cout << "Executing " << (char*)cmdLine.data() << std::endl;
- }
-
- return RunCommand(cmdLine);
-}
-
-/**
-UpdatePkgFileMap: Update the package file map by getting the embedded sis file list from the parser object
-
-@internalComponent
-@released
-
-@param aPath - Extract path
-@param aFile - SIS file name
-*/
-void Sis2Iby::UpdatePkgFileMap(String aPath, String aFile)
-{
- String pkgFileName;
- std::list<String> sisList;
-
- // main pkg file
- pkgFileName = aPath;
- AppendFileName(pkgFileName, aFile);
- pkgFileName.append(".pkg");
-
- // create an instance for the pkg file parser
- // get the embedded sis file list
- // add each as pkg file into the list
- pkgParser = 0;
- if( IsFileExist(pkgFileName) )
- {
- pkgParser = new PkgParser(pkgFileName);
-
- if(pkgParser)
- {
- pkgParser->ParsePkgFile();
-
- iPkgFileMap[pkgFileName] = pkgParser;
-
- pkgParser->GetEmbeddedSisList(sisList);
- SISFILE_LIST::iterator begin = sisList.begin();
- SISFILE_LIST::iterator end = sisList.end();
-
- while(begin != end)
- {
- String currPath = aPath;
-
- currPath.append(PATHSEPARATOR);
- GetFileName((*begin), currPath);
- UpdatePkgFileMap(currPath, (*begin));
-
- ++begin;
- }
- }
- else
- throw SisUtilsException((char*)pkgFileName.data(), "Could not create parser object");
- }
- else
- throw SisUtilsException((char*)pkgFileName.data(), "File not found");
-}
-
-/**
-WriteLanguages: Writes language section in the IBY file
-
-@internalComponent
-@released
-
-@param aParser - Package file parser object
-*/
-void Sis2Iby::WriteLanguages(PPKGPARSER aParser)
-{
- LANGUAGE_LIST lanMap;
- PLANG_LIST langCode;
-
- aParser->GetLanguageList(lanMap);
- ibyHandle << "\n// Languages: ";
-
- LANGUAGE_LIST::iterator begin = lanMap.begin();
- LANGUAGE_LIST::iterator end = lanMap.end();
-
- while(begin != end)
- {
- langCode = (*begin);
-
- ibyHandle << " " << langCode->langName;
- ibyHandle << "(" << langCode->langCode;
-
- if(langCode->dialectCode)
- {
- ibyHandle << "-" << langCode->dialectCode;
- }
- ibyHandle << ")";
-
- ++begin;
- }
-}
-
-/**
-WritePackageHeader: Writes package header section in the IBY file
-
-@internalComponent
-@released
-
-@param aParser - Package file parser object
-*/
-void Sis2Iby::WritePackageHeader(PPKGPARSER aParser)
-{
- PKG_HEADER pkgHeader;
- std::list<String> pkgList;
- std::ostringstream str;
-
- aParser->GetHeader(pkgHeader);
-
- ibyHandle << "\n// Header: ";
-
- pkgList = pkgHeader.pkgNameList;
- while(pkgList.size())
- {
- ibyHandle << "\"" << pkgList.front() << "\" ";
- pkgList.pop_front();
- }
-
- str << "(0x" << std::setbase(16) << pkgHeader.pkgUid << ")";
-
- ibyHandle << str.str();
-}
-
-/**
-WriteInstallOptions: Writes install option section in the IBY file
-
-@internalComponent
-@released
-
-@param aParser - Package file parser object
-*/
-void Sis2Iby::WriteInstallOptions(PPKGPARSER aParser)
-{
- std::list<String> optList;
- String ibyName;
-
- aParser->GetInstallOptions(optList);
- SISFILE_LIST::iterator begin = optList.begin();
- SISFILE_LIST::iterator end = optList.end();
-
- if(begin != end)
- {
- ibyHandle << "\n// Install Options: ";
- }
-
- while(begin != end)
- {
- ibyHandle << " \"" << (*begin) << "\"";
- ++begin;
- }
-}
-
-/**
-InsertTabs: Inserts spaces for indentation in the output IBY file
-
-@internalComponent
-@released
-
-@param num - num of spaces to be inserted
-*/
-void Sis2Iby::InsertTabs(int num)
-{
- ibyHandle << "\n";
- while(num--)
- {
- ibyHandle << " ";
- }
-}
-
-/**
-WritePackageBody: Writes package body details in the IBY file
-
-@internalComponent
-@released
-
-@param aParser - Package file parser object
-*/
-void Sis2Iby::WritePackageBody(PPKGPARSER aParser)
-{
- CMDBLOCK_LIST cmdList;
- PCMD_BLOCK cmd;
- int pad = 0;
-
- ibyHandle << "\n\n";
- aParser->GetCommandList(cmdList);
-
- CMDBLOCK_LIST::iterator begin = cmdList.begin();
- CMDBLOCK_LIST::iterator end = cmdList.end();
-
- while(begin != end)
- {
- cmd = (*begin);
-
- switch(cmd->cmdType)
- {
- case IF:
- {
- InsertTabs(pad);
- ibyHandle << "#if " << cmd->cmdExpression;
- pad++;
- }
- break;
- case ELSEIF:
- {
- InsertTabs(pad-1);
- ibyHandle << "#elif " << cmd->cmdExpression;
- }
- break;
- case ELSE:
- {
- InsertTabs(pad-1);
- ibyHandle << "#else";
- }
- break;
- case ENDIF:
- {
- --pad;
- InsertTabs(pad);
- ibyHandle << "#endif";
- }
- break;
- case INSTALLFILE:
- {
- WriteInstallFileList(cmd->iInstallFileList, aParser, pad);
- }
- break;
- case PACKAGE:
- {
- InsertTabs(pad);
- ibyHandle << "#include " << "\"" << cmd->cmdExpression << "\"";
- }
- break;
- }
-
- ++begin;
- }
-}
-
-/**
-WriteFileInclusion: Writes installable file details in the IBY file
-
-@internalComponent
-@released
-
-@param aSrcFile - Name of the source file
-@param aDestFile - Name of the destination file
-@param aPkgName - Name of the package file
-*/
-void Sis2Iby::WriteFileInclusion(String aSrcFile, String aDestFile, String aPkgName, int pad)
-{
- NormaliseSourceFile(aSrcFile, aPkgName);
-
- InsertTabs(pad);
- if(IsValidE32Image(aSrcFile))
- {
- ibyHandle << "file = ";
- }
- else
- {
- ibyHandle << "data = ";
- }
-
- ibyHandle << aSrcFile << " ";
- NormaliseDestFile(aDestFile);
- ibyHandle << aDestFile;
-}
-
-/**
-WriteInstallFileList: Writes installable file details in the IBY file
-
-@internalComponent
-@released
-
-@param aFileList - Installable file list structure
-@param aParser - Package file parser object
-@param pad - Number of spaces for indentation purpose
-*/
-void Sis2Iby::WriteInstallFileList(PINSTALLFILE_LIST aFileList, PPKGPARSER aParser, int pad)
-{
- WriteFileInclusion(aFileList->srcFiles.front(), aFileList->destFile, aParser->GetPkgFileName(), pad);
-}
-
-/**
-AppendFileName: Appends file name to the given path
-
-@internalComponent
-@released
-
-@param aPath - Source path
-@param aFile - File name
-*/
-void Sis2Iby::AppendFileName(String& aPath, String aFile)
-{
- TUint pos = 0;
-
- TrimQuotes(aPath);
- TrimQuotes(aFile);
-
- pos = aPath.rfind(PATHSEPARATOR);
- if(pos == String::npos)
- {
- aPath.append(PATHSEPARATOR);
- }
-
- if(pos < (aPath.length()-1))
- {
- aPath.append(PATHSEPARATOR);
- }
-
- GetFileName(aFile, aPath);
- return;
-}
-
-/**
-GetFileName: Returns the base file name
-
-@internalComponent
-@released
-
-@param aName - Input file name
-@param aFile - Output parameter to hold the return value
-*/
-void Sis2Iby::GetFileName(String aName, String& aFile)
-{
- TUint spos = 0, epos = 0;
-
- spos = aName.rfind(PATHSEPARATOR);
- if(spos != String::npos)
- {
- spos += 1;
- }
- else
- {
- spos = 0;
- }
-
- epos = aName.rfind(".");
- if(epos == String::npos)
- {
- epos = aName.size();
- }
-
- aFile.append(aName.substr(spos, (epos-spos)));
-}
-
-/**
-MakeFullPath: Returns the absolute path of the given file
-
-@internalComponent
-@released
-
-@param aFile - Input file name
-*/
-void Sis2Iby::MakeFullPath(String& aFile)
-{
-#ifdef WIN32
- char fPath[_MAX_PATH];
-
- if( _fullpath(fPath, (char*)aFile.data(), _MAX_PATH) != NULL )
- {
- aFile.assign(fPath);
- }
-#else
-#error "TODO: Implement this function under other OS than Windows"
-#endif
- return;
-}
-
-/**
-NormaliseSourceFile: Normalise the source file with its absolute path
-
-@internalComponent
-@released
-
-@param aFile - Input file name
-@param aPkgFile - Package file path
-*/
-void Sis2Iby::NormaliseSourceFile(String& aFile, String aPkgFile)
-{
- String result;
- TUint pos = 0;
-
- pos = aPkgFile.rfind(PATHSEPARATOR);
- if(pos != String::npos)
- {
- result = aPkgFile.substr(0,pos);
- }
- else
- {
- result = ".";
- }
-
- result.append(PATHSEPARATOR);
- result.append(aFile);
-
- MakeFullPath(result);
-
- aFile = "\"" + result + "\"";
-}
-
-/**
-NormaliseDestFile: Normalise the destination file
-
-@internalComponent
-@released
-
-@param aFile - Input file name
-*/
-void Sis2Iby::NormaliseDestFile(String& aFile)
-{
- TUint pos = 0;
-
- /** Comment by KunXu to fix DEF122540 on 18 Jun 2008
- pos = aFile.find("$:");
- if(pos != String::npos)
- {
- aFile.replace(pos, 2, "");
- }
-
- pos = aFile.find("!:");
- if(pos != String::npos)
- {
- aFile.replace(pos, 2, "");
- }
- **/
-
- /** Add by KunXu to fix DEF122540 on 18 Jun 2008 **/
- /** Ignore any drive indication in the filename to generate an iby file **/
- /** Begin **/
- pos = aFile.find(":");
- if (1 == pos)
- {
- char chFirst = aFile[0];
- if ('$' == chFirst || '!' == chFirst || (chFirst >='a' && chFirst <='z') || (chFirst >='A' && chFirst <='Z'))
- {
- aFile.replace(0, 2, "");
- }
- }
- /** End **/
-
- aFile = "\"" + aFile + "\"";
-}
-
-/**
-IsValidE32Image: Checks whether the given file is E32 image
-
-@internalComponent
-@released
-
-@param aFile - Input file name
-*/
-TBool Sis2Iby::IsValidE32Image(String aFile)
-{
- std::ifstream aIfs;
- TInt8 aSig[5];
- TUint32 e32SigOffset = 0x10, fileSize = 0;
- TBool validE32 = EFalse;
-
- TrimQuotes(aFile);
-
- aIfs.open(aFile.c_str(), std::ios::in | std::ios::binary);
-
- if( !aIfs.is_open() )
- {
- throw SisUtilsException((char*)aFile.data(), "Cannot open file");
- }
-
- aIfs.seekg(0,std::ios::end);
- fileSize = aIfs.tellg();
- if(fileSize > 20)
- {
- aIfs.seekg(e32SigOffset,std::ios::beg);
- aIfs.read((char*)aSig, 4);
- aSig[4] = '\0';
-
- if(!strcmp((char*)aSig, "EPOC"))
- {
- validE32 = ETrue;
- }
- }
-
- aIfs.close();
-
- return validE32;
-}
+/*
+* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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 "sisutils.h"
+#include "sis2iby.h"
+
+/**
+Constructor: Sis2Iby class
+Initilize the parameters to data members.
+
+@internalComponent
+@released
+
+@param aFile - SIS file name
+*/
+Sis2Iby::Sis2Iby(const char* aFile) : SisUtils(aFile) {
+}
+
+/**
+Destructor: Sis2Iby class
+Deallocates the memory for data members
+
+@internalComponent
+@released
+*/
+Sis2Iby::~Sis2Iby() {
+ PKGFILE_MAP::iterator begin = iPkgFileMap.begin();
+ PKGFILE_MAP::iterator end = iPkgFileMap.end();
+ while(begin != end) {
+ PPKGPARSER ptemp = 0;
+ ptemp = (*begin).second;
+
+ if(ptemp)
+ delete ptemp;
+ ++begin;
+ }
+ iPkgFileMap.clear();
+}
+
+/**
+ProcessSisFile: Processes the input sis file
+ Invoke the DUMPSIS tool to extract the sis file contents
+ Creates package parser object for each of the package file
+
+@internalComponent
+@released
+*/
+void Sis2Iby::ProcessSisFile() {
+ TUint32 retStatus = STAT_SUCCESS;
+ string sisFile = SisFileName();
+
+ if(IsVerboseMode()) {
+ cout << "Processing " << sisFile.c_str() << endl;
+ }
+
+ if(IsFileExist(sisFile)) {
+ retStatus = InvokeExtractTool(sisFile);
+
+ switch(retStatus) {
+ case STAT_SUCCESS:
+ UpdatePkgFileMap(iExtractPath, sisFile);
+ break;
+ case STAT_FAILURE:
+ throw SisUtilsException(sisFile.c_str(), "Failed to extract SIS file");
+ break ;
+ }
+ }
+ else
+ throw SisUtilsException(sisFile.c_str(), "File not found");
+}
+
+/**
+GenerateOutput: Generates IBY for each of the package file
+
+@internalComponent
+@released
+*/
+void Sis2Iby::GenerateOutput() {
+ PKGFILE_MAP::iterator begin = iPkgFileMap.begin();
+ PKGFILE_MAP::iterator end = iPkgFileMap.end();
+ while(begin != end) {
+ GenerateIby((*begin).first, (*begin).second);
+ ++begin;
+ }
+}
+
+/**
+GenerateOutput: Generates IBY file for the given package file
+
+@internalComponent
+@released
+
+@param aPkgFile - package file name
+@param aParser - corresponding package file reader object
+*/
+void Sis2Iby::GenerateIby(string aPkgFile, PPKGPARSER aParser) {
+ string ibyFile = iOutputPath;
+
+ AppendFileName(ibyFile, aPkgFile);
+ ibyFile.append(".iby");
+
+ if( !MakeDirectory(iOutputPath) )
+ throw SisUtilsException(iOutputPath.c_str(), "Failed to create path");
+
+ if(IsVerboseMode()) {
+ cout << "Generating IBY file " << ibyFile.c_str() << endl;
+ }
+
+ ibyHandle.open(ibyFile.c_str(),ios_base::out);
+
+ if(!ibyHandle.good()) {
+ throw SisUtilsException(ibyFile.c_str() , "Failed to create IBY file");
+ }
+
+ // Generating Header
+ MakeFullPath(aPkgFile);
+ ibyHandle << "\n// Generated IBY file for the package file: ";
+ ibyHandle << aPkgFile;
+
+ // Language Supported
+ WriteLanguages(aParser);
+
+ // Package Header
+ WritePackageHeader(aParser);
+
+ // Install options list
+ WriteInstallOptions(aParser);
+
+ // Package Body
+ WritePackageBody(aParser);
+
+ ibyHandle.close();
+}
+
+/**
+InvokeExtractTool: Invokes the SIS file extraction tool and returns the status
+
+@internalComponent
+@released
+
+@param sisFile - SIS file name
+*/
+TUint32 Sis2Iby::InvokeExtractTool(const string& aSisFile) {
+ string cmdLine;
+
+ cmdLine.append(SISEXTRACT_TOOL_NAME SISEXTRACT_TOOL_DEFOPT);
+
+ AppendFileName(iExtractPath, aSisFile);
+
+ cmdLine.append(SISEXTRACT_TOOL_EXTOPT);
+ cmdLine.append("\"" + iExtractPath + "\" ");
+ cmdLine.append(aSisFile);
+
+ if(IsVerboseMode()) {
+ cout << "Executing " << cmdLine.c_str() << endl;
+ }
+
+ return RunCommand(cmdLine.c_str());
+}
+
+/**
+UpdatePkgFileMap: Update the package file map by getting the embedded sis file list from the parser object
+
+@internalComponent
+@released
+
+@param aPath - Extract path
+@param aFile - SIS file name
+*/
+void Sis2Iby::UpdatePkgFileMap(const string& aPath, const string& aFile) {
+ string pkgFileName;
+ list<string> sisList;
+
+ // main pkg file
+ pkgFileName = aPath;
+ AppendFileName(pkgFileName, aFile);
+ pkgFileName.append(".pkg");
+
+ // create an instance for the pkg file parser
+ // get the embedded sis file list
+ // add each as pkg file into the list
+ pkgParser = 0;
+ if( IsFileExist(pkgFileName) ) {
+ pkgParser = new PkgParser(pkgFileName);
+
+ if(pkgParser) {
+ pkgParser->ParsePkgFile();
+
+ iPkgFileMap[pkgFileName] = pkgParser;
+
+ pkgParser->GetEmbeddedSisList(sisList);
+ SISFILE_LIST::iterator begin = sisList.begin();
+ SISFILE_LIST::iterator end = sisList.end();
+
+ while(begin != end) {
+ string currPath = aPath;
+
+ currPath.append(PATHSEPARATOR);
+ GetFileName((*begin), currPath);
+ UpdatePkgFileMap(currPath, (*begin));
+
+ ++begin;
+ }
+ }
+ else
+ throw SisUtilsException(pkgFileName.c_str(), "Could not create parser object");
+ }
+ else
+ throw SisUtilsException(pkgFileName.c_str(), "File not found");
+}
+
+/**
+WriteLanguages: Writes language section in the IBY file
+
+@internalComponent
+@released
+
+@param aParser - Package file parser object
+*/
+void Sis2Iby::WriteLanguages(PPKGPARSER aParser) {
+ LANGUAGE_LIST lanMap;
+ PLANG_LIST iLangCode;
+
+ aParser->GetLanguageList(lanMap);
+ ibyHandle << "\n// Languages: ";
+
+ LANGUAGE_LIST::iterator begin = lanMap.begin();
+ LANGUAGE_LIST::iterator end = lanMap.end();
+
+ while(begin != end) {
+ iLangCode = (*begin);
+
+ ibyHandle << " " << iLangCode->iLangName;
+ ibyHandle << "(" << iLangCode->iLangCode;
+
+ if(iLangCode->iDialectCode) {
+ ibyHandle << "-" << iLangCode->iDialectCode;
+ }
+ ibyHandle << ")";
+
+ ++begin;
+ }
+}
+
+/**
+WritePackageHeader: Writes package header section in the IBY file
+
+@internalComponent
+@released
+
+@param aParser - Package file parser object
+*/
+void Sis2Iby::WritePackageHeader(PPKGPARSER aParser) {
+ PKG_HEADER pkgHeader;
+ list<string> pkgList;
+ ostringstream str;
+
+ aParser->GetHeader(pkgHeader);
+
+ ibyHandle << "\n// Header: ";
+
+ pkgList = pkgHeader.iPkgNames;
+ while(pkgList.size())
+ {
+ ibyHandle << "\"" << pkgList.front() << "\" ";
+ pkgList.pop_front();
+ }
+
+ str << "(0x" << setbase(16) << pkgHeader.iPkgUID << ")";
+
+ ibyHandle << str.str();
+}
+
+/**
+WriteInstallOptions: Writes install option section in the IBY file
+
+@internalComponent
+@released
+
+@param aParser - Package file parser object
+*/
+void Sis2Iby::WriteInstallOptions(PPKGPARSER aParser) {
+ list<string> optList;
+ string ibyName;
+
+ aParser->GetInstallOptions(optList);
+ SISFILE_LIST::iterator begin = optList.begin();
+ SISFILE_LIST::iterator end = optList.end();
+
+ if(begin != end) {
+ ibyHandle << "\n// Install Options: ";
+ }
+
+ while(begin != end) {
+ ibyHandle << " \"" << (*begin) << "\"";
+ ++begin;
+ }
+}
+
+/**
+InsertTabs: Inserts spaces for indentation in the output IBY file
+
+@internalComponent
+@released
+
+@param num - num of spaces to be inserted
+*/
+void Sis2Iby::InsertTabs(TInt num) {
+ ibyHandle << "\n";
+ while(num--) {
+ ibyHandle << " ";
+ }
+}
+
+/**
+WritePackageBody: Writes package body details in the IBY file
+
+@internalComponent
+@released
+
+@param aParser - Package file parser object
+*/
+void Sis2Iby::WritePackageBody(PPKGPARSER aParser) {
+ CMDBLOCK_LIST cmdList;
+ PCMD_BLOCK cmd;
+ TInt pad = 0;
+
+ ibyHandle << "\n\n";
+ aParser->GetCommandList(cmdList);
+
+ CMDBLOCK_LIST::iterator begin = cmdList.begin();
+ CMDBLOCK_LIST::iterator end = cmdList.end();
+
+ while(begin != end) {
+ cmd = (*begin);
+
+ switch(cmd->iCmdType)
+ {
+ case IF:
+ InsertTabs(pad);
+ ibyHandle << "#if " << cmd->iCmdExpr;
+ pad++;
+
+ break;
+ case ELSEIF:
+ InsertTabs(pad-1);
+ ibyHandle << "#elif " << cmd->iCmdExpr;
+ break;
+ case ELSE:
+ InsertTabs(pad-1);
+ ibyHandle << "#else";
+ break;
+ case ENDIF:
+ --pad;
+ InsertTabs(pad);
+ ibyHandle << "#endif";
+ break;
+ case INSTALLFILE:
+ WriteInstallFileList(cmd->iInstallFileList, aParser, pad);
+ break;
+ case PACKAGE:
+ InsertTabs(pad);
+ ibyHandle << "#include " << "\"" << cmd->iCmdExpr << "\"";
+ break;
+ }
+
+ ++begin;
+ }
+}
+
+/**
+WriteFileInclusion: Writes installable file details in the IBY file
+
+@internalComponent
+@released
+
+@param aSrcFile - Name of the source file
+@param aDestFile - Name of the destination file
+@param aPkgName - Name of the package file
+*/
+void Sis2Iby::WriteFileInclusion(string aSrcFile, string aDestFile, string aPkgName, TInt aPadding) {
+ NormaliseSourceFile(aSrcFile, aPkgName);
+
+ InsertTabs(aPadding);
+ if(IsValidE32Image(aSrcFile)){
+ ibyHandle << "file = ";
+ }
+ else {
+ ibyHandle << "data = ";
+ }
+
+ ibyHandle << aSrcFile << " ";
+ NormaliseDestFile(aDestFile);
+ ibyHandle << aDestFile;
+}
+
+/**
+WriteInstallFileList: Writes installable file details in the IBY file
+
+@internalComponent
+@released
+
+@param aFileList - Installable file list structure
+@param aParser - Package file parser object
+@param pad - Number of spaces for indentation purpose
+*/
+void Sis2Iby::WriteInstallFileList(PINSTALLFILE_LIST aFileList, PPKGPARSER aParser, TInt aPadding) {
+ WriteFileInclusion(aFileList->iSourceFiles.front(), aFileList->iDestFile, aParser->GetPkgFileName(), aPadding);
+}
+
+/**
+AppendFileName: Appends file name to the given path
+
+@internalComponent
+@released
+
+@param aPath - Source path
+@param aFile - File name
+*/
+void Sis2Iby::AppendFileName(string& aPath, string aFile) {
+ TUint pos = 0;
+
+ TrimQuotes(aPath);
+ TrimQuotes(aFile);
+
+ pos = aPath.rfind(PATHSEPARATOR);
+ if(pos == string::npos) {
+ aPath.append(PATHSEPARATOR);
+ }
+
+ if(pos < (aPath.length() - 1)) {
+ aPath.append(PATHSEPARATOR);
+ }
+
+ GetFileName(aFile, aPath);
+ return;
+}
+
+/**
+GetFileName: Returns the base file name
+
+@internalComponent
+@released
+
+@param aName - Input file name
+@param aFile - Output parameter to hold the return value
+*/
+void Sis2Iby::GetFileName(const string& aName, string& aFile) {
+ TUint spos = 0, epos = 0;
+
+ spos = aName.rfind(PATHSEPARATOR);
+ if(spos != string::npos) {
+ spos += 1;
+ }
+ else {
+ spos = 0;
+ }
+
+ epos = aName.rfind(".");
+ if(epos == string::npos) {
+ epos = aName.size();
+ }
+
+ aFile.append(aName.substr(spos, (epos-spos)));
+}
+
+/**
+MakeFullPath: Returns the absolute path of the given file
+
+@internalComponent
+@released
+
+@param aFile - Input file name
+*/
+#ifndef _MAX_PATH
+#define _MAX_PATH 1024
+#endif
+void Sis2Iby::MakeFullPath(string& aFile) {
+
+ char path[_MAX_PATH];
+ if( _fullpath(path, aFile.c_str(), _MAX_PATH) != NULL ) {
+ aFile.assign(path);
+ }
+
+}
+
+/**
+NormaliseSourceFile: Normalise the source file with its absolute path
+
+@internalComponent
+@released
+
+@param aFile - Input file name
+@param aPkgFile - Package file path
+*/
+void Sis2Iby::NormaliseSourceFile(string& aFile, const string& aPkgFile) {
+ string result;
+ TUint pos = 0;
+
+ pos = aPkgFile.rfind(PATHSEPARATOR);
+ if(pos != string::npos) {
+ result = aPkgFile.substr(0,pos);
+ }
+ else {
+ result = ".";
+ }
+
+ result.append(PATHSEPARATOR);
+ result.append(aFile);
+
+ MakeFullPath(result);
+
+ aFile = "\"" + result + "\"";
+}
+
+/**
+NormaliseDestFile: Normalise the destination file
+
+@internalComponent
+@released
+
+@param aFile - Input file name
+*/
+void Sis2Iby::NormaliseDestFile(string& aFile) {
+ TUint pos = 0;
+ pos = aFile.find(":");
+ if (1 == pos) {
+ char chFirst = aFile[0];
+ if ('$' == chFirst || '!' == chFirst || (chFirst >='a' && chFirst <='z') || (chFirst >='A' && chFirst <='Z')) {
+ aFile.replace(0, 2, "");
+ }
+ }
+
+
+ aFile = "\"" + aFile + "\"";
+}
+
+/**
+IsValidE32Image: Checks whether the given file is E32 image
+
+@internalComponent
+@released
+
+@param aFile - Input file name
+*/
+TBool Sis2Iby::IsValidE32Image(string aFile) {
+ ifstream file;
+ char sig[5];
+ TUint32 e32SigOffset = 0x10, fileSize = 0;
+ TBool validE32 = EFalse;
+
+ TrimQuotes(aFile);
+
+ file.open(aFile.c_str(), ios_base::in | ios_base::binary);
+
+ if( !file.is_open() ) {
+ throw SisUtilsException(aFile.c_str(), "Cannot open file");
+ }
+
+ file.seekg(0,ios_base::end);
+ fileSize = file.tellg();
+ if(fileSize > 20) {
+ file.seekg(e32SigOffset,ios_base::beg);
+ file.read(sig, 4);
+ sig[4] = '\0';
+
+ if(!strcmp(sig, "EPOC")) {
+ validE32 = ETrue;
+ }
+ }
+
+ file.close();
+ return validE32;
+}