// Program name: cffile.h // Programmed by: Anthony Barbachan // Programmed in: C++ (Turbo C++ 3.0 Compatable) // Purpose: Header file for a cabinet file folder object. // Version: 1.00 // Last modified on: 11/5/1998 // Version: 1.00a // Last modified on: 11/29/1998 // Changes: Added support for directory and volume attributes. Fixed memset use. // Version: 2.00 // Last modification date: 10-18-1999 // Changes: Replaced code with new classes' code. #ifndef __CFFILE_H__ #define __CFFILE_H__ #include #include #include "bstring.h" #include "cftypes.h" //////////////////////////////////////////////////////////////////////////////// class cabinet_file_fixed_header { public: enum { CONTINUED_FROM_PREV = 0xFFFDU, CONTINUED_TO_NEXT = 0xFFFEU, CONTINUED_PREV_AND_NEXT = 0xFFFFU }; enum { A_RDONLY = 0x01, A_HIDDEN = 0x02, A_SYSTEM = 0x04, A_VOLUME = 0x08, // Gotten from Dr. Dobbs CABLIB A_DIRECTORY = 0x10, // Gotten from Dr. Dobbs CABLIB A_ARCHIVE = 0x20, A_EXECUTE = 0x40, A_NAME_IS_UTF = 0x80 }; struct Date { unsigned day: 5; unsigned month: 4; unsigned year: 7; }; struct Time { unsigned second: 5; unsigned minute: 6; unsigned hour: 5; }; protected: dword size; // uncompressed size of this file in bytes dword offset; // uncompressed offset of this file in the folder word folder; // index into the CFFOLDER area word date; // date stamp for this file word time; // time stamp for this file word attribs; // attribute flags for this file private: void clear_variables() { memset(this, 0, sizeof(*this)); } public: cabinet_file_fixed_header() { clear_variables(); } ~cabinet_file_fixed_header() {} void clear() { clear_variables(); } Error read(istream& in); Error write(ostream& out); dword get_size() { return size; } void set_size(dword len) { size = len; } dword get_offset() { return offset; } void set_offset(dword off) { offset = off; } word get_folder() { return folder; } void set_folder(word f) { folder = f; } word get_date() { return date; } void set_date(word d) { date = d; } void set_date(word m, word d, word y) { date = ((y - 1980) << 9) + (m << 5) + d; } word get_time() { return time; } void set_time(word t) { time = t; } void set_time(word h, word m, word s) { time = (h << 11) + (m << 5) + (s / 2); } word get_attribs() { return attribs; } void set_attribs(word a) { attribs = a; } int continued_from_prev() { return folder == (unsigned) CONTINUED_FROM_PREV; } int continues_in_next() { return folder == (unsigned) CONTINUED_TO_NEXT; } int continued_from_prev_and_in_next() { return folder == (unsigned) CONTINUED_PREV_AND_NEXT; } int compeletely_within_cabinet() { return (folder != (unsigned) CONTINUED_FROM_PREV) && (folder != (unsigned) CONTINUED_TO_NEXT) && (folder != (unsigned) CONTINUED_PREV_AND_NEXT); } int not_compeletely_within_cabinet() { return (folder == (unsigned) CONTINUED_FROM_PREV) || (folder == (unsigned) CONTINUED_TO_NEXT) || (folder == (unsigned) CONTINUED_PREV_AND_NEXT); } int is_readonly() { return attribs & A_RDONLY; } int is_hidden() { return attribs & A_HIDDEN; } int is_system() { return attribs & A_SYSTEM; } int is_directory() { return attribs & A_DIRECTORY; } int is_volume() { return attribs & A_VOLUME; } int is_archive() { return attribs & A_ARCHIVE; } int must_execute() { return attribs & A_EXECUTE; } int name_is_utf() { return attribs & A_NAME_IS_UTF; } // ((Year - 1980) << 9) + (Month << 5) + Day; unsigned year() { return ((Date *) &date)->year + 1980; } unsigned month() { return ((Date *) &date)->month; } unsigned day() { return ((Date *) &date)->day; } // (Hour << 11) + (Minutes << 5) + (Seconds / 2) unsigned hour() { return ((Time *) &time)->hour; } unsigned minute() { return ((Time *) &time)->minute; } unsigned second() { return ((Time *) &time)->second * 2; } int has_special_folder_number() { return (folder == (unsigned) CONTINUED_FROM_PREV) || (folder == (unsigned) CONTINUED_TO_NEXT) || (folder == (unsigned) CONTINUED_PREV_AND_NEXT); } int hasnt_special_folder_number() { return (folder != (unsigned) CONTINUED_FROM_PREV) && (folder != (unsigned) CONTINUED_TO_NEXT) && (folder != (unsigned) CONTINUED_PREV_AND_NEXT); } }; //////////////////////////////////////////////////////////////////////////////// class cabinet_file_header : public cabinet_file_fixed_header { protected: b_string name; // name of this file private: void clear_local_variables() { name.clear(); } public: cabinet_file_header() {} ~cabinet_file_header() {} void clear() { clear_local_variables(); cabinet_file_fixed_header::clear(); } Error read(istream& in); Error write(ostream& out); const char* get_name() { return (const char *) name; } void set_name(const char* n) { name = n; } void set_name(b_string& n) { name = n; } }; //////////////////////////////////////////////////////////////////////////////// #endif