diff -r c7c26511138f -r 360bd6b35136 imgtools/sisutils/src/sis2iby.cpp --- 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 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 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 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 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 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 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; +}