Merge master.
[dcpomatic.git] / src / wx / config_dialog.cc
index ee660832f441561a244f0881cf7e895aeab56bcd..175ed94ade131a754781e69476f9d6d6f4f3a534 100644 (file)
@@ -39,6 +39,8 @@
 #include "lib/colour_conversion.h"
 #include "lib/log.h"
 #include "lib/util.h"
+#include "lib/cross.h"
+#include "lib/exceptions.h"
 #include "config_dialog.h"
 #include "wx_util.h"
 #include "editable_list.h"
@@ -656,6 +658,10 @@ public:
                        s->Add (_load_decryption_private_key, 0, wxLEFT, DCPOMATIC_SIZER_X_GAP);
                        table->Add (s, 0);
                }
+
+               _export_decryption_certificate = new wxButton (_panel, wxID_ANY, _("Export DCP decryption certificate..."));
+               table->Add (_export_decryption_certificate);
+               table->AddSpacer (0);
                
                _add_certificate->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&KeysPage::add_certificate, this));
                _remove_certificate->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&KeysPage::remove_certificate, this));
@@ -664,6 +670,7 @@ public:
                _load_signer_private_key->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&KeysPage::load_signer_private_key, this));
                _load_decryption_certificate->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&KeysPage::load_decryption_certificate, this));
                _load_decryption_private_key->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&KeysPage::load_decryption_private_key, this));
+               _export_decryption_certificate->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&KeysPage::export_decryption_certificate, this));
 
                _signer.reset (new dcp::Signer (*Config::instance()->signer().get ()));
 
@@ -683,7 +690,7 @@ private:
                
                if (d->ShowModal() == wxID_OK) {
                        try {
-                               shared_ptr<dcp::Certificate> c (new dcp::Certificate (dcp::file_to_string (wx_to_std (d->GetPath ()))));
+                               dcp::Certificate c (dcp::file_to_string (wx_to_std (d->GetPath ())));
                                _signer->certificates().add (c);
                                Config::instance()->set_signer (_signer);
                                update_certificate_list ();
@@ -720,7 +727,7 @@ private:
                        wxListItem item;
                        item.SetId (n);
                        _certificates->InsertItem (item);
-                       _certificates->SetItem (n, 1, std_to_wx ((*i)->thumbprint ()));
+                       _certificates->SetItem (n, 1, std_to_wx (i->thumbprint ()));
 
                        if (n == 0) {
                                _certificates->SetItem (n, 0, _("Root"));
@@ -814,6 +821,26 @@ private:
                _decryption_private_key->SetLabel (std_to_wx (dcp::private_key_fingerprint (Config::instance()->decryption_private_key())));
        }
 
+       void export_decryption_certificate ()
+       {
+               wxFileDialog* d = new wxFileDialog (
+                       _panel, _("Select Certificate File"), wxEmptyString, wxEmptyString, wxT ("PEM files (*.pem)|*.pem"),
+                       wxFD_SAVE | wxFD_OVERWRITE_PROMPT
+                       );
+               
+               if (d->ShowModal () == wxID_OK) {
+                       FILE* f = fopen_boost (wx_to_std (d->GetPath ()), "w");
+                       if (!f) {
+                               throw OpenFileError (wx_to_std (d->GetPath ()));
+                       }
+
+                       string const s = Config::instance()->decryption_certificate().certificate (true);
+                       fwrite (s.c_str(), 1, s.length(), f);
+                       fclose (f);
+               }
+               d->Destroy ();
+       }
+
        wxPanel* _panel;
        wxListCtrl* _certificates;
        wxButton* _add_certificate;
@@ -824,6 +851,7 @@ private:
        wxButton* _load_decryption_certificate;
        wxStaticText* _decryption_private_key;
        wxButton* _load_decryption_private_key;
+       wxButton* _export_decryption_certificate;
        shared_ptr<dcp::Signer> _signer;
 };
 
@@ -978,9 +1006,13 @@ public:
                add_label_to_sizer (table, panel, _("CC address"), true);
                _kdm_cc = new wxTextCtrl (panel, wxID_ANY);
                table->Add (_kdm_cc, 1, wxEXPAND | wxALL);
+
+               add_label_to_sizer (table, panel, _("BCC address"), true);
+               _kdm_bcc = new wxTextCtrl (panel, wxID_ANY);
+               table->Add (_kdm_bcc, 1, wxEXPAND | wxALL);
                
                _kdm_email = new wxTextCtrl (panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize (480, 128), wxTE_MULTILINE);
-               s->Add (_kdm_email, 1.5, wxEXPAND | wxALL, _border);
+               s->Add (_kdm_email, 1, wxEXPAND | wxALL, _border);
 
                _reset_kdm_email = new wxButton (panel, wxID_ANY, _("Reset to default text"));
                s->Add (_reset_kdm_email, 0, wxEXPAND | wxALL, _border);
@@ -998,6 +1030,8 @@ public:
                _kdm_from->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&KDMEmailPage::kdm_from_changed, this));
                _kdm_cc->SetValue (std_to_wx (config->kdm_cc ()));
                _kdm_cc->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&KDMEmailPage::kdm_cc_changed, this));
+               _kdm_bcc->SetValue (std_to_wx (config->kdm_bcc ()));
+               _kdm_bcc->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&KDMEmailPage::kdm_bcc_changed, this));
                _kdm_email->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&KDMEmailPage::kdm_email_changed, this));
                _kdm_email->SetValue (std_to_wx (Config::instance()->kdm_email ()));
                _reset_kdm_email->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&KDMEmailPage::reset_kdm_email, this));
@@ -1035,6 +1069,11 @@ private:
        {
                Config::instance()->set_kdm_cc (wx_to_std (_kdm_cc->GetValue ()));
        }
+
+       void kdm_bcc_changed ()
+       {
+               Config::instance()->set_kdm_bcc (wx_to_std (_kdm_bcc->GetValue ()));
+       }
        
        void kdm_email_changed ()
        {
@@ -1053,6 +1092,7 @@ private:
        wxTextCtrl* _kdm_subject;
        wxTextCtrl* _kdm_from;
        wxTextCtrl* _kdm_cc;
+       wxTextCtrl* _kdm_bcc;
        wxTextCtrl* _kdm_email;
        wxButton* _reset_kdm_email;
 };