// Program name: listcab.cpp // Programmed by: Anthony Barbachan // Programmed in: C++ (Turbo C++ 3.0 Compatable) // Purpose: Source file for a cabinet file object. // Version: 1.00 // Last modified on: 11/5/1998 #include #include //#include #include #include #include "cftypes.h" #include "cfheader.h" #include "cffolder.h" #include "cffile.h" #include "cfdblock.h" #include "cffdrmgr.h" #include "cfreader.h" #include "cfcreate.h" ////////////////////////////////////////**************************************** void display_header_info(cabinet_header& cfh); void display_folder_info(cabinet_folder_header& folder, word foldernumber); void display_file_info(cabinet_file_header& file, word filenumber); //void ListFilesWithInfo(CabinetFile& cf, ostream& out); void print_file_info(cabinet_file_header& file, ostream& out); ////////////////////////////////////////**************************************** int main(int argc, char *argv[]) { if(argc == 1) { int retval = 0; cabinet_creator cab; char filename[256]; if((retval = cab.open()) != OK) { cerr << "Open Error: " << retval << endl; return 1; } if((retval = cab.new_folder(cfc_folderinfo::MSZIP_COMPRESSION)) != OK) { cerr << "New Folder Error: " << retval << endl; return 1; } int n; do{ cout << "Enter filename: "; fgets(filename, 256, stdin); n = strlen (filename); if (n == 1 && filename[0] == '\n') n = 0; if(n > 0) { if (filename[n-1] == '\n') filename[n-1] = '\0'; if((retval = cab.add_file(filename)) != OK) { perror("read"); cerr << "Add file Error: " << retval << endl; cerr << "Unable to open: " << filename << endl; return 1; } } }while(n > 0); cout << "Enter filename for cabinet: "; fgets(filename, 256, stdin); n = strlen (filename); if (n > 0 && filename[n-1] == '\n') filename[n-1] = '\0'; if((retval = cab.close(filename)) != OK) { cerr << "Close Error: " << retval << endl; return 1; } return 0; } int err = 0; word pos = 0u; cabinet_reader cr; cout << "Using new codebase..." << endl; if((err = cr.open(argv[1])) != OK) { cerr << "Unable to open cabinet file: " << argv[1] << ": " << err << endl; return 1; } display_header_info(cr); cout << "Number of files within archive: " << cr.get_nfiles() << endl; char line[81]; sprintf(line, "%-31s%-15s%-15s%-9s%-10s", "Name", "Size", "Date", "Time", "Attributes"); cout << line; memset(line, '-', 80); line[80] = '\0'; cout << line; for(pos = 0u; pos < cr.get_nfiles(); pos++) { //cout << "File " << pos << ": " << cr.file(pos).get_name() << endl; print_file_info(cr.file(pos), cout); } for(int index = 2; index < argc; index++) { if((err = cr.extract(argv[index])) != OK) { cerr << "Failed to extract: " << argv[index] << endl << "Reason for failure: " << get_cabinet_error_string(err) << endl; return 1; } } cr.close(); return 0; //cerr << "Invalid syntax." << endl; /* char fname[256]; CabinetFile cf(argv[1]); if(cf.ErrorCode() != OK) { cout << "Error encountered while opening cabinet file: " << cf.error_string() << endl; return -1; } DisplayHeaderInfo(cf); for(word cell = 0u; cell < cf.NumFolders(); cell++) { DisplayFolderInfo(cf.Folder(cell), cell); } for(cell = 0u; cell < cf.NumFiles(); cell++) { DisplayFileInfo(cf.File(cell), cell); } ListFilesWithInfo(cf, cout); cout << "Enter file to extract: "; cin >> fname; // ofstream out(fname, ios::out | ios::binary); switch(cf.Extract(fname)) { case OK: cout << fname << ": extracted." << endl; //out.close(); break; case 0: cerr << fname << ": not in archive." << endl; out.close(); unlink(fname); break; default: cerr << fname << ": extraction encountered an error: " << cf.error_string() << endl; //out.close(); //unlink(fname); break; } argc = argc; */ } /****************************************************************************/ void display_header_info(cabinet_header& cfh) { cout << "This cabinet file is " << ((cfh.valid_header()) ? "" : "not ") << "valid." << endl << "This cabinet file is: " << cfh.get_size() << " bytes." << endl << "This cabinet file's version is: " << (unsigned) cfh.get_version_major() << '.' << (unsigned) cfh.get_version_minor() << endl << "This cabinet file has " << cfh.get_nfolders() << " folders." << endl << "This cabinet file has " << cfh.get_nfiles() << " files." << endl << "This cabinet is " << ((cfh.is_first()) ? "" : "not ") << "the first cabinet in this series." << endl << "This cabinet is " << ((cfh.is_last()) ? "" : "not ") << "the last cabinet in this series." << endl << "This cabinet does " << ((cfh.has_reserved_area()) ? "" : "not ") << "has reserved fields." << endl; if(cfh.has_reserved_area()) { cout << "The reserved information is: " << cfh.get_reserved_area() << endl; } if(cfh.has_prev()) { cout << "The previous cabinet is: " << cfh.get_prev_cabinet() << endl; cout << "The previous disk is: " << cfh.get_prev_disk() << endl; } if(cfh.has_next()) { cout << "The next cabinet is: " << cfh.get_next_cabinet() << endl; cout << "The next disk is: " << cfh.get_next_disk() << endl; } } /****************************************************************************/ void display_folder_info(cabinet_folder_header& folder, word foldernumber) { char buf[(sizeof(word) * 2) + 1]; sprintf(buf, "%x", folder.get_compression_type()); cout << "Folder " << foldernumber << ':' << endl << "\tnumber of data blocks: " << folder.get_ndatablocks() << endl << "\tcompression type: " << buf << endl << "\thas reserved field: " << ((folder.has_reserved_area()) ? "Yes" : "No") << endl; } /****************************************************************************/ void display_file_info(cabinet_file_header& file, word filenumber) { cout << "File " << filenumber << ':' << endl << "\tname: " << file.get_name() << endl << "\tsize: " << file.get_size() << endl << "\tin folder: " << file.get_folder() << endl << "\tdate: " << file.month() << '-' << file.day() << '-' << file.year() << endl << "\ttime: " << file.hour() << ':' << file.minute() << ':' << file.second() << endl << "\tContinued From Previous Cabinet: " << ((file.continued_from_prev()) ? "Yes" : "No") << endl << "\tContinued In Next Cabinet: " << ((file.continues_in_next()) ? "Yes" : "No") << endl << "\tContinued From Previous Cabinet and In Next Cabinet: " << ((file.continued_from_prev_and_in_next()) ? "Yes" : "No") << endl << "\tattributes: "; if(file.is_readonly()) cout << 'R'; if(file.is_hidden()) cout << 'H'; if(file.is_system()) cout << 'S'; if(file.is_archive()) cout << 'A'; if(file.must_execute()) cout << 'E'; if(file.name_is_utf()) cout << 'U'; cout << endl; } /****************************************************************************/ void print_file_info(cabinet_file_header& file, ostream& out) { char line[81]; sprintf(line, "%-26.26s %10lu %02u-%02u-%04u %02u:%02u:%02u %c%c%c%c%c%c", file.get_name(), file.get_size(), file.month(), file.day(), file.year(), file.hour(), file.minute(), file.second(), ((file.is_readonly()) ? 'R' : '-'), ((file.is_hidden()) ? 'H' : '-'), ((file.is_system()) ? 'S' : '-'), ((file.is_archive()) ? 'A' : '-'), ((file.must_execute()) ? 'E' : '-'), ((file.name_is_utf()) ? 'U' : '-')); out << line; } /****************************************************************************/