*/
-#include "disk_writer_messages.h"
-#include "copy_to_drive_job.h"
+
#include "compose.hpp"
-#include "exceptions.h"
+#include "copy_to_drive_job.h"
#include "dcpomatic_log.h"
+#include "disk_writer_messages.h"
+#include "exceptions.h"
#include <dcp/raw_convert.h>
#include <nanomsg/nn.h>
-#include <unistd.h>
#include <fcntl.h>
+#include <unistd.h>
+#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <iostream>
#include "i18n.h"
-using std::string;
+
using std::cout;
using std::min;
using std::shared_ptr;
+using std::string;
using boost::optional;
using dcp::raw_convert;
-CopyToDriveJob::CopyToDriveJob (boost::filesystem::path dcp, Drive drive, Nanomsg& nanomsg)
+
+CopyToDriveJob::CopyToDriveJob(std::vector<boost::filesystem::path> const& dcps, Drive drive, Nanomsg& nanomsg)
: Job (shared_ptr<Film>())
- , _dcp (dcp)
+ , _dcps (dcps)
, _drive (drive)
, _nanomsg (nanomsg)
{
}
+
string
CopyToDriveJob::name () const
{
- return String::compose (_("Copying %1\nto %2"), _dcp.filename().string(), _drive.description());
+ if (_dcps.size() == 1) {
+ return String::compose(_("Copying %1\nto %2"), _dcps[0].filename().string(), _drive.description());
+ }
+
+ return String::compose(_("Copying DCPs to %1"), _drive.description());
}
+
string
CopyToDriveJob::json_name () const
{
void
CopyToDriveJob::run ()
{
- LOG_DISK("Sending write request to disk writer for %1 %2", _dcp.string(), _drive.device());
- if (!_nanomsg.send(String::compose(DISK_WRITER_WRITE "\n%1\n%2\n", _dcp.string(), _drive.device()), 2000)) {
+ LOG_DISK("Sending write requests to disk %1 for:", _drive.device());
+ for (auto dcp: _dcps) {
+ LOG_DISK("%1", dcp.string());
+ }
+
+ string request = String::compose(DISK_WRITER_WRITE "\n%1\n", _drive.device());
+ for (auto dcp: _dcps) {
+ request += String::compose("%1\n", dcp.string());
+ }
+ request += "\n";
+ if (!_nanomsg.send(request, 2000)) {
+ LOG_DISK_NC("Failed to send write request.");
throw CommunicationFailedError ();
}
} state = SETUP;
while (true) {
- optional<string> s = _nanomsg.receive (10000);
- if (!s) {
+ auto response = DiskWriterBackEndResponse::read_from_nanomsg(_nanomsg, 10000);
+ if (!response) {
continue;
}
- if (*s == DISK_WRITER_OK) {
+
+ switch (response->type()) {
+ case DiskWriterBackEndResponse::Type::OK:
set_state (FINISHED_OK);
return;
- } else if (*s == DISK_WRITER_ERROR) {
- auto const m = _nanomsg.receive (500);
- auto const n = _nanomsg.receive (500);
- throw CopyError (m.get_value_or("Unknown"), raw_convert<int>(n.get_value_or("0")));
- } else if (*s == DISK_WRITER_FORMAT_PROGRESS) {
+ case DiskWriterBackEndResponse::Type::PONG:
+ break;
+ case DiskWriterBackEndResponse::Type::ERROR:
+ throw CopyError(response->error_message(), response->ext4_error_number(), response->platform_error_number());
+ case DiskWriterBackEndResponse::Type::FORMAT_PROGRESS:
if (state == SETUP) {
sub (_("Formatting drive"));
state = FORMAT;
}
- auto progress = _nanomsg.receive (500);
- if (progress) {
- set_progress (raw_convert<float>(*progress));
- }
- } else if (*s == DISK_WRITER_COPY_PROGRESS) {
+ set_progress(response->progress());
+ break;
+ case DiskWriterBackEndResponse::Type::COPY_PROGRESS:
if (state == FORMAT) {
sub (_("Copying DCP"));
state = COPY;
}
- auto progress = _nanomsg.receive (500);
- if (progress) {
- set_progress (raw_convert<float>(*progress));
- }
- } else if (*s == DISK_WRITER_VERIFY_PROGRESS) {
+ set_progress(response->progress());
+ break;
+ case DiskWriterBackEndResponse::Type::VERIFY_PROGRESS:
if (state == COPY) {
sub (_("Verifying copied files"));
state = VERIFY;
}
- auto progress = _nanomsg.receive (500);
- if (progress) {
- set_progress (raw_convert<float>(*progress));
- }
+ set_progress(response->progress());
+ break;
}
}
}