diff options
author | Paul Gilbert | 2016-02-14 17:44:53 -0500 |
---|---|---|
committer | Paul Gilbert | 2016-02-14 17:44:53 -0500 |
commit | 84c24b08079bc787e17995868fdd426f0a58d3da (patch) | |
tree | ddac24a2abccdf037a5c782de706e1f527c1ee82 /engines | |
parent | 3f59b21c3bb6c22bbf0a642bb0d10726af1c85ab (diff) | |
download | scummvm-rg350-84c24b08079bc787e17995868fdd426f0a58d3da.tar.gz scummvm-rg350-84c24b08079bc787e17995868fdd426f0a58d3da.tar.bz2 scummvm-rg350-84c24b08079bc787e17995868fdd426f0a58d3da.zip |
TITANIC: Beginnings of CompressedFile class
Diffstat (limited to 'engines')
-rw-r--r-- | engines/titanic/files.cpp | 79 | ||||
-rw-r--r-- | engines/titanic/files.h | 38 |
2 files changed, 113 insertions, 4 deletions
diff --git a/engines/titanic/files.cpp b/engines/titanic/files.cpp index 814746ecda..a49c47a9ab 100644 --- a/engines/titanic/files.cpp +++ b/engines/titanic/files.cpp @@ -28,6 +28,10 @@ namespace Titanic { SimpleFile::SimpleFile() { } +SimpleFile::~SimpleFile() { + _file.close(); +} + void SimpleFile::open(const Common::String &name, FileMode mode) { assert(mode == FILE_READ); if (!_file.open(name)) @@ -39,11 +43,12 @@ void SimpleFile::close() { } void SimpleFile::safeRead(void *dst, size_t count) { - if (_file.read(dst, count) != count) + assert(_file.isOpen()); + if (unsafeRead(dst, count) != count) error("Could not read %d bytes", count); } -int SimpleFile::unsafeRead(void *dst, size_t count) { +size_t SimpleFile::unsafeRead(void *dst, size_t count) { return _file.read(dst, count); } @@ -164,4 +169,74 @@ double SimpleFile::readFloat() { return floatValue; } +/*------------------------------------------------------------------------*/ + +CompressedFile::CompressedFile() : SimpleFile() { + _field48 = 0; + _isReading = 0; + _field260 = 0; + _mode = 0; +} + +CompressedFile::~CompressedFile() { +} + +void CompressedFile::open(const Common::String &name, FileMode mode) { + SimpleFile::open(name, mode); + + if (mode == FILE_READ) { + validate(&_mode, "1.0.4", 0x38); + _field48 = 2; + } else if (mode == FILE_WRITE) { + validate(&_mode, "1.0.4", 0x38); + } +} +void CompressedFile::close() { + _queue.clear(); + SimpleFile::close(); +} + +size_t CompressedFile::unsafeRead(void *dst, size_t count) { + assert(_file.isOpen()); + if (count == 0) + return 0; + + // Ensure there's enough data queued in the buffer + decompress(); + + // Pass the data to the output buffer + size_t bytesRead = 0; + byte *dataPtr = (byte *)dst; + + while (count > 0) { + if (_queue.empty()) { + decompress(); + + } + + *dataPtr++ = _queue.pop(); + ++bytesRead; + --count; + } + + return bytesRead; +} + +void CompressedFile::validate(int *mode, const char *version, int v3) { + validate2(mode, 15, version, v3); +} + +int CompressedFile::validate2(int *mode, int v15, const char *version, int v3) { + if (!version || *version != '1' || v3 != 0x38) + return -6; + if (!mode) + return -2; + + // TODO +} + +void CompressedFile::decompress() { + +} + } // End of namespace Titanic diff --git a/engines/titanic/files.h b/engines/titanic/files.h index d8810dc84c..a1fb741602 100644 --- a/engines/titanic/files.h +++ b/engines/titanic/files.h @@ -25,6 +25,7 @@ #include "common/scummsys.h" #include "common/file.h" +#include "common/queue.h" #include "titanic/string.h" namespace Titanic { @@ -32,10 +33,11 @@ namespace Titanic { enum FileMode { FILE_READ = 1, FILE_WRITE = 2 }; class SimpleFile { -public: +protected: Common::File _file; public: SimpleFile(); + virtual ~SimpleFile(); /** * Open a file for access @@ -55,7 +57,7 @@ public: /** * Read from the file */ - virtual int unsafeRead(void *dst, size_t count); + virtual size_t unsafeRead(void *dst, size_t count); /** * Read a string from the file @@ -74,7 +76,39 @@ public: }; class CompressedFile : public SimpleFile { +private: + Common::Queue<byte> _queue; + int _field48; + int _isReading; + int _field260; + int _mode; + + /** + * Decompress data from the source file + */ + void decompress(); + + void validate(int *mode, const char *version, int v3); + + int validate2(int *mode, int v15, const char *version, int v3); +public: + CompressedFile(); + virtual ~CompressedFile(); + + /** + * Open a file for access + */ + virtual void open(const Common::String &name, FileMode mode = FILE_READ); + + /** + * Close the file + */ + virtual void close(); + /** + * Read from the file + */ + virtual size_t unsafeRead(void *dst, size_t count); }; } // End of namespace Titanic |