summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2020-08-07 00:10:59 +0200
committerCarl Hetherington <cth@carlh.net>2020-08-07 00:10:59 +0200
commit334d3cb564c72bd430a17c6e6f01aeb488fb191c (patch)
tree52b4e97d21f24e55b377e5f1e1a11e4e3c22ed3b /src
parente28f10cd045d3a420689c9aafc5abaa64d35fa92 (diff)
Check that we have a connection to the disk writer before starting to use it in earnest.
Diffstat (limited to 'src')
-rw-r--r--src/lib/disk_writer_messages.h10
-rw-r--r--src/tools/dcpomatic_disk.cc25
-rw-r--r--src/tools/dcpomatic_disk_writer.cc2
3 files changed, 37 insertions, 0 deletions
diff --git a/src/lib/disk_writer_messages.h b/src/lib/disk_writer_messages.h
index d31a9cb0a..406afc61d 100644
--- a/src/lib/disk_writer_messages.h
+++ b/src/lib/disk_writer_messages.h
@@ -23,6 +23,16 @@
* by \n.
*/
+/* PING */
+
+// Front-end sends:
+
+#define DISK_WRITER_PING "P"
+
+// Back-end responds
+
+#define DISK_WRITER_PONG "O"
+
/* REQUEST TO WRITE DCP */
// Front-end sends:
diff --git a/src/tools/dcpomatic_disk.cc b/src/tools/dcpomatic_disk.cc
index b94d4bf94..7bea4d8e9 100644
--- a/src/tools/dcpomatic_disk.cc
+++ b/src/tools/dcpomatic_disk.cc
@@ -210,6 +210,31 @@ private:
DCPOMATIC_ASSERT (_drive->GetSelection() != wxNOT_FOUND);
DCPOMATIC_ASSERT (static_cast<bool>(_dcp_path));
+ bool have_writer = true;
+ if (!_nanomsg.send(DISK_WRITER_PING "\n", 2000)) {
+ have_writer = false;
+ } else {
+ optional<string> reply = _nanomsg.receive (2000);
+ if (!reply || *reply != DISK_WRITER_PONG) {
+ have_writer = false;
+ }
+ }
+
+ if (!have_writer) {
+#ifdef DCPOMATIC_WINDOWS
+ MessageDialog* m = new MessageDialog (
+ this,
+ _("DCP-o-matic Disk Writer"),
+ _("Do you see a 'User Account Control' dialogue asking about dcpomatic2_disk_writer.exe? If so, click 'Yes', then try again.")
+ );
+ m->ShowModal ();
+ m->Destroy ();
+ return;
+#else
+ throw CommunicationFailedError ();
+#endif
+ }
+
Drive const& drive = _drives[_drive->GetSelection()];
if (drive.mounted()) {
TryUnmountDialog* d = new TryUnmountDialog(this, drive.description());
diff --git a/src/tools/dcpomatic_disk_writer.cc b/src/tools/dcpomatic_disk_writer.cc
index 2c3753e57..a2788e18b 100644
--- a/src/tools/dcpomatic_disk_writer.cc
+++ b/src/tools/dcpomatic_disk_writer.cc
@@ -460,6 +460,8 @@ try
if (*s == DISK_WRITER_QUIT) {
exit (EXIT_SUCCESS);
+ } else if (*s == DISK_WRITER_PING) {
+ nanomsg->send(DISK_WRITER_PONG "\n", LONG_TIMEOUT);
} else if (*s == DISK_WRITER_UNMOUNT) {
/* XXX: should do Linux polkit stuff here */
optional<string> xml_head = nanomsg->receive (LONG_TIMEOUT);