aboutsummaryrefslogtreecommitdiff
path: root/engines/voyeur/files.h
blob: b481a08a06d8ddb1595bccb0536cf9647f04b750 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.

 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 */

#ifndef VOYEUR_FILES_H
#define VOYEUR_FILES_H

#include "common/scummsys.h"
#include "common/file.h"
#include "common/str.h"

namespace Voyeur {

class VoyeurEngine;
class BoltGroup;
class BoltEntry;
#define DECOMPRESS_SIZE 0x7000

class BoltFile {
private:
	static BoltFile *_curLibPtr;
	static BoltGroup *_curGroupPtr;
	static BoltEntry *_curMemberPtr;
	static byte *_curMemInfoPtr;
	static int _fromGroupFlag;
	static byte _xorMask;
	static bool _encrypt;
	// TODO: Move decompression statics and methods into BoltEntry
	static int _curFilePosition;
	static int _bufferEnd;
	static int _bufferBegin;
	static int _bytesLeft;
	static int _bufSize;
	static byte *_bufP;
	static byte *_bufStart;
	static byte *_bufPos;
	static byte _decompressBuf[DECOMPRESS_SIZE];
	static int _historyIndex;
	static byte _historyBuffer[0x200];
	static int _runLength;
	static int _decompState;
	static int _runType;
	static int _runValue;
	static int _runOffset;
private:
	Common::File _curFd;
	Common::Array<BoltGroup> _groups;

	// Decompression
	byte *decompress(byte *buf, int size, int mode);
	void nextBlock();
private:
	void resolveAll() {}
	byte *getBoltMember(uint32 id);

	// Methods copied into bolt virtual table
	void initType();
	void termType() {}
	void initMem(int id) {}
	void termMem() {}
	void initGro() {}
	void termGro() {}
public:
	BoltFile();
	~BoltFile();

	bool getBoltGroup(uint32 id);
	byte *memberAddr(uint32 id);
};

class BoltGroup {
private:
	Common::SeekableReadStream *_file;
public:
	byte _loaded;
	bool _processed;
	bool _callInitGro;
	int _count;
	int _fileOffset;
	Common::Array<BoltEntry> _entries;
public:
	BoltGroup(Common::SeekableReadStream *f); 

	void load();
};


class BoltEntry {
private:
	Common::SeekableReadStream *_file;
public:
	byte _mode;
	byte _field1;
	byte _field3;
	int _fileOffset;
	byte _xorMask;
	int _size;
	byte *_data;
public:
	BoltEntry(Common::SeekableReadStream *f);
	virtual ~BoltEntry();

	void load();
};

class FilesManager {
private:
	int _decompressSize;
public:
	BoltFile *_curLibPtr;
public:
	FilesManager();

	bool openBoltLib(const Common::String &filename, BoltFile *&boltFile);
};

} // End of namespace Voyeur

#endif /* VOYEUR_VOYEUR_H */