Confirm overwrite of KDMs (#1008).
[dcpomatic.git] / src / tools / dcpomatic_kdm.cc
index 5afcb17a4d077d56306257917c83aeb6fa048ef8..880aec454e073bed9d1320ca356c838ae9bbb926 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2015 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2015-2016 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -62,6 +62,8 @@ using std::string;
 using std::vector;
 using boost::shared_ptr;
 using boost::bind;
+using boost::optional;
+using boost::ref;
 
 enum {
        ID_help_report_a_problem = 1,
@@ -75,6 +77,17 @@ public:
        {
 
        }
+
+       optional<dcp::EncryptedKDM> get ()
+       {
+               try {
+                       return dcp::EncryptedKDM (dcp::file_to_string (wx_to_std (_dialog->GetPath ()), MAX_KDM_SIZE));
+               } catch (cxml::Error& e) {
+                       error_dialog (_parent, wxString::Format ("This file does not look like a KDM (%s)", std_to_wx (e.what()).data()));
+               }
+
+               return optional<dcp::EncryptedKDM> ();
+       }
 };
 
 static string
@@ -115,10 +128,10 @@ public:
                setup_menu (bar);
                SetMenuBar (bar);
 
-               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::file_exit, this),             wxID_EXIT);
-               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::edit_preferences, this),      wxID_PREFERENCES);
-               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::help_about, this),            wxID_ABOUT);
-               Bind (wxEVT_COMMAND_MENU_SELECTED, boost::bind (&DOMFrame::help_report_a_problem, this), ID_help_report_a_problem);
+               Bind (wxEVT_MENU, boost::bind (&DOMFrame::file_exit, this),             wxID_EXIT);
+               Bind (wxEVT_MENU, boost::bind (&DOMFrame::edit_preferences, this),      wxID_PREFERENCES);
+               Bind (wxEVT_MENU, boost::bind (&DOMFrame::help_about, this),            wxID_ABOUT);
+               Bind (wxEVT_MENU, boost::bind (&DOMFrame::help_report_a_problem, this), ID_help_report_a_problem);
 
                /* Use a panel as the only child of the Frame so that we avoid
                   the dark-grey background on Windows.
@@ -156,7 +169,7 @@ public:
                vector<string> columns;
                columns.push_back (wx_to_std (_("CPL")));
                _dkdm = new EditableList<dcp::EncryptedKDM, KDMFileDialogWrapper> (
-                       overall_panel, columns, bind (&DOMFrame::dkdms, this), bind (&DOMFrame::set_dkdms, this, _1), bind (&always_valid), bind (&column, _1), false
+                       overall_panel, columns, bind (&DOMFrame::dkdms, this), bind (&DOMFrame::set_dkdms, this, _1), bind (&column, _1), false
                        );
                right->Add (_dkdm, 0, wxEXPAND | wxALL, DCPOMATIC_SIZER_Y_GAP);
 
@@ -177,7 +190,7 @@ public:
                Config::instance()->Changed.connect (boost::bind (&Config::write, Config::instance ()));
 
                _screens->ScreensChanged.connect (boost::bind (&DOMFrame::setup_sensitivity, this));
-               _create->Bind (wxEVT_COMMAND_BUTTON_CLICKED, bind (&DOMFrame::create_kdms, this));
+               _create->Bind (wxEVT_BUTTON, bind (&DOMFrame::create_kdms, this));
                _dkdm->SelectionChanged.connect (boost::bind (&DOMFrame::setup_sensitivity, this));
 
                setup_sensitivity ();
@@ -256,6 +269,14 @@ private:
                m->Append (help, _("&Help"));
        }
 
+       bool confirm_overwrite (boost::filesystem::path path)
+       {
+               return confirm_dialog (
+                       this,
+                       wxString::Format (_("File %s already exists.  Do you want to overwrite it?"), std_to_wx(path.string()).data())
+                       );
+       }
+
        void create_kdms ()
        {
                try {
@@ -297,19 +318,25 @@ private:
                                screen_kdms.push_back (ScreenKDM (i, kdm.encrypt (signer, i->recipient.get(), i->trusted_devices, _output->formulation())));
                        }
 
-                       NameFormat::Map name_values;
-                       name_values["film_name"] = decrypted.content_title_text();
-                       name_values["from"] = dcp::LocalTime(_timing->from()).date() + " " + dcp::LocalTime(_timing->from()).time_of_day();
-                       name_values["to"] = dcp::LocalTime(_timing->until()).date() + " " + dcp::LocalTime(_timing->until()).time_of_day();
+                       dcp::NameFormat::Map name_values;
+                       name_values['f'] = decrypted.content_title_text();
+                       name_values['b'] = dcp::LocalTime(_timing->from()).date() + " " + dcp::LocalTime(_timing->from()).time_of_day();
+                       name_values['e'] = dcp::LocalTime(_timing->until()).date() + " " + dcp::LocalTime(_timing->until()).time_of_day();
 
                        if (_output->write_to()) {
-                               ScreenKDM::write_files (screen_kdms, _output->directory(), _output->name_format(), name_values);
-                               /* XXX: proper plural form support in wxWidgets? */
-                               wxString s = screen_kdms.size() == 1 ? _("%d KDM written to %s") : _("%d KDMs written to %s");
-                               message_dialog (
-                                       this,
-                                       wxString::Format (s, int(screen_kdms.size()), std_to_wx(_output->directory().string()).data())
+                               int written = ScreenKDM::write_files (
+                                       screen_kdms, _output->directory(), _output->name_format(), name_values,
+                                       bind (&DOMFrame::confirm_overwrite, this, _1)
                                        );
+
+                               if (written > 0) {
+                                       /* XXX: proper plural form support in wxWidgets? */
+                                       wxString s = written == 1 ? _("%d KDM written to %s") : _("%d KDMs written to %s");
+                                       message_dialog (
+                                               this,
+                                               wxString::Format (s, written, std_to_wx(_output->directory().string()).data())
+                                               );
+                               }
                        } else {
                                string film_name = decrypted.annotation_text().get_value_or ("");
                                if (film_name.empty ()) {