X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Ftools%2Fdcpomatic_kdm.cc;h=880aec454e073bed9d1320ca356c838ae9bbb926;hb=7e4d7d9e4f146576a63c6ab1be9bca5a79b507d9;hp=2613358e581a159747c653f48d7fc11d2cdde15e;hpb=e77cb632183134a3bfba23d39fa5162a507f6337;p=dcpomatic.git diff --git a/src/tools/dcpomatic_kdm.cc b/src/tools/dcpomatic_kdm.cc index 2613358e5..880aec454 100644 --- a/src/tools/dcpomatic_kdm.cc +++ b/src/tools/dcpomatic_kdm.cc @@ -1,19 +1,20 @@ /* - Copyright (C) 2015 Carl Hetherington + Copyright (C) 2015-2016 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + DCP-o-matic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with DCP-o-matic. If not, see . */ @@ -61,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, @@ -74,6 +77,17 @@ public: { } + + optional 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 (); + } }; static string @@ -86,7 +100,7 @@ class DOMFrame : public wxFrame { public: DOMFrame (wxString const & title) - : wxFrame (NULL, -1, title) + : wxFrame (0, -1, title) , _config_dialog (0) , _job_view (0) { @@ -114,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. @@ -125,49 +139,58 @@ public: wxPanel* overall_panel = new wxPanel (this, wxID_ANY); wxBoxSizer* main_sizer = new wxBoxSizer (wxHORIZONTAL); - wxBoxSizer* vertical = new wxBoxSizer (wxVERTICAL); + wxBoxSizer* horizontal = new wxBoxSizer (wxHORIZONTAL); + wxBoxSizer* left = new wxBoxSizer (wxVERTICAL); + wxBoxSizer* right = new wxBoxSizer (wxVERTICAL); + + horizontal->Add (left, 1, wxEXPAND | wxRIGHT, DCPOMATIC_SIZER_X_GAP * 2); + horizontal->Add (right, 1, wxEXPAND); wxFont subheading_font (*wxNORMAL_FONT); subheading_font.SetWeight (wxFONTWEIGHT_BOLD); wxStaticText* h = new wxStaticText (overall_panel, wxID_ANY, _("Screens")); h->SetFont (subheading_font); - vertical->Add (h, 0, wxALIGN_CENTER_VERTICAL); + left->Add (h, 0, wxALIGN_CENTER_VERTICAL | wxBOTTOM, DCPOMATIC_SIZER_Y_GAP); _screens = new ScreensPanel (overall_panel); - vertical->Add (_screens, 1, wxEXPAND | wxALL, DCPOMATIC_SIZER_Y_GAP); + left->Add (_screens, 1, wxEXPAND | wxBOTTOM, DCPOMATIC_SIZER_Y_GAP); + /// TRANSLATORS: translate the word "Timing" here; do not include the "KDM|" prefix + h = new wxStaticText (overall_panel, wxID_ANY, S_("KDM|Timing")); + h->SetFont (subheading_font); + right->Add (h, 0, wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_Y_GAP * 2); _timing = new KDMTimingPanel (overall_panel); - vertical->Add (_timing, 0, wxALL, DCPOMATIC_SIZER_Y_GAP); + right->Add (_timing, 0, wxALL, DCPOMATIC_SIZER_Y_GAP); h = new wxStaticText (overall_panel, wxID_ANY, _("DKDM")); h->SetFont (subheading_font); - vertical->Add (h, 0, wxALIGN_CENTER_VERTICAL | wxTOP, DCPOMATIC_SIZER_Y_GAP * 2); + right->Add (h, 0, wxALIGN_CENTER_VERTICAL | wxTOP, DCPOMATIC_SIZER_Y_GAP * 2); vector columns; columns.push_back (wx_to_std (_("CPL"))); _dkdm = new EditableList ( - 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 ); - vertical->Add (_dkdm, 0, wxEXPAND | wxALL, DCPOMATIC_SIZER_Y_GAP); + right->Add (_dkdm, 0, wxEXPAND | wxALL, DCPOMATIC_SIZER_Y_GAP); h = new wxStaticText (overall_panel, wxID_ANY, _("Output")); h->SetFont (subheading_font); - vertical->Add (h, 0, wxALIGN_CENTER_VERTICAL | wxTOP, DCPOMATIC_SIZER_Y_GAP * 2); + right->Add (h, 0, wxALIGN_CENTER_VERTICAL | wxTOP, DCPOMATIC_SIZER_Y_GAP * 2); /* XXX: hard-coded non-interop here */ _output = new KDMOutputPanel (overall_panel, false); - vertical->Add (_output, 0, wxALL, DCPOMATIC_SIZER_Y_GAP); + right->Add (_output, 0, wxALL, DCPOMATIC_SIZER_Y_GAP); _create = new wxButton (overall_panel, wxID_ANY, _("Create KDMs")); - vertical->Add (_create, 0, wxALL, DCPOMATIC_SIZER_GAP); + right->Add (_create, 0, wxALL, DCPOMATIC_SIZER_GAP); - main_sizer->Add (vertical, 1, wxALL, DCPOMATIC_DIALOG_BORDER); + main_sizer->Add (horizontal, 1, wxALL | wxEXPAND, DCPOMATIC_DIALOG_BORDER); overall_panel->SetSizer (main_sizer); /* Instantly save any config changes when using a DCP-o-matic GUI */ 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 (); @@ -246,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 { @@ -273,7 +304,7 @@ private: dcp::DecryptedKDM kdm ( dcp::LocalTime (_timing->from(), i->cinema->utc_offset_hour(), i->cinema->utc_offset_minute()), dcp::LocalTime (_timing->until(), i->cinema->utc_offset_hour(), i->cinema->utc_offset_minute()), - decrypted.annotation_text(), + decrypted.annotation_text().get_value_or (""), decrypted.content_title_text(), dcp::LocalTime().as_string() ); @@ -287,24 +318,35 @@ private: screen_kdms.push_back (ScreenKDM (i, kdm.encrypt (signer, i->recipient.get(), i->trusted_devices, _output->formulation()))); } + 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 (decrypted.content_title_text(), screen_kdms, _output->directory()); - /* 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 (); + string film_name = decrypted.annotation_text().get_value_or (""); if (film_name.empty ()) { film_name = decrypted.content_title_text (); } shared_ptr job (new SendKDMEmailJob ( - film_name, - decrypted.content_title_text(), - _timing->from(), _timing->until(), CinemaKDMs::collect (screen_kdms), + _output->name_format(), + name_values, + decrypted.content_title_text(), shared_ptr () ));