11558Srgrimes// ResourceFile.h
250476Speter
31558Srgrimes#ifndef RESOURCE_FILE_H
412481Speter#define RESOURCE_FILE_H
51558Srgrimes
641061Sbde#include <ByteOrder.h>
741061Sbde#include <List.h>
839271Sphk
939255Sgibbs#include "OffsetFile.h"
1038653Sgpalmer
1138653Sgpalmerclass Exception;
1255980Speterclass ResourceItem;
1343859Sobrienstruct MemArea;
1438653Sgpalmerstruct resource_info;
1538653Sgpalmerstruct PEFContainerHeader;
1638653Sgpalmer
1738653Sgpalmerclass ResourceFile {
1838653Sgpalmerpublic:
1938653Sgpalmer								ResourceFile();
2038653Sgpalmer	virtual						~ResourceFile();
2138653Sgpalmer
2238653Sgpalmer			void				Init(BFile& file);	// throws Exception
2338653Sgpalmer			void				Unset();
2453644Sguido			status_t			InitCheck() const;
2554225Sguido
2638653Sgpalmer			bool				AddItem(ResourceItem* item, int32 index = -1);
2754225Sguido			ResourceItem*		RemoveItem(int32 index);
2854225Sguido			bool				RemoveItem(ResourceItem* item);
2938653Sgpalmer				int32				IndexOf(ResourceItem* item) const;
3038653Sgpalmer			ResourceItem*		ItemAt(int32 index) const;
3138653Sgpalmer			int32				CountItems() const;
3238843Sjb
3338653Sgpalmer			uint32				GetResourcesSize() const;
3438653Sgpalmer			uint32				WriteResources(void* buffer, uint32 size);
3538653Sgpalmer			void				WriteTest();
3638653Sgpalmer
3738653Sgpalmer			void				PrintToStream(bool longInfo = true);
3855980Speter
3938653Sgpalmerprivate:
4043557Ssemenu			void				_InitFile(BFile& file);
4138653Sgpalmer			void				_InitELFFile(BFile& file);
4238653Sgpalmer			void				_InitPEFFile(BFile& file,
4338653Sgpalmer									const PEFContainerHeader& pefHeader);
4438653Sgpalmer			void				_ReadHeader();
4538653Sgpalmer			void				_ReadIndex();
4638653Sgpalmer			bool				_ReadIndexEntry(int32 index,
4744690Sbrian												uint32 tableOffset,
4838653Sgpalmer												bool peekAhead);
4938653Sgpalmer			void				_ReadInfoTable();
5038653Sgpalmer			bool				_ReadInfoTableEnd(const void* data,
5138653Sgpalmer												  int32 dataSize);
5238653Sgpalmer			const void*			_ReadResourceInfo(const MemArea& area,
5338653Sgpalmer												  const resource_info* info,
5438653Sgpalmer												  type_code type,
5555163Sshin												  bool* readIndices);
5638653Sgpalmer
5738653Sgpalmer	inline	int16				_GetInt16(int16 value);
5838653Sgpalmer	inline	uint16				_GetUInt16(uint16 value);
5938653Sgpalmer	inline	int32				_GetInt32(int32 value);
6038653Sgpalmer	inline	uint32				_GetUInt32(uint32 value);
6155163Sshin
6238653Sgpalmerprivate:
6338653Sgpalmer			BList				fItems;
6438653Sgpalmer			OffsetFile			fFile;
6541061Sbde			uint32				fFileType;
6638653Sgpalmer			off_t				fFileSize;
6746878Sobrien			int32				fResourceCount;
6838653Sgpalmer			ResourceItem*		fInfoTableItem;
6938653Sgpalmer			bool				fHostEndianess;
7042117Ssos};
7142117Ssos
7210855Sjoerg// _GetInt16
7344317Sjkhinline
7452252Sbpint16
7544317SjkhResourceFile::_GetInt16(int16 value)
7644317Sjkh{
7738852Sjb	return (fHostEndianess ? value : B_SWAP_INT16(value));
7838852Sjb}
7938458Sjb
8038458Sjb// _GetUInt16
811558Srgrimesinline
82uint16
83ResourceFile::_GetUInt16(uint16 value)
84{
85	return (fHostEndianess ? value : B_SWAP_INT16(value));
86}
87
88// _GetInt32
89inline
90int32
91ResourceFile::_GetInt32(int32 value)
92{
93	return (fHostEndianess ? value : B_SWAP_INT32(value));
94}
95
96// _GetUInt32
97inline
98uint32
99ResourceFile::_GetUInt32(uint32 value)
100{
101	return (fHostEndianess ? value : B_SWAP_INT32(value));
102}
103
104
105#endif	// RESOURCE_FILE_H
106