예제 #1
0
파일: genlangfiles.c 프로젝트: Kjir/amsn
int main () {

    readMaster();
    writeLangList();
    checkMissing();
    writeMasterKeys();

    return 0;
}
예제 #2
0
파일: dsa1.cpp 프로젝트: Henne/BrightEyes
/**** 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;
}
예제 #3
0
파일: dsa1.cpp 프로젝트: Henne/BrightEyes
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;
}