From 048f9b6b5569f03d1342a04f75c83a2bad340996 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 14 Jan 2013 21:49:40 +0000 Subject: [PATCH] Various work on certificate handling for screens; need XML config here, now. --- src/lib/cinema.h | 3 ++- src/lib/config.cc | 12 ++++++++-- src/wx/kdm_dialog.cc | 5 +++-- src/wx/screen_dialog.cc | 49 +++++++++++++++++++++++++++++++++++++++-- src/wx/screen_dialog.h | 11 ++++++++- 5 files changed, 72 insertions(+), 8 deletions(-) diff --git a/src/lib/cinema.h b/src/lib/cinema.h index 0cec01384..6f426ae8d 100644 --- a/src/lib/cinema.h +++ b/src/lib/cinema.h @@ -3,8 +3,9 @@ class Screen { public: - Screen (std::string const & n) + Screen (std::string const & n, boost::shared_ptr cert) : name (n) + , certificate (cert) {} std::string name; diff --git a/src/lib/config.cc b/src/lib/config.cc index 848e466a6..a74c36f73 100644 --- a/src/lib/config.cc +++ b/src/lib/config.cc @@ -50,6 +50,7 @@ Config::Config () string line; shared_ptr cinema; + shared_ptr screen; while (getline (f, line)) { if (line.empty ()) { @@ -99,8 +100,15 @@ Config::Config () assert (cinema); cinema->email = v; } else if (k == "screen") { - shared_ptr s (new Screen (v)); - cinema->screens.push_back (s); + assert (cinema); + if (screen) { + cinema->screens.push_back (screen); + } + screen.reset (new Screen (v, shared_ptr ())); + } else if (k == "screen_certificate") { + assert (screen); + shared_ptr c (new libdcp::Certificate); + c->set_from_string (v); } } diff --git a/src/wx/kdm_dialog.cc b/src/wx/kdm_dialog.cc index 0febdf38e..d94c13057 100644 --- a/src/wx/kdm_dialog.cc +++ b/src/wx/kdm_dialog.cc @@ -269,7 +269,7 @@ KDMDialog::add_screen_clicked (wxCommandEvent &) ScreenDialog* d = new ScreenDialog (this, "Add Screen"); d->ShowModal (); - shared_ptr s (new Screen (d->name())); + shared_ptr s (new Screen (d->name(), d->certificate())); c->screens.push_back (s); add_screen (c, s); @@ -287,10 +287,11 @@ KDMDialog::edit_screen_clicked (wxCommandEvent &) pair > s = selected_screens().front(); - ScreenDialog* d = new ScreenDialog (this, "Edit screen", s.second->name); + ScreenDialog* d = new ScreenDialog (this, "Edit screen", s.second->name, s.second->certificate); d->ShowModal (); s.second->name = d->name (); + s.second->certificate = d->certificate (); _targets->SetItemText (s.first, std_to_wx (d->name())); Config::instance()->write (); diff --git a/src/wx/screen_dialog.cc b/src/wx/screen_dialog.cc index 32f36ab8b..910dece9d 100644 --- a/src/wx/screen_dialog.cc +++ b/src/wx/screen_dialog.cc @@ -17,21 +17,42 @@ */ +#include +#include +#include +#include "lib/compose.hpp" #include "screen_dialog.h" #include "wx_util.h" using std::string; +using std::cout; +using boost::shared_ptr; -ScreenDialog::ScreenDialog (wxWindow* parent, string title, string name) +ScreenDialog::ScreenDialog (wxWindow* parent, string title, string name, shared_ptr certificate) : wxDialog (parent, wxID_ANY, std_to_wx (title)) + , _certificate (certificate) { wxFlexGridSizer* table = new wxFlexGridSizer (2, 6, 6); table->AddGrowableCol (1, 1); add_label_to_sizer (table, this, "Name"); - _name = new wxTextCtrl (this, wxID_ANY, std_to_wx (name), wxDefaultPosition, wxSize (256, -1)); + _name = new wxTextCtrl (this, wxID_ANY, std_to_wx (name), wxDefaultPosition, wxSize (320, -1)); table->Add (_name, 1, wxEXPAND); + add_label_to_sizer (table, this, "Certificate"); + _certificate_load = new wxButton (this, wxID_ANY, wxT ("Load from file...")); + table->Add (_certificate_load, 1, wxEXPAND); + + table->AddSpacer (0); + _certificate_text = new wxTextCtrl (this, wxID_ANY, wxT (""), wxDefaultPosition, wxSize (320, 256), wxTE_MULTILINE | wxTE_READONLY); + if (certificate) { + _certificate_text->SetValue (certificate->certificate ()); + } + wxFont font = wxSystemSettings::GetFont (wxSYS_ANSI_FIXED_FONT); + font.SetPointSize (font.GetPointSize() / 2); + _certificate_text->SetFont (font); + table->Add (_certificate_text, 1, wxEXPAND); + wxBoxSizer* overall_sizer = new wxBoxSizer (wxVERTICAL); overall_sizer->Add (table, 1, wxEXPAND | wxALL, 6); @@ -43,6 +64,8 @@ ScreenDialog::ScreenDialog (wxWindow* parent, string title, string name) SetSizer (overall_sizer); overall_sizer->Layout (); overall_sizer->SetSizeHints (this); + + _certificate_load->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (ScreenDialog::load_certificate), 0, this); } string @@ -50,3 +73,25 @@ ScreenDialog::name () const { return wx_to_std (_name->GetValue()); } + +shared_ptr +ScreenDialog::certificate () const +{ + return _certificate; +} + +void +ScreenDialog::load_certificate (wxCommandEvent &) +{ + wxFileDialog* d = new wxFileDialog (this, _("Select Certificate File")); + d->ShowModal (); + + try { + _certificate.reset (new libdcp::Certificate (wx_to_std (d->GetPath ()))); + _certificate_text->SetValue (_certificate->certificate ()); + } catch (libdcp::MiscError& e) { + error_dialog (this, String::compose ("Could not read certificate file (%1)", e.what())); + } + + d->Destroy (); +} diff --git a/src/wx/screen_dialog.h b/src/wx/screen_dialog.h index 78869782f..1bd4a89a9 100644 --- a/src/wx/screen_dialog.h +++ b/src/wx/screen_dialog.h @@ -18,14 +18,23 @@ */ #include +#include +#include class ScreenDialog : public wxDialog { public: - ScreenDialog (wxWindow *, std::string, std::string name = ""); + ScreenDialog (wxWindow *, std::string, std::string name = "", boost::shared_ptr c = boost::shared_ptr ()); std::string name () const; + boost::shared_ptr certificate () const; private: + void load_certificate (wxCommandEvent &); + wxTextCtrl* _name; + wxButton* _certificate_load; + wxTextCtrl* _certificate_text; + + boost::shared_ptr _certificate; }; -- 2.30.2