Subversion Repositories spk

Rev

Rev 88 | Rev 115 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 cycrow 1
// File.h: interface for the C_File class.
2
//
3
//////////////////////////////////////////////////////////////////////
4
 
5
/*
6
File class, Created by Matthew Gravestock (Cycrow)
7
 
8
	This class handles the store of data for each of the file in the package.
9
	It also includes all the compression functions to compress and uncompress the files from the package
10
 
11
	Enums:
12
		Compression Type - The type of compression for each section and file, theres currently 3 types
13
			7Zip - Compress via 7Zip compression, only works on windows version, but linux version can decompress them. Default for file data on Windows version
14
			ZLIB - Compress via the ZLIB libray, ie Zip copression. Default compression for headers on all versions, and file data on Linux Version
15
			None - No compression, just write in plain text (Not really used, prodcudes much larger files)
16
 
17
		FileType - This is what type of file they are, deterimes how and where the file is installed
18
			Script - A script file, goes into the X3/Scripts directory
19
			Text - A Text file, ie 447532.xml, contains all text data used by script/mod.  Goes in the X3/t directory
20
			Readme - A Readme .txt file, can be displayed in installer in Rich Text format
21
			Map - A Map script, these are xml files that create a new universe
22
			Mod - .cat/.dat file pair, can also be a fake patch if named as a number, ie 01.cat
23
			Uninstall - An uninstall script, only goes to X3/Scripts directory when plugin is uninstalled, allows plugins to clean themselves when removed
24
			Sound - Soundtrack files, goes in the X3/Soundtrack directory, used for the sector music
25
			Screen - Screen shot file, goes in the X3/loadscr directory, will be displayed as a loading screen
26
			Extra - Any other file that doesn't fit in the section, can be placed in any directory thats required
27
 
28
		Error - Stores the last error found (currently only used for a few errors)
29
			None - No error, function was successful
30
			Malloc - Error trying to malloc memory space, possible cause (Not enough memory)
31
			Fileopen - Unable to open the file, possible cause (File doesn't exist)
32
			Fileread - Error trying to read a file, happens after the file is open
33
 
34
	Class includes all files needed for both 7Zip and ZLIB Libraries, and acts as the path between them
35
 
36
	Functions (Windows Only):
37
		LZMAEncodeData - Encodes a data stream using 7Zip, returns the encoded data as char array
38
		LZMADecodeData - Decodes a compressed stream using 7Zip, returns the uncompressed data
39
		LZMAEncodeFile - Encodes a file stream using 7Zip, writes to another file
40
		LZMADecodeFile - Decodes a file stream using 7Zip, writes uncomressed data to file
41
 
42
	Classes
43
		CProgressInfo - Used to store progress info, basse class that needs to be dervived from to handle the progress update.
44
						When decoding multi files, calls DoingFile() for each functions, allows class to display the current progress of the file
45
						ProgressUpdated() is called for each progress, as the processed size and max size
46
		CProgressInfo7Zip (Windows Only) - 7Zip specific progress, dervive from this for using progress on 7Zip Compression. (Currently no progress for ZLIB)
47
 
48
	C_File:
49
		The files here are stored in 1 of 2 ways, either file data, or a file pointer
50
 
51
		File Data:
52
			Uses the m_sData and m_lDataSize varibles.  As well as the m_iDataCompression.
53
			This method is used when reading the file to memory, either from a file or direct from the SPK Package.
54
			This can be stored in compressed form so when writing the SPK File, it doesn't need to be compressed again.
55
			CompressData() will compress the current data stream to m_sData, changes m_lDataSize and m_iDataCompression to match
56
			UncomressData() will uncompress the data, it can either uncomress and return the uncomressed data stream, without effecting m_sData,
57
			or it can change m_sData to the uncompressed data.
58
 
59
		File Pointer:
60
			When adding a new file, it will be first added as a pointer, this means that there is no data loaded, it just points to a filename on disk.
61
			ReadFileSize() will read the size of the file to m_lSize
62
			ReadLastModifed() will read the modified data tag of the file and store it in the class
63
			ReadFromFile() will open and read the file to the data stream, m_sData, the compression will be set to None.
64
			ReadFromFile (FILE *id) will read from a currently open file stream into the data, can be used to read a file from an existing SPK Package
65
 
66
 
67
*/
68
 
69
#if !defined(AFX_FILE_H__A0C15B81_4FD1_40D7_8EE8_2ECF5824BB8B__INCLUDED_)
70
#define AFX_FILE_H__A0C15B81_4FD1_40D7_8EE8_2ECF5824BB8B__INCLUDED_
71
 
72
#if _MSC_VER > 1000
73
#pragma once
74
#endif // _MSC_VER > 1000
75
 
32 cycrow 76
#define LZMA_LEVEL	5
77
#define LZMA_DICT	(1 << 26)
78
 
79
#define PCKHEADERSIZE 10
80
#define DEFAULT_COMPRESSION_LEVEL	5
81
 
94 cycrow 82
#include "spkdefines.h"
1 cycrow 83
#include "File_IO.h"
32 cycrow 84
#include "zlib/zlib.h"
1 cycrow 85
//#include "x2bc/x2bc_common/bob_dom.h"
86
//#include "x2bc/x2bc_common/bob_realfile_stream.h"
87
 
88
// compression type
89
enum { SPKCOMPRESS_NONE, SPKCOMPRESS_ZLIB, SPKCOMPRESS_7ZIP, SPKCOMPRESS_LZMA, SPKCOMPRESS_BEST };
90
// file type
32 cycrow 91
typedef enum {
92
	FILETYPE_SCRIPT,
93
	FILETYPE_TEXT,
94
	FILETYPE_README,
95
	FILETYPE_MAP,
96
	FILETYPE_MOD,
97
	FILETYPE_UNINSTALL,
98
	FILETYPE_SOUND,
99
	FILETYPE_EXTRA,
100
	FILETYPE_SCREEN,
101
	FILETYPE_MISSION,
102
	FILETYPE_ADVERT,
103
	FILETYPE_SHIPOTHER,
104
	FILETYPE_SHIPMODEL,
105
	FILETYPE_SHIPSCENE,
106
	FILETYPE_COCKPITSCENE,
107
	FILETYPE_MAX,
108
	FILETYPE_BACKUP 
109
} FileType;
110
 
18 cycrow 111
// special file types used internally
112
enum {
113
	FILETYPE_SCRIPT_UNINSTALL		= 1000,
114
};
1 cycrow 115
// error
116
enum {SPKERR_NONE, SPKERR_MALLOC, SPKERR_FILEOPEN, SPKERR_FILEREAD, SPKERR_UNCOMPRESS, SPKERR_WRITEFILE, SPKERR_CREATEDIRECTORY, SPKERR_FILEMISMATCH};
117
enum {STATUS_NONE, STATUS_COMPRESS, STATUS_WRITE};
118
 
119
 
120
bool IsDataPCK ( const unsigned char *data, size_t size );
121
unsigned char SPKEXPORT *UnPCKData ( unsigned char *data, size_t datasize, size_t *len, bool nocrypt );
122
unsigned char SPKEXPORT *UnPCKFile ( const char *file, size_t *len, bool nocrypt );
123
unsigned char SPKEXPORT *UnPCKData ( unsigned char *data, size_t datasize, size_t *len );
124
int ReadScriptVersionFromData ( unsigned char *data, long size );
125
bool ReadSignedFromData ( unsigned char *data, long size );
126
 
127
struct SMultiSpkFile;
128
 
129
class C_File;
130
class SPKEXPORT CProgressInfo
131
{
132
public:
133
	CProgressInfo () { m_bDoIn = false; m_lMaxSize = 0; m_bDoHalf = false; m_bSecondHalf = false; m_bDoSecond = false; m_iStatus = -1; m_iDone = 0;}
134
 
135
	void SetIn ( bool in ) { m_bDoIn = in; }
136
	void SetMax ( long max ) { m_lMaxSize = max; }
137
	void DoHalf() { m_bDoHalf = true; m_bSecondHalf = false; }
138
	void SecondHalf() { m_bSecondHalf = true; }
139
	void SwitchSecond() { m_bDoSecond = !m_bDoSecond; }
140
	bool IsSecond() { return m_bDoSecond; }
141
	void UpdateStatus(int i ) { m_iStatus = i; StatusUpdated(i); }
142
	int  GetStatus() { return m_iStatus; }
143
	void IncDone(int i) { m_iDone += i; }
144
	void UpdateProgress ( const long cur, const long max )
145
	{
146
		if ( !m_bDoSecond )
147
			ProgressUpdated(cur, max);
148
		else
149
			ProgressUpdated2(cur, max);
150
	}
151
	void UpdateFile(C_File *f) { DoingFile(f); }
152
	void UpdatePackage(SMultiSpkFile *f) { DoingPackage(f); }
153
	unsigned long *GetDonePointer() { return &m_iDone; }
154
	unsigned long GetDone() { return m_iDone; }
155
	void SetDone(int i) { m_iDone = i; }
156
 
157
protected:
158
	virtual void ProgressUpdated ( const long cur, const long max ) = 0;
159
	virtual void ProgressUpdated2 ( const long cur, const long max ) { };
160
	virtual void StatusUpdated(int i) { }
161
	virtual void DoingFile ( C_File *file ) = 0;
162
	virtual void DoingPackage ( SMultiSpkFile *file ) { }
163
 
164
	bool m_bDoIn;
165
	long m_lMaxSize;
166
	bool m_bDoHalf;
167
	bool m_bSecondHalf;
168
	bool m_bDoSecond;
169
	int	 m_iStatus;
170
 
171
	unsigned long m_iDone;
172
};
173
 
174
 
175
class SPKEXPORT CProgressInfoDone : public CProgressInfo
176
{
177
public:
178
	CProgressInfoDone () : CProgressInfo() { m_pOnFile = NULL; m_bDontDoMax = false; m_pOnPackage = NULL; }
179
 
180
	unsigned long GetMax() { return m_lMaxSize; }
181
	C_File *GetFile() { return m_pOnFile; }
182
	SMultiSpkFile *GetPackage() { return m_pOnPackage; }
183
 
184
	void DoMax() { m_bDontDoMax = false; }
185
	void DontDoMax() { m_bDontDoMax = true; }
186
 
187
protected:
188
	virtual void ProgressUpdated ( const long cur, const long max ) { m_iDone = cur; m_lMaxSize = max; }
189
	virtual void DoingFile ( C_File *file );
190
	virtual void DoingPackage ( SMultiSpkFile *package );
191
	virtual void StatusUpdated(int i) { if ( i == STATUS_WRITE ) this->DontDoMax(); }
192
 
193
	SMultiSpkFile	*m_pOnPackage;
194
	C_File			*m_pOnFile;
195
	bool			 m_bDontDoMax;
196
};
197
 
198
#include "ansi7zip/7Decoder.h"
199
 
200
#define GZ_FLAG_TEXT     1     // 0
201
#define GZ_FLAG_HCRC     2     // 1
202
#define GZ_FLAG_EXTRA    4     // 2
203
#define GZ_FLAG_FILENAME 8     // 3
204
#define GZ_FLAG_COMMENT  16    // 4
205
#define GZ_FLAG_RES1     32    // 5
206
#define GZ_FLAG_RES2     64    // 6
207
#define GZ_FLAG_RES3     128   // 7
208
 
209
class CProgressInfo2
210
{
211
public:
212
	virtual void ProgressPercent ( float percent ) = 0;
213
};
214
 
215
 
216
CyString SPKEXPORT GetFileTypeString ( int type );
217
int		 SPKEXPORT GetFileTypeFromString ( CyString type );
218
CyString SPKEXPORT FormatErrorString ( int error, CyString rest );
219
float	 SPKEXPORT GetLibraryVersion ();
220
float	 SPKEXPORT GetFileFormatVersion ();
221
 
222
class CBaseFile;
223
class SPKEXPORT C_File
224
{
225
public:
226
	static bool DoesTypeHaveExtraDir(int i)
227
	{
228
		switch (i)
229
		{
230
			case FILETYPE_EXTRA:
231
			case FILETYPE_SHIPSCENE:
232
			case FILETYPE_COCKPITSCENE:
233
			case FILETYPE_SHIPMODEL:
234
			case FILETYPE_SHIPOTHER:
235
				return true;
236
		}
237
		return false;
238
	}
239
	void ClearUsed () { m_iUsed = 0; }
240
	void IncUsed () { ++m_iUsed; }
241
	void DeleteData ();
242
	// varible setting functions
243
	void SetFileType ( int t ) { m_iFileType = t; }
244
	void SetFilename ( CyString filename );
245
	void SetName ( CyString name ) { m_sName = name; }
246
	void SetDir ( CyString dir ) { m_sDir = dir; }
247
	void SetCreationTime ( time_t time ) { m_tTime = time; }
248
	void SetFileSize ( long size ) { m_lSize = size; }
249
	void SetDataSize ( long size ) { m_lDataSize = size; }
250
	void SetUncompressedDataSize ( long size ) { m_lUncomprDataSize = size; }
251
	void SetDataCompression ( int c ) { m_iDataCompression = c; }
252
	void SetShared ( bool b ) { m_bShared = b; }
253
	void SetSigned ( bool b ) { m_bSigned = b; }
254
	void SetFullDir ( CyString dir ) { m_sFullDir = dir; }
255
	void SetInMod ( CyString s ) { m_sInMod = s; }
256
	void SetCompressedToFile ( bool b ) { m_bCompressedToFile = b; }
257
	void SetData(const unsigned char *data, size_t size) { m_sData = (unsigned char *)data, m_lDataSize = (long)size; }
43 cycrow 258
	void copyData(const unsigned char *data, size_t size);
1 cycrow 259
 
260
	// get functions
261
	int GetUsed () { return m_iUsed; }
262
	int GetLastError () { return m_iLastError; }
263
	int GetFileType () { return m_iFileType; }
264
	CyString GetFilename () { return m_sName; }
265
	CyString GetFullFilename () { return m_sFullDir + "/" + m_sName; }
266
	long GetSize () { return m_lSize; }
267
	time_t GetCreationTime () { return m_tTime; }
268
	CyString GetName () { return m_sName; }
269
	CyString GetDir() { return m_sDir; }
270
	CyString GetDataSizeString ();
271
	CyString GetUncompressedSizeString ();
272
	CyString GetDirectory ( CBaseFile *spkfile );
273
	int GetVersion () { return m_iVersion; }
274
	time_t GetLastModified() { return m_tTime; }
275
	CyString GetFileTypeString () { return ::GetFileTypeString ( m_iFileType ); }
276
	CyString GetCreationTimeString ();
277
	CyString GetTempFile () { return m_sTmpFile; }
278
	CyString GetFullDir () { return m_sFullDir; }
279
	CyString GetBaseName ();
280
	CyString GetOriginalName() { return m_sOriginalName; }
281
	CyString GetInMod() { return m_sInMod; }
282
	CyString GetSignature() { if ( !m_bUpdatedSignature ) UpdateSignature(); return m_sSignature; }
283
	void UpdateSignature();
284
	void ChangeBaseName(CyString b) { m_sName = b + "." + this->GetFileExt(); }
285
	bool RenameScript(CyString baseName);
286
	bool IsInMod() { return !m_sInMod.Empty(); }
287
 
288
	void FixOriginalName() { m_sOriginalName = m_sName; }
289
	void SetOriginalName(CyString name) { m_sOriginalName = name; }
290
 
291
	bool IsFakePatch ();
292
	bool IsAutoTextFile();
293
	int  GetTextFileID(CyString name = NullString);
294
	bool IsCompressedToFile () { return m_bCompressedToFile; }
295
	bool CompareNew ( C_File *file );
296
	CyString GetFileExt () { return m_sName.GetToken ( m_sName.NumToken('.'), '.' ); }
297
	bool CheckFileExt ( const CyString &ext ) { if ( GetFileExt().Compare(ext) ) return true; return false; }
298
	CyString ChangeFileExt(CyString ext);
299
	bool CheckPackedExtension();
300
 
301
	int GetCompressionType () { return m_iDataCompression; }
302
	long GetDataSize () { return m_lDataSize; }
303
	// returns the Uncompressed Data size, based on how the file is loaded, ie view data, view pointer, etc
304
	long GetUncompressedDataSize ()
305
	{
306
		if ( m_lUncomprDataSize )
307
			return m_lUncomprDataSize;
308
		if ( m_lSize )
309
			return m_lSize;
310
		return m_lDataSize;
311
	}
312
	CyString GetNameDirectory ( CBaseFile *spkfile );
313
 
314
	int  GetGame() { return m_iGame; }
315
	void SetGame(int i) { m_iGame = i; }
316
 
317
	unsigned char *GetData () { return m_sData; }
318
	bool IsShared () { return m_bShared; }
319
	bool IsSigned () { return m_bSigned; }
320
	bool UpdateSigned();
321
	bool ReadSignedFile();
322
 
323
	// file reading functions
324
	long ReadFileSize ();
325
	time_t ReadLastModified ();
326
	bool ReadFromFile (CyString filename);
327
	bool ReadFromFile ();
58 cycrow 328
	bool readFromFile(CFileIO &File);
329
	bool readFromFile(CFileIO &File, int lSize, bool bDoSize = true);
330
	//bool readFromFile(std::fstream &stream, long lSize, bool bDoSize = true );
1 cycrow 331
	bool ReadFromData ( char *data, long size );
332
	int ReadScriptVersion ();
333
	CyString GetFilePointer ();
88 cycrow 334
	Utils::String filePointer() const;
1 cycrow 335
 
336
	// file writing functions
337
	bool WriteToFile ( CyString filename, unsigned char * = NULL, long = 0 );
338
	bool WriteToDir ( CyString &dir, CBaseFile *, bool = true, CyString appendDir = NullString, unsigned char * = NULL, long = 0 );
339
	bool WriteFilePointer ( unsigned char *cData = NULL, long len = 0 );
340
 
341
	// file compression functions
342
	unsigned char *CompressToData(int compressionType, unsigned long *outSize, CProgressInfo *progress = NULL, int level = DEFAULT_COMPRESSION_LEVEL);
343
	bool UncompressToFile ( CyString, CBaseFile *, bool = true, CProgressInfo * = NULL );
344
	bool ChangeCompression(int compresstyp, CProgressInfo *progress);
345
	bool CompressData ( int compressionType, CProgressInfo * = NULL, int level = DEFAULT_COMPRESSION_LEVEL );
346
	bool CompressFile ( CProgressInfo * = NULL );
347
	bool UncompressData ( CProgressInfo * = NULL );
348
	unsigned char *UncompressData ( long *size, CProgressInfo * = NULL );
349
 
350
	void CopyData(C_File *, bool includeData = true);
351
 
352
	bool IsDisabled () { return m_bDisabled; }
353
	void SetDisabled ( bool b ) { m_bDisabled = b; }
354
 
355
	void MarkSkip () { m_bSkip = true; }
356
	bool Skip () { return m_bSkip; }
357
	bool CheckPCK ();
358
	bool CheckValidFilePointer ();
359
	unsigned char *UnPCKFile ( size_t *len );
360
	bool MatchFile ( C_File *file );
361
	bool UnPCKFile ();
362
	bool PCKFile();
363
 
364
	void SetPos(int i)	{ m_iPos = i; }
365
	int  GetPos()		{ return m_iPos; }
366
 
367
	bool BobDecompile();
368
	bool BodCompile();
369
 
370
	// contructor/decontructor
371
	C_File();
372
	C_File ( CyString filename );
373
	C_File ( const char *filename );
374
	virtual ~C_File();
375
 
376
protected:
377
	static int m_iTempNum; // Used when creating temp files, allows new tmp files without overrighing used ones
378
 
379
	// private functions
380
	void Reset();
381
	CyString GetFullFileToDir ( CyString dir, bool includedir, CBaseFile *file );
382
 
383
	CyString  m_sName; // just the filename
384
	CyString  m_sDir;  // the extra dir (only for extras)
385
	CyString  m_sInMod; // in a mod files
386
	CyString  m_sSignature;
387
 
388
	// file pointer varibles
389
	CyString  m_sFullDir; // the full dir path of the file (This is used for file pointers when not loaded data in file)
390
	long    m_lSize;  // size of current file pointer
391
 
392
	// Main file varibles
393
	int		m_iVersion;  // used when reading script versions
394
	bool	m_bSigned;   // signed status of file, installer only, read from file
395
	bool    m_bShared;   // is file a marked shared file (Not used much anymore)
396
	int		m_iUsed;     // used by installer, number of plugins that uses the file
397
	time_t	m_tTime;     // Creation time of the file
398
 
399
	// File data varibles
400
	long	m_lDataSize;  // size of the data stream in what ever compression is set
401
	long	m_lUncomprDataSize; // size of stream if it was uncompressed
402
	unsigned char   *m_sData;  // stores the file data if loaded in memory
403
	int		m_iDataCompression; // the current compression of m_sData
404
 
405
	int     m_iFileType; // type if file, ie Script, Text, etc
406
 
407
	bool    m_bUsedMalloc; // malloc type of m_sData, so it can use with free() or delete
408
	CyString	m_sTmpFile;
409
 
410
	bool	m_bCompressedToFile;
411
 
412
	bool    m_bSkip;
413
	bool	m_bLoaded;
414
	bool	m_bDisabled;	// if the file has be disabled
415
	bool	m_bUpdatedSignature;
416
 
417
	int		m_iPos;
418
	int		m_iGame;
419
 
420
	CyString	m_sOriginalName;
421
 
422
	int m_iLastError;
423
	bool	m_bDontDeleteData; // fix for bad data deleteion
424
};
425
 
426
#endif // !defined(AFX_FILE_H__A0C15B81_4FD1_40D7_8EE8_2ECF5824BB8B__INCLUDED_)