File Annotation

Not logged in
5128eecc9f 2011-02-23        kinaba: #ifndef AFX_ZIPTOOL_H__4C5F3720_4483_11D4_8D96_88668194683D__INCLUDED_
5128eecc9f 2011-02-23        kinaba: #define AFX_ZIPTOOL_H__4C5F3720_4483_11D4_8D96_88668194683D__INCLUDED_
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: // Zip Archive Extraction ... ( XacRett #39 SubSet )
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: // ローカルヘッダ
5128eecc9f 2011-02-23        kinaba: struct ZipLocalHeader
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	// 'P' 'K' 03 04
5128eecc9f 2011-02-23        kinaba: 	 WORD ver; // version_needed_to_extract
5128eecc9f 2011-02-23        kinaba: 	 WORD flg; // general_purpose_bit_flag
5128eecc9f 2011-02-23        kinaba: 	 WORD mhd; // compression_method
5128eecc9f 2011-02-23        kinaba: 	 WORD tim; // last_modified_file_time
5128eecc9f 2011-02-23        kinaba: 	 WORD dat; // last_modified_file_date
5128eecc9f 2011-02-23        kinaba: 	DWORD crc; // crc32
5128eecc9f 2011-02-23        kinaba: 	DWORD csz; // compressed-size
5128eecc9f 2011-02-23        kinaba: 	DWORD usz; // uncompressed-size
5128eecc9f 2011-02-23        kinaba: 	 WORD fnl; // filename-len
5128eecc9f 2011-02-23        kinaba: 	 WORD exl; // extra_field_length
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	char fnm[MAX_PATH];
5128eecc9f 2011-02-23        kinaba: //	BYTE ext[];
5128eecc9f 2011-02-23        kinaba: };
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: // 圧縮メソッドの種類
5128eecc9f 2011-02-23        kinaba: enum ZipMethod
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 	Stored,		// 0
5128eecc9f 2011-02-23        kinaba: 	Shrunk,		// 1
5128eecc9f 2011-02-23        kinaba: 	Reduced1,	// 2-5
5128eecc9f 2011-02-23        kinaba: 	Reduced2,
5128eecc9f 2011-02-23        kinaba: 	Reduced3,
5128eecc9f 2011-02-23        kinaba: 	Reduced4,
5128eecc9f 2011-02-23        kinaba: 	Imploded,	// 6
5128eecc9f 2011-02-23        kinaba: 	Tokenized,	// 7 ( not supported )
5128eecc9f 2011-02-23        kinaba: 	Deflated,	// 8
5128eecc9f 2011-02-23        kinaba: 	EnhDeflated,// 9 ( not supported )
5128eecc9f 2011-02-23        kinaba: 	DclImploded,//10 ( not supported )
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	Err=178     // this value is used by xacrett (^^;
5128eecc9f 2011-02-23        kinaba: };
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: class CZipTool
5128eecc9f 2011-02-23        kinaba: {
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: public:
5128eecc9f 2011-02-23        kinaba: 	//-- 外向きインターフェイス --------------
5128eecc9f 2011-02-23        kinaba: 	bool Extract( const char* aname, const char* dll, kiPath& dll_rel_path );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: private: //-- Zip内部処理用 -----------------------
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: // CRC
5128eecc9f 2011-02-23        kinaba: 	DWORD crc32( DWORD crc, const BYTE* dat, int len );
5128eecc9f 2011-02-23        kinaba: // ファイルIO
5128eecc9f 2011-02-23        kinaba: 	FILE *zip,*out;
5128eecc9f 2011-02-23        kinaba: 	void zipwrite( BYTE* dat, int len )
5128eecc9f 2011-02-23        kinaba: 		{ fwrite( dat, 1, len, out ); }
5128eecc9f 2011-02-23        kinaba: 	int zipread( BYTE* dat, int len )
5128eecc9f 2011-02-23        kinaba: 		{ return fread( dat, 1, len, zip ); }
5128eecc9f 2011-02-23        kinaba: // bit-reader
5128eecc9f 2011-02-23        kinaba: 	unsigned long bitbuf;
5128eecc9f 2011-02-23        kinaba: 	int bits_left;
5128eecc9f 2011-02-23        kinaba: 	bool bits_eof;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	void initbits()
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			bits_eof=false, bits_left=0, bitbuf=0;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 	int getbits( int n )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			if( n <= bits_left )
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				int c = (int)(bitbuf & ((1<<n)-1));
5128eecc9f 2011-02-23        kinaba: 				bitbuf >>= n;
5128eecc9f 2011-02-23        kinaba: 				bits_left -= n;
5128eecc9f 2011-02-23        kinaba: 				return c;
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 			return fillbits( n );
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 	int fillbits( int n )
5128eecc9f 2011-02-23        kinaba: 		{
5128eecc9f 2011-02-23        kinaba: 			BYTE next;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 			if( !zipread( &next,1 ) )
5128eecc9f 2011-02-23        kinaba: 				bits_eof = true;
5128eecc9f 2011-02-23        kinaba: 			else
5128eecc9f 2011-02-23        kinaba: 			{
5128eecc9f 2011-02-23        kinaba: 				bitbuf |= (next<<bits_left);
5128eecc9f 2011-02-23        kinaba: 				bits_left += 8;
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 				if( zipread( &next,1 ) )
5128eecc9f 2011-02-23        kinaba: 				{
5128eecc9f 2011-02-23        kinaba: 					bitbuf |= (next<<bits_left);
5128eecc9f 2011-02-23        kinaba: 					bits_left += 8;
5128eecc9f 2011-02-23        kinaba: 				}
5128eecc9f 2011-02-23        kinaba: 			}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 			int c = (int)(bitbuf & ((1<<n)-1));
5128eecc9f 2011-02-23        kinaba: 			bitbuf >>= n;
5128eecc9f 2011-02-23        kinaba: 			bits_left -= n;
5128eecc9f 2011-02-23        kinaba: 			return c;
5128eecc9f 2011-02-23        kinaba: 		}
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: // 展開アルゴリズム
5128eecc9f 2011-02-23        kinaba: 	void Unstore( DWORD usz, DWORD csz );
5128eecc9f 2011-02-23        kinaba: 	void Inflate( DWORD usz, DWORD csz );
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: // ヘッダ処理
5128eecc9f 2011-02-23        kinaba: // 面倒なのでCentralDirectory系は一切無視!
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: 	// 現在のファイル位置からヘッダとして読む
5128eecc9f 2011-02-23        kinaba: 	bool read_header( ZipLocalHeader* hdr );
5128eecc9f 2011-02-23        kinaba: 	// ヘッダ位置を探し出して読む
5128eecc9f 2011-02-23        kinaba: 	bool doHeader( ZipLocalHeader* hdr );
5128eecc9f 2011-02-23        kinaba: };
5128eecc9f 2011-02-23        kinaba: 
5128eecc9f 2011-02-23        kinaba: #endif