diff -r 000000000000 -r 044383f39525 imgtools/imgcheck/libimgutils/src/e32reader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imgtools/imgcheck/libimgutils/src/e32reader.cpp Tue Oct 27 16:36:35 2009 +0000 @@ -0,0 +1,235 @@ +/* +* Copyright (c) 2007-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: +* +*/ + + +/** + @file + @internalComponent + @released +*/ + +#include "e32reader.h" +#include + +/** +Constructor. + +@internalComponent +@released +*/ +E32Image::E32Image() +:E32ImageFile() +{ +} + +/** +Destructor. + +@internalComponent +@released +*/ +E32Image::~E32Image() +{ +} + +/** +Function responsible to read the import section of an e32 image and return the dependency names. + +@internalComponent +@released + +@param aCount - Number of imports found + +@return - returns the two dimensional +*/ +char** E32Image::GetImportExecutableNames(int& aCount) +{ + const E32ImportSection* isection = (const E32ImportSection*)(iData + iOrigHdr->iImportOffset); + const E32ImportBlock* impBlock = (const E32ImportBlock*)(isection + 1); + + char** nameList = (char**)malloc(iOrigHdr->iDllRefTableCount * sizeof(char*)); + + aCount = iOrigHdr->iDllRefTableCount; + + for (int d = 0; d < iOrigHdr->iDllRefTableCount; ++d) + { + char* dllname = iData + iOrigHdr->iImportOffset + impBlock->iOffsetOfDllName; + char* curlyStart = strchr(dllname, '{'); + char* dotStart = strrchr(dllname, '.'); + + dllname[curlyStart - dllname] = '\0'; + strcat(dllname,dotStart); + + nameList[d] = dllname; + TUint impfmt = iOrigHdr->ImportFormat(); + impBlock = impBlock->NextBlock(impfmt); //Get next import block + } + return nameList; +} + +/** +Constructor intializes the class pointer members. + +@internalComponent +@released + +@param aImageName - image file name +*/ +E32Reader::E32Reader(char* aImageName) +:ImageReader(aImageName) +{ + iInputStream.open(iImgFileName.c_str(), Ios::binary | Ios::in); + int fwdSlashOff = iImgFileName.find_last_of('/'); + int bwdSlashOff = iImgFileName.find_last_of('\\'); + int exeNameOff = (fwdSlashOff > bwdSlashOff) ? fwdSlashOff : bwdSlashOff; + iExeName = iImgFileName.substr(exeNameOff + 1); +} + +/** +Destructor deletes the class pointer members. + +@internalComponent +@released +*/ +E32Reader::~E32Reader() +{ + iInputStream.close(); + DELETE(iE32Image); +} + +/** +Function responsible to say whether it is an e32 image or not. + +@internalComponent +@released + +@param aImage - e32 image +*/ +bool E32Reader::IsE32Image(char* aFile) +{ + if(E32Image::IsE32ImageFile(aFile)) + return true; + return false; +} + +/** +Funtion to read the whole e32 image file and write the contents into iData memeber + +@internalComponent +@released +*/ +void E32Reader::ReadImage() +{ + if( !iInputStream.is_open() ) + { + cerr << "Error: " << "Can not open file" << iImgFileName.c_str() << endl; + exit(EXIT_FAILURE); + } + iE32Image = new E32Image(); + iInputStream.seekg(0, Ios::end); + TUint32 aSz = iInputStream.tellg(); + iInputStream.seekg(0, Ios::beg); + iE32Image->Adjust(aSz); + iE32Image->iFileSize = aSz; +} + +/** +Function responsible to read the E32 image and put the data into E32ImageFile object. +It is achieved using the operator >> overloaded function. + +@internalComponent +@released +*/ +void E32Reader::ProcessImage() +{ + iInputStream >> *iE32Image; + iExeAvailable = true; +} + +/** +Function responsible to gather dependencies for one e32 image. + +@internalComponent +@released + +@return iExeNamesVsDepListMap - returns all executable's dependencies +*/ +ExeNamesVsDepListMap& E32Reader::GatherDependencies() +{ + int count=0; + char** nameList = iE32Image->GetImportExecutableNames(count); + int i = 0; + for(; i < count; ++i) + { + iDependencyList.push_back(String(nameList[i])); + } + iImageVsDepList.insert(std::make_pair(iExeName, iDependencyList)); + return iImageVsDepList; +} + +/** +Function responsible to return the dependency list of an e32 image. + +@internalComponent +@released + +@return iDependencyList - returns all executable's dependencies +*/ +const StringList& E32Reader::GetDependencyList() +{ + return iDependencyList; +} + +/** +Function responsible prepare the ExeVsId map. + +@internalComponent +@released +*/ +void E32Reader::PrepareExeVsIdMap() +{ + IdData* id; + if(iExeVsIdData.size() == 0) //Is not already prepared + { + id = new IdData; + id->iUid = iE32Image->iOrigHdr->iUid1; + id->iDbgFlag = (iE32Image->iOrigHdr->iFlags & KImageDebuggable)? true : false; + TUint aHeaderFmt = E32ImageHeader::HdrFmtFromFlags(iE32Image->iOrigHdr->iFlags); + if (aHeaderFmt >= KImageHdrFmt_V) + { + E32ImageHeaderV* v = iE32Image->iHdr; + id->iSid = v->iS.iSecureId; + id->iVid = v->iS.iVendorId; + } + id->iFileOffset = 0; + iExeVsIdData[iExeName] = id; + } + id = KNull; +} + +/** +Function responsible to return the Executable versus IdData container. + +@internalComponent +@released + +@return - returns iExeVsIdData +*/ +const ExeVsIdDataMap& E32Reader::GetExeVsIdMap() const +{ + return iExeVsIdData; +}