+#include <cstring>
#include <stdexcept>
#include <msp/io/zlibcompressed.h>
#include "collection.h"
namespace Msp {
namespace DataFile {
+const char RawData::signature[4] = { 'M', 'D', 'R', 1 };
+
RawData::~RawData()
{
delete owned_data;
delete in;
}
+bool RawData::detect_signature(const std::string &sig)
+{
+ return !sig.compare(0, string::npos, signature, sizeof(signature));
+}
+
void RawData::open_file(Collection &coll, const string &fn)
{
if(in)
unsigned len = i.read(header, sizeof(header));
if(len!=sizeof(header))
throw data_error(fn, 0, "Missing header");
- if(header[0]!='M' || header[1]!='D' || header[2]!='R' || header[3]!=1)
+ if(memcmp(header, signature, sizeof(signature)))
throw data_error(fn, 0, "Bad header");
size = 0;
in = nullptr;
}
+void RawData::write_io(IO::Base &io, bool compress)
+{
+ if(!data)
+ throw logic_error("no data");
+
+ io.write(signature, sizeof(signature));
+
+ for(unsigned i=56; i<64; i-=8)
+ io.put((size>>i)&0xFF);
+
+ uint16_t flags = 0;
+ if(compress)
+ flags |= COMPRESSED;
+ io.put((flags>>8)&0xFF);
+ io.put(flags&0xFF);
+
+ if(compress)
+ {
+ IO::ZlibCompressed z(io, IO::M_WRITE);
+ z.write(data, size);
+ }
+ else
+ io.write(data, size);
+}
+
} // namespace DataFile
} // namespace Msp