#ifndef _T_RESOURCE_SET_H
#define _T_RESOURCE_SET_H
#include <List.h>
#include <Locker.h>
#include <SupportDefs.h>
class BBitmap;
class BResources;
class BDataIO;
class BString;
namespace TResourcePrivate {
class TypeItem;
class TypeList;
}
using namespace TResourcePrivate;
const uint32 B_STRING_BLOCK_TYPE = 'SBLK';
class TStringBlock {
public:
TStringBlock(BDataIO* data);
TStringBlock(const void* block, size_t size);
virtual ~TStringBlock();
const char* String(size_t index) const;
private:
size_t PreIndex(char* strings, ssize_t len);
void MakeIndex(const char* strings, ssize_t len, size_t indexLen,
size_t* outIndex);
size_t fNumEntries;
size_t* fIndex;
char* fStrings;
bool fOwnData;
};
class TResourceSet {
public:
TResourceSet();
virtual ~TResourceSet();
status_t AddResources(BResources* resources);
status_t AddDirectory(const char* fullPath);
status_t AddEnvDirectory(const char* envPath,
const char* defaultValue = NULL);
const void* FindResource(type_code type, int32 id, size_t* outSize);
const void* FindResource(type_code type, const char* name, size_t* outSize);
const BBitmap* FindBitmap(type_code type, int32 id);
const BBitmap* FindBitmap(type_code type, const char* name);
const TStringBlock* FindStringBlock(type_code type, int32 id);
const TStringBlock* FindStringBlock(type_code type, const char* name);
const char* FindString(type_code type, int32 id, uint32 index);
const char* FindString(type_code type, const char* name, uint32 index);
private:
status_t ExpandString(BString* out, const char* in);
TypeList* FindTypeList(type_code type);
TypeItem* FindItemID(type_code type, int32 id);
TypeItem* FindItemName(type_code type, const char* name);
TypeItem* LoadResource(type_code type, int32 id, const char* name,
TypeList** inoutList = NULL);
BBitmap* ReturnBitmapItem(type_code type, TypeItem* from);
TStringBlock* ReturnStringBlockItem(TypeItem* from);
BLocker fLock;
BList fResources;
BList fDirectories;
BList fTypes;
};
TResourceSet* AppResSet();
#endif