X-Git-Url: http://git.tdb.fi/?p=libs%2Fdatafile.git;a=blobdiff_plain;f=tool%2Fpacker.cpp;h=2e773a21a04a12dd8139bda0bb1c7acee20d0b15;hp=fa4d7e236a943ba3361507cb5ff0b2bcf559415a;hb=83971ed7f55794a61e1d249c59867184a6eb97ba;hpb=52fb63aded47733fa67e871ce0bd360b9eea7468 diff --git a/tool/packer.cpp b/tool/packer.cpp index fa4d7e2..2e773a2 100644 --- a/tool/packer.cpp +++ b/tool/packer.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -57,6 +58,8 @@ void Packer::pack_file(const string &fn) ObjectList objects; 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_unknown(in, *tmp_file); @@ -91,6 +94,15 @@ bool Packer::detect_data(IO::Seekable &in) 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) { DataFile::Parser parser(in, fn); @@ -123,6 +135,14 @@ void Packer::transfer_datafile(IO::Base &in, const string &fn, IO::Base &out, Ob delete writer; } +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())