- dcp::Data key (dcpomatic::crypto_key_length());
- memset (key.data().get(), 0, key.size());
- string const magic = command_and_read ("dcpomatic2_uuid");
- strncpy ((char *) key.data().get(), magic.c_str(), dcpomatic::crypto_key_length());
- return key;
+ dcp::File f(from, "rb");
+ if (!f) {
+ throw OpenFileError (from, errno, OpenFileError::READ);
+ }
+ dcp::File t(to, "wb");
+ if (!t) {
+ throw OpenFileError (to, errno, OpenFileError::WRITE);
+ }
+
+ /* on the order of a second's worth of copying */
+ boost::uintmax_t const chunk = 20 * 1024 * 1024;
+
+ std::vector<uint8_t> buffer(chunk);
+
+ boost::uintmax_t const total = boost::filesystem::file_size (from);
+ boost::uintmax_t remaining = total;
+
+ while (remaining) {
+ boost::uintmax_t this_time = min (chunk, remaining);
+ size_t N = f.read(buffer.data(), 1, chunk);
+ if (N < this_time) {
+ throw ReadFileError (from, errno);
+ }
+
+ N = t.write(buffer.data(), 1, this_time);
+ if (N < this_time) {
+ throw WriteFileError (to, errno);
+ }
+
+ progress (1 - float(remaining) / total);
+ remaining -= this_time;
+ }