diff -r 000000000000 -r 83f4b4db085c toolsandutils/e32tools/elf2e32/source/messageimplementation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolsandutils/e32tools/elf2e32/source/messageimplementation.cpp Tue Feb 02 01:39:43 2010 +0200 @@ -0,0 +1,425 @@ +// Copyright (c) 2004-2009 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: +// Message Implementation Operations for elf2e32 tool +// @internalComponent +// @released +// +// + + +#include "messageimplementation.h" +#include "errorhandler.h" +#include +#include +#include +#include + +using std::endl; +using std::cout; +typedef std::string String; + +char *errorMssgPrefix="elf2e32 : Error: E"; +char *warnMssgPrefix="elf2e32 : Warning: W"; +char *infoMssgPrefix="elf2e32 : Information: I"; +char *colSpace=": "; + +enum MessageArraySize{MAX=66}; + +//Messages stored required for the program +struct EnglishMessage MessageArray[MAX]= +{ + {FILEOPENERROR,"Could not open file : %s."}, + {FILEREADERROR,"Could not read file : %s."}, + {FILEWRITEERROR,"Could not write file : %s."}, + {ELFMAGICERROR,"Invalid ELF magic in file : %s."}, + {ELFCLASSERROR,"ELF file %s is not 32 bit."}, + {ELFABIVERSIONERROR,"ELF file %s is not BPABI conformant."}, + {ELFLEERROR,"ELF file %s is not Little Endian."}, + {ELFARMERROR,"ELF file %s does not target ARM."}, + {ELFEXECUTABLEERROR,"ELF file %s is neither executable (ET_EXEC) or shared (ET_DYN)."}, + {ELFSHSTRINDEXERROR,"Error in ELF Section Header String Index : %s."}, + {NAMELIBRARYNOTCORRECT,"Name or Library not supplied correctly : %s[Line No=%d][%s]"}, + {ORDINALSEQUENCEERROR,"Ordinal number is not in sequence : %s[Line No=%d][%s]."}, + {ARGUMENTNAMEERROR,"Argument %s is not correct."}, + {OPTIONNAMEERROR,"Option %s is Unrecognized."}, + {NOARGUMENTERROR,"Missing arguments for option : %s."}, + {OPTIONPREFIXERROR,"Option %s is neither preceedded by '-' nor '--'."}, + {NOREQUIREDOPTIONERROR,"Missing options : %s."}, + {NOFILENAMEERROR,"Missing argument for option : %s."}, + {INVALIDARGUMENTERROR,"Argument '%s' not permitted for option %s."}, + {HUFFMANBUFFEROVERFLOWERROR,"Huffman buffer overflow during E32Image compression."}, + {HUFFMANTOOMANYCODESERROR,"Too many Huffman codes during E32Image compression."}, + {HUFFMANINVALIDCODINGERROR,"Invalid Huffman coding during E32Image compression."}, + {CAPABILITYALLINVERSIONERROR,"-ALL not a valid capability."}, + {CAPABILITYNONEINVERSIONERROR,"+NONE not a valid capability."}, + {UNRECOGNISEDCAPABILITYERROR,"Unrecognized capability : %s."}, + {NOSTATICSYMBOLSERROR,"ELF File %s contains no static symbols."}, + {DLLHASINITIALISEDDATAERROR,"ELF File %s contains initialized writable data."}, + {DLLHASUNINITIALISEDDATAERROR,"ELF File %s contains uninitialized writable data."}, + {ENTRYPOINTCORRUPTERROR,"ELF File %s has corrupt entry point."}, + {ENTRYPOINTNOTSUPPORTEDERROR,"ELF File %s has unsupported entry point type."}, + {EXCEPTIONDESCRIPTOROUTSIDEROERROR,"ELF File %s has invalid exception descriptor."}, + {NOEXCEPTIONDESCRIPTORERROR,"ELF File %s has no exception descriptor."}, + {NEEDSECTIONVIEWERROR,"ELF File %s has no section headers."}, + {DSONOTFOUNDERROR,"DSO %s not found."}, + {UNDEFINEDSYMBOLERROR,"Undefined Symbol %s found in ELF File %s."}, + {SYMBOLMISSINGFROMELFERROR,"Symbol %s Missing from ELF File : %s."}, + {MEMORYALLOCATIONERROR,"Memory allocation failure : %s."}, + {E32IMAGEERROR,"Not able to write E32 Image file."}, + {INVALIDINVOCATIONERROR,"Invalid invocation of elf2e32."}, + {TARGETTYPENOTSPECIFIEDERROR,"Target Type Not Specified."}, + {UNSUPPORTEDTARGETTYPEERROR,"Unsupported Target Type '%s'."}, + {INDEXNOMESSAGEERROR,"There is no message for the message index[%d]."}, + {INDEXNOTREQUIREDERROR,"Message index[%d] not required in message file."}, + {INDEXNOTFOUNDERROR,"Message index [%d] not found in message file"}, + {NOMESSAGEFILEERROR,"There is no message file."}, + {ENTRYPOINTNOTSETERROR,"Entry point is not set for %s."}, + {UNDEFINEDENTRYPOINTERROR,"Entry point and Text segment base both 0, can't tell if entry point set for %s."}, + {ORDINALNOTANUMBER,"Ordinal not a Number : %s[Line No=%d][%s]."}, + {UNRECOGNIZEDTOKEN,"Unrecognized Token : %s[Line No=%d][%s]."}, + {NONAMEMISSING,"NONAME Missing : %s[Line No=%d][%s]."}, + {EXPORTSEXPECTED,"EXPORTS expected before first export entry : %s[Line No=%d][%s]."}, + {ATRATEMISSING,"@ Missing : %s[Line No=%d][%s]."}, + {SYSDEFSMISMATCHERROR,"Symbol %s passed through '--sysdef' option is not at the specified ordinal in the DEF file %s."}, + {SYSDEFERROR,"Ordinal number is not provided as input to the option: %s"}, + {INVALIDE32IMAGEERROR,"%s is not a valid E32Image file."}, + {HUFFMANBUFFERUNDERFLOWERROR,"Huffman buffer underflow on deflate."}, + {HUFFMANINCONSISTENTSIZEERROR,"Inconsistent sizes discovered during uncompression."}, + {MULTIPLESYSDEFERROR, "Multiple system definitions passed to %s should be separated by ';'"}, + {SYSDEFNOSYMBOLERROR, "Symbol Name is not provided as input to the option: %s"}, + {VALUEIGNOREDWARNING, "Value passed to '%s' is ignored"}, + {ELFFILEERROR,"Error while processing the ELF file %s."}, + {SYMBOLCOUNTMISMATCHERROR, "Symbol count provided by DT_ARM_SYMTABSZ is not same as that in the Hash Table in %s"}, + {POSTLINKERERROR,"Fatal Error in Postlinker"}, + {BYTEPAIRINCONSISTENTSIZEERROR, "Inconsistent sizes discovered during Byte pair uncompression." }, + {ILLEGALEXPORTFROMDATASEGMENT,"'%s' : '%s' Import relocation does not refer to code segment."}, + {VALIDATIONERROR,"Image failed validation"} +}; + +/** +Constructor to reset the logging option flag. + +@internalComponent +@released +*/ +MessageImplementation::MessageImplementation() +{ + iLogging = false; +} + +/** +Destructor to close log file if logging is enabled and to clear the messaged. +@internalComponent +@released +*/ +MessageImplementation::~MessageImplementation() +{ + if(iLogging) + { + fclose(iLogPtr); + } + iMessage.clear(); +} + +/** +Function to Get Message stored in map. + +@internalComponent +@released + +@param aMessageIndex +Index of the Message to be displayed +@return Message string to be displayed +*/ +char * MessageImplementation::GetMessageString(int aMessageIndex) +{ + Map::iterator p; + + if(iMessage.empty()) + { + if(aMessageIndex <= MAX) + { + return MessageArray[aMessageIndex-1].message; + } + else + { + return NULL; + } + } + else + { + p=iMessage.find(aMessageIndex); + if(p == iMessage.end()) + { + if(aMessageIndex <= MAX) + { + return MessageArray[aMessageIndex-1].message; + } + else + { + return NULL; + } + } + + if(aMessageIndex <= MAX) + { + return p->second; + } + else + { + return NULL; + } + } +} + +/** +Function to display output and log message in log file if logging is enable. + +@internalComponent +@released + +@param aString +Message to be displayed +*/ +void MessageImplementation::Output(const char *aString) +{ + + if (iLogging) + { + fputs(aString,iLogPtr); + fputs("\n",iLogPtr); + } + cout << aString << endl; +} + +/** +Function to Get Message stored in map and to display the Message + +@internalComponent +@released + +@param +The type of the message, whether it is Error or Warning or Information. +@param +The index of the information and the corresponding arguments. +*/ +void MessageImplementation::ReportMessage(int aMessageType, int aMsgIndex,...) +{ + char *reportMessage, *ptr, *tmpMessage; + char intStr[16]; + char mssgNo[MAXMSSGNOLENGTH]; + int mssgIndex,k; + + va_list ap; + va_start(ap,aMsgIndex); + + reportMessage=GetMessageString(aMsgIndex); + + if(reportMessage) + { + String message; + switch (aMessageType) + { + case ERROR: + message = errorMssgPrefix; + break; + case WARNING: + message = warnMssgPrefix; + break; + case INFORMATION: + message = infoMssgPrefix; + break; + } + mssgIndex = BASEMSSGNO + aMsgIndex; + sprintf(mssgNo,"%d",mssgIndex); + message += mssgNo; + message += colSpace; + + ptr = strchr(reportMessage,'%'); + + while( ptr != NULL && (ptr[0]) == '%' ) + { + tmpMessage=new char[ptr - reportMessage + 1]; + strncpy(tmpMessage, reportMessage, ptr - reportMessage+1); + tmpMessage[ptr - reportMessage]='\0'; + message += tmpMessage; + delete tmpMessage; + ptr++; + switch(ptr[0]) + { + case 'd': + k = va_arg(ap, int); + sprintf(intStr,"%d",k); + message += intStr; + ptr++; + reportMessage = ptr; + break; + case 's': + message += va_arg(ap, char *); + ptr++; + reportMessage = ptr; + break; + case '%': + message += ptr[0]; + reportMessage = ptr; + default: + break; + } + ptr=strchr(reportMessage,'%'); + } + message += reportMessage; + Output(message.c_str()); + } +} + +/** +Function to start logging. + +@internalComponent +@released + +@param aFileName +Name of the Log file +*/ +void MessageImplementation::StartLogging(char *aFileName) +{ + char logFile[1024]; + FILE *fptr; + + strcpy(logFile,aFileName); + + // open file for log etc. + if((fptr=fopen(logFile,"w"))==NULL) + { + ReportMessage(WARNING, FILEOPENERROR,aFileName); + } + else + { + iLogging = true; + iLogPtr=fptr; + } +} + +/** +Function to Create Messages file. + +@internalComponent +@released +@param aFileName +Name of the Message file to be dumped +*/ +void MessageImplementation::CreateMessageFile(char *aFileName) +{ + int i; + FILE *fptr; + + // open file for writing messages. + if((fptr=fopen(aFileName,"w"))==NULL) + { + ReportMessage(WARNING, FILEOPENERROR,aFileName); + } + else + { + for(i=0;i(atoi(index),errStr)); + + lineToken=strtok(lineToken+lineLength+1,"\n"); + } + + delete messageEntries; + + } + else + { + for(i=0;i(MessageArray[i].index,errStr)); + } + } +} + +