#include <zip.h>
#include "lib/compose.hpp"
#include "lib/util.h"
+#include "lib/ui_signaller.h"
+#include "lib/internet.h"
#include "doremi_certificate_dialog.h"
#include "wx_util.h"
using std::string;
+using std::cout;
using boost::function;
+using boost::optional;
DoremiCertificateDialog::DoremiCertificateDialog (wxWindow* parent, function<void (boost::filesystem::path)> load)
: DownloadCertificateDialog (parent, load)
{
add (_("Server serial number"), true);
- _serial = add (new wxTextCtrl (this, wxID_ANY));
-
- add_common_widgets ();
-}
-
+ _serial = add (new wxTextCtrl (this, wxID_ANY, wxT (""), wxDefaultPosition, wxSize (300, -1)));
+ _serial->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&DoremiCertificateDialog::set_sensitivity, this));
-static size_t
-ftp_data (void* buffer, size_t size, size_t nmemb, void* stream)
-{
- FILE* f = reinterpret_cast<FILE*> (stream);
- return fwrite (buffer, size, nmemb, f);
+ add_common_widgets ();
}
void
{
string const serial = wx_to_std (_serial->GetValue ());
if (serial.length() != 6) {
- _message->SetLabel (_("Doremi serial numbers must have 6 digits"));
- return;
- }
-
- CURL* curl = curl_easy_init ();
- if (!curl) {
- _message->SetLabel (N_("Could not set up libcurl"));
+ error_dialog (this, _("Doremi serial numbers must have 6 digits"));
return;
}
-
- string const url = String::compose (
- "ftp://service:t3chn1c1an@ftp.doremilabs.com/Certificates/%1xxx/dcp2000-%2.dcicerts.zip",
- serial.substr(0, 3), serial
+
+ _message->SetLabel (_("Downloading certificate"));
+
+#ifdef DCPOMATIC_OSX
+ /* This is necessary on OS X, otherwise the SetLabel() above has no visible effect */
+ wxMilliSleep (200);
+#endif
+
+ ui_signaller->when_idle (boost::bind (&DoremiCertificateDialog::finish_download, this, serial));
+}
+
+void
+DoremiCertificateDialog::finish_download (string serial)
+{
+ /* Try dcp2000, imb and ims prefixes (see mantis #375) */
+
+ optional<string> error = get_from_zip_url (
+ String::compose (
+ "ftp://service:t3chn1c1an@ftp.doremilabs.com/Certificates/%1xxx/dcp2000-%2.dcicerts.zip",
+ serial.substr(0, 3), serial
+ ),
+ String::compose ("dcp2000-%1.cert.sha256.pem", serial),
+ _load
+ );
+
+ if (error) {
+ error = get_from_zip_url (
+ String::compose (
+ "ftp://service:t3chn1c1an@ftp.doremilabs.com/Certificates/%1xxx/imb-%2.dcicerts.zip",
+ serial.substr(0, 3), serial
+ ),
+ String::compose ("imb-%1.cert.sha256.pem", serial),
+ _load
);
-
- curl_easy_setopt (curl, CURLOPT_URL, url.c_str ());
-
- ScopedTemporary temp_zip;
- FILE* f = temp_zip.open ("wb");
- curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, ftp_data);
- curl_easy_setopt (curl, CURLOPT_WRITEDATA, f);
-
- _message->SetLabel (_("Downloading certificate from Doremi"));
- run_gui_loop ();
-
- CURLcode const cr = curl_easy_perform (curl);
-
- _gauge->SetValue (50);
- run_gui_loop ();
-
- temp_zip.close ();
- curl_easy_cleanup (curl);
- if (cr != CURLE_OK) {
- _message->SetLabel (wxString::Format (_("Certificate download failed (%d)"), cr));
- return;
- }
-
- _message->SetLabel (_("Unpacking"));
- run_gui_loop ();
-
- struct zip* zip = zip_open (temp_zip.c_str(), 0, 0);
- if (!zip) {
- _message->SetLabel (N_("Could not open certificate ZIP file"));
- return;
}
-
- string const name_in_zip = String::compose ("dcp2000-%1.cert.sha256.pem", serial);
- struct zip_file* zip_file = zip_fopen (zip, name_in_zip.c_str(), 0);
- if (!zip_file) {
- _message->SetLabel (N_("Could not find certificate in ZIP file"));
- return;
+
+ if (error) {
+ error = get_from_zip_url (
+ String::compose (
+ "ftp://service:t3chn1c1an@ftp.doremilabs.com/Certificates/%1xxx/ims-%2.dcicerts.zip",
+ serial.substr(0, 3), serial
+ ),
+ String::compose ("ims-%1.cert.sha256.pem", serial),
+ _load
+ );
}
-
- ScopedTemporary temp_cert;
- f = temp_cert.open ("wb");
- char buffer[4096];
- while (1) {
- int const N = zip_fread (zip_file, buffer, sizeof (buffer));
- fwrite (buffer, 1, N, f);
- if (N < int (sizeof (buffer))) {
- break;
- }
+
+ if (error) {
+ error_dialog (this, std_to_wx (error.get ()));
+ } else {
+ _message->SetLabel (_("Certificate downloaded"));
}
- temp_cert.close ();
-
- _gauge->SetValue (100);
- _message->SetLabel (_("OK"));
- _load (temp_cert.file ());
}
+
+void
+DoremiCertificateDialog::set_sensitivity ()
+{
+ _download->Enable (!_serial->IsEmpty ());
+}
+