+
+ 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());
+ int const r = d->ShowModal ();
+ d->Destroy ();
+ if (r != wxID_OK) {
+ return;
+ }
+
+ LOG_DISK("Sending unmount request to disk writer for %1", drive.as_xml());
+ if (!_nanomsg.send(DISK_WRITER_UNMOUNT "\n", 2000)) {
+ throw CommunicationFailedError ();
+ }
+ if (!_nanomsg.send(drive.as_xml(), 2000)) {
+ throw CommunicationFailedError ();
+ }
+ optional<string> reply = _nanomsg.receive (2000);
+ if (!reply || *reply != DISK_WRITER_OK) {
+ MessageDialog* m = new MessageDialog (
+ this,
+ _("DCP-o-matic Disk Writer"),
+ wxString::Format(_("The drive %s could not be unmounted.\nClose any application that is using it, then try again."), std_to_wx(drive.description()))
+ );
+ m->ShowModal ();
+ m->Destroy ();
+ return;
+ }
+ }
+
+