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