From cacb0750b9e6efbefa5ffa33a0df9552db5483db Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 6 May 2022 00:55:18 +0200 Subject: [PATCH] Allow sending KDMs to more emails (#2244). --- src/lib/kdm_cli.cc | 4 +- src/lib/kdm_with_metadata.cc | 38 +++++++++++---- src/lib/kdm_with_metadata.h | 3 +- src/lib/send_kdm_email_job.cc | 17 ++++--- src/lib/send_kdm_email_job.h | 8 +++- src/wx/dkdm_output_panel.cc | 3 +- src/wx/extra_kdm_email_dialog.cc | 81 ++++++++++++++++++++++++++++++++ src/wx/extra_kdm_email_dialog.h | 41 ++++++++++++++++ src/wx/kdm_output_panel.cc | 31 ++++++++---- src/wx/kdm_output_panel.h | 2 + src/wx/wscript | 1 + 11 files changed, 199 insertions(+), 30 deletions(-) create mode 100644 src/wx/extra_kdm_email_dialog.cc create mode 100644 src/wx/extra_kdm_email_dialog.h diff --git a/src/lib/kdm_cli.cc b/src/lib/kdm_cli.cc index e89da6e37..4c1a55d7d 100644 --- a/src/lib/kdm_cli.cc +++ b/src/lib/kdm_cli.cc @@ -250,7 +250,7 @@ from_film ( } write_files (kdms, zip, output, container_name_format, filename_format, verbose, out); if (email) { - send_emails ({kdms}, container_name_format, filename_format, film->dcp_name()); + send_emails ({kdms}, container_name_format, filename_format, film->dcp_name(), {}); } } catch (FileError& e) { throw KDMCLIError (String::compose("%1 (%2)", e.what(), e.file().string())); @@ -383,7 +383,7 @@ from_dkdm ( } write_files (kdms, zip, output, container_name_format, filename_format, verbose, out); if (email) { - send_emails ({kdms}, container_name_format, filename_format, dkdm.annotation_text().get_value_or("")); + send_emails ({kdms}, container_name_format, filename_format, dkdm.annotation_text().get_value_or(""), {}); } } catch (FileError& e) { throw KDMCLIError (String::compose("%1 (%2)", e.what(), e.file().string())); diff --git a/src/lib/kdm_with_metadata.cc b/src/lib/kdm_with_metadata.cc index a826327ca..5c1ab0aa6 100644 --- a/src/lib/kdm_with_metadata.cc +++ b/src/lib/kdm_with_metadata.cc @@ -38,6 +38,7 @@ using std::function; using std::list; using std::shared_ptr; using std::string; +using std::vector; using boost::optional; @@ -201,7 +202,8 @@ send_emails ( list> kdms, dcp::NameFormat container_name_format, dcp::NameFormat filename_format, - string cpl_name + string cpl_name, + vector extra_addresses ) { auto config = Config::instance (); @@ -255,22 +257,38 @@ send_emails ( email.add_attachment (zip_file, container_name_format.get(first->name_values(), ".zip"), "application/zip"); + auto log_details = [](Emailer& email) { + dcpomatic_log->log("Email content follows", LogEntry::TYPE_DEBUG_EMAIL); + dcpomatic_log->log(email.email(), LogEntry::TYPE_DEBUG_EMAIL); + dcpomatic_log->log("Email session follows", LogEntry::TYPE_DEBUG_EMAIL); + dcpomatic_log->log(email.notes(), LogEntry::TYPE_DEBUG_EMAIL); + }; + try { email.send (config->mail_server(), config->mail_port(), config->mail_protocol(), config->mail_user(), config->mail_password()); } catch (...) { boost::filesystem::remove (zip_file); - dcpomatic_log->log ("Email content follows", LogEntry::TYPE_DEBUG_EMAIL); - dcpomatic_log->log (email.email(), LogEntry::TYPE_DEBUG_EMAIL); - dcpomatic_log->log ("Email session follows", LogEntry::TYPE_DEBUG_EMAIL); - dcpomatic_log->log (email.notes(), LogEntry::TYPE_DEBUG_EMAIL); + log_details (email); throw; } - boost::filesystem::remove (zip_file); + log_details (email); - dcpomatic_log->log ("Email content follows", LogEntry::TYPE_DEBUG_EMAIL); - dcpomatic_log->log (email.email(), LogEntry::TYPE_DEBUG_EMAIL); - dcpomatic_log->log ("Email session follows", LogEntry::TYPE_DEBUG_EMAIL); - dcpomatic_log->log (email.notes(), LogEntry::TYPE_DEBUG_EMAIL); + for (auto extra: extra_addresses) { + Emailer email (config->kdm_from(), { extra }, subject, body); + email.add_attachment (zip_file, container_name_format.get(first->name_values(), ".zip"), "application/zip"); + + try { + email.send (config->mail_server(), config->mail_port(), config->mail_protocol(), config->mail_user(), config->mail_password()); + } catch (...) { + boost::filesystem::remove (zip_file); + log_details (email); + throw; + } + + log_details (email); + } + + boost::filesystem::remove (zip_file); } } diff --git a/src/lib/kdm_with_metadata.h b/src/lib/kdm_with_metadata.h index 6c961768a..df9f04125 100644 --- a/src/lib/kdm_with_metadata.h +++ b/src/lib/kdm_with_metadata.h @@ -107,7 +107,8 @@ void send_emails ( std::list> kdms, dcp::NameFormat container_name_format, dcp::NameFormat filename_format, - std::string cpl_name + std::string cpl_name, + std::vector extra_addresses ); #endif diff --git a/src/lib/send_kdm_email_job.cc b/src/lib/send_kdm_email_job.cc index d4d13fa48..bffdc9e58 100644 --- a/src/lib/send_kdm_email_job.cc +++ b/src/lib/send_kdm_email_job.cc @@ -19,18 +19,19 @@ */ -#include "send_kdm_email_job.h" #include "compose.hpp" -#include "kdm_with_metadata.h" #include "film.h" +#include "kdm_with_metadata.h" +#include "send_kdm_email_job.h" #include #include "i18n.h" -using std::string; using std::list; using std::shared_ptr; +using std::string; +using std::vector; using boost::optional; @@ -38,12 +39,14 @@ SendKDMEmailJob::SendKDMEmailJob ( list kdms, dcp::NameFormat container_name_format, dcp::NameFormat filename_format, - string cpl_name + string cpl_name, + vector extra_addresses ) : Job (shared_ptr()) , _container_name_format (container_name_format) , _filename_format (filename_format) , _cpl_name (cpl_name) + , _extra_addresses (extra_addresses) { for (auto i: kdms) { list s; @@ -63,13 +66,15 @@ SendKDMEmailJob::SendKDMEmailJob ( list > kdms, dcp::NameFormat container_name_format, dcp::NameFormat filename_format, - string cpl_name + string cpl_name, + vector extra_addresses ) : Job (shared_ptr()) , _container_name_format (container_name_format) , _filename_format (filename_format) , _cpl_name (cpl_name) , _kdms (kdms) + , _extra_addresses (extra_addresses) { } @@ -104,7 +109,7 @@ void SendKDMEmailJob::run () { set_progress_unknown (); - send_emails (_kdms, _container_name_format, _filename_format, _cpl_name); + send_emails (_kdms, _container_name_format, _filename_format, _cpl_name, _extra_addresses); set_progress (1); set_state (FINISHED_OK); } diff --git a/src/lib/send_kdm_email_job.h b/src/lib/send_kdm_email_job.h index 76fb72b8a..621254e0f 100644 --- a/src/lib/send_kdm_email_job.h +++ b/src/lib/send_kdm_email_job.h @@ -24,6 +24,7 @@ #include #include #include +#include namespace dcpomatic { @@ -41,14 +42,16 @@ public: std::list kdms, dcp::NameFormat container_name_format, dcp::NameFormat filename_format, - std::string cpl_name + std::string cpl_name, + std::vector extra_addresses ); SendKDMEmailJob ( std::list> kdms, dcp::NameFormat container_name_format, dcp::NameFormat filename_format, - std::string cpl_name + std::string cpl_name, + std::vector extra_addresses ); ~SendKDMEmailJob (); @@ -62,4 +65,5 @@ private: dcp::NameFormat _filename_format; std::string _cpl_name; std::list> _kdms; + std::vector _extra_addresses; }; diff --git a/src/wx/dkdm_output_panel.cc b/src/wx/dkdm_output_panel.cc index cc02721ed..9eb3084e3 100644 --- a/src/wx/dkdm_output_panel.cc +++ b/src/wx/dkdm_output_panel.cc @@ -178,7 +178,8 @@ DKDMOutputPanel::make ( kdms, _filename_format->get(), _filename_format->get(), - name + name, + {} ) ); } diff --git a/src/wx/extra_kdm_email_dialog.cc b/src/wx/extra_kdm_email_dialog.cc new file mode 100644 index 000000000..8a8a37f0a --- /dev/null +++ b/src/wx/extra_kdm_email_dialog.cc @@ -0,0 +1,81 @@ +/* + Copyright (C) 2022 Carl Hetherington + + 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. + + 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 DCP-o-matic. If not, see . + +*/ + + +#include "editable_list.h" +#include "extra_kdm_email_dialog.h" +#include "wx_util.h" +#include +#include + + +using std::string; +using std::vector; +#if BOOST_VERSION >= 106100 +using namespace boost::placeholders; +#endif + + +ExtraKDMEmailDialog::ExtraKDMEmailDialog (wxWindow* parent, vector emails) + : wxDialog (parent, wxID_ANY, _("Extra addresses for KDM delivery")) + , _emails(emails) +{ + auto overall_sizer = new wxBoxSizer (wxVERTICAL); + SetSizer (overall_sizer); + + auto sizer = new wxGridBagSizer (DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP); + int r = 0; + + vector columns; + columns.push_back (EditableListColumn(_("Address"), 500, true)); + _email_list = new EditableList ( + this, columns, bind(&ExtraKDMEmailDialog::get, this), bind(&ExtraKDMEmailDialog::set, this, _1), [](string s, int) { + return s; + }, false, EditableListButton::NEW | EditableListButton::EDIT | EditableListButton::REMOVE + ); + + sizer->Add (_email_list, wxGBPosition(r, 0), wxGBSpan(1, 2), wxEXPAND); + ++r; + + overall_sizer->Add (sizer, 1, wxEXPAND | wxALL, DCPOMATIC_DIALOG_BORDER); + + auto buttons = CreateSeparatedButtonSizer (wxOK | wxCANCEL); + if (buttons) { + overall_sizer->Add (buttons, wxSizerFlags().Expand().DoubleBorder()); + } + + overall_sizer->Layout (); + overall_sizer->SetSizeHints (this); +} + + +vector +ExtraKDMEmailDialog::get () const +{ + return _emails; +} + + +void +ExtraKDMEmailDialog::set(vector emails) +{ + _emails = emails; +} + diff --git a/src/wx/extra_kdm_email_dialog.h b/src/wx/extra_kdm_email_dialog.h new file mode 100644 index 000000000..e04541864 --- /dev/null +++ b/src/wx/extra_kdm_email_dialog.h @@ -0,0 +1,41 @@ +/* + Copyright (C) 2022 Carl Hetherington + + 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. + + 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 DCP-o-matic. If not, see . + +*/ + + +#include "editable_list.h" +#include "email_dialog.h" +#include +#include + + +class ExtraKDMEmailDialog : public wxDialog +{ +public: + ExtraKDMEmailDialog (wxWindow* parent, std::vector emails); + + std::vector get () const; + +private: + void set(std::vector emails); + + EditableList* _email_list; + std::vector _emails; +}; + diff --git a/src/wx/kdm_output_panel.cc b/src/wx/kdm_output_panel.cc index 98f408135..75971c14b 100644 --- a/src/wx/kdm_output_panel.cc +++ b/src/wx/kdm_output_panel.cc @@ -22,6 +22,7 @@ #include "check_box.h" #include "confirm_kdm_email_dialog.h" #include "dcpomatic_button.h" +#include "extra_kdm_email_dialog.h" #include "kdm_advanced_dialog.h" #include "kdm_choice.h" #include "kdm_output_panel.h" @@ -50,6 +51,7 @@ using std::exception; using std::function; using std::list; using std::make_pair; +using std::make_shared; using std::pair; using std::shared_ptr; using std::string; @@ -135,7 +137,8 @@ KDMOutputPanel::KDMOutputPanel (wxWindow* parent) _email = new CheckBox (this, _("Send by email")); table->Add (_email, 1, wxEXPAND); - table->AddSpacer (0); + auto add_email_addresses = new wxButton(this, wxID_ANY, _("Set additional email addresses...")); + table->Add (add_email_addresses); switch (Config::instance()->last_kdm_write_type().get_value_or(Config::KDM_WRITE_FLAT)) { case Config::KDM_WRITE_FLAT: @@ -154,6 +157,7 @@ KDMOutputPanel::KDMOutputPanel (wxWindow* parent) _write_to->Bind (wxEVT_CHECKBOX, boost::bind (&KDMOutputPanel::write_to_changed, this)); _email->Bind (wxEVT_CHECKBOX, boost::bind (&KDMOutputPanel::email_changed, this)); + add_email_addresses->Bind (wxEVT_BUTTON, boost::bind(&KDMOutputPanel::add_email_addresses_clicked, this)); _write_flat->Bind (wxEVT_RADIOBUTTON, boost::bind (&KDMOutputPanel::kdm_write_type_changed, this)); _write_folder->Bind (wxEVT_RADIOBUTTON, boost::bind (&KDMOutputPanel::kdm_write_type_changed, this)); _write_zip->Bind (wxEVT_RADIOBUTTON, boost::bind (&KDMOutputPanel::kdm_write_type_changed, this)); @@ -301,13 +305,12 @@ KDMOutputPanel::make ( } if (_email->GetValue ()) { - job.reset ( - new SendKDMEmailJob ( - cinema_kdms, - _container_name_format->get(), - _filename_format->get(), - name - ) + job = make_shared( + cinema_kdms, + _container_name_format->get(), + _filename_format->get(), + name, + _extra_addresses ); } @@ -335,3 +338,15 @@ KDMOutputPanel::directory () const { return wx_to_std (_folder->GetPath ()); } + + +void +KDMOutputPanel::add_email_addresses_clicked () +{ + auto dialog = new ExtraKDMEmailDialog (this, _extra_addresses); + if (dialog->ShowModal() == wxID_OK) { + _extra_addresses = dialog->get(); + } + dialog->Destroy(); +} + diff --git a/src/wx/kdm_output_panel.h b/src/wx/kdm_output_panel.h index 872d23a8f..9c30e286c 100644 --- a/src/wx/kdm_output_panel.h +++ b/src/wx/kdm_output_panel.h @@ -67,6 +67,7 @@ private: void advanced_clicked (); void write_to_changed (); void email_changed (); + void add_email_addresses_clicked (); KDMChoice* _type; NameFormatEditor* _container_name_format; @@ -84,4 +85,5 @@ private: bool _forensic_mark_video; bool _forensic_mark_audio; boost::optional _forensic_mark_audio_up_to; + std::vector _extra_addresses; }; diff --git a/src/wx/wscript b/src/wx/wscript index 8da9b546c..ad343cede 100644 --- a/src/wx/wscript +++ b/src/wx/wscript @@ -68,6 +68,7 @@ sources = """ email_dialog.cc export_subtitles_dialog.cc export_video_file_dialog.cc + extra_kdm_email_dialog.cc file_picker_ctrl.cc film_editor.cc film_name_location_dialog.cc -- 2.30.2