Move default config options into their own tab; support user/password for SMTP TLS...
authorCarl Hetherington <cth@carlh.net>
Mon, 23 Dec 2013 21:53:51 +0000 (21:53 +0000)
committerCarl Hetherington <cth@carlh.net>
Mon, 23 Dec 2013 21:53:51 +0000 (21:53 +0000)
ChangeLog
src/lib/config.cc
src/lib/config.h
src/lib/kdm.cc
src/lib/kdm.h
src/lib/wscript
src/tools/dcpomatic.cc
src/wx/config_dialog.cc
src/wx/config_dialog.h

index 6cd71b30f4284710e9ee291e6ac8a192e86c3c38..34db26bcb4b73c325d9fd944c1183a2acf9ccc55 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2013-12-23  Carl Hetherington  <cth@carlh.net>
 
+       * 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.
index 87cce9d7b4575e14e9eda7d50bc7bf886c9a63dd..1c34619b42beeef2812880ae3001b80845e33c98 100644 (file)
@@ -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);
 
index 14c707dd2dcf85d70fe4449b05d82637040cf7fb..67d29388461f4a688eb4ec982f2954efa2899da6 100644 (file)
@@ -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<PresetColourConversion> _colour_conversions;
        std::list<boost::shared_ptr<Cinema> > _cinemas;
        std::string _mail_server;
+       std::string _mail_user;
+       std::string _mail_password;
        std::string _kdm_from;
        std::string _kdm_email;
 
index 97e0536d1d9a40ec7c6d06b769e7781a7a0726c0..cf551285bb5444a476bd5b5f319b3ac556f056fd 100644 (file)
@@ -46,7 +46,7 @@ struct ScreenKDM
 };
 
 static string
-kdm_filename (shared_ptr<Film> film, ScreenKDM kdm)
+kdm_filename (shared_ptr<const Film> 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> cinema;
        list<ScreenKDM> screen_kdms;
 
-       void make_zip_file (shared_ptr<Film> film, boost::filesystem::path zip_file) const
+       void make_zip_file (shared_ptr<const Film> 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<ScreenKDM>
 make_screen_kdms (
-       shared_ptr<Film> film,
+       shared_ptr<const Film> film,
        list<shared_ptr<Screen> > screens,
        boost::filesystem::path dcp,
        boost::posix_time::ptime from,
@@ -124,7 +124,7 @@ make_screen_kdms (
 
 static list<CinemaKDMs>
 make_cinema_kdms (
-       shared_ptr<Film> film,
+       shared_ptr<const Film> film,
        list<shared_ptr<Screen> > screens,
        boost::filesystem::path dcp,
        boost::posix_time::ptime from,
@@ -166,7 +166,7 @@ make_cinema_kdms (
 
 void
 write_kdm_files (
-       shared_ptr<Film> film,
+       shared_ptr<const Film> film,
        list<shared_ptr<Screen> > 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> film,
+       shared_ptr<const Film> film,
        list<shared_ptr<Screen> > screens,
        boost::filesystem::path dcp,
        boost::posix_time::ptime from,
@@ -205,7 +205,7 @@ write_kdm_zip_files (
 
 void
 email_kdms (
-       shared_ptr<Film> film,
+       shared_ptr<const Film> film,
        list<shared_ptr<Screen> > 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));
index 5701a8bf85a18107126456bc5e284d9aba99482d..c4fd43d49bfc315e623c1bf005070e61e2031778 100644 (file)
@@ -24,7 +24,7 @@ class Screen;
 class Film;
 
 extern void write_kdm_files (
-       boost::shared_ptr<Film> film,
+       boost::shared_ptr<const Film> film,
        std::list<boost::shared_ptr<Screen> > 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> film,
+       boost::shared_ptr<const Film> film,
        std::list<boost::shared_ptr<Screen> > 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> film,
+       boost::shared_ptr<const Film> film,
        std::list<boost::shared_ptr<Screen> > screens,
        boost::filesystem::path dcp,
        boost::posix_time::ptime from,
index 1699c5ec8c6b5c1b9f782a3cf718dfcbdca8049e..25186a3d3452895a06299b1a3cc286982f7a7dd3 100644 (file)
@@ -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
index c20283b2ee6ec5b8375daafd44f3e730e7f55e16..72fb56b4f552d216a6a7a65e1766064bf66f6935 100644 (file)
@@ -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<Job> (new SendKDMEmailJob (film, d->screens (), d->dcp (), d->from (), d->until ()))
+                                       );
                        }
                } catch (KDMError& e) {
                        error_dialog (this, e.what ());
index 4743000f23a90000ff7371d84bcb6e36c1ff49a5..7c4601c42688da6de2ffc156e1a61d753e5df128 100644 (file)
@@ -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 ()
index 45739ef9287ba3a9253ea7124159ac8b9d07b467..49b466bcb9d31d4a080b240d5e9fc6cef3308024 100644 (file)
@@ -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<PresetColourConversion, PresetColourConversionDialog>* _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