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
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;
}
, 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;
/*
- 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.
using boost::shared_ptr;
using boost::bind;
using boost::optional;
+using boost::ref;
enum {
ID_help_report_a_problem = 1,
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 {
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 ()) {
using std::vector;
using boost::shared_ptr;
using boost::optional;
+using boost::bind;
static void
help ()
exit (EXIT_FAILURE);
}
+static bool
+always_overwrite ()
+{
+ return true;
+}
+
int main (int argc, char* argv[])
{
boost::filesystem::path output;
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";
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"))
_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 ()
{
screen_kdms,
_output->directory(),
_output->name_format(),
- name_values
+ name_values,
+ bind (&KDMDialog::confirm_overwrite, this, _1)
);
}
private:
void setup_sensitivity ();
void make_clicked ();
+ bool confirm_overwrite (boost::filesystem::path path);
boost::weak_ptr<const Film> _film;
ScreensPanel* _screens;