X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=tool%2Fpacker.cpp;h=d54d333e3affc244e80ce9653cbc4867f66f43fe;hb=HEAD;hp=46dd5d242ffc652cf9547bf7eb68bb76bb946a19;hpb=ffbc4b86547b788225895a868b48d602cb1bc139;p=libs%2Fdatafile.git diff --git a/tool/packer.cpp b/tool/packer.cpp index 46dd5d2..2e773a2 100644 --- a/tool/packer.cpp +++ b/tool/packer.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -13,11 +14,10 @@ using namespace Msp; Packer::Packer(DataTool &t): tool(t), tmp_file(tempfile()), - tmp_buf(new IO::Buffered(*tmp_file)), dir_alloc(0) { } -IO::File *Packer::tempfile() +IO::BufferedFile *Packer::tempfile() { FS::Path tmpdir; const char *tmp_env = getenv("TMPDIR"); @@ -31,7 +31,7 @@ IO::File *Packer::tempfile() try { FS::Path filename = tmpdir/format("mspdatatool.%d", i); - IO::File *file = new IO::File(filename.str(), IO::M_RDWR, IO::File::C_NEW); + IO::BufferedFile *file = new IO::BufferedFile(filename.str(), IO::M_RDWR, IO::File::C_NEW); FS::unlink(filename.str()); return file; } @@ -44,7 +44,6 @@ IO::File *Packer::tempfile() Packer::~Packer() { - delete tmp_buf; delete tmp_file; } @@ -57,14 +56,12 @@ void Packer::pack_file(const string &fn) IO::BufferedFile in(fn); ObjectList objects; - bool raw = detect_raw(in); - if(raw) - transfer_raw(in, *tmp_file); + if(detect_data(in)) + transfer_datafile(in, fn, *tmp_file, objects); + else if(detect_raw(in)) + transfer_raw_data(in, fn, *tmp_file); else - { - transfer_datafile(in, fn, *tmp_buf, objects); - tmp_buf->flush(); - } + transfer_unknown(in, *tmp_file); unsigned length = tmp_file->tell()-offset; @@ -77,12 +74,12 @@ void Packer::pack_file(const string &fn) dir_alloc += 100+objects.size()*100; } -bool Packer::detect_raw(IO::Seekable &in) +bool Packer::detect_data(IO::Seekable &in) { IO::SeekOffset offset = in.tell(); - bool raw = false; + bool data = true; DataFile::Parser parser(in, "-"); - while(!raw && parser && in.tell()<10240) + while(data && parser && in.tell()<10240) { try { @@ -90,11 +87,20 @@ bool Packer::detect_raw(IO::Seekable &in) } catch(...) { - raw = true; + data = false; } } in.seek(offset, IO::S_BEG); - return raw; + return data; +} + +bool Packer::detect_raw(IO::Seekable &in) +{ + char header[4] = { }; + IO::SeekOffset offset = in.tell(); + in.read(header, sizeof(header)); + in.seek(offset, IO::S_BEG); + return DataFile::RawData::detect_signature(string(header, sizeof(header))); } void Packer::transfer_datafile(IO::Base &in, const string &fn, IO::Base &out, ObjectList &objects) @@ -129,7 +135,15 @@ void Packer::transfer_datafile(IO::Base &in, const string &fn, IO::Base &out, Ob delete writer; } -void Packer::transfer_raw(IO::Base &in, IO::Base &out) +void Packer::transfer_raw_data(IO::Base &in, const string &fn, IO::Base &out) +{ + DataFile::RawData raw; + raw.open_io(in, fn); + raw.load(); + raw.write_io(out, tool.is_compressed()); +} + +void Packer::transfer_unknown(IO::Base &in, IO::Base &out) { while(!in.eof()) { @@ -170,12 +184,14 @@ void Packer::create_pack(const string &fn) IO::File out(fn, IO::M_WRITE); out.write(&dir_buffer[0], base_offset); tmp_file->seek(0, IO::S_BEG); + unsigned bufsize = 1048576; + char *buf = new char[bufsize]; while(!tmp_file->eof()) { - char buf[16384]; - unsigned len = tmp_file->read(buf, sizeof(buf)); + unsigned len = tmp_file->read(buf, bufsize); if(!len) break; out.write(buf, len); } + delete[] buf; }