]> git.tdb.fi Git - libs/datafile.git/blobdiff - tool/packer.cpp
Cosmetic changes
[libs/datafile.git] / tool / packer.cpp
index d54d333e3affc244e80ce9653cbc4867f66f43fe..2e773a21a04a12dd8139bda0bb1c7acee20d0b15 100644 (file)
@@ -1,4 +1,5 @@
 #include <msp/datafile/parser.h>
+#include <msp/datafile/rawdata.h>
 #include <msp/datafile/statement.h>
 #include <msp/datafile/writer.h>
 #include <msp/fs/utils.h>
@@ -55,11 +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);
-       else
+       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);
 
        unsigned length = tmp_file->tell()-offset;
 
@@ -72,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
                {
@@ -85,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)
@@ -124,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())
        {