No-op; rename a whole load of wx constants to their shorter equivalents.
[dcpomatic.git] / src / wx / dolby_doremi_certificate_panel.cc
1 /*
2     Copyright (C) 2014-2015 Carl Hetherington <cth@carlh.net>
3
4     This file is part of DCP-o-matic.
5
6     DCP-o-matic is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     DCP-o-matic is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
18
19 */
20
21 #include "dolby_doremi_certificate_panel.h"
22 #include "download_certificate_dialog.h"
23 #include "wx_util.h"
24 #include "lib/compose.hpp"
25 #include "lib/util.h"
26 #include "lib/signal_manager.h"
27 #include "lib/internet.h"
28 #include <dcp/raw_convert.h>
29 #include <curl/curl.h>
30 #include <zip.h>
31 #include <boost/foreach.hpp>
32 #include <iostream>
33
34 using std::string;
35 using std::cout;
36 using std::list;
37 using boost::function;
38 using boost::optional;
39 using dcp::raw_convert;
40
41 DolbyDoremiCertificatePanel::DolbyDoremiCertificatePanel (wxWindow* parent, DownloadCertificateDialog* dialog)
42         : DownloadCertificatePanel (parent, dialog)
43 {
44         add_label_to_sizer (_table, this, _("Serial number"), true);
45         _serial = new wxTextCtrl (this, wxID_ANY, wxT (""), wxDefaultPosition, wxSize (300, -1));
46         _table->Add (_serial, 1, wxEXPAND);
47
48         _serial->Bind (wxEVT_TEXT, boost::bind (&DownloadCertificateDialog::setup_sensitivity, _dialog));
49
50         layout ();
51 }
52
53 void
54 DolbyDoremiCertificatePanel::download (wxStaticText* message)
55 {
56         message->SetLabel (_("Downloading certificate"));
57
58         /* Hack: without this the SetLabel() above has no visible effect */
59         wxMilliSleep (200);
60
61         signal_manager->when_idle (boost::bind (&DolbyDoremiCertificatePanel::finish_download, this, wx_to_std (_serial->GetValue ()), message));
62 }
63
64 static void
65 try_dcp2000 (list<string>& urls, list<string>& files, string prefix, string serial)
66 {
67         urls.push_back (String::compose ("%1%2xxx/dcp2000-%3.dcicerts.zip", prefix, serial.substr(0, 3), serial));
68         files.push_back (String::compose ("dcp2000-%1.cert.sha256.pem", serial));
69
70         urls.push_back (String::compose ("%1%2xxx/dcp2000-%3.dcicerts.zip", prefix, serial.substr(0, 3), serial));
71         files.push_back (String::compose ("dcp2000-%1.cert.sha256.pem", serial));
72
73         urls.push_back (String::compose ("%1%2xxx/dcp2000-%3.certs.zip", prefix, serial.substr(0, 3), serial));
74         files.push_back (String::compose ("dcp2000-%1.cert.sha256.pem", serial));
75 }
76
77 static void
78 try_imb (list<string>& urls, list<string>& files, string prefix, string serial)
79 {
80         urls.push_back (String::compose ("%1%2xxx/imb-%3.dcicerts.zip", prefix, serial.substr(0, 3), serial));
81         files.push_back (String::compose ("imb-%1.cert.sha256.pem", serial));
82 }
83
84 static void
85 try_ims (list<string>& urls, list<string>& files, string prefix, string serial)
86 {
87         urls.push_back (String::compose ("%1%2xxx/ims-%3.dcicerts.zip", prefix, serial.substr(0, 3), serial));
88         files.push_back (String::compose ("ims-%1.cert.sha256.pem", serial));
89 }
90
91 static void
92 try_cat862 (list<string>& urls, list<string>& files, string prefix, string serial)
93 {
94         int const serial_int = raw_convert<int> (serial);
95
96         string cat862;
97         if (serial_int <= 510999) {
98                 cat862 = "CAT862_510999_and_lower";
99         } else if (serial_int >= 617000) {
100                 cat862 = "CAT862_617000_and_higher";
101         } else {
102                 int const lower = serial_int - (serial_int % 1000);
103                 cat862 = String::compose ("CAT862_%1-%2", lower, lower + 999);
104         }
105
106         urls.push_back (String::compose ("%1%2/cert_Dolby256-CAT862-%3.zip", prefix, cat862, serial_int));
107         files.push_back (String::compose ("cert_Dolby256-CAT862-%1.pem.crt", serial_int));
108 }
109
110 static void
111 try_dsp100 (list<string>& urls, list<string>& files, string prefix, string serial)
112 {
113         int const serial_int = raw_convert<int> (serial);
114
115         string dsp100;
116         if (serial_int <= 999) {
117                 dsp100 = "DSP100_053_thru_999";
118         } else if (serial_int >= 3000) {
119                 dsp100 = "DSP100_3000_and_higher";
120         } else {
121                 int const lower = serial_int - (serial_int % 1000);
122                 dsp100 = String::compose ("DSP100_%1_thru_%2", lower, lower + 999);
123         }
124
125         urls.push_back (String::compose ("%1%2/cert_Dolby256-DSP100-%3.zip", prefix, dsp100, serial_int));
126         files.push_back (String::compose ("cert_Dolby256-DSP100-%1.pem.crt", serial_int));
127 }
128
129 static void
130 try_cat745 (list<string>& urls, list<string>& files, string prefix, string serial)
131 {
132         int const serial_int = raw_convert<int> (serial.substr (1));
133
134         string cat745;
135         if (serial_int <= 999) {
136                 cat745 = "CAT745_1_thru_999";
137         } else if (serial_int >= 6000) {
138                 cat745 = "CAT745_6000_and_higher";
139         } else {
140                 int const lower = serial_int - (serial_int % 1000);
141                 cat745 = String::compose ("CAT745_%1_thru_%2", lower, lower + 999);
142         }
143
144         urls.push_back (String::compose ("%1%2/cert_Dolby-CAT745-%3.zip", prefix, cat745, serial_int));
145         files.push_back (String::compose ("cert_Dolby-CAT745-%1.pem.crt", serial_int));
146 }
147
148 static void
149 try_cp850 (list<string>& urls, list<string>& files, string prefix, string serial)
150 {
151         int const serial_int = raw_convert<int> (serial.substr (1));
152
153         int const lower = serial_int - (serial_int % 1000);
154         urls.push_back (String::compose ("%1CP850_CAT1600_F%2-F%3/cert_RMB_SPB_MDE_FMA.Dolby-CP850-F%4.zip", prefix, lower, lower + 999, serial_int));
155         files.push_back (String::compose ("cert_RMB_SPB_MDE_FMA.Dolby-CP850-F%1.pem.crt", serial_int));
156 }
157
158 void
159 DolbyDoremiCertificatePanel::finish_download (string serial, wxStaticText* message)
160 {
161         /* Try dcp2000, imb and ims prefixes (see mantis #375) */
162
163         string const prefix = "ftp://anonymous@ftp.cinema.dolby.com/Certificates/";
164         list<string> urls;
165         list<string> files;
166
167         bool starts_with_digit = false;
168         optional<char> starting_char;
169
170         if (!serial.empty()) {
171                 if (isdigit (serial[0])) {
172                         starts_with_digit = true;
173                 } else {
174                         starting_char = serial[0];
175                 }
176         }
177
178         if (starts_with_digit) {
179                 try_dcp2000 (urls, files, prefix, serial);
180                 try_imb (urls, files, prefix, serial);
181                 try_ims (urls, files, prefix, serial);
182                 try_cat862 (urls, files, prefix, serial);
183                 try_dsp100 (urls, files, prefix, serial);
184         } else if (starting_char == 'H') {
185                 try_cat745 (urls, files, prefix, serial);
186         } else if (starting_char == 'F') {
187                 try_cp850 (urls, files, prefix, serial);
188         }
189
190         list<string> errors;
191         bool ok = false;
192         list<string>::const_iterator i = urls.begin ();
193         list<string>::const_iterator j = files.begin ();
194         while (!ok && i != urls.end ()) {
195                 optional<string> error = get_from_zip_url (*i++, *j++, true, boost::bind (&DownloadCertificatePanel::load, this, _1));
196                 if (error) {
197                         errors.push_back (error.get ());
198                 } else {
199                         ok = true;
200                 }
201         }
202
203         if (ok) {
204                 message->SetLabel (_("Certificate downloaded"));
205                 _dialog->setup_sensitivity ();
206         } else {
207                 message->SetLabel (wxT (""));
208
209                 string s;
210                 BOOST_FOREACH (string e, errors) {
211                         s += e + "\n";
212                 }
213
214                 error_dialog (this, std_to_wx (s));
215         }
216 }
217
218 bool
219 DolbyDoremiCertificatePanel::ready_to_download () const
220 {
221         return !_serial->IsEmpty ();
222 }