*/
-/** @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);
}
-Data::Data (uint8_t const * data_, boost::uintmax_t size_)
- : data (new uint8_t[size])
- , size (size_)
+void
+Data::write_via_temp (boost::filesystem::path temp, boost::filesystem::path final) const
{
- memcpy (data.get(), data_, size);
+ write (temp);
+ boost::filesystem::rename (temp, final);
}
#ifndef LIBDCP_DATA_H
#define LIBDCP_DATA_H
-/** @file src/data.h
- * @brief Data class.
- */
-
#include <boost/shared_array.hpp>
#include <boost/filesystem.hpp>
#include <stdint.h>
namespace dcp {
-/** A block of arbitrary data */
class Data
{
public:
- Data () {}
+ Data ();
+ Data (int size);
+ Data (uint8_t const * data, int size);
+ Data (boost::shared_array<uint8_t> data, int size);
+ Data (boost::filesystem::path file);
- Data (boost::shared_array<uint8_t> data_, boost::uintmax_t size_)
- : data (data_)
- , size (size_)
- {}
+ virtual ~Data () {}
- Data (uint8_t const * data, boost::uintmax_t size_);
+ void write (boost::filesystem::path file) const;
+ void write_via_temp (boost::filesystem::path temp, boost::filesystem::path final) const;
- Data (boost::filesystem::path file);
+ boost::shared_array<uint8_t> data () const {
+ return _data;
+ }
+
+ int size () const {
+ return _size;
+ }
- boost::shared_array<uint8_t> data;
- boost::uintmax_t size;
+private:
+ boost::shared_array<uint8_t> _data;
+ int _size;
};
}
++j;
}
if (j != _fonts.end ()) {
- fwrite (j->data.data.get(), 1, j->data.size, f);
+ fwrite (j->data.data().get(), 1, j->data.size(), f);
j->file = file;
}
fclose (f);
shared_ptr<dcp::OpenJPEGImage>
dcp::decompress_j2k (Data data, int reduce)
{
- return dcp::decompress_j2k (data.data.get(), data.size, reduce);
+ return dcp::decompress_j2k (data.data().get(), data.size(), reduce);
}
class ReadBuffer
OPJ_SIZE_T write (void* buffer, OPJ_SIZE_T nb_bytes)
{
DCP_ASSERT ((_offset + nb_bytes) < MAX_J2K_SIZE);
- memcpy (_data.data.get() + _offset, buffer, nb_bytes);
+ memcpy (_data.data().get() + _offset, buffer, nb_bytes);
_offset += nb_bytes;
return nb_bytes;
}
}
if (j != _fonts.end ()) {
ASDCP::TimedText::FrameBuffer buffer;
- buffer.SetData (j->data.data.get(), j->data.size);
- buffer.Size (j->data.size);
+ buffer.SetData (j->data.data().get(), j->data.size());
+ buffer.Size (j->data.size());
r = writer.WriteAncillaryResource (buffer);
if (ASDCP_FAILURE (r)) {
boost::throw_exception (MXFFileError ("could not write font to timed text resource", p.string(), r));
cout << "Compress: " << count / compress.get() << " fps.\n";
FILE* f = fopen ("check.j2c", "wb");
- fwrite (recomp.data.get(), 1, recomp.size, f);
+ fwrite (recomp.data().get(), 1, recomp.size(), f);
fclose (f);
}
fread (ref.get(), 1, size, f);
fclose (f);
- BOOST_CHECK_EQUAL (memcmp (subs2->_fonts.front().data.data.get(), ref.get(), size), 0);
+ BOOST_CHECK_EQUAL (memcmp (subs2->_fonts.front().data.data().get(), ref.get(), size), 0);
}
/** Create a DCP with SMPTE subtitles and check that the font is written and read back correctly */
fread (ref.get(), 1, size, f);
fclose (f);
- BOOST_REQUIRE (subs2->_fonts.front().data.data);
- BOOST_CHECK_EQUAL (memcmp (subs2->_fonts.front().data.data.get(), ref.get(), size), 0);
+ BOOST_REQUIRE (subs2->_fonts.front().data.data());
+ BOOST_CHECK_EQUAL (memcmp (subs2->_fonts.front().data.data().get(), ref.get(), size), 0);
}
cerr << "Could not open font file " << i->first << ".ttf for writing";
exit (EXIT_FAILURE);
}
- fwrite (i->second.data.get(), 1, i->second.size, f);
+ fwrite (i->second.data().get(), 1, i->second.size(), f);
fclose (f);
}
}