int main () { readMaster(); writeLangList(); checkMissing(); writeMasterKeys(); return 0; }
/**** DSA1: SCHICK.DAT / BLADE.DAT ****************************************/ bool DSA1Main::read(istream& strm) { if (config->mode == 'm') return true; readMaster(config->archive_name); file_size = filesize(strm); header_size = 308*4; DSA1Main_Entry* oldentry = 0; for (u32 i=0; i<308; i++) { DSA1Main_Entry* entry = dynamic_cast<DSA1Main_Entry*>(entries[i]); assert(entry != 0); entry->read(strm); if (oldentry) oldentry->size = entry->offset - oldentry->offset; // Hat outro.xmi einen ungültigen Offset, geht die Datei davor zum Archivende. if (i == 307 && entry->offset == 0) { oldentry->size = file_size - oldentry->offset; } oldentry = entry; } // Hat outro.xmi (wie im Originalarchiv) einen ungültigen Offset, wird sie // als leer ausgegeben. Ansonsten wird sie wie jede normale Datei behandelt. if (oldentry->offset == 0) oldentry->size = 0; else oldentry->size = file_size - oldentry->offset; return true; }
errcode DSA1Intro::a_create(Config* config) { std::ofstream ofs_dir(config->archive_name.c_str(), std::ios::binary); if (!ofs_dir.good()) { cerror << "could not write archive directory '" << config->archive_name << "'" << std::endl; exit(1); } // Dateigrößen feststellen CmdlineList::iterator f = config->fileList.begin(); while (f != config->fileList.end()) { std::ifstream ifs(f->second.name.c_str(), std::ios::binary); if (ifs.good()) { f->second.size = filesize(ifs); f++; } else { std::cerr << "Warning: Could not open "<< f->second.name << std::endl; CmdlineList::iterator temp = f; temp++; config->fileList.erase(f); f = temp; } ifs.close(); } // Header schreiben readMaster(config->archive_name); synchronize(config->fileList); write(ofs_dir); ofs_dir.close(); // Dateien schreiben for(FileList::iterator f = entries.begin(); f != entries.end(); f++) { DSA1Intro_Entry* entry = dynamic_cast<DSA1Intro_Entry*>(*f); assert(entry != 0); Cmdline_Entry cmde = config->fileList.find(entry->name)->second; std::ifstream ifs(cmde.name.c_str(), std::ios::binary); std::fstream ofs; string volname = ""; if (ifs.good()) { /*if (volname != entry->volname) { if (ofs.is_open()) ofs.close(); ofs.open(entry->volname.c_str(), std::ios::binary); if (!ofs.good()) { cerror << "could not write archive volume '" << config->archive_name << "'" << std::endl; exit(-1); } }*/ // TODO: Dieser Modus (app) bereitet Schwierigkeiten beim Überschreiben. ofs.open(entry->volname.c_str(), std::ios::binary | std::ios::out | std::ios::in); if (!ofs.good()) { cerror << "could not write archive volume '" << config->archive_name << "'" << std::endl; exit(-1); } ifs.seekg(0); ofs.seekp(entry->offset, std::ios::beg); std::cout << "writing from " << cmde.name << ":"<<ifs.tellg()<< " to " << entry->volname << ":"<<entry->offset<<" ["<<entry->size <<"]"<< std::endl; copy(ifs, ofs, entry->size); ofs.close(); } else { std::cerr << "Error reading file »" << cmde.name <<"«"<< std::endl; exit(0); } ofs.close(); ifs.close(); } return ERR_OK; }