From ee1d68bbbfe89b3aa131d912747e5da4a746fdce Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 3 Nov 2015 21:27:26 +0000 Subject: [PATCH] Various improvements in robustness / neatness of certificate download stuff. --- src/lib/internet.cc | 23 ++++++++----- src/lib/internet.h | 2 +- src/lib/signal_manager.h | 4 +-- src/wx/dolby_certificate_dialog.cc | 52 +++++++++++++++++++---------- src/wx/doremi_certificate_dialog.cc | 6 ++-- 5 files changed, 53 insertions(+), 34 deletions(-) diff --git a/src/lib/internet.cc b/src/lib/internet.cc index 7bc818717..2b1e90ca7 100644 --- a/src/lib/internet.cc +++ b/src/lib/internet.cc @@ -17,16 +17,17 @@ */ -#include +#include "scoped_temporary.h" +#include "compose.hpp" +#include "safe_stringstream.h" +#include "exceptions.h" +#include +#include #include #include #include #include -#include -#include -#include "scoped_temporary.h" -#include "compose.hpp" -#include "safe_stringstream.h" +#include #include "i18n.h" @@ -111,11 +112,11 @@ ftp_ls_data (void* buffer, size_t size, size_t nmemb, void* data) } list -ftp_ls (string url) +ftp_ls (string url, bool pasv) { CURL* curl = curl_easy_init (); if (!curl) { - return list (); + throw NetworkError ("could not set up curl"); } if (url.substr (url.length() - 1, 1) != "/") { @@ -132,9 +133,13 @@ ftp_ls (string url) curl_easy_setopt (curl, CURLOPT_WRITEDATA, &ls_raw); curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, ftp_ls_data); curl_easy_setopt (curl, CURLOPT_FTP_USE_EPSV, 0); + if (!pasv) { + curl_easy_setopt (curl, CURLOPT_FTPPORT, ""); + } CURLcode const r = curl_easy_perform (curl); if (r != CURLE_OK) { - return list (); + curl_easy_cleanup (curl); + throw NetworkError (curl_easy_strerror (r)); } SafeStringStream s (ls_raw); diff --git a/src/lib/internet.h b/src/lib/internet.h index d7427fe48..f46abc367 100644 --- a/src/lib/internet.h +++ b/src/lib/internet.h @@ -22,4 +22,4 @@ #include boost::optional get_from_zip_url (std::string url, std::string file, boost::function load); -std::list ftp_ls (std::string dir); +std::list ftp_ls (std::string dir, bool pasv = true); diff --git a/src/lib/signal_manager.h b/src/lib/signal_manager.h index b8d892c41..62afacade 100644 --- a/src/lib/signal_manager.h +++ b/src/lib/signal_manager.h @@ -46,8 +46,8 @@ public: /** Call this in the UI when it is idle */ size_t ui_idle () { - /* This executes any functors that have been post()ed to _service */ - return _service.poll (); + /* This executes one of the functors that has been post()ed to _service */ + return _service.poll_one (); } /** This should wake the UI and make it call ui_idle() */ diff --git a/src/wx/dolby_certificate_dialog.cc b/src/wx/dolby_certificate_dialog.cc index 58ad73e0d..8661cd5f8 100644 --- a/src/wx/dolby_certificate_dialog.cc +++ b/src/wx/dolby_certificate_dialog.cc @@ -22,6 +22,7 @@ #include "lib/compose.hpp" #include "lib/internet.h" #include "lib/signal_manager.h" +#include "lib/util.h" #include #include #include @@ -54,7 +55,7 @@ DolbyCertificateDialog::DolbyCertificateDialog (wxWindow* parent, boost::functio _country->Bind (wxEVT_COMMAND_CHOICE_SELECTED, boost::bind (&DolbyCertificateDialog::country_selected, this)); _cinema->Bind (wxEVT_COMMAND_CHOICE_SELECTED, boost::bind (&DolbyCertificateDialog::cinema_selected, this)); _serial->Bind (wxEVT_COMMAND_CHOICE_SELECTED, boost::bind (&DolbyCertificateDialog::serial_selected, this)); - Bind (wxEVT_IDLE, boost::bind (&DolbyCertificateDialog::setup_countries, this)); + signal_manager->when_idle (boost::bind (&DolbyCertificateDialog::setup_countries, this)); _country->Clear (); _cinema->Clear (); @@ -64,7 +65,7 @@ list DolbyCertificateDialog::get_dir (string dir) const { string url = String::compose ("ftp://dolbyrootcertificates:houro61l@ftp.dolby.co.uk/SHA256/%1", dir); - return ftp_ls (url); + return ftp_ls (url, false); } void @@ -78,19 +79,24 @@ DolbyCertificateDialog::setup_countries () _country->Append (_("Fetching...")); _country->SetSelection (0); -#ifdef DCPOMATIC_OSX /* See DoremiCertificateDialog for discussion about this daft delay */ wxMilliSleep (200); -#endif + signal_manager->when_idle (boost::bind (&DolbyCertificateDialog::finish_setup_countries, this)); } void DolbyCertificateDialog::finish_setup_countries () { - _country->Clear (); - BOOST_FOREACH (string i, get_dir ("")) { - _country->Append (std_to_wx (i)); + try { + list const c = get_dir (""); + _country->Clear (); + BOOST_FOREACH (string i, c) { + _country->Append (std_to_wx (i)); + } + } catch (NetworkError& e) { + error_dialog (this, wxString::Format (_("Could not get country list (%s)"), e.what())); + _country->Clear (); } } @@ -110,9 +116,15 @@ DolbyCertificateDialog::country_selected () void DolbyCertificateDialog::finish_country_selected () { - _cinema->Clear (); - BOOST_FOREACH (string i, get_dir (wx_to_std (_country->GetStringSelection()))) { - _cinema->Append (std_to_wx (i)); + try { + list const c = get_dir (wx_to_std (_country->GetStringSelection())); + _cinema->Clear (); + BOOST_FOREACH (string i, c) { + _cinema->Append (std_to_wx (i)); + } + } catch (NetworkError& e) { + error_dialog (this, wxString::Format (_("Could not get cinema list (%s)"), e.what ())); + _cinema->Clear (); } } @@ -132,15 +144,19 @@ DolbyCertificateDialog::cinema_selected () void DolbyCertificateDialog::finish_cinema_selected () { - string const dir = String::compose ("%1/%2", wx_to_std (_country->GetStringSelection()), wx_to_std (_cinema->GetStringSelection())); - - _serial->Clear (); - BOOST_FOREACH (string i, get_dir (dir)) { - vector a; - split (a, i, is_any_of ("-_")); - if (a.size() >= 4) { - _serial->Append (std_to_wx (a[3]), new wxStringClientData (std_to_wx (i))); + try { + list const s = get_dir (String::compose ("%1/%2", wx_to_std (_country->GetStringSelection()), wx_to_std (_cinema->GetStringSelection()))); + _serial->Clear (); + BOOST_FOREACH (string i, s) { + vector a; + split (a, i, is_any_of ("-_")); + if (a.size() >= 4) { + _serial->Append (std_to_wx (a[3]), new wxStringClientData (std_to_wx (i))); + } } + } catch (NetworkError& e) { + error_dialog (this, wxString::Format (_("Could not get screen list (%s)"), e.what())); + _serial->Clear (); } } diff --git a/src/wx/doremi_certificate_dialog.cc b/src/wx/doremi_certificate_dialog.cc index c4c2115f0..ffb2a0f99 100644 --- a/src/wx/doremi_certificate_dialog.cc +++ b/src/wx/doremi_certificate_dialog.cc @@ -55,10 +55,8 @@ DoremiCertificateDialog::download () downloaded (false); _message->SetLabel (_("Downloading certificate")); -#ifdef DCPOMATIC_OSX - /* This is necessary on OS X, otherwise the SetLabel() above has no visible effect */ + /* Hack: without this the SetLabel() above has no visible effect */ wxMilliSleep (200); -#endif signal_manager->when_idle (boost::bind (&DoremiCertificateDialog::finish_download, this, serial)); } @@ -100,6 +98,7 @@ DoremiCertificateDialog::finish_download (string serial) } if (error) { + _message->SetLabel (wxT ("")); error_dialog (this, std_to_wx (error.get ())); } else { _message->SetLabel (_("Certificate downloaded")); @@ -112,4 +111,3 @@ DoremiCertificateDialog::set_sensitivity () { _download->Enable (!_serial->IsEmpty ()); } - -- 2.30.2