Confirm overwrite of KDMs (#1008).
authorCarl Hetherington <cth@carlh.net>
Fri, 16 Dec 2016 15:59:02 +0000 (15:59 +0000)
committerCarl Hetherington <cth@carlh.net>
Fri, 16 Dec 2016 15:59:02 +0000 (15:59 +0000)
ChangeLog
src/lib/screen_kdm.cc
src/lib/screen_kdm.h
src/tools/dcpomatic_kdm.cc
src/tools/dcpomatic_kdm_cli.cc
src/wx/kdm_dialog.cc
src/wx/kdm_dialog.h

index 97e77f3aa1c817b54858e3dae063a6b7d4918e6a..2ba0cefe16648a526c056fea513c3fc1b10d29cd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2016-12-16  Carl Hetherington  <cth@carlh.net>
 
+       * Confirm overwrite of KDMs (#1008).
+
        * Add preference for default KDM target directory (#1013).
 
        * Fix failure to write referenced DCPs when they have non-zero
index 182d03bb071c7d8cd632303ab76357e15272ed5d..5d8409ea746b6e30ff1cf4667f4d20f6e0aecb9e 100644 (file)
@@ -34,14 +34,27 @@ operator== (ScreenKDM const & a, ScreenKDM const & b)
        return a.screen == b.screen && a.kdm == b.kdm;
 }
 
-void
-ScreenKDM::write_files (list<ScreenKDM> screen_kdms, boost::filesystem::path directory, dcp::NameFormat name_format, dcp::NameFormat::Map name_values)
+int
+ScreenKDM::write_files (
+       list<ScreenKDM> screen_kdms,
+       boost::filesystem::path directory,
+       dcp::NameFormat name_format,
+       dcp::NameFormat::Map name_values,
+       boost::function<bool (boost::filesystem::path)> confirm_overwrite
+       )
 {
+       int written = 0;
+
        /* Write KDMs to the specified directory */
        BOOST_FOREACH (ScreenKDM const & i, screen_kdms) {
                name_values['c'] = i.screen->cinema->name;
                name_values['s'] = i.screen->name;
                boost::filesystem::path out = directory / (name_format.get(name_values, ".xml"));
-               i.kdm.as_xml (out);
+               if (!boost::filesystem::exists (out) || confirm_overwrite (out)) {
+                       i.kdm.as_xml (out);
+                       ++written;
+               }
        }
+
+       return written;
 }
index 60486c2593d5481ecadbbbd45df9847833e4d16b..9ab73b8515ac69a3c3d23b54c5250bb9da2b6708 100644 (file)
@@ -36,9 +36,10 @@ public:
                , kdm (k)
        {}
 
-       static void write_files (
+       static int write_files (
                std::list<ScreenKDM> screen_kdms, boost::filesystem::path directory,
-               dcp::NameFormat name_format, dcp::NameFormat::Map name_values
+               dcp::NameFormat name_format, dcp::NameFormat::Map name_values,
+               boost::function<bool (boost::filesystem::path)> confirm_overwrite
                );
 
        boost::shared_ptr<Screen> screen;
index a0a3a59f8786aa348ebc562578f207dbb1923b3f..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.
 
@@ -63,6 +63,7 @@ using std::vector;
 using boost::shared_ptr;
 using boost::bind;
 using boost::optional;
+using boost::ref;
 
 enum {
        ID_help_report_a_problem = 1,
@@ -268,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 {
@@ -315,13 +324,19 @@ private:
                        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 ()) {
index f0097d7de38cd14b06256009d174ca60100f8a96..7cfcaa1712b50a39f645dc266518cf950e0fdf22 100644 (file)
@@ -40,6 +40,7 @@ using std::list;
 using std::vector;
 using boost::shared_ptr;
 using boost::optional;
+using boost::bind;
 
 static void
 help ()
@@ -106,6 +107,12 @@ duration_from_string (string d)
        exit (EXIT_FAILURE);
 }
 
+static bool
+always_overwrite ()
+{
+       return true;
+}
+
 int main (int argc, char* argv[])
 {
        boost::filesystem::path output;
@@ -306,7 +313,10 @@ int main (int argc, char* argv[])
                                        cout << "Wrote ZIP files to " << output << "\n";
                                }
                        } else {
-                               ScreenKDM::write_files (screen_kdms, output, Config::instance()->kdm_filename_format(), values);
+                               ScreenKDM::write_files (
+                                       screen_kdms, output, Config::instance()->kdm_filename_format(), values,
+                                       bind (&always_overwrite)
+                                       );
 
                                if (verbose) {
                                        cout << "Wrote KDM files to " << output << "\n";
index 8294a12aa9b6d3dc3e48236be33e0af2ba671c67..5ed1169b13390a3ac8504f39609dd7ce428dcee1 100644 (file)
@@ -48,6 +48,7 @@ using std::cout;
 using std::vector;
 using std::make_pair;
 using boost::shared_ptr;
+using boost::bind;
 
 KDMDialog::KDMDialog (wxWindow* parent, shared_ptr<const Film> film)
        : wxDialog (parent, wxID_ANY, _("Make KDMs"))
@@ -123,6 +124,15 @@ KDMDialog::setup_sensitivity ()
        _make->Enable (!_screens->screens().empty() && _timing->valid() && _cpl->has_selected());
 }
 
+bool
+KDMDialog::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
 KDMDialog::make_clicked ()
 {
@@ -146,7 +156,8 @@ KDMDialog::make_clicked ()
                                screen_kdms,
                                _output->directory(),
                                _output->name_format(),
-                               name_values
+                               name_values,
+                               bind (&KDMDialog::confirm_overwrite, this, _1)
                                );
                }
 
index a76c2a14f9e26d46bb899ca1118a48e51a8ab123..099db951beede0d9fde2b4d3622bdc60cb8398f5 100644 (file)
@@ -42,6 +42,7 @@ public:
 private:
        void setup_sensitivity ();
        void make_clicked ();
+       bool confirm_overwrite (boost::filesystem::path path);
 
        boost::weak_ptr<const Film> _film;
        ScreensPanel* _screens;