// Program name: cfdata.h // Programmed by: Anthony Barbachan // Programmed in: C++ (Turbo C++ 3.0 Compatable) // Purpose: Header file for a cabinet file data block object. // Version: 1.00 // Last modified on: 11/5/1998 // Version: 1.00a // Last modified on: 11/29/1998 // Changes: Removed undefined function. Fixed program name. // Version: 2.00 // Last modification date: 10-18-1999 // Changes: Replaced code with new classes' code. #ifndef __CFDBLOCK_H__ #define __CFDBLOCK_H__ #include #include #include //////////////////////////////////////////////////////////////////////////////// class cabinet_datablock_fixed_header { public: typedef unsigned long CHECKSUM; protected: dword csum; // Checksum of this CF_Data entry word compressed_size; // number of compressed bytes in this block word uncompressed_size; // number of uncompressed bytes in this block private: void clear_variables() { memset(this, 0, sizeof(*this)); } public: cabinet_datablock_fixed_header() { clear_variables(); } ~cabinet_datablock_fixed_header() {} void clear() { clear_variables(); } Error read(istream& in); Error write(ostream& out); dword get_checksum() { return csum; } void set_checksum(dword c) { csum = c; } word get_compressed_size() { return compressed_size; } void set_compressed_size(word s) { compressed_size = s; } word get_uncompressed_size() { return uncompressed_size; } void set_uncompressed_size(word s) { uncompressed_size = s; } }; //////////////////////////////////////////////////////////////////////////////// class cabinet_datablock : protected cabinet_datablock_fixed_header { protected: byte* reserved_area; // (optional) per-datablock reserved area byte* compressed_data; // compressed data bytes byte ra_size; // (optional) size of per-folder reserved area private: void clear_variables() { reserved_area = NULL; compressed_data = NULL; ra_size = (byte) 0u; } void free_buffers() { if(reserved_area != NULL) delete[] reserved_area; if(compressed_data != NULL) delete[] compressed_data; } CHECKSUM CSUMCompute(byte* pv, unsigned cb, CHECKSUM seed); public: cabinet_datablock() { clear_variables(); } ~cabinet_datablock() { free_buffers(); } void clear() { free_buffers(); clear_variables(); cabinet_datablock_fixed_header::clear(); } int read(istream& in, cabinet_header& cab_header); int write(ostream& out); int checksum_ok(void); int checksum_not_ok(void); dword get_checksum() { return csum; } word get_compressed_size() { return compressed_size; } word get_uncompressed_size() { return uncompressed_size; } const byte* get_reserved_area() { return reserved_area; } const byte* get_compressed_data() { return compressed_data; } byte get_ra_size() { return ra_size; } void compute_checksum(void); void set_reserved_area(const byte* ra, byte len); void set_compressed_data(const byte* cdata, word csize, word usize); }; //////////////////////////////////////////////////////////////////////////////// #endif