aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorPaul Gilbert2012-02-20 22:30:46 +1100
committerPaul Gilbert2012-02-20 22:30:46 +1100
commit0f3614b043816238a9334f6cde9fa477ecbf00ff (patch)
tree8cf841a4b92b2e4ec5298e0519efd4e9a348603d /engines
parentd77253fbe592714e57b87a258fb403e1ea84d17a (diff)
downloadscummvm-rg350-0f3614b043816238a9334f6cde9fa477ecbf00ff.tar.gz
scummvm-rg350-0f3614b043816238a9334f6cde9fa477ecbf00ff.tar.bz2
scummvm-rg350-0f3614b043816238a9334f6cde9fa477ecbf00ff.zip
TSAGE: Implemented method for getting a resource section entry
This will be needed for streaming data directly from the resource file without fully loading the resource.
Diffstat (limited to 'engines')
-rw-r--r--engines/tsage/resources.cpp62
-rw-r--r--engines/tsage/resources.h5
2 files changed, 56 insertions, 11 deletions
diff --git a/engines/tsage/resources.cpp b/engines/tsage/resources.cpp
index 824f20e9b2..f6f870be20 100644
--- a/engines/tsage/resources.cpp
+++ b/engines/tsage/resources.cpp
@@ -135,7 +135,7 @@ uint16 BitReader::readToken() {
/*-------------------------------------------------------------------------*/
TLib::TLib(MemoryManager &memManager, const Common::String &filename) :
- _memoryManager(memManager) {
+ _filename(filename), _memoryManager(memManager) {
// If the resource strings list isn't yet loaded, load them
if (_resStrings.size() == 0) {
@@ -158,25 +158,35 @@ TLib::~TLib() {
_resStrings.clear();
}
+/**
+ * Load a section index from the given position in the file
+ */
void TLib::loadSection(uint32 fileOffset) {
_resources.clear();
_file.seek(fileOffset);
_sections.fileOffset = fileOffset;
- if (_file.readUint32BE() != 0x544D492D)
+ loadSection(_file, _resources);
+}
+
+/**
+ * Inner logic for decoding a section index into a passed resource list object
+ */
+void TLib::loadSection(Common::File &f, ResourceList &resources) {
+ if (f.readUint32BE() != 0x544D492D)
error("Data block is not valid Rlb data");
- /*uint8 unknown1 = */_file.readByte();
- uint16 numEntries = _file.readByte();
+ /*uint8 unknown1 = */f.readByte();
+ uint16 numEntries = f.readByte();
for (uint i = 0; i < numEntries; ++i) {
- uint16 id = _file.readUint16LE();
- uint16 size = _file.readUint16LE();
- uint16 uncSize = _file.readUint16LE();
- uint8 sizeHi = _file.readByte();
- uint8 type = _file.readByte() >> 5;
+ uint16 id = f.readUint16LE();
+ uint16 size = f.readUint16LE();
+ uint16 uncSize = f.readUint16LE();
+ uint8 sizeHi = f.readByte();
+ uint8 type = f.readByte() >> 5;
assert(type <= 1);
- uint32 offset = _file.readUint32LE();
+ uint32 offset = f.readUint32LE();
ResourceEntry re;
re.id = id;
@@ -185,7 +195,7 @@ void TLib::loadSection(uint32 fileOffset) {
re.size = ((sizeHi & 0xF) << 16) | size;
re.uncompressedSize = ((sizeHi & 0xF0) << 12) | uncSize;
- _resources.push_back(re);
+ resources.push_back(re);
}
}
@@ -443,6 +453,36 @@ bool TLib::getMessage(int resNum, int lineNum, Common::String &result, bool supp
/*--------------------------------------------------------------------------*/
+/**
+ * Open up the main resource file and get an entry from the root section
+ */
+bool TLib::getSectionEntry(Common::File &f, ResourceType resType, int rlbNum, int resNum,
+ ResourceEntry &resEntry) {
+ // Try and open the resource file
+ if (!f.open(_filename))
+ return false;
+
+ // Load the root section index
+ ResourceList resList;
+ loadSection(f, resList);
+
+ // Loop through the index for the desired entry
+ ResourceList::iterator iter;
+ for (iter = _resources.begin(); iter != _resources.end(); ++iter) {
+ ResourceEntry &re = *iter;
+ if (re.id == resNum) {
+ // Found it, so exit
+ resEntry = re;
+ return true;
+ }
+ }
+
+ // No matching entry found
+ return false;
+}
+
+/*--------------------------------------------------------------------------*/
+
ResourceManager::~ResourceManager() {
for (uint idx = 0; idx < _libList.size(); ++idx)
delete _libList[idx];
diff --git a/engines/tsage/resources.h b/engines/tsage/resources.h
index 0410fa3f42..2b5561b184 100644
--- a/engines/tsage/resources.h
+++ b/engines/tsage/resources.h
@@ -145,10 +145,12 @@ private:
MemoryManager &_memoryManager;
private:
Common::File _file;
+ Common::String _filename;
ResourceList _resources;
SectionList _sections;
void loadSection(uint32 fileOffset);
+ void loadSection(Common::File &f, ResourceList &resources);
void loadIndex();
public:
TLib(MemoryManager &memManager, const Common::String &filename);
@@ -159,6 +161,8 @@ public:
bool getPalette(int paletteNum, byte *palData, uint *startNum, uint *numEntries);
byte *getSubResource(int resNum, int rlbNum, int index, uint *size, bool suppressErrors = false);
bool getMessage(int resNum, int lineNum, Common::String &result, bool suppressErrors = false);
+
+ bool getSectionEntry(Common::File &f, ResourceType resType, int rlbNum, int resNum, ResourceEntry &resEntry);
};
class ResourceManager {
@@ -174,6 +178,7 @@ public:
void getPalette(int paletteNum, byte *palData, uint *startNum, uint *numEntries, bool suppressErrors = false);
byte *getSubResource(int resNum, int rlbNum, int index, uint *size, bool suppressErrors = false);
Common::String getMessage(int resNum, int lineNum, bool suppressErrors = false);
+ TLib &first() { return **_libList.begin(); }
};