Subversion Repositories spk

Rev

Go to most recent revision | Details | 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
 
76
#define tstruct typedef struct SPKEXPORT
77
#define tclass class SPKEXPORT 
78
 
79
#include "File_IO.h"
80
//#include "x2bc/x2bc_common/bob_dom.h"
81
//#include "x2bc/x2bc_common/bob_realfile_stream.h"
82
 
83
// compression type
84
enum { SPKCOMPRESS_NONE, SPKCOMPRESS_ZLIB, SPKCOMPRESS_7ZIP, SPKCOMPRESS_LZMA, SPKCOMPRESS_BEST };
85
// file type
86
enum {FILETYPE_SCRIPT, FILETYPE_TEXT, FILETYPE_README, FILETYPE_MAP, FILETYPE_MOD, FILETYPE_UNINSTALL, FILETYPE_SOUND, FILETYPE_EXTRA, FILETYPE_SCREEN, FILETYPE_MISSION, FILETYPE_ADVERT, FILETYPE_SHIPOTHER, FILETYPE_SHIPMODEL, FILETYPE_SHIPSCENE, FILETYPE_COCKPITSCENE, FILETYPE_MAX, FILETYPE_BACKUP };
18 cycrow 87
// special file types used internally
88
enum {
89
	FILETYPE_SCRIPT_UNINSTALL		= 1000,
90
};
1 cycrow 91
// error
92
enum {SPKERR_NONE, SPKERR_MALLOC, SPKERR_FILEOPEN, SPKERR_FILEREAD, SPKERR_UNCOMPRESS, SPKERR_WRITEFILE, SPKERR_CREATEDIRECTORY, SPKERR_FILEMISMATCH};
93
enum {STATUS_NONE, STATUS_COMPRESS, STATUS_WRITE};
94
 
95
#include "zlib/zlib.h"
96
 
97
#define LZMA_LEVEL	5
98
#define LZMA_DICT	(1 << 26)
99
 
100
#define PCKHEADERSIZE 10
101
#define DEFAULT_COMPRESSION_LEVEL	5
102
 
103
bool IsDataPCK ( const unsigned char *data, size_t size );
104
unsigned char SPKEXPORT *UnPCKData ( unsigned char *data, size_t datasize, size_t *len, bool nocrypt );
105
unsigned char SPKEXPORT *UnPCKFile ( const char *file, size_t *len, bool nocrypt );
106
unsigned char SPKEXPORT *UnPCKData ( unsigned char *data, size_t datasize, size_t *len );
107
int ReadScriptVersionFromData ( unsigned char *data, long size );
108
bool ReadSignedFromData ( unsigned char *data, long size );
109
 
110
struct SMultiSpkFile;
111
 
112
class C_File;
113
class SPKEXPORT CProgressInfo
114
{
115
public:
116
	CProgressInfo () { m_bDoIn = false; m_lMaxSize = 0; m_bDoHalf = false; m_bSecondHalf = false; m_bDoSecond = false; m_iStatus = -1; m_iDone = 0;}
117
 
118
	void SetIn ( bool in ) { m_bDoIn = in; }
119
	void SetMax ( long max ) { m_lMaxSize = max; }
120
	void DoHalf() { m_bDoHalf = true; m_bSecondHalf = false; }
121
	void SecondHalf() { m_bSecondHalf = true; }
122
	void SwitchSecond() { m_bDoSecond = !m_bDoSecond; }
123
	bool IsSecond() { return m_bDoSecond; }
124
	void UpdateStatus(int i ) { m_iStatus = i; StatusUpdated(i); }
125
	int  GetStatus() { return m_iStatus; }
126
	void IncDone(int i) { m_iDone += i; }
127
	void UpdateProgress ( const long cur, const long max )
128
	{
129
		if ( !m_bDoSecond )
130
			ProgressUpdated(cur, max);
131
		else
132
			ProgressUpdated2(cur, max);
133
	}
134
	void UpdateFile(C_File *f) { DoingFile(f); }
135
	void UpdatePackage(SMultiSpkFile *f) { DoingPackage(f); }
136
	unsigned long *GetDonePointer() { return &m_iDone; }
137
	unsigned long GetDone() { return m_iDone; }
138
	void SetDone(int i) { m_iDone = i; }
139
 
140
protected:
141
	virtual void ProgressUpdated ( const long cur, const long max ) = 0;
142
	virtual void ProgressUpdated2 ( const long cur, const long max ) { };
143
	virtual void StatusUpdated(int i) { }
144
	virtual void DoingFile ( C_File *file ) = 0;
145
	virtual void DoingPackage ( SMultiSpkFile *file ) { }
146
 
147
	bool m_bDoIn;
148
	long m_lMaxSize;
149
	bool m_bDoHalf;
150
	bool m_bSecondHalf;
151
	bool m_bDoSecond;
152
	int	 m_iStatus;
153
 
154
	unsigned long m_iDone;
155
};
156
 
157
 
158
class SPKEXPORT CProgressInfoDone : public CProgressInfo
159
{
160
public:
161
	CProgressInfoDone () : CProgressInfo() { m_pOnFile = NULL; m_bDontDoMax = false; m_pOnPackage = NULL; }
162
 
163
	unsigned long GetMax() { return m_lMaxSize; }
164
	C_File *GetFile() { return m_pOnFile; }
165
	SMultiSpkFile *GetPackage() { return m_pOnPackage; }
166
 
167
	void DoMax() { m_bDontDoMax = false; }
168
	void DontDoMax() { m_bDontDoMax = true; }
169
 
170
protected:
171
	virtual void ProgressUpdated ( const long cur, const long max ) { m_iDone = cur; m_lMaxSize = max; }
172
	virtual void DoingFile ( C_File *file );
173
	virtual void DoingPackage ( SMultiSpkFile *package );
174
	virtual void StatusUpdated(int i) { if ( i == STATUS_WRITE ) this->DontDoMax(); }
175
 
176
	SMultiSpkFile	*m_pOnPackage;
177
	C_File			*m_pOnFile;
178
	bool			 m_bDontDoMax;
179
};
180
 
181
#include "ansi7zip/7Decoder.h"
182
 
183
#define GZ_FLAG_TEXT     1     // 0
184
#define GZ_FLAG_HCRC     2     // 1
185
#define GZ_FLAG_EXTRA    4     // 2
186
#define GZ_FLAG_FILENAME 8     // 3
187
#define GZ_FLAG_COMMENT  16    // 4
188
#define GZ_FLAG_RES1     32    // 5
189
#define GZ_FLAG_RES2     64    // 6
190
#define GZ_FLAG_RES3     128   // 7
191
 
192
class CProgressInfo2
193
{
194
public:
195
	virtual void ProgressPercent ( float percent ) = 0;
196
};
197
 
198
 
199
CyString SPKEXPORT GetFileTypeString ( int type );
200
int		 SPKEXPORT GetFileTypeFromString ( CyString type );
201
CyString SPKEXPORT FormatErrorString ( int error, CyString rest );
202
float	 SPKEXPORT GetLibraryVersion ();
203
float	 SPKEXPORT GetFileFormatVersion ();
204
 
205
class CBaseFile;
206
class SPKEXPORT C_File
207
{
208
public:
209
	static bool DoesTypeHaveExtraDir(int i)
210
	{
211
		switch (i)
212
		{
213
			case FILETYPE_EXTRA:
214
			case FILETYPE_SHIPSCENE:
215
			case FILETYPE_COCKPITSCENE:
216
			case FILETYPE_SHIPMODEL:
217
			case FILETYPE_SHIPOTHER:
218
				return true;
219
		}
220
		return false;
221
	}
222
	void ClearUsed () { m_iUsed = 0; }
223
	void IncUsed () { ++m_iUsed; }
224
	void DeleteData ();
225
	// varible setting functions
226
	void SetFileType ( int t ) { m_iFileType = t; }
227
	void SetFilename ( CyString filename );
228
	void SetName ( CyString name ) { m_sName = name; }
229
	void SetDir ( CyString dir ) { m_sDir = dir; }
230
	void SetCreationTime ( time_t time ) { m_tTime = time; }
231
	void SetFileSize ( long size ) { m_lSize = size; }
232
	void SetDataSize ( long size ) { m_lDataSize = size; }
233
	void SetUncompressedDataSize ( long size ) { m_lUncomprDataSize = size; }
234
	void SetDataCompression ( int c ) { m_iDataCompression = c; }
235
	void SetShared ( bool b ) { m_bShared = b; }
236
	void SetSigned ( bool b ) { m_bSigned = b; }
237
	void SetFullDir ( CyString dir ) { m_sFullDir = dir; }
238
	void SetInMod ( CyString s ) { m_sInMod = s; }
239
	void SetCompressedToFile ( bool b ) { m_bCompressedToFile = b; }
240
	void SetData(const unsigned char *data, size_t size) { m_sData = (unsigned char *)data, m_lDataSize = (long)size; }
241
 
242
	// get functions
243
	int GetUsed () { return m_iUsed; }
244
	int GetLastError () { return m_iLastError; }
245
	int GetFileType () { return m_iFileType; }
246
	CyString GetFilename () { return m_sName; }
247
	CyString GetFullFilename () { return m_sFullDir + "/" + m_sName; }
248
	long GetSize () { return m_lSize; }
249
	time_t GetCreationTime () { return m_tTime; }
250
	CyString GetName () { return m_sName; }
251
	CyString GetDir() { return m_sDir; }
252
	CyString GetDataSizeString ();
253
	CyString GetUncompressedSizeString ();
254
	CyString GetDirectory ( CBaseFile *spkfile );
255
	int GetVersion () { return m_iVersion; }
256
	time_t GetLastModified() { return m_tTime; }
257
	CyString GetFileTypeString () { return ::GetFileTypeString ( m_iFileType ); }
258
	CyString GetCreationTimeString ();
259
	CyString GetTempFile () { return m_sTmpFile; }
260
	CyString GetFullDir () { return m_sFullDir; }
261
	CyString GetBaseName ();
262
	CyString GetOriginalName() { return m_sOriginalName; }
263
	CyString GetInMod() { return m_sInMod; }
264
	CyString GetSignature() { if ( !m_bUpdatedSignature ) UpdateSignature(); return m_sSignature; }
265
	void UpdateSignature();
266
	void ChangeBaseName(CyString b) { m_sName = b + "." + this->GetFileExt(); }
267
	bool RenameScript(CyString baseName);
268
	bool IsInMod() { return !m_sInMod.Empty(); }
269
 
270
	void FixOriginalName() { m_sOriginalName = m_sName; }
271
	void SetOriginalName(CyString name) { m_sOriginalName = name; }
272
 
273
	bool IsFakePatch ();
274
	bool IsAutoTextFile();
275
	int  GetTextFileID(CyString name = NullString);
276
	bool IsCompressedToFile () { return m_bCompressedToFile; }
277
	bool CompareNew ( C_File *file );
278
	CyString GetFileExt () { return m_sName.GetToken ( m_sName.NumToken('.'), '.' ); }
279
	bool CheckFileExt ( const CyString &ext ) { if ( GetFileExt().Compare(ext) ) return true; return false; }
280
	CyString ChangeFileExt(CyString ext);
281
	bool CheckPackedExtension();
282
 
283
	int GetCompressionType () { return m_iDataCompression; }
284
	long GetDataSize () { return m_lDataSize; }
285
	// returns the Uncompressed Data size, based on how the file is loaded, ie view data, view pointer, etc
286
	long GetUncompressedDataSize ()
287
	{
288
		if ( m_lUncomprDataSize )
289
			return m_lUncomprDataSize;
290
		if ( m_lSize )
291
			return m_lSize;
292
		return m_lDataSize;
293
	}
294
	CyString GetNameDirectory ( CBaseFile *spkfile );
295
 
296
	int  GetGame() { return m_iGame; }
297
	void SetGame(int i) { m_iGame = i; }
298
 
299
	unsigned char *GetData () { return m_sData; }
300
	bool IsShared () { return m_bShared; }
301
	bool IsSigned () { return m_bSigned; }
302
	bool UpdateSigned();
303
	bool ReadSignedFile();
304
 
305
	// file reading functions
306
	long ReadFileSize ();
307
	time_t ReadLastModified ();
308
	bool ReadFromFile (CyString filename);
309
	bool ReadFromFile ();
310
	bool ReadFromFile ( FILE *id, long size, bool = true );
311
	bool ReadFromData ( char *data, long size );
312
	int ReadScriptVersion ();
313
	CyString GetFilePointer ();
314
 
315
	// file writing functions
316
	bool WriteToFile ( CyString filename, unsigned char * = NULL, long = 0 );
317
	bool WriteToDir ( CyString &dir, CBaseFile *, bool = true, CyString appendDir = NullString, unsigned char * = NULL, long = 0 );
318
	bool WriteFilePointer ( unsigned char *cData = NULL, long len = 0 );
319
 
320
	// file compression functions
321
	unsigned char *CompressToData(int compressionType, unsigned long *outSize, CProgressInfo *progress = NULL, int level = DEFAULT_COMPRESSION_LEVEL);
322
	bool UncompressToFile ( CyString, CBaseFile *, bool = true, CProgressInfo * = NULL );
323
	bool ChangeCompression(int compresstyp, CProgressInfo *progress);
324
	bool CompressData ( int compressionType, CProgressInfo * = NULL, int level = DEFAULT_COMPRESSION_LEVEL );
325
	bool CompressFile ( CProgressInfo * = NULL );
326
	bool UncompressData ( CProgressInfo * = NULL );
327
	unsigned char *UncompressData ( long *size, CProgressInfo * = NULL );
328
 
329
	void CopyData(C_File *, bool includeData = true);
330
 
331
	bool IsDisabled () { return m_bDisabled; }
332
	void SetDisabled ( bool b ) { m_bDisabled = b; }
333
 
334
	void MarkSkip () { m_bSkip = true; }
335
	bool Skip () { return m_bSkip; }
336
	bool CheckPCK ();
337
	bool CheckValidFilePointer ();
338
	unsigned char *UnPCKFile ( size_t *len );
339
	bool MatchFile ( C_File *file );
340
	bool UnPCKFile ();
341
	bool PCKFile();
342
 
343
	void SetPos(int i)	{ m_iPos = i; }
344
	int  GetPos()		{ return m_iPos; }
345
 
346
	bool BobDecompile();
347
	bool BodCompile();
348
 
349
	// contructor/decontructor
350
	C_File();
351
	C_File ( CyString filename );
352
	C_File ( const char *filename );
353
	virtual ~C_File();
354
 
355
protected:
356
	static int m_iTempNum; // Used when creating temp files, allows new tmp files without overrighing used ones
357
 
358
	// private functions
359
	void Reset();
360
	CyString GetFullFileToDir ( CyString dir, bool includedir, CBaseFile *file );
361
 
362
	CyString  m_sName; // just the filename
363
	CyString  m_sDir;  // the extra dir (only for extras)
364
	CyString  m_sInMod; // in a mod files
365
	CyString  m_sSignature;
366
 
367
	// file pointer varibles
368
	CyString  m_sFullDir; // the full dir path of the file (This is used for file pointers when not loaded data in file)
369
	long    m_lSize;  // size of current file pointer
370
 
371
	// Main file varibles
372
	int		m_iVersion;  // used when reading script versions
373
	bool	m_bSigned;   // signed status of file, installer only, read from file
374
	bool    m_bShared;   // is file a marked shared file (Not used much anymore)
375
	int		m_iUsed;     // used by installer, number of plugins that uses the file
376
	time_t	m_tTime;     // Creation time of the file
377
 
378
	// File data varibles
379
	long	m_lDataSize;  // size of the data stream in what ever compression is set
380
	long	m_lUncomprDataSize; // size of stream if it was uncompressed
381
	unsigned char   *m_sData;  // stores the file data if loaded in memory
382
	int		m_iDataCompression; // the current compression of m_sData
383
 
384
	int     m_iFileType; // type if file, ie Script, Text, etc
385
 
386
	bool    m_bUsedMalloc; // malloc type of m_sData, so it can use with free() or delete
387
	CyString	m_sTmpFile;
388
 
389
	bool	m_bCompressedToFile;
390
 
391
	bool    m_bSkip;
392
	bool	m_bLoaded;
393
	bool	m_bDisabled;	// if the file has be disabled
394
	bool	m_bUpdatedSignature;
395
 
396
	int		m_iPos;
397
	int		m_iGame;
398
 
399
	CyString	m_sOriginalName;
400
 
401
	int m_iLastError;
402
	bool	m_bDontDeleteData; // fix for bad data deleteion
403
};
404
 
405
 
406
#endif // !defined(AFX_FILE_H__A0C15B81_4FD1_40D7_8EE8_2ECF5824BB8B__INCLUDED_)