--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dbgsrv/coredumpserver/plugins/formatters/symbianelf/selflib/selflib.h Tue Mar 02 10:33:16 2010 +0530
@@ -0,0 +1,117 @@
+// Copyright (c) 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:
+// Classes that allow the editing and creation of Symbian ELF files
+//
+
+/**
+ * @file
+ * @publishedAll
+ * @prototype
+ */
+
+#ifndef __SELF_LIB_H__
+#define __SELF_LIB_H__
+
+#include <e32base.h>
+#include <e32debug.h>
+#include <f32file.h>
+#include <elfdefs.h>
+#include <badesca.h>
+#include <symbianelfdefs.h>
+
+_LIT(KTempFileLocation, "C:\\"); //TODO: Investigate system drive
+
+/** Reads a struct from a file
+ * @param t Type to read
+ * @param s the structure
+ * @param f RFile to read from
+ * @param r Point in the file from which to read
+ * */
+#define READ_STRUCTL(t, s, f, r)\
+ t s;\
+ {\
+ TPtr8 ptr((TUint8*)&s, sizeof(s), sizeof(s));\
+ User::LeaveIfError(f.Read(r, ptr));\
+ }
+
+/**
+ * This represents a Symbian Note segment in an ELF file
+ * It consits of a program header, descriptor header and
+ * the Note specific segment.
+ */
+struct TSELFSegment
+ {
+ Elf32_Phdr iPhdr;
+ Sym32_dhdr iDhdr;
+
+ union TSegmentType
+ {
+ Sym32_variant_spec_data iVarData;
+ //Other section types can live here - currently only support variant specific data
+ };
+
+ TSegmentType iType;
+ };
+
+class CStringInfoTableV2;
+
+/**
+ * This class is the interface to allow editing of SELF files
+ */
+class CSELFEditor : public CBase
+ {
+ public:
+ IMPORT_C static CSELFEditor* NewL(const TDesC& aFilename);
+ IMPORT_C static CSELFEditor* NewLC(const TDesC& aFilename);
+
+ IMPORT_C void GetELFHeader(Elf32_Ehdr& aELFHeader);
+ IMPORT_C void InsertVariantSpecificDataL(const TDesC8& aVarData);
+ IMPORT_C void WriteELFUpdatesL();
+
+ virtual ~CSELFEditor();
+
+ private:
+ CSELFEditor();
+ void ConstructL(const TDesC& aFilename);
+ TBool IsValidELFFile();
+ TBool IsELFFileSupported();
+
+ TUint CopyFromELFFileL(TUint aStartPoint, TUint aSize, RFile aDestinationFile, TUint aDestWrite = 0);
+ TUint CopyRegistersL(RFile aFile, TUint aSrcRead, TUint aDestWrite, TUint& aSizeWritten);
+ TUint CopyVariantDataL(RFile aFile, TUint aSrcRead, TUint aDestWrite, TUint& aSizeWritten);
+ void PutEmptySpaceAtEndOfFileL(RFile aFile, TUint aSize);
+
+ void CacheStringTableL();
+ void CacheProgramHeadersL();
+ void CacheELFHeaderL();
+
+ TUint WriteStringInfoL(RFile aFile, TUint& aOffset);
+ void SwapFilesL(const TDesC& aSrc, const TDesC& aDest);
+
+ private:
+ RFs iFsSession;
+ RFile iELFFile;
+ RArray<TSELFSegment> iNewSegments;
+ RArray<Elf32_Phdr> iProgramHeaders;
+
+ Elf32_Ehdr iELFHeader;
+ Sym32_dhdr iStringTableDhdr;
+ CStringInfoTableV2* iStringTable;
+
+ //Flat array of descriptors for data to be inserted to ELF
+ CDesC8Array* iRawData;
+
+ };
+
+#endif