*/
-/** @file src/data.cc
- * @brief Data class.
- */
-
#include "data.h"
#include "util.h"
#include "exceptions.h"
#include <cstdio>
+#include <cerrno>
+using boost::shared_array;
using namespace dcp;
-/** Construct a Data object from the contents of a file.
- * @param file File to read.
- */
+Data::Data ()
+ : _size (0)
+{
+
+}
+
+Data::Data (int size)
+ : _data (new uint8_t[size])
+ , _size (size)
+{
+
+}
+
+Data::Data (uint8_t const * data, int size)
+ : _data (new uint8_t[size])
+ , _size (size)
+{
+ memcpy (_data.get(), data, size);
+}
+
+Data::Data (shared_array<uint8_t> data, int size)
+ : _data (data)
+ , _size (size)
+{
+
+}
+
Data::Data (boost::filesystem::path file)
{
+ _size = boost::filesystem::file_size (file);
+ _data.reset (new uint8_t[_size]);
+
FILE* f = fopen_boost (file, "rb");
if (!f) {
throw FileError ("could not open file for reading", file, errno);
}
- size = boost::filesystem::file_size (file);
- data.reset (new uint8_t[size]);
- size_t const read = fread (data.get(), 1, size, f);
+ size_t const r = fread (_data.get(), 1, _size, f);
+ if (r != size_t (_size)) {
+ fclose (f);
+ throw FileError ("could not read from file", file, errno);
+ }
+
fclose (f);
+}
- if (read != size) {
- throw FileError ("could not read file", file, -1);
+void
+Data::write (boost::filesystem::path file) const
+{
+ FILE* f = fopen_boost (file, "wb");
+ if (!f) {
+ throw FileError ("could not write to file", file, errno);
+ }
+ size_t const r = fwrite (_data.get(), 1, _size, f);
+ if (r != size_t (_size)) {
+ fclose (f);
+ throw FileError ("could not write to file", file, errno);
}
+ fclose (f);
+}
+
+void
+Data::write_via_temp (boost::filesystem::path temp, boost::filesystem::path final) const
+{
+ write (temp);
+ boost::filesystem::rename (temp, final);
}