tools/elf4rom/src/elfsection.h
author Gareth Stockwell <gareth.stockwell@accenture.com>
Wed, 22 Sep 2010 15:40:40 +0100
branchgraphics-phase-3
changeset 111 345f1c88c950
parent 34 92d87f2e53c2
permissions -rwxr-xr-x
Fixes to syborg-graphicswrapper.vcproj These changes allow syborg-graphicswrapper to link against the hostthreadadapter and khronosapiwrapper libraries built by the graphics.simulator component. The .vcproj file uses relative paths, which requires that the following three packages are laid out as follows: os/ graphics adapt/ graphics.simulator qemu

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU Lesser General Public License for more details.
* 
* You should have received a copy of the GNU Lesser General Public License
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef ELFSECTION_H_
#define ELFSECTION_H_

#include <libelf.h>

#include "defs.h" // for String

#include "filefragment.h"
#include "inputfile.h"

class ElfSectionHeader {
public:
	ElfSectionHeader()
		{}
	
	ElfSectionHeader(Elf32_Shdr & aShdr) :
		iElf32Shdr(aShdr)
		{}
	
	Elf32_Shdr iElf32Shdr;
};

class ElfSectionData  : public FileFragmentOwner {
public:
	ElfSectionData()
		{}
	ElfSectionData(size_t aOffset):
		FileFragmentOwner(aOffset)
		{}
	virtual ElfSectionData * Clone() = 0;
	
	// The FileFragmentOwner protocol
	virtual void GetFileFragmentData(FileFragmentData & aFileFragmentData ) = 0;
	virtual size_t Size() = 0;
	virtual void DeleteFileFragmentData() = 0;


};

class ElfSectionRomData : public ElfSectionData {
public:
	ElfSectionRomData(size_t aOffset, size_t aSize) :
		ElfSectionData(aOffset), 
		iSize(aSize)
		{}
	
	ElfSectionRomData(const ElfSectionRomData & aData);

	// ElfSection protocol
	virtual ElfSectionRomData * Clone();

	// The FileFragmentOwner protocol
	virtual void GetFileFragmentData(FileFragmentData & aFileFragmentData ){}
	virtual size_t Size(){ return iSize; }
	// Nothing to delete
	virtual void DeleteFileFragmentData(){};
	// Dont add data;
	virtual void AddData(OutputFile & aOutputFile) {};
	
private:
	size_t iSize;
};

class ElfSectionElfData : public ElfSectionData {
public:
	ElfSectionElfData(FileFragmentOwner & aSource) :
		iSource(aSource)
		{}
	
	ElfSectionElfData(const ElfSectionElfData & aData);
	
	// ElfSection protocol
	virtual ElfSectionElfData * Clone();

	// The FileFragmentOwner protocol
	virtual void GetFileFragmentData(FileFragmentData & aFileFragmentData );
	virtual size_t Size();
	virtual void DeleteFileFragmentData();
	virtual void AddData(OutputFile & aOutputFile);
	virtual size_t GetOffset();
	
private:
	FileFragmentOwner & iSource;
};

class ElfSectionFileData : public ElfSectionData {
public:
	ElfSectionFileData(InputFile * aInputFile) :
		iInputFile(aInputFile), iData(NULL)
		{}
	ElfSectionFileData(const ElfSectionFileData & aData);
	
	// ElfSection protocol
	virtual ElfSectionFileData * Clone();

	// The FileFragmentOwner protocol
	virtual void GetFileFragmentData(FileFragmentData & aFileFragmentData );
	virtual size_t Size();
	virtual void DeleteFileFragmentData();

private:
	InputFile * iInputFile;
	char * iData;
};

class ElfSectionNoData : public ElfSectionData {
public:
	ElfSectionNoData(){}
	
	ElfSectionNoData(const ElfSectionNoData & aData);
	
	// ElfSection protocol
	virtual ElfSectionNoData * Clone();

	// The FileFragmentOwner protocol
	virtual void GetFileFragmentData(FileFragmentData & aFileFragmentData );
	virtual size_t Size() { return 0; }
	// Nothing to delete
	virtual void DeleteFileFragmentData(){};
	// Dont add data;
	virtual void AddData(OutputFile & aOutputFile) {};



private:
	InputFile * iInputFile;
};

class ElfSection {
public:
	ElfSection(ElfSectionData *  aData) :
		iSectionName(""), iSectionData(aData), iIndex(0)
		{}
	
	ElfSection(ElfSectionData *  aData, String aName, Elf32_Shdr & aShdr) :
		iSectionName(aName), iSectionHdr(aShdr), iSectionData(aData)
		{}
	
	ElfSection(const ElfSection & aData);
	
	ElfSection & operator=(const ElfSection & aSection);
	
	virtual ~ElfSection();
	
	String & GetName() { return iSectionName ; }
	void SetNameOffset(size_t nameOffset) { iSectionHdr.iElf32Shdr.sh_name = nameOffset; }
	
	ElfSectionHeader & GetSectionHeader() { return iSectionHdr; }
	
	void SetSize(size_t aSize) { iSectionHdr.iElf32Shdr.sh_size = aSize; }
	void SetOffset(size_t aOffset) { iSectionHdr.iElf32Shdr.sh_offset = aOffset; }
	
	virtual void AddData(OutputFile & aOutputFile);
	unsigned int GetIndex() { return iIndex; };
	void SetIndex(unsigned int aIndex) { iIndex = aIndex; };
	
private:
	String iSectionName;
	ElfSectionHeader iSectionHdr;
	ElfSectionData * iSectionData;
	unsigned int	iIndex;
};

#endif /*ELFSECTION_H_*/