2 Copyright (C) 2014-2015 Carl Hetherington <cth@carlh.net>
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #include "dolby_certificate_dialog.h"
22 #include "lib/compose.hpp"
23 #include "lib/internet.h"
24 #include "lib/signal_manager.h"
25 #include <curl/curl.h>
26 #include <boost/algorithm/string.hpp>
27 #include <boost/foreach.hpp>
33 using boost::optional;
34 using boost::algorithm::split;
35 using boost::algorithm::is_any_of;
37 DolbyCertificateDialog::DolbyCertificateDialog (wxWindow* parent, boost::function<void (boost::filesystem::path)> load)
38 : DownloadCertificateDialog (parent, load)
40 add (_("Country"), true);
41 _country = add (new wxChoice (this, wxID_ANY));
42 _country->Append (N_("Hashemite Kingdom of Jordan"));
44 add (_("Cinema"), true);
45 _cinema = add (new wxChoice (this, wxID_ANY));
46 _cinema->Append (N_("Motion Picture Solutions London Mobile & QC"));
48 add (_("Serial number"), true);
49 _serial = add (new wxChoice (this, wxID_ANY));
51 add_common_widgets ();
53 _country->Bind (wxEVT_COMMAND_CHOICE_SELECTED, boost::bind (&DolbyCertificateDialog::country_selected, this));
54 _cinema->Bind (wxEVT_COMMAND_CHOICE_SELECTED, boost::bind (&DolbyCertificateDialog::cinema_selected, this));
55 _serial->Bind (wxEVT_COMMAND_CHOICE_SELECTED, boost::bind (&DolbyCertificateDialog::serial_selected, this));
56 Bind (wxEVT_IDLE, boost::bind (&DolbyCertificateDialog::setup_countries, this));
63 DolbyCertificateDialog::get_dir (string dir) const
65 string url = String::compose ("ftp://dolbyrootcertificates:houro61l@ftp.dolby.co.uk/SHA256/%1", dir);
70 DolbyCertificateDialog::setup_countries ()
72 if (_country->GetCount() > 0) {
77 _country->Append (_("Fetching..."));
78 _country->SetSelection (0);
81 /* See DoremiCertificateDialog for discussion about this daft delay */
84 signal_manager->when_idle (boost::bind (&DolbyCertificateDialog::finish_setup_countries, this));
88 DolbyCertificateDialog::finish_setup_countries ()
91 BOOST_FOREACH (string i, get_dir ("")) {
92 _country->Append (std_to_wx (i));
97 DolbyCertificateDialog::country_selected ()
100 _cinema->Append (_("Fetching..."));
101 _cinema->SetSelection (0);
106 signal_manager->when_idle (boost::bind (&DolbyCertificateDialog::finish_country_selected, this));
110 DolbyCertificateDialog::finish_country_selected ()
113 BOOST_FOREACH (string i, get_dir (wx_to_std (_country->GetStringSelection()))) {
114 _cinema->Append (std_to_wx (i));
119 DolbyCertificateDialog::cinema_selected ()
122 _serial->Append (_("Fetching..."));
123 _serial->SetSelection (0);
128 signal_manager->when_idle (boost::bind (&DolbyCertificateDialog::finish_cinema_selected, this));
132 DolbyCertificateDialog::finish_cinema_selected ()
134 string const dir = String::compose ("%1/%2", wx_to_std (_country->GetStringSelection()), wx_to_std (_cinema->GetStringSelection()));
137 BOOST_FOREACH (string i, get_dir (dir)) {
139 split (a, i, is_any_of ("-_"));
141 _serial->Append (std_to_wx (a[3]), new wxStringClientData (std_to_wx (i)));
147 DolbyCertificateDialog::serial_selected ()
149 _download->Enable (true);
153 DolbyCertificateDialog::download ()
156 _message->SetLabel (_("Downloading certificate"));
162 signal_manager->when_idle (boost::bind (&DolbyCertificateDialog::finish_download, this));
166 DolbyCertificateDialog::finish_download ()
168 string const zip = string_client_data (_serial->GetClientObject (_serial->GetSelection ()));
170 string const file = String::compose (
171 "ftp://dolbyrootcertificates:houro61l@ftp.dolby.co.uk/SHA256/%1/%2/%3",
172 wx_to_std (_country->GetStringSelection()),
173 wx_to_std (_cinema->GetStringSelection()),
177 /* Work out the certificate file name inside the zip */
179 split (b, zip, is_any_of ("_"));
181 _message->SetLabel (_("Unexpected certificate filename form"));
184 string const cert = b[0] + "_" + b[1] + ".pem.crt";
186 optional<string> error = get_from_zip_url (file, cert, _load);
188 _message->SetLabel (std_to_wx (error.get ()));
190 _message->SetLabel (_("Certificate downloaded"));