Allow sending KDMs to more emails (#2244).
authorCarl Hetherington <cth@carlh.net>
Thu, 5 May 2022 22:55:18 +0000 (00:55 +0200)
committerCarl Hetherington <cth@carlh.net>
Fri, 3 Jun 2022 20:26:16 +0000 (22:26 +0200)
src/lib/kdm_cli.cc
src/lib/kdm_with_metadata.cc
src/lib/kdm_with_metadata.h
src/lib/send_kdm_email_job.cc
src/lib/send_kdm_email_job.h
src/wx/dkdm_output_panel.cc
src/wx/extra_kdm_email_dialog.cc [new file with mode: 0644]
src/wx/extra_kdm_email_dialog.h [new file with mode: 0644]
src/wx/kdm_output_panel.cc
src/wx/kdm_output_panel.h
src/wx/wscript

index e89da6e373913757df420164fd494cd37eaf01be..4c1a55d7d3f19423148d6797040fdcbb182f2c22 100644 (file)
@@ -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()));
index a826327ca1bff8f692f019cb0d178663de1baa8d..5c1ab0aa6fe2e3b2978073d918dedc35b9664969 100644 (file)
@@ -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<list<KDMWithMetadataPtr>> kdms,
        dcp::NameFormat container_name_format,
        dcp::NameFormat filename_format,
-       string cpl_name
+       string cpl_name,
+       vector<string> 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);
        }
 }
index 6c961768a9b41f79e1de0393b9c2aa16b781be40..df9f041251ec9d8075b338cd164ea0bc50949ece 100644 (file)
@@ -107,7 +107,8 @@ void send_emails (
                std::list<std::list<KDMWithMetadataPtr>> kdms,
                dcp::NameFormat container_name_format,
                dcp::NameFormat filename_format,
-               std::string cpl_name
+               std::string cpl_name,
+               std::vector<std::string> extra_addresses
                );
 
 #endif
index d4d13fa48d6f5d9865aaa7782ff9f9ce72cc86f4..bffdc9e5848a02c8275e741f86ecd9c46ebf4962 100644 (file)
 */
 
 
-#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 <list>
 
 #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<KDMWithMetadataPtr> kdms,
        dcp::NameFormat container_name_format,
        dcp::NameFormat filename_format,
-       string cpl_name
+       string cpl_name,
+       vector<string> extra_addresses
        )
        : Job (shared_ptr<Film>())
        , _container_name_format (container_name_format)
        , _filename_format (filename_format)
        , _cpl_name (cpl_name)
+       , _extra_addresses (extra_addresses)
 {
        for (auto i: kdms) {
                list<KDMWithMetadataPtr> s;
@@ -63,13 +66,15 @@ SendKDMEmailJob::SendKDMEmailJob (
        list<list<KDMWithMetadataPtr> > kdms,
        dcp::NameFormat container_name_format,
        dcp::NameFormat filename_format,
-       string cpl_name
+       string cpl_name,
+       vector<string> extra_addresses
        )
        : Job (shared_ptr<Film>())
        , _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);
 }
index 76fb72b8a364c0866310ea77ad161d931626eb4c..621254e0fc8a82ae953e0167499e30334b10237f 100644 (file)
@@ -24,6 +24,7 @@
 #include <dcp/types.h>
 #include <dcp/name_format.h>
 #include <boost/filesystem.hpp>
+#include <vector>
 
 
 namespace dcpomatic {
@@ -41,14 +42,16 @@ public:
                std::list<KDMWithMetadataPtr> kdms,
                dcp::NameFormat container_name_format,
                dcp::NameFormat filename_format,
-               std::string cpl_name
+               std::string cpl_name,
+               std::vector<std::string> extra_addresses
                );
 
        SendKDMEmailJob (
                std::list<std::list<KDMWithMetadataPtr>> kdms,
                dcp::NameFormat container_name_format,
                dcp::NameFormat filename_format,
-               std::string cpl_name
+               std::string cpl_name,
+               std::vector<std::string> extra_addresses
                );
 
        ~SendKDMEmailJob ();
@@ -62,4 +65,5 @@ private:
        dcp::NameFormat _filename_format;
        std::string _cpl_name;
        std::list<std::list<KDMWithMetadataPtr>> _kdms;
+       std::vector<std::string> _extra_addresses;
 };
index cc02721ed15d9ec7f08a905ee414410de40fd7d7..9eb3084e3c999f323893d95fa369a5bc66c72d41 100644 (file)
@@ -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 (file)
index 0000000..8a8a37f
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+    Copyright (C) 2022 Carl Hetherington <cth@carlh.net>
+
+    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 <http://www.gnu.org/licenses/>.
+
+*/
+
+
+#include "editable_list.h"
+#include "extra_kdm_email_dialog.h"
+#include "wx_util.h"
+#include <wx/gbsizer.h>
+#include <vector>
+
+
+using std::string;
+using std::vector;
+#if BOOST_VERSION >= 106100
+using namespace boost::placeholders;
+#endif
+
+
+ExtraKDMEmailDialog::ExtraKDMEmailDialog (wxWindow* parent, vector<string> 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<EditableListColumn> columns;
+       columns.push_back (EditableListColumn(_("Address"), 500, true));
+       _email_list = new EditableList<string, EmailDialog> (
+               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<string>
+ExtraKDMEmailDialog::get () const
+{
+       return _emails;
+}
+
+
+void
+ExtraKDMEmailDialog::set(vector<string> 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 (file)
index 0000000..e045418
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+    Copyright (C) 2022 Carl Hetherington <cth@carlh.net>
+
+    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 <http://www.gnu.org/licenses/>.
+
+*/
+
+
+#include "editable_list.h"
+#include "email_dialog.h"
+#include <wx/wx.h>
+#include <vector>
+
+
+class ExtraKDMEmailDialog : public wxDialog
+{
+public:
+       ExtraKDMEmailDialog (wxWindow* parent, std::vector<std::string> emails);
+
+       std::vector<std::string> get () const;
+
+private:
+       void set(std::vector<std::string> emails);
+
+       EditableList<std::string, EmailDialog>* _email_list;
+       std::vector<std::string> _emails;
+};
+
index 98f40813514a7a38e4061fad8188bf040046b6b3..75971c14b5b6de795d8305d69c1d0c08bc3885e2 100644 (file)
@@ -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<SendKDMEmailJob>(
+                               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();
+}
+
index 872d23a8f9f6afe38d4b15e33d43ee42386dab65..9c30e286c856a34158c5a826afea64127fb0d52e 100644 (file)
@@ -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<int> _forensic_mark_audio_up_to;
+       std::vector<std::string> _extra_addresses;
 };
index 8da9b546cd19b23ed1e7cbc1ed7713050f8ac762..ad343cede428ca338ddc887d95f1aaca24e07e29 100644 (file)
@@ -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