From 7e4d7d9e4f146576a63c6ab1be9bca5a79b507d9 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 16 Dec 2016 15:59:02 +0000 Subject: [PATCH] Confirm overwrite of KDMs (#1008). --- ChangeLog | 2 ++ src/lib/screen_kdm.cc | 19 ++++++++++++++++--- src/lib/screen_kdm.h | 5 +++-- src/tools/dcpomatic_kdm.cc | 29 ++++++++++++++++++++++------- src/tools/dcpomatic_kdm_cli.cc | 12 +++++++++++- src/wx/kdm_dialog.cc | 13 ++++++++++++- src/wx/kdm_dialog.h | 1 + 7 files changed, 67 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index 97e77f3aa..2ba0cefe1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,7 @@ 2016-12-16 Carl Hetherington + * Confirm overwrite of KDMs (#1008). + * Add preference for default KDM target directory (#1013). * Fix failure to write referenced DCPs when they have non-zero diff --git a/src/lib/screen_kdm.cc b/src/lib/screen_kdm.cc index 182d03bb0..5d8409ea7 100644 --- a/src/lib/screen_kdm.cc +++ b/src/lib/screen_kdm.cc @@ -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 screen_kdms, boost::filesystem::path directory, dcp::NameFormat name_format, dcp::NameFormat::Map name_values) +int +ScreenKDM::write_files ( + list screen_kdms, + boost::filesystem::path directory, + dcp::NameFormat name_format, + dcp::NameFormat::Map name_values, + boost::function 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; } diff --git a/src/lib/screen_kdm.h b/src/lib/screen_kdm.h index 60486c259..9ab73b851 100644 --- a/src/lib/screen_kdm.h +++ b/src/lib/screen_kdm.h @@ -36,9 +36,10 @@ public: , kdm (k) {} - static void write_files ( + static int write_files ( std::list 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 confirm_overwrite ); boost::shared_ptr screen; diff --git a/src/tools/dcpomatic_kdm.cc b/src/tools/dcpomatic_kdm.cc index a0a3a59f8..880aec454 100644 --- a/src/tools/dcpomatic_kdm.cc +++ b/src/tools/dcpomatic_kdm.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2015 Carl Hetherington + Copyright (C) 2015-2016 Carl Hetherington 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 ()) { diff --git a/src/tools/dcpomatic_kdm_cli.cc b/src/tools/dcpomatic_kdm_cli.cc index f0097d7de..7cfcaa171 100644 --- a/src/tools/dcpomatic_kdm_cli.cc +++ b/src/tools/dcpomatic_kdm_cli.cc @@ -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"; diff --git a/src/wx/kdm_dialog.cc b/src/wx/kdm_dialog.cc index 8294a12aa..5ed1169b1 100644 --- a/src/wx/kdm_dialog.cc +++ b/src/wx/kdm_dialog.cc @@ -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 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) ); } diff --git a/src/wx/kdm_dialog.h b/src/wx/kdm_dialog.h index a76c2a14f..099db951b 100644 --- a/src/wx/kdm_dialog.h +++ b/src/wx/kdm_dialog.h @@ -42,6 +42,7 @@ public: private: void setup_sensitivity (); void make_clicked (); + bool confirm_overwrite (boost::filesystem::path path); boost::weak_ptr _film; ScreensPanel* _screens; -- 2.30.2