aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorPaul Gilbert2016-02-14 17:44:53 -0500
committerPaul Gilbert2016-02-14 17:44:53 -0500
commit84c24b08079bc787e17995868fdd426f0a58d3da (patch)
treeddac24a2abccdf037a5c782de706e1f527c1ee82 /engines
parent3f59b21c3bb6c22bbf0a642bb0d10726af1c85ab (diff)
downloadscummvm-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.cpp79
-rw-r--r--engines/titanic/files.h38
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