From 320c9b6d68d111bc0768e210cc8c7ae9d0d7c22e Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 23 Dec 2013 21:53:51 +0000 Subject: [PATCH] Move default config options into their own tab; support user/password for SMTP TLS/SSL. --- ChangeLog | 2 + src/lib/config.cc | 4 ++ src/lib/config.h | 18 ++++++ src/lib/kdm.cc | 26 +++++--- src/lib/kdm.h | 6 +- src/lib/wscript | 1 + src/tools/dcpomatic.cc | 5 +- src/wx/config_dialog.cc | 137 ++++++++++++++++++++++++++-------------- src/wx/config_dialog.h | 6 ++ 9 files changed, 146 insertions(+), 59 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6cd71b30f..34db26bcb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,7 @@ 2013-12-23 Carl Hetherington + * Add TLS/SSL support to KDM email sending. + * Add $START_TIME and $END_TIME as variables for the KDM email. * Add top/bottom option for 3D frames. diff --git a/src/lib/config.cc b/src/lib/config.cc index 87cce9d7b..1c34619b4 100644 --- a/src/lib/config.cc +++ b/src/lib/config.cc @@ -176,6 +176,8 @@ Config::read () } _mail_server = f.string_child ("MailServer"); + _mail_user = f.optional_string_child("MailUser").get_value_or (""); + _mail_password = f.optional_string_child("MailPassword").get_value_or (""); _kdm_from = f.string_child ("KDMFrom"); _kdm_email = f.string_child ("KDMEmail"); } @@ -347,6 +349,8 @@ Config::write () const } root->add_child("MailServer")->add_child_text (_mail_server); + root->add_child("MailUser")->add_child_text (_mail_user); + root->add_child("MailPassword")->add_child_text (_mail_password); root->add_child("KDMFrom")->add_child_text (_kdm_from); root->add_child("KDMEmail")->add_child_text (_kdm_email); diff --git a/src/lib/config.h b/src/lib/config.h index 14c707dd2..67d293884 100644 --- a/src/lib/config.h +++ b/src/lib/config.h @@ -155,6 +155,14 @@ public: return _mail_server; } + std::string mail_user () const { + return _mail_user; + } + + std::string mail_password () const { + return _mail_password; + } + std::string kdm_from () const { return _kdm_from; } @@ -261,6 +269,14 @@ public: _mail_server = s; } + void set_mail_user (std::string u) { + _mail_user = u; + } + + void set_mail_password (std::string p) { + _mail_password = p; + } + void set_kdm_from (std::string f) { _kdm_from = f; } @@ -321,6 +337,8 @@ private: std::vector _colour_conversions; std::list > _cinemas; std::string _mail_server; + std::string _mail_user; + std::string _mail_password; std::string _kdm_from; std::string _kdm_email; diff --git a/src/lib/kdm.cc b/src/lib/kdm.cc index 97e0536d1..cf551285b 100644 --- a/src/lib/kdm.cc +++ b/src/lib/kdm.cc @@ -46,7 +46,7 @@ struct ScreenKDM }; static string -kdm_filename (shared_ptr film, ScreenKDM kdm) +kdm_filename (shared_ptr film, ScreenKDM kdm) { return tidy_for_filename (film->name()) + "_" + tidy_for_filename (kdm.screen->cinema->name) + "_" + tidy_for_filename (kdm.screen->name) + ".kdm.xml"; } @@ -56,7 +56,7 @@ struct CinemaKDMs shared_ptr cinema; list screen_kdms; - void make_zip_file (shared_ptr film, boost::filesystem::path zip_file) const + void make_zip_file (shared_ptr film, boost::filesystem::path zip_file) const { int error; struct zip* zip = zip_open (zip_file.string().c_str(), ZIP_CREATE | ZIP_EXCL, &error); @@ -100,7 +100,7 @@ operator== (ScreenKDM const & a, ScreenKDM const & b) static list make_screen_kdms ( - shared_ptr film, + shared_ptr film, list > screens, boost::filesystem::path dcp, boost::posix_time::ptime from, @@ -124,7 +124,7 @@ make_screen_kdms ( static list make_cinema_kdms ( - shared_ptr film, + shared_ptr film, list > screens, boost::filesystem::path dcp, boost::posix_time::ptime from, @@ -166,7 +166,7 @@ make_cinema_kdms ( void write_kdm_files ( - shared_ptr film, + shared_ptr film, list > screens, boost::filesystem::path dcp, boost::posix_time::ptime from, @@ -186,7 +186,7 @@ write_kdm_files ( void write_kdm_zip_files ( - shared_ptr film, + shared_ptr film, list > screens, boost::filesystem::path dcp, boost::posix_time::ptime from, @@ -205,7 +205,7 @@ write_kdm_zip_files ( void email_kdms ( - shared_ptr film, + shared_ptr film, list > screens, boost::filesystem::path dcp, boost::posix_time::ptime from, @@ -237,7 +237,17 @@ email_kdms ( quickmail_set_body (mail, body.c_str()); quickmail_add_attachment_file (mail, zip_file.string().c_str(), "application/zip"); - char const* error = quickmail_send (mail, Config::instance()->mail_server().c_str(), 25, "", ""); + + int const port = Config::instance()->mail_user().empty() ? 25 : 587; + + char const* error = quickmail_send ( + mail, + Config::instance()->mail_server().c_str(), + port, + Config::instance()->mail_user().c_str(), + Config::instance()->mail_password().c_str() + ); + if (error) { quickmail_destroy (mail); throw KDMError (String::compose ("Failed to send KDM email (%1)", error)); diff --git a/src/lib/kdm.h b/src/lib/kdm.h index 5701a8bf8..c4fd43d49 100644 --- a/src/lib/kdm.h +++ b/src/lib/kdm.h @@ -24,7 +24,7 @@ class Screen; class Film; extern void write_kdm_files ( - boost::shared_ptr film, + boost::shared_ptr film, std::list > screens, boost::filesystem::path dcp, boost::posix_time::ptime from, @@ -33,7 +33,7 @@ extern void write_kdm_files ( ); extern void write_kdm_zip_files ( - boost::shared_ptr film, + boost::shared_ptr film, std::list > screens, boost::filesystem::path dcp, boost::posix_time::ptime from, @@ -42,7 +42,7 @@ extern void write_kdm_zip_files ( ); extern void email_kdms ( - boost::shared_ptr film, + boost::shared_ptr film, std::list > screens, boost::filesystem::path dcp, boost::posix_time::ptime from, diff --git a/src/lib/wscript b/src/lib/wscript index 1699c5ec8..25186a3d3 100644 --- a/src/lib/wscript +++ b/src/lib/wscript @@ -44,6 +44,7 @@ sources = """ resampler.cc scp_dcp_job.cc scaler.cc + send_kdm_email_job.cc server.cc server_finder.cc sndfile_content.cc diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index c20283b2e..72fb56b4f 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -53,6 +53,7 @@ #include "lib/exceptions.h" #include "lib/cinema.h" #include "lib/kdm.h" +#include "lib/send_kdm_email_job.h" using std::cout; using std::string; @@ -459,7 +460,9 @@ private: if (d->write_to ()) { write_kdm_files (film, d->screens (), d->dcp (), d->from (), d->until (), d->directory ()); } else { - email_kdms (film, d->screens (), d->dcp (), d->from (), d->until ()); + JobManager::instance()->add ( + shared_ptr (new SendKDMEmailJob (film, d->screens (), d->dcp (), d->from (), d->until ())) + ); } } catch (KDMError& e) { error_dialog (this, e.what ()); diff --git a/src/wx/config_dialog.cc b/src/wx/config_dialog.cc index 4743000f2..7c4601c42 100644 --- a/src/wx/config_dialog.cc +++ b/src/wx/config_dialog.cc @@ -57,6 +57,8 @@ ConfigDialog::ConfigDialog (wxWindow* parent) make_misc_panel (); _notebook->AddPage (_misc_panel, _("Miscellaneous"), true); + make_defaults_panel (); + _notebook->AddPage (_defaults_panel, _("Defaults"), false); make_servers_panel (); _notebook->AddPage (_servers_panel, _("Encoding servers"), false); make_colour_conversions_panel (); @@ -117,57 +119,22 @@ ConfigDialog::make_misc_panel () _mail_server = new wxTextCtrl (_misc_panel, wxID_ANY); table->Add (_mail_server, 1, wxEXPAND | wxALL); + add_label_to_sizer (table, _misc_panel, _("Mail user name"), true); + _mail_user = new wxTextCtrl (_misc_panel, wxID_ANY); + table->Add (_mail_user, 1, wxEXPAND | wxALL); + + add_label_to_sizer (table, _misc_panel, _("Mail password"), true); + _mail_password = new wxTextCtrl (_misc_panel, wxID_ANY); + table->Add (_mail_password, 1, wxEXPAND | wxALL); + + wxStaticText* plain = add_label_to_sizer (table, _misc_panel, _("(password will be stored on disk in plaintext)"), false); + plain->SetFont (font); + table->AddSpacer (0); + add_label_to_sizer (table, _misc_panel, _("From address for KDM emails"), true); _kdm_from = new wxTextCtrl (_misc_panel, wxID_ANY); table->Add (_kdm_from, 1, wxEXPAND | wxALL); - { - add_label_to_sizer (table, _misc_panel, _("Default duration of still images"), true); - wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL); - _default_still_length = new wxSpinCtrl (_misc_panel); - s->Add (_default_still_length); - add_label_to_sizer (s, _misc_panel, _("s"), false); - table->Add (s, 1); - } - - add_label_to_sizer (table, _misc_panel, _("Default directory for new films"), true); -#ifdef DCPOMATIC_USE_OWN_DIR_PICKER - _default_directory = new DirPickerCtrl (_misc_panel); -#else - _default_directory = new wxDirPickerCtrl (_misc_panel, wxDD_DIR_MUST_EXIST); -#endif - table->Add (_default_directory, 1, wxEXPAND); - - add_label_to_sizer (table, _misc_panel, _("Default DCI name details"), true); - _default_dci_metadata_button = new wxButton (_misc_panel, wxID_ANY, _("Edit...")); - table->Add (_default_dci_metadata_button); - - add_label_to_sizer (table, _misc_panel, _("Default container"), true); - _default_container = new wxChoice (_misc_panel, wxID_ANY); - table->Add (_default_container); - - add_label_to_sizer (table, _misc_panel, _("Default content type"), true); - _default_dcp_content_type = new wxChoice (_misc_panel, wxID_ANY); - table->Add (_default_dcp_content_type); - - { - add_label_to_sizer (table, _misc_panel, _("Default JPEG2000 bandwidth"), true); - wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL); - _default_j2k_bandwidth = new wxSpinCtrl (_misc_panel); - s->Add (_default_j2k_bandwidth); - add_label_to_sizer (s, _misc_panel, _("MBps"), false); - table->Add (s, 1); - } - - { - add_label_to_sizer (table, _misc_panel, _("Default audio delay"), true); - wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL); - _default_audio_delay = new wxSpinCtrl (_misc_panel); - s->Add (_default_audio_delay); - add_label_to_sizer (s, _misc_panel, _("ms"), false); - table->Add (s, 1); - } - Config* config = Config::instance (); _set_language->SetValue (config->language ()); @@ -195,9 +162,74 @@ ConfigDialog::make_misc_panel () _mail_server->SetValue (std_to_wx (config->mail_server ())); _mail_server->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&ConfigDialog::mail_server_changed, this)); + _mail_user->SetValue (std_to_wx (config->mail_user ())); + _mail_user->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&ConfigDialog::mail_user_changed, this)); + _mail_password->SetValue (std_to_wx (config->mail_password ())); + _mail_password->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&ConfigDialog::mail_password_changed, this)); _kdm_from->SetValue (std_to_wx (config->kdm_from ())); _kdm_from->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&ConfigDialog::kdm_from_changed, this)); +} + +void +ConfigDialog::make_defaults_panel () +{ + _defaults_panel = new wxPanel (_notebook); + wxBoxSizer* s = new wxBoxSizer (wxVERTICAL); + _defaults_panel->SetSizer (s); + + wxFlexGridSizer* table = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP); + table->AddGrowableCol (1, 1); + s->Add (table, 1, wxALL | wxEXPAND, 8); + + { + add_label_to_sizer (table, _defaults_panel, _("Default duration of still images"), true); + wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL); + _default_still_length = new wxSpinCtrl (_defaults_panel); + s->Add (_default_still_length); + add_label_to_sizer (s, _defaults_panel, _("s"), false); + table->Add (s, 1); + } + + add_label_to_sizer (table, _defaults_panel, _("Default directory for new films"), true); +#ifdef DCPOMATIC_USE_OWN_DIR_PICKER + _default_directory = new DirPickerCtrl (_defaults_panel); +#else + _default_directory = new wxDirPickerCtrl (_defaults_panel, wxDD_DIR_MUST_EXIST); +#endif + table->Add (_default_directory, 1, wxEXPAND); + + add_label_to_sizer (table, _defaults_panel, _("Default DCI name details"), true); + _default_dci_metadata_button = new wxButton (_defaults_panel, wxID_ANY, _("Edit...")); + table->Add (_default_dci_metadata_button); + + add_label_to_sizer (table, _defaults_panel, _("Default container"), true); + _default_container = new wxChoice (_defaults_panel, wxID_ANY); + table->Add (_default_container); + + add_label_to_sizer (table, _defaults_panel, _("Default content type"), true); + _default_dcp_content_type = new wxChoice (_defaults_panel, wxID_ANY); + table->Add (_default_dcp_content_type); + + { + add_label_to_sizer (table, _defaults_panel, _("Default JPEG2000 bandwidth"), true); + wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL); + _default_j2k_bandwidth = new wxSpinCtrl (_defaults_panel); + s->Add (_default_j2k_bandwidth); + add_label_to_sizer (s, _defaults_panel, _("MBps"), false); + table->Add (s, 1); + } + + { + add_label_to_sizer (table, _defaults_panel, _("Default audio delay"), true); + wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL); + _default_audio_delay = new wxSpinCtrl (_defaults_panel); + s->Add (_default_audio_delay); + add_label_to_sizer (s, _defaults_panel, _("ms"), false); + table->Add (s, 1); + } + Config* config = Config::instance (); + _default_still_length->SetRange (1, 3600); _default_still_length->SetValue (config->default_still_length ()); _default_still_length->Bind (wxEVT_COMMAND_SPINCTRL_UPDATED, boost::bind (&ConfigDialog::default_still_length_changed, this)); @@ -503,6 +535,17 @@ ConfigDialog::mail_server_changed () Config::instance()->set_mail_server (wx_to_std (_mail_server->GetValue ())); } +void +ConfigDialog::mail_user_changed () +{ + Config::instance()->set_mail_user (wx_to_std (_mail_user->GetValue ())); +} + +void +ConfigDialog::mail_password_changed () +{ + Config::instance()->set_mail_password (wx_to_std (_mail_password->GetValue ())); +} void ConfigDialog::kdm_from_changed () diff --git a/src/wx/config_dialog.h b/src/wx/config_dialog.h index 45739ef92..49b466bcb 100644 --- a/src/wx/config_dialog.h +++ b/src/wx/config_dialog.h @@ -60,6 +60,8 @@ private: void default_j2k_bandwidth_changed (); void default_audio_delay_changed (); void mail_server_changed (); + void mail_user_changed (); + void mail_password_changed (); void kdm_from_changed (); void kdm_email_changed (); void use_any_servers_changed (); @@ -67,6 +69,7 @@ private: void setup_language_sensitivity (); void make_misc_panel (); + void make_defaults_panel (); void make_servers_panel (); void make_tms_panel (); void make_metadata_panel (); @@ -75,6 +78,7 @@ private: wxNotebook* _notebook; wxPanel* _misc_panel; + wxPanel* _defaults_panel; wxPanel* _servers_panel; wxPanel* _tms_panel; EditableList* _colour_conversions_panel; @@ -89,6 +93,8 @@ private: wxTextCtrl* _tms_password; wxSpinCtrl* _num_local_encoding_threads; wxTextCtrl* _mail_server; + wxTextCtrl* _mail_user; + wxTextCtrl* _mail_password; wxTextCtrl* _kdm_from; wxSpinCtrl* _default_still_length; #ifdef DCPOMATIC_USE_OWN_DIR_PICKER -- 2.30.2