Add uninstaller for the .pkg part of the disk writer on macOS (#1740).
[dcpomatic.git] / src / tools / dcpomatic_disk.cc
index b94d4bf941016c4deb5e898040c7e50995c88fe5..1a3c3d5fe78d4f71f0099aa6b9a1d151850e2ace 100644 (file)
@@ -53,6 +53,17 @@ using std::cout;
 using std::cerr;
 using boost::shared_ptr;
 using boost::optional;
+#if BOOST_VERSION >= 106100
+using namespace boost::placeholders;
+#endif
+
+
+#ifdef DCPOMATIC_OSX
+enum {
+       ID_tools_uninstall = 1,
+};
+#endif
+
 
 class DOMFrame : public wxFrame
 {
@@ -62,6 +73,15 @@ public:
                , _nanomsg (true)
                , _sizer (new wxBoxSizer(wxVERTICAL))
        {
+#ifdef DCPOMATIC_OSX
+               wxMenuBar* bar = new wxMenuBar;
+               wxMenu* tools = new wxMenu;
+               tools->Append(ID_tools_uninstall, _("Uninstall..."));
+               bar->Append(tools, _("Tools"));
+               SetMenuBar (bar);
+               Bind (wxEVT_MENU, boost::bind(&DOMFrame::uninstall, this), ID_tools_uninstall);
+#endif
+
                /* Use a panel as the only child of the Frame so that we avoid
                   the dark-grey background on Windows.
                */
@@ -159,6 +179,14 @@ private:
        }
 
 
+#ifdef DCPOMATIC_OSX
+       void uninstall()
+       {
+               system(String::compose("osascript \"%1/uninstall_disk.applescript\"", resources_path().string()).c_str());
+       }
+#endif
+
+
        bool should_close ()
        {
                if (!JobManager::instance()->work_to_do()) {
@@ -210,6 +238,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());
@@ -320,6 +373,7 @@ public:
 #endif
 
 #ifdef DCPOMATIC_OSX
+                       dcpomatic_sleep_seconds (1);
                        make_foreground_application ();
 #endif