pot/merge.
[dcpomatic.git] / src / tools / dcpomatic_disk.cc
index 6dbfbe4b036791565092179ed59db5d13758b44e..bf4d45e2040461b6770fb8c54139ee4021240da2 100644 (file)
@@ -171,28 +171,30 @@ private:
                        TryUnmountDialog* d = new TryUnmountDialog(this, drive.description());
                        int const r = d->ShowModal ();
                        d->Destroy ();
-                       if (r == wxID_OK) {
-                               if (!_nanomsg.send(DISK_WRITER_UNMOUNT "\n", 2000)) {
-                                       throw CommunicationFailedError ();
-                               }
-                               if (!_nanomsg.send(drive.internal_name() + "\n", 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;
-                               }
+                       if (r != wxID_OK) {
+                               return;
+                       }
+
+                       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;
                        }
                }
 
-               
+
                DriveWipeWarningDialog* d = new DriveWipeWarningDialog (this, _drive->GetString(_drive->GetSelection()));
                int const r = d->ShowModal ();
                bool ok = r == wxID_OK && d->confirmed();
@@ -216,7 +218,7 @@ private:
                _drive->Clear ();
                int re_select = wxNOT_FOUND;
                int j = 0;
-               _drives = get_drives ();
+               _drives = Drive::get ();
                BOOST_FOREACH (Drive i, _drives) {
                        wxString const s = std_to_wx(i.description());
                        if (s == current) {
@@ -242,7 +244,9 @@ private:
        JobManagerView* _jobs;
        boost::optional<boost::filesystem::path> _dcp_path;
        std::vector<Drive> _drives;
+#ifndef DCPOMATIC_OSX
        boost::process::child* _writer;
+#endif
        Nanomsg _nanomsg;
        wxSizer* _sizer;
 };
@@ -328,6 +332,44 @@ public:
                ev.Skip ();
        }
 
+       void report_exception ()
+       {
+               try {
+                       throw;
+               } catch (FileError& e) {
+                       error_dialog (
+                               0,
+                               wxString::Format (
+                                       _("An exception occurred: %s (%s)\n\n") + REPORT_PROBLEM,
+                                       std_to_wx (e.what()),
+                                       std_to_wx (e.file().string().c_str ())
+                                       )
+                               );
+               } catch (exception& e) {
+                       error_dialog (
+                               0,
+                               wxString::Format (
+                                       _("An exception occurred: %s.\n\n") + REPORT_PROBLEM,
+                                       std_to_wx (e.what ())
+                                       )
+                               );
+               } catch (...) {
+                       error_dialog (0, _("An unknown exception occurred.") + "  " + REPORT_PROBLEM);
+               }
+       }
+
+       bool OnExceptionInMainLoop ()
+       {
+               report_exception ();
+               /* This will terminate the program */
+               return false;
+       }
+
+       void OnUnhandledException ()
+       {
+               report_exception ();
+       }
+
        DOMFrame* _frame;
 };