Remove player activity logging. Fixes #2122.
[dcpomatic.git] / src / lib / config.cc
1 /*
2     Copyright (C) 2012-2021 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 "config.h"
22 #include "filter.h"
23 #include "ratio.h"
24 #include "types.h"
25 #include "log.h"
26 #include "dcp_content_type.h"
27 #include "colour_conversion.h"
28 #include "cinema.h"
29 #include "util.h"
30 #include "cross.h"
31 #include "film.h"
32 #include "dkdm_wrapper.h"
33 #include "compose.hpp"
34 #include "crypto.h"
35 #include "dkdm_recipient.h"
36 #include <dcp/raw_convert.h>
37 #include <dcp/name_format.h>
38 #include <dcp/certificate_chain.h>
39 #include <libcxml/cxml.h>
40 #include <glib.h>
41 #include <libxml++/libxml++.h>
42 #include <boost/filesystem.hpp>
43 #include <boost/algorithm/string.hpp>
44 #include <boost/thread.hpp>
45 #include <cstdlib>
46 #include <fstream>
47 #include <iostream>
48
49 #include "i18n.h"
50
51 using std::vector;
52 using std::cout;
53 using std::ifstream;
54 using std::string;
55 using std::list;
56 using std::min;
57 using std::max;
58 using std::remove;
59 using std::shared_ptr;
60 using std::make_shared;
61 using boost::optional;
62 using std::dynamic_pointer_cast;
63 using boost::algorithm::trim;
64 using dcp::raw_convert;
65
66 Config* Config::_instance = 0;
67 int const Config::_current_version = 3;
68 boost::signals2::signal<void ()> Config::FailedToLoad;
69 boost::signals2::signal<void (string)> Config::Warning;
70 boost::signals2::signal<bool (Config::BadReason)> Config::Bad;
71
72 /** Construct default configuration */
73 Config::Config ()
74         /* DKDMs are not considered a thing to reset on set_defaults() */
75         : _dkdms (new DKDMGroup ("root"))
76 {
77         set_defaults ();
78 }
79
80 void
81 Config::set_defaults ()
82 {
83         _master_encoding_threads = max (2U, boost::thread::hardware_concurrency ());
84         _server_encoding_threads = max (2U, boost::thread::hardware_concurrency ());
85         _server_port_base = 6192;
86         _use_any_servers = true;
87         _servers.clear ();
88         _only_servers_encode = false;
89         _tms_protocol = FileTransferProtocol::SCP;
90         _tms_ip = "";
91         _tms_path = ".";
92         _tms_user = "";
93         _tms_password = "";
94         _allow_any_dcp_frame_rate = false;
95         _allow_any_container = false;
96         _show_experimental_audio_processors = false;
97         _language = optional<string> ();
98         _default_still_length = 10;
99         _default_container = Ratio::from_id ("185");
100         _default_dcp_content_type = DCPContentType::from_isdcf_name ("FTR");
101         _default_dcp_audio_channels = 6;
102         _default_j2k_bandwidth = 150000000;
103         _default_audio_delay = 0;
104         _default_interop = false;
105         _default_metadata.clear ();
106         _upload_after_make_dcp = false;
107         _mail_server = "";
108         _mail_port = 25;
109         _mail_protocol = EmailProtocol::AUTO;
110         _mail_user = "";
111         _mail_password = "";
112         _kdm_from = "";
113         _kdm_cc.clear ();
114         _kdm_bcc = "";
115         _notification_from = "";
116         _notification_to = "";
117         _notification_cc.clear ();
118         _notification_bcc = "";
119         _check_for_updates = false;
120         _check_for_test_updates = false;
121         _maximum_j2k_bandwidth = 250000000;
122         _log_types = LogEntry::TYPE_GENERAL | LogEntry::TYPE_WARNING | LogEntry::TYPE_ERROR | LogEntry::TYPE_DISK;
123         _analyse_ebur128 = true;
124         _automatic_audio_analysis = false;
125 #ifdef DCPOMATIC_WINDOWS
126         _win32_console = false;
127 #endif
128         _cinemas_file = read_path ("cinemas.xml");
129         _dkdm_recipients_file = read_path ("dkdm_recipients.xml");
130         _show_hints_before_make_dcp = true;
131         _confirm_kdm_email = true;
132         _kdm_container_name_format = dcp::NameFormat ("KDM %f %c");
133         _kdm_filename_format = dcp::NameFormat ("KDM %f %c %s");
134         _dkdm_filename_format = dcp::NameFormat ("DKDM %f %c %s");
135         _dcp_metadata_filename_format = dcp::NameFormat ("%t");
136         _dcp_asset_filename_format = dcp::NameFormat ("%t");
137         _jump_to_selected = true;
138         for (int i = 0; i < NAG_COUNT; ++i) {
139                 _nagged[i] = false;
140         }
141         _sound = true;
142         _sound_output = optional<string> ();
143         _last_kdm_write_type = KDM_WRITE_FLAT;
144         _last_dkdm_write_type = DKDM_WRITE_INTERNAL;
145
146         /* I think the scaling factor here should be the ratio of the longest frame
147            encode time to the shortest; if the thread count is T, longest time is L
148            and the shortest time S we could encode L/S frames per thread whilst waiting
149            for the L frame to encode so we might have to store LT/S frames.
150
151            However we don't want to use too much memory, so keep it a bit lower than we'd
152            perhaps like.  A J2K frame is typically about 1Mb so 3 here will mean we could
153            use about 240Mb with 72 encoding threads.
154         */
155         _frames_in_memory_multiplier = 3;
156         _decode_reduction = optional<int>();
157         _default_notify = false;
158         for (int i = 0; i < NOTIFICATION_COUNT; ++i) {
159                 _notification[i] = false;
160         }
161         _barco_username = optional<string>();
162         _barco_password = optional<string>();
163         _christie_username = optional<string>();
164         _christie_password = optional<string>();
165         _gdc_username = optional<string>();
166         _gdc_password = optional<string>();
167         _player_mode = PLAYER_MODE_WINDOW;
168         _image_display = 0;
169         _video_view_type = VIDEO_VIEW_SIMPLE;
170         _respect_kdm_validity_periods = true;
171         _player_debug_log_file = boost::none;
172         _player_content_directory = boost::none;
173         _player_playlist_directory = boost::none;
174         _player_kdm_directory = boost::none;
175         _audio_mapping = boost::none;
176         _custom_languages.clear ();
177         _add_files_path = boost::none;
178
179         _allowed_dcp_frame_rates.clear ();
180         _allowed_dcp_frame_rates.push_back (24);
181         _allowed_dcp_frame_rates.push_back (25);
182         _allowed_dcp_frame_rates.push_back (30);
183         _allowed_dcp_frame_rates.push_back (48);
184         _allowed_dcp_frame_rates.push_back (50);
185         _allowed_dcp_frame_rates.push_back (60);
186
187         set_kdm_email_to_default ();
188         set_notification_email_to_default ();
189         set_cover_sheet_to_default ();
190 }
191
192 void
193 Config::restore_defaults ()
194 {
195         Config::instance()->set_defaults ();
196         Config::instance()->changed ();
197 }
198
199 shared_ptr<dcp::CertificateChain>
200 Config::create_certificate_chain ()
201 {
202         return make_shared<dcp::CertificateChain> (
203                 openssl_path(),
204                 "dcpomatic.com",
205                 "dcpomatic.com",
206                 ".dcpomatic.smpte-430-2.ROOT",
207                 ".dcpomatic.smpte-430-2.INTERMEDIATE",
208                 "CS.dcpomatic.smpte-430-2.LEAF"
209                 );
210 }
211
212 void
213 Config::backup ()
214 {
215         /* Make a copy of the configuration */
216         try {
217                 int n = 1;
218                 while (n < 100 && boost::filesystem::exists(write_path(String::compose("config.xml.%1", n)))) {
219                         ++n;
220                 }
221
222                 boost::filesystem::copy_file(read_path("config.xml"), write_path(String::compose("config.xml.%1", n)));
223                 boost::filesystem::copy_file(read_path("cinemas.xml"), write_path(String::compose("cinemas.xml.%1", n)));
224                 boost::filesystem::copy_file(read_path("dkdm_recipients.xml"), write_path(String::compose("dkdm_recipients.xml.%1", n)));
225         } catch (...) {}
226 }
227
228 void
229 Config::read ()
230 try
231 {
232         cxml::Document f ("Config");
233         f.read_file (config_read_file());
234
235         auto version = f.optional_number_child<int> ("Version");
236         if (version && *version < _current_version) {
237                 /* Back up the old config before we re-write it in a back-incompatible way */
238                 backup ();
239         }
240
241         if (f.optional_number_child<int>("NumLocalEncodingThreads")) {
242                 _master_encoding_threads = _server_encoding_threads = f.optional_number_child<int>("NumLocalEncodingThreads").get();
243         } else {
244                 _master_encoding_threads = f.number_child<int>("MasterEncodingThreads");
245                 _server_encoding_threads = f.number_child<int>("ServerEncodingThreads");
246         }
247
248         _default_directory = f.optional_string_child ("DefaultDirectory");
249         if (_default_directory && _default_directory->empty ()) {
250                 /* We used to store an empty value for this to mean "none set" */
251                 _default_directory = boost::optional<boost::filesystem::path> ();
252         }
253
254         auto b = f.optional_number_child<int> ("ServerPort");
255         if (!b) {
256                 b = f.optional_number_child<int> ("ServerPortBase");
257         }
258         _server_port_base = b.get ();
259
260         auto u = f.optional_bool_child ("UseAnyServers");
261         _use_any_servers = u.get_value_or (true);
262
263         for (auto i: f.node_children("Server")) {
264                 if (i->node_children("HostName").size() == 1) {
265                         _servers.push_back (i->string_child ("HostName"));
266                 } else {
267                         _servers.push_back (i->content ());
268                 }
269         }
270
271         _only_servers_encode = f.optional_bool_child ("OnlyServersEncode").get_value_or (false);
272         _tms_protocol = static_cast<FileTransferProtocol>(f.optional_number_child<int>("TMSProtocol").get_value_or(static_cast<int>(FileTransferProtocol::SCP)));
273         _tms_ip = f.string_child ("TMSIP");
274         _tms_path = f.string_child ("TMSPath");
275         _tms_user = f.string_child ("TMSUser");
276         _tms_password = f.string_child ("TMSPassword");
277
278         _language = f.optional_string_child ("Language");
279
280         auto c = f.optional_string_child ("DefaultContainer");
281         if (c) {
282                 _default_container = Ratio::from_id (c.get ());
283         }
284
285         if (_default_container && !_default_container->used_for_container()) {
286                 Warning (_("Your default container is not valid and has been changed to Flat (1.85:1)"));
287                 _default_container = Ratio::from_id ("185");
288         }
289
290         _default_dcp_content_type = DCPContentType::from_isdcf_name(f.optional_string_child("DefaultDCPContentType").get_value_or("FTR"));
291         _default_dcp_audio_channels = f.optional_number_child<int>("DefaultDCPAudioChannels").get_value_or (6);
292
293         if (f.optional_string_child ("DCPMetadataIssuer")) {
294                 _dcp_issuer = f.string_child ("DCPMetadataIssuer");
295         } else if (f.optional_string_child ("DCPIssuer")) {
296                 _dcp_issuer = f.string_child ("DCPIssuer");
297         }
298
299         auto up = f.optional_bool_child("UploadAfterMakeDCP");
300         if (!up) {
301                 up = f.optional_bool_child("DefaultUploadAfterMakeDCP");
302         }
303         _upload_after_make_dcp = up.get_value_or (false);
304         _dcp_creator = f.optional_string_child ("DCPCreator").get_value_or ("");
305         _dcp_company_name = f.optional_string_child("DCPCompanyName").get_value_or("");
306         _dcp_product_name = f.optional_string_child("DCPProductName").get_value_or("");
307         _dcp_product_version = f.optional_string_child("DCPProductVersion").get_value_or("");
308         _dcp_j2k_comment = f.optional_string_child("DCPJ2KComment").get_value_or("");
309
310         _default_still_length = f.optional_number_child<int>("DefaultStillLength").get_value_or (10);
311         _default_j2k_bandwidth = f.optional_number_child<int>("DefaultJ2KBandwidth").get_value_or (200000000);
312         _default_audio_delay = f.optional_number_child<int>("DefaultAudioDelay").get_value_or (0);
313         _default_interop = f.optional_bool_child("DefaultInterop").get_value_or (false);
314
315         for (auto const& i: f.node_children("DefaultMetadata")) {
316                 _default_metadata[i->string_attribute("key")] = i->content();
317         }
318
319         _default_kdm_directory = f.optional_string_child("DefaultKDMDirectory");
320
321         /* Read any cinemas that are still lying around in the config file
322          * from an old version.
323          */
324         read_cinemas (f);
325
326         _mail_server = f.string_child ("MailServer");
327         _mail_port = f.optional_number_child<int> ("MailPort").get_value_or (25);
328
329         {
330                 /* Make sure this matches the code in write_config */
331                 string const protocol = f.optional_string_child("MailProtocol").get_value_or("Auto");
332                 if (protocol == "Auto") {
333                         _mail_protocol = EmailProtocol::AUTO;
334                 } else if (protocol == "Plain") {
335                         _mail_protocol = EmailProtocol::PLAIN;
336                 } else if (protocol == "STARTTLS") {
337                         _mail_protocol = EmailProtocol::STARTTLS;
338                 } else if (protocol == "SSL") {
339                         _mail_protocol = EmailProtocol::SSL;
340                 }
341         }
342
343         _mail_user = f.optional_string_child("MailUser").get_value_or ("");
344         _mail_password = f.optional_string_child("MailPassword").get_value_or ("");
345
346         _kdm_subject = f.optional_string_child ("KDMSubject").get_value_or (_("KDM delivery: $CPL_NAME"));
347         _kdm_from = f.string_child ("KDMFrom");
348         for (auto i: f.node_children("KDMCC")) {
349                 if (!i->content().empty()) {
350                         _kdm_cc.push_back (i->content ());
351                 }
352         }
353         _kdm_bcc = f.optional_string_child ("KDMBCC").get_value_or ("");
354         _kdm_email = f.string_child ("KDMEmail");
355
356         _notification_subject = f.optional_string_child("NotificationSubject").get_value_or(_("DCP-o-matic notification"));
357         _notification_from = f.optional_string_child("NotificationFrom").get_value_or("");
358         _notification_to = f.optional_string_child("NotificationTo").get_value_or("");
359         for (auto i: f.node_children("NotificationCC")) {
360                 if (!i->content().empty()) {
361                         _notification_cc.push_back (i->content ());
362                 }
363         }
364         _notification_bcc = f.optional_string_child("NotificationBCC").get_value_or("");
365         if (f.optional_string_child("NotificationEmail")) {
366                 _notification_email = f.string_child("NotificationEmail");
367         }
368
369         _check_for_updates = f.optional_bool_child("CheckForUpdates").get_value_or (false);
370         _check_for_test_updates = f.optional_bool_child("CheckForTestUpdates").get_value_or (false);
371
372         _maximum_j2k_bandwidth = f.optional_number_child<int> ("MaximumJ2KBandwidth").get_value_or (250000000);
373         _allow_any_dcp_frame_rate = f.optional_bool_child ("AllowAnyDCPFrameRate").get_value_or (false);
374         _allow_any_container = f.optional_bool_child ("AllowAnyContainer").get_value_or (false);
375         _show_experimental_audio_processors = f.optional_bool_child ("ShowExperimentalAudioProcessors").get_value_or (false);
376
377         _log_types = f.optional_number_child<int> ("LogTypes").get_value_or (LogEntry::TYPE_GENERAL | LogEntry::TYPE_WARNING | LogEntry::TYPE_ERROR);
378         _analyse_ebur128 = f.optional_bool_child("AnalyseEBUR128").get_value_or (true);
379         _automatic_audio_analysis = f.optional_bool_child ("AutomaticAudioAnalysis").get_value_or (false);
380 #ifdef DCPOMATIC_WINDOWS
381         _win32_console = f.optional_bool_child ("Win32Console").get_value_or (false);
382 #endif
383
384         for (auto i: f.node_children("History")) {
385                 _history.push_back (i->content ());
386         }
387
388         for (auto i: f.node_children("PlayerHistory")) {
389                 _player_history.push_back (i->content ());
390         }
391
392         auto signer = f.optional_node_child ("Signer");
393         if (signer) {
394                 auto c = make_shared<dcp::CertificateChain>();
395                 /* Read the signing certificates and private key in from the config file */
396                 for (auto i: signer->node_children ("Certificate")) {
397                         c->add (dcp::Certificate (i->content ()));
398                 }
399                 c->set_key (signer->string_child ("PrivateKey"));
400                 _signer_chain = c;
401         } else {
402                 /* Make a new set of signing certificates and key */
403                 _signer_chain = create_certificate_chain ();
404         }
405
406         auto decryption = f.optional_node_child ("Decryption");
407         if (decryption) {
408                 auto c = make_shared<dcp::CertificateChain>();
409                 for (auto i: decryption->node_children ("Certificate")) {
410                         c->add (dcp::Certificate (i->content ()));
411                 }
412                 c->set_key (decryption->string_child ("PrivateKey"));
413                 _decryption_chain = c;
414         } else {
415                 _decryption_chain = create_certificate_chain ();
416         }
417
418         /* These must be done before we call Bad as that might set one
419            of the nags.
420         */
421         for (auto i: f.node_children("Nagged")) {
422                 auto const id = i->number_attribute<int>("Id");
423                 if (id >= 0 && id < NAG_COUNT) {
424                         _nagged[id] = raw_convert<int>(i->content());
425                 }
426         }
427
428         optional<BadReason> bad;
429
430         for (auto const& i: _signer_chain->unordered()) {
431                 if (i.has_utf8_strings()) {
432                         bad = BAD_SIGNER_UTF8_STRINGS;
433                 }
434         }
435
436         if (!_signer_chain->chain_valid() || !_signer_chain->private_key_valid()) {
437                 bad = BAD_SIGNER_INCONSISTENT;
438         }
439
440         if (!_decryption_chain->chain_valid() || !_decryption_chain->private_key_valid()) {
441                 bad = BAD_DECRYPTION_INCONSISTENT;
442         }
443
444         if (bad) {
445                 auto const remake = Bad(*bad);
446                 if (remake && *remake) {
447                         switch (*bad) {
448                         case BAD_SIGNER_UTF8_STRINGS:
449                         case BAD_SIGNER_INCONSISTENT:
450                                 _signer_chain = create_certificate_chain ();
451                                 break;
452                         case BAD_DECRYPTION_INCONSISTENT:
453                                 _decryption_chain = create_certificate_chain ();
454                                 break;
455                         }
456                 }
457         }
458
459         if (f.optional_node_child("DKDMGroup")) {
460                 /* New-style: all DKDMs in a group */
461                 _dkdms = dynamic_pointer_cast<DKDMGroup> (DKDMBase::read (f.node_child("DKDMGroup")));
462         } else {
463                 /* Old-style: one or more DKDM nodes */
464                 _dkdms.reset (new DKDMGroup ("root"));
465                 for (auto i: f.node_children("DKDM")) {
466                         _dkdms->add (DKDMBase::read (i));
467                 }
468         }
469         _cinemas_file = f.optional_string_child("CinemasFile").get_value_or(read_path("cinemas.xml").string());
470         _dkdm_recipients_file = f.optional_string_child("DKDMRecipientsFile").get_value_or(read_path("dkdm_recipients.xml").string());
471         _show_hints_before_make_dcp = f.optional_bool_child("ShowHintsBeforeMakeDCP").get_value_or (true);
472         _confirm_kdm_email = f.optional_bool_child("ConfirmKDMEmail").get_value_or (true);
473         _kdm_container_name_format = dcp::NameFormat (f.optional_string_child("KDMContainerNameFormat").get_value_or ("KDM %f %c"));
474         _kdm_filename_format = dcp::NameFormat (f.optional_string_child("KDMFilenameFormat").get_value_or ("KDM %f %c %s"));
475         _dkdm_filename_format = dcp::NameFormat (f.optional_string_child("DKDMFilenameFormat").get_value_or("DKDM %f %c %s"));
476         _dcp_metadata_filename_format = dcp::NameFormat (f.optional_string_child("DCPMetadataFilenameFormat").get_value_or ("%t"));
477         _dcp_asset_filename_format = dcp::NameFormat (f.optional_string_child("DCPAssetFilenameFormat").get_value_or ("%t"));
478         _jump_to_selected = f.optional_bool_child("JumpToSelected").get_value_or (true);
479         /* The variable was renamed but not the XML tag */
480         _sound = f.optional_bool_child("PreviewSound").get_value_or (true);
481         _sound_output = f.optional_string_child("PreviewSoundOutput");
482         if (f.optional_string_child("CoverSheet")) {
483                 _cover_sheet = f.optional_string_child("CoverSheet").get();
484         }
485         _last_player_load_directory = f.optional_string_child("LastPlayerLoadDirectory");
486         if (f.optional_string_child("LastKDMWriteType")) {
487                 if (f.optional_string_child("LastKDMWriteType").get() == "flat") {
488                         _last_kdm_write_type = KDM_WRITE_FLAT;
489                 } else if (f.optional_string_child("LastKDMWriteType").get() == "folder") {
490                         _last_kdm_write_type = KDM_WRITE_FOLDER;
491                 } else if (f.optional_string_child("LastKDMWriteType").get() == "zip") {
492                         _last_kdm_write_type = KDM_WRITE_ZIP;
493                 }
494         }
495         if (f.optional_string_child("LastDKDMWriteType")) {
496                 if (f.optional_string_child("LastDKDMWriteType").get() == "internal") {
497                         _last_dkdm_write_type = DKDM_WRITE_INTERNAL;
498                 } else if (f.optional_string_child("LastDKDMWriteType").get() == "file") {
499                         _last_dkdm_write_type = DKDM_WRITE_FILE;
500                 }
501         }
502         _frames_in_memory_multiplier = f.optional_number_child<int>("FramesInMemoryMultiplier").get_value_or(3);
503         _decode_reduction = f.optional_number_child<int>("DecodeReduction");
504         _default_notify = f.optional_bool_child("DefaultNotify").get_value_or(false);
505
506         for (auto i: f.node_children("Notification")) {
507                 int const id = i->number_attribute<int>("Id");
508                 if (id >= 0 && id < NOTIFICATION_COUNT) {
509                         _notification[id] = raw_convert<int>(i->content());
510                 }
511         }
512
513         _barco_username = f.optional_string_child("BarcoUsername");
514         _barco_password = f.optional_string_child("BarcoPassword");
515         _christie_username = f.optional_string_child("ChristieUsername");
516         _christie_password = f.optional_string_child("ChristiePassword");
517         _gdc_username = f.optional_string_child("GDCUsername");
518         _gdc_password = f.optional_string_child("GDCPassword");
519
520         auto pm = f.optional_string_child("PlayerMode");
521         if (pm && *pm == "window") {
522                 _player_mode = PLAYER_MODE_WINDOW;
523         } else if (pm && *pm == "full") {
524                 _player_mode = PLAYER_MODE_FULL;
525         } else if (pm && *pm == "dual") {
526                 _player_mode = PLAYER_MODE_DUAL;
527         }
528
529         _image_display = f.optional_number_child<int>("ImageDisplay").get_value_or(0);
530         auto vc = f.optional_string_child("VideoViewType");
531         if (vc && *vc == "opengl") {
532                 _video_view_type = VIDEO_VIEW_OPENGL;
533         } else if (vc && *vc == "simple") {
534                 _video_view_type = VIDEO_VIEW_SIMPLE;
535         }
536         _respect_kdm_validity_periods = f.optional_bool_child("RespectKDMValidityPeriods").get_value_or(true);
537         _player_debug_log_file = f.optional_string_child("PlayerDebugLogFile");
538         _player_content_directory = f.optional_string_child("PlayerContentDirectory");
539         _player_playlist_directory = f.optional_string_child("PlayerPlaylistDirectory");
540         _player_kdm_directory = f.optional_string_child("PlayerKDMDirectory");
541
542         if (f.optional_node_child("AudioMapping")) {
543                 _audio_mapping = AudioMapping (f.node_child("AudioMapping"), Film::current_state_version);
544         }
545
546         for (auto i: f.node_children("CustomLanguage")) {
547                 try {
548                         /* This will fail if it's called before dcp::init() as it won't recognise the
549                          * tag.  That's OK because the Config will be reloaded again later.
550                          */
551                         _custom_languages.push_back (dcp::LanguageTag(i->content()));
552                 } catch (std::runtime_error& e) {}
553         }
554
555         _add_files_path = f.optional_string_child("AddFilesPath");
556
557         if (boost::filesystem::exists (_cinemas_file)) {
558                 cxml::Document f ("Cinemas");
559                 f.read_file (_cinemas_file);
560                 read_cinemas (f);
561         }
562
563         if (boost::filesystem::exists (_dkdm_recipients_file)) {
564                 cxml::Document f ("DKDMRecipients");
565                 f.read_file (_dkdm_recipients_file);
566                 read_dkdm_recipients (f);
567         }
568 }
569 catch (...) {
570         if (have_existing ("config.xml")) {
571                 backup ();
572                 /* We have a config file but it didn't load */
573                 FailedToLoad ();
574         }
575         set_defaults ();
576         /* Make a new set of signing certificates and key */
577         _signer_chain = create_certificate_chain ();
578         /* And similar for decryption of KDMs */
579         _decryption_chain = create_certificate_chain ();
580         write ();
581 }
582
583 /** @return Singleton instance */
584 Config *
585 Config::instance ()
586 {
587         if (_instance == 0) {
588                 _instance = new Config;
589                 _instance->read ();
590         }
591
592         return _instance;
593 }
594
595 /** Write our configuration to disk */
596 void
597 Config::write () const
598 {
599         write_config ();
600         write_cinemas ();
601         write_dkdm_recipients ();
602 }
603
604 void
605 Config::write_config () const
606 {
607         xmlpp::Document doc;
608         auto root = doc.create_root_node ("Config");
609
610         /* [XML] Version The version number of the configuration file format. */
611         root->add_child("Version")->add_child_text (raw_convert<string>(_current_version));
612         /* [XML] MasterEncodingThreads Number of encoding threads to use when running as master. */
613         root->add_child("MasterEncodingThreads")->add_child_text (raw_convert<string> (_master_encoding_threads));
614         /* [XML] ServerEncodingThreads Number of encoding threads to use when running as server. */
615         root->add_child("ServerEncodingThreads")->add_child_text (raw_convert<string> (_server_encoding_threads));
616         if (_default_directory) {
617                 /* [XML:opt] DefaultDirectory Default directory when creating a new film in the GUI. */
618                 root->add_child("DefaultDirectory")->add_child_text (_default_directory->string ());
619         }
620         /* [XML] ServerPortBase Port number to use for frame encoding requests.  <code>ServerPortBase</code> + 1 and
621            <code>ServerPortBase</code> + 2 are used for querying servers.  <code>ServerPortBase</code> + 3 is used
622            by the batch converter to listen for job requests.
623         */
624         root->add_child("ServerPortBase")->add_child_text (raw_convert<string> (_server_port_base));
625         /* [XML] UseAnyServers 1 to broadcast to look for encoding servers to use, 0 to use only those configured. */
626         root->add_child("UseAnyServers")->add_child_text (_use_any_servers ? "1" : "0");
627
628         for (auto i: _servers) {
629                 /* [XML:opt] Server IP address or hostname of an encoding server to use; you can use as many of these tags
630                    as you like.
631                 */
632                 root->add_child("Server")->add_child_text (i);
633         }
634
635         /* [XML] OnlyServersEncode 1 to set the master to do decoding of source content no JPEG2000 encoding; all encoding
636            is done by the encoding servers.  0 to set the master to do some encoding as well as coordinating the job.
637         */
638         root->add_child("OnlyServersEncode")->add_child_text (_only_servers_encode ? "1" : "0");
639         /* [XML] TMSProtocol Protocol to use to copy files to a TMS; 0 to use SCP, 1 for FTP. */
640         root->add_child("TMSProtocol")->add_child_text (raw_convert<string> (static_cast<int> (_tms_protocol)));
641         /* [XML] TMSIP IP address of TMS. */
642         root->add_child("TMSIP")->add_child_text (_tms_ip);
643         /* [XML] TMSPath Path on the TMS to copy files to. */
644         root->add_child("TMSPath")->add_child_text (_tms_path);
645         /* [XML] TMSUser Username to log into the TMS with. */
646         root->add_child("TMSUser")->add_child_text (_tms_user);
647         /* [XML] TMSPassword Password to log into the TMS with. */
648         root->add_child("TMSPassword")->add_child_text (_tms_password);
649         if (_language) {
650                 /* [XML:opt] Language Language to use in the GUI e.g. <code>fr_FR</code>. */
651                 root->add_child("Language")->add_child_text (_language.get());
652         }
653         if (_default_container) {
654                 /* [XML:opt] DefaultContainer ID of default container
655                    to use when creating new films (<code>185</code>,<code>239</code> or
656                    <code>190</code>).
657                 */
658                 root->add_child("DefaultContainer")->add_child_text (_default_container->id ());
659         }
660         if (_default_dcp_content_type) {
661                 /* [XML:opt] DefaultDCPContentType Default content type ot use when creating new films (<code>FTR</code>, <code>SHR</code>,
662                    <code>TLR</code>, <code>TST</code>, <code>XSN</code>, <code>RTG</code>, <code>TSR</code>, <code>POL</code>,
663                    <code>PSA</code> or <code>ADV</code>). */
664                 root->add_child("DefaultDCPContentType")->add_child_text (_default_dcp_content_type->isdcf_name ());
665         }
666         /* [XML] DefaultDCPAudioChannels Default number of audio channels to use when creating new films. */
667         root->add_child("DefaultDCPAudioChannels")->add_child_text (raw_convert<string> (_default_dcp_audio_channels));
668         /* [XML] DCPIssuer Issuer text to write into CPL files. */
669         root->add_child("DCPIssuer")->add_child_text (_dcp_issuer);
670         /* [XML] DCPCreator Creator text to write into CPL files. */
671         root->add_child("DCPCreator")->add_child_text (_dcp_creator);
672         /* [XML] Company name to write into MXF files. */
673         root->add_child("DCPCompanyName")->add_child_text (_dcp_company_name);
674         /* [XML] Product name to write into MXF files. */
675         root->add_child("DCPProductName")->add_child_text (_dcp_product_name);
676         /* [XML] Product version to write into MXF files. */
677         root->add_child("DCPProductVersion")->add_child_text (_dcp_product_version);
678         /* [XML] Comment to write into JPEG2000 data. */
679         root->add_child("DCPJ2KComment")->add_child_text (_dcp_j2k_comment);
680         /* [XML] UploadAfterMakeDCP 1 to upload to a TMS after making a DCP, 0 for no upload. */
681         root->add_child("UploadAfterMakeDCP")->add_child_text (_upload_after_make_dcp ? "1" : "0");
682
683         /* [XML] DefaultStillLength Default length (in seconds) for still images in new films. */
684         root->add_child("DefaultStillLength")->add_child_text (raw_convert<string> (_default_still_length));
685         /* [XML] DefaultJ2KBandwidth Default bitrate (in bits per second) for JPEG2000 data in new films. */
686         root->add_child("DefaultJ2KBandwidth")->add_child_text (raw_convert<string> (_default_j2k_bandwidth));
687         /* [XML] DefaultAudioDelay Default delay to apply to audio (positive moves audio later) in milliseconds. */
688         root->add_child("DefaultAudioDelay")->add_child_text (raw_convert<string> (_default_audio_delay));
689         /* [XML] DefaultInterop 1 to default new films to Interop, 0 for SMPTE. */
690         root->add_child("DefaultInterop")->add_child_text (_default_interop ? "1" : "0");
691         for (auto const& i: _default_metadata) {
692                 auto c = root->add_child("DefaultMetadata");
693                 c->set_attribute("key", i.first);
694                 c->add_child_text(i.second);
695         }
696         if (_default_kdm_directory) {
697                 /* [XML:opt] DefaultKDMDirectory Default directory to write KDMs to. */
698                 root->add_child("DefaultKDMDirectory")->add_child_text (_default_kdm_directory->string ());
699         }
700         /* [XML] MailServer Hostname of SMTP server to use. */
701         root->add_child("MailServer")->add_child_text (_mail_server);
702         /* [XML] MailPort Port number to use on SMTP server. */
703         root->add_child("MailPort")->add_child_text (raw_convert<string> (_mail_port));
704         /* [XML] MailProtocol Protocol to use on SMTP server (Auto, Plain, STARTTLS or SSL) */
705         switch (_mail_protocol) {
706         case EmailProtocol::AUTO:
707                 root->add_child("MailProtocol")->add_child_text("Auto");
708                 break;
709         case EmailProtocol::PLAIN:
710                 root->add_child("MailProtocol")->add_child_text("Plain");
711                 break;
712         case EmailProtocol::STARTTLS:
713                 root->add_child("MailProtocol")->add_child_text("STARTTLS");
714                 break;
715         case EmailProtocol::SSL:
716                 root->add_child("MailProtocol")->add_child_text("SSL");
717                 break;
718         }
719         /* [XML] MailUser Username to use on SMTP server. */
720         root->add_child("MailUser")->add_child_text (_mail_user);
721         /* [XML] MailPassword Password to use on SMTP server. */
722         root->add_child("MailPassword")->add_child_text (_mail_password);
723
724         /* [XML] KDMSubject Subject to use for KDM emails. */
725         root->add_child("KDMSubject")->add_child_text (_kdm_subject);
726         /* [XML] KDMFrom From address to use for KDM emails. */
727         root->add_child("KDMFrom")->add_child_text (_kdm_from);
728         for (auto i: _kdm_cc) {
729                 /* [XML] KDMCC CC address to use for KDM emails; you can use as many of these tags as you like. */
730                 root->add_child("KDMCC")->add_child_text (i);
731         }
732         /* [XML] KDMBCC BCC address to use for KDM emails. */
733         root->add_child("KDMBCC")->add_child_text (_kdm_bcc);
734         /* [XML] KDMEmail Text of KDM email. */
735         root->add_child("KDMEmail")->add_child_text (_kdm_email);
736
737         /* [XML] NotificationSubject Subject to use for notification emails. */
738         root->add_child("NotificationSubject")->add_child_text (_notification_subject);
739         /* [XML] NotificationFrom From address to use for notification emails. */
740         root->add_child("NotificationFrom")->add_child_text (_notification_from);
741         /* [XML] NotificationFrom To address to use for notification emails. */
742         root->add_child("NotificationTo")->add_child_text (_notification_to);
743         for (auto i: _notification_cc) {
744                 /* [XML] NotificationCC CC address to use for notification emails; you can use as many of these tags as you like. */
745                 root->add_child("NotificationCC")->add_child_text (i);
746         }
747         /* [XML] NotificationBCC BCC address to use for notification emails. */
748         root->add_child("NotificationBCC")->add_child_text (_notification_bcc);
749         /* [XML] NotificationEmail Text of notification email. */
750         root->add_child("NotificationEmail")->add_child_text (_notification_email);
751
752         /* [XML] CheckForUpdates 1 to check dcpomatic.com for new versions, 0 to check only on request. */
753         root->add_child("CheckForUpdates")->add_child_text (_check_for_updates ? "1" : "0");
754         /* [XML] CheckForUpdates 1 to check dcpomatic.com for new text versions, 0 to check only on request. */
755         root->add_child("CheckForTestUpdates")->add_child_text (_check_for_test_updates ? "1" : "0");
756
757         /* [XML] MaximumJ2KBandwidth Maximum J2K bandwidth (in bits per second) that can be specified in the GUI. */
758         root->add_child("MaximumJ2KBandwidth")->add_child_text (raw_convert<string> (_maximum_j2k_bandwidth));
759         /* [XML] AllowAnyDCPFrameRate 1 to allow users to specify any frame rate when creating DCPs, 0 to limit the GUI to standard rates. */
760         root->add_child("AllowAnyDCPFrameRate")->add_child_text (_allow_any_dcp_frame_rate ? "1" : "0");
761         /* [XML] AllowAnyContainer 1 to allow users to user any container ratio for their DCP, 0 to limit the GUI to DCI Flat/Scope */
762         root->add_child("AllowAnyContainer")->add_child_text (_allow_any_container ? "1" : "0");
763         /* [XML] ShowExperimentalAudioProcessors 1 to offer users the (experimental) audio upmixer processors, 0 to hide them */
764         root->add_child("ShowExperimentalAudioProcessors")->add_child_text (_show_experimental_audio_processors ? "1" : "0");
765         /* [XML] LogTypes Types of logging to write; a bitfield where 1 is general notes, 2 warnings, 4 errors, 8 debug information related
766            to 3D, 16 debug information related to encoding, 32 debug information for timing purposes, 64 debug information related
767            to sending email, 128 debug information related to the video view, 256 information about disk writing, 512 debug information
768            related to the player, 1024 debug information related to audio analyses.
769         */
770         root->add_child("LogTypes")->add_child_text (raw_convert<string> (_log_types));
771         /* [XML] AnalyseEBUR128 1 to do EBUR128 analyses when analysing audio, otherwise 0. */
772         root->add_child("AnalyseEBUR128")->add_child_text (_analyse_ebur128 ? "1" : "0");
773         /* [XML] AutomaticAudioAnalysis 1 to run audio analysis automatically when audio content is added to the film, otherwise 0. */
774         root->add_child("AutomaticAudioAnalysis")->add_child_text (_automatic_audio_analysis ? "1" : "0");
775 #ifdef DCPOMATIC_WINDOWS
776         if (_win32_console) {
777                 /* [XML] Win32Console 1 to open a console when running on Windows, otherwise 0.
778                  * We only write this if it's true, which is a bit of a hack to allow unit tests to work
779                  * more easily on Windows (without a platform-specific reference in config_write_utf8_test)
780                  */
781                 root->add_child("Win32Console")->add_child_text ("1");
782         }
783 #endif
784
785         /* [XML] Signer Certificate chain and private key to use when signing DCPs and KDMs.  Should contain <code>&lt;Certificate&gt;</code>
786            tags in order and a <code>&lt;PrivateKey&gt;</code> tag all containing PEM-encoded certificates or private keys as appropriate.
787         */
788         auto signer = root->add_child ("Signer");
789         DCPOMATIC_ASSERT (_signer_chain);
790         for (auto const& i: _signer_chain->unordered()) {
791                 signer->add_child("Certificate")->add_child_text (i.certificate (true));
792         }
793         signer->add_child("PrivateKey")->add_child_text (_signer_chain->key().get ());
794
795         /* [XML] Decryption Certificate chain and private key to use when decrypting KDMs */
796         auto decryption = root->add_child ("Decryption");
797         DCPOMATIC_ASSERT (_decryption_chain);
798         for (auto const& i: _decryption_chain->unordered()) {
799                 decryption->add_child("Certificate")->add_child_text (i.certificate (true));
800         }
801         decryption->add_child("PrivateKey")->add_child_text (_decryption_chain->key().get ());
802
803         /* [XML] History Filename of DCP to present in the <guilabel>File</guilabel> menu of the GUI; there can be more than one
804            of these tags.
805         */
806         for (auto i: _history) {
807                 root->add_child("History")->add_child_text (i.string ());
808         }
809
810         /* [XML] History Filename of DCP to present in the <guilabel>File</guilabel> menu of the player; there can be more than one
811            of these tags.
812         */
813         for (auto i: _player_history) {
814                 root->add_child("PlayerHistory")->add_child_text (i.string ());
815         }
816
817         /* [XML] DKDMGroup A group of DKDMs, each with a <code>Name</code> attribute, containing other <code>&lt;DKDMGroup&gt;</code>
818            or <code>&lt;DKDM&gt;</code> tags.
819         */
820         /* [XML] DKDM A DKDM as XML */
821         _dkdms->as_xml (root);
822
823         /* [XML] CinemasFile Filename of cinemas list file. */
824         root->add_child("CinemasFile")->add_child_text (_cinemas_file.string());
825         /* [XML] DKDMRecipientsFile Filename of DKDM recipients list file. */
826         root->add_child("DKDMRecipientsFile")->add_child_text (_dkdm_recipients_file.string());
827         /* [XML] ShowHintsBeforeMakeDCP 1 to show hints in the GUI before making a DCP, otherwise 0. */
828         root->add_child("ShowHintsBeforeMakeDCP")->add_child_text (_show_hints_before_make_dcp ? "1" : "0");
829         /* [XML] ConfirmKDMEmail 1 to confirm before sending KDM emails in the GUI, otherwise 0. */
830         root->add_child("ConfirmKDMEmail")->add_child_text (_confirm_kdm_email ? "1" : "0");
831         /* [XML] KDMFilenameFormat Format for KDM filenames. */
832         root->add_child("KDMFilenameFormat")->add_child_text (_kdm_filename_format.specification ());
833         /* [XML] KDMFilenameFormat Format for DKDM filenames. */
834         root->add_child("DKDMFilenameFormat")->add_child_text(_dkdm_filename_format.specification());
835         /* [XML] KDMContainerNameFormat Format for KDM containers (directories or ZIP files). */
836         root->add_child("KDMContainerNameFormat")->add_child_text (_kdm_container_name_format.specification ());
837         /* [XML] DCPMetadataFilenameFormat Format for DCP metadata filenames. */
838         root->add_child("DCPMetadataFilenameFormat")->add_child_text (_dcp_metadata_filename_format.specification ());
839         /* [XML] DCPAssetFilenameFormat Format for DCP asset filenames. */
840         root->add_child("DCPAssetFilenameFormat")->add_child_text (_dcp_asset_filename_format.specification ());
841         /* [XML] JumpToSelected 1 to make the GUI jump to the start of content when it is selected, otherwise 0. */
842         root->add_child("JumpToSelected")->add_child_text (_jump_to_selected ? "1" : "0");
843         /* [XML] Nagged 1 if a particular nag screen has been shown and should not be shown again, otherwise 0. */
844         for (int i = 0; i < NAG_COUNT; ++i) {
845                 xmlpp::Element* e = root->add_child ("Nagged");
846                 e->set_attribute ("Id", raw_convert<string>(i));
847                 e->add_child_text (_nagged[i] ? "1" : "0");
848         }
849         /* [XML] PreviewSound 1 to use sound in the GUI preview and player, otherwise 0. */
850         root->add_child("PreviewSound")->add_child_text (_sound ? "1" : "0");
851         if (_sound_output) {
852                 /* [XML:opt] PreviewSoundOutput Name of the audio output to use. */
853                 root->add_child("PreviewSoundOutput")->add_child_text (_sound_output.get());
854         }
855         /* [XML] CoverSheet Text of the cover sheet to write when making DCPs. */
856         root->add_child("CoverSheet")->add_child_text (_cover_sheet);
857         if (_last_player_load_directory) {
858                 root->add_child("LastPlayerLoadDirectory")->add_child_text(_last_player_load_directory->string());
859         }
860         /* [XML] LastKDMWriteType Last type of KDM-write: <code>flat</code> for a flat file, <code>folder</code> for a folder or <code>zip</code> for a ZIP file. */
861         if (_last_kdm_write_type) {
862                 switch (_last_kdm_write_type.get()) {
863                 case KDM_WRITE_FLAT:
864                         root->add_child("LastKDMWriteType")->add_child_text("flat");
865                         break;
866                 case KDM_WRITE_FOLDER:
867                         root->add_child("LastKDMWriteType")->add_child_text("folder");
868                         break;
869                 case KDM_WRITE_ZIP:
870                         root->add_child("LastKDMWriteType")->add_child_text("zip");
871                         break;
872                 }
873         }
874         /* [XML] LastDKDMWriteType Last type of DKDM-write: <code>file</code> for a file, <code>internal</code> to add to DCP-o-matic's list. */
875         if (_last_dkdm_write_type) {
876                 switch (_last_dkdm_write_type.get()) {
877                 case DKDM_WRITE_INTERNAL:
878                         root->add_child("LastDKDMWriteType")->add_child_text("internal");
879                         break;
880                 case DKDM_WRITE_FILE:
881                         root->add_child("LastDKDMWriteType")->add_child_text("file");
882                         break;
883                 }
884         }
885         /* [XML] FramesInMemoryMultiplier value to multiply the encoding threads count by to get the maximum number of
886            frames to be held in memory at once.
887         */
888         root->add_child("FramesInMemoryMultiplier")->add_child_text(raw_convert<string>(_frames_in_memory_multiplier));
889
890         /* [XML] DecodeReduction power of 2 to reduce DCP images by before decoding in the player. */
891         if (_decode_reduction) {
892                 root->add_child("DecodeReduction")->add_child_text(raw_convert<string>(_decode_reduction.get()));
893         }
894
895         /* [XML] DefaultNotify 1 to default jobs to notify when complete, otherwise 0. */
896         root->add_child("DefaultNotify")->add_child_text(_default_notify ? "1" : "0");
897
898         /* [XML] Notification 1 if a notification type is enabled, otherwise 0. */
899         for (int i = 0; i < NOTIFICATION_COUNT; ++i) {
900                 xmlpp::Element* e = root->add_child ("Notification");
901                 e->set_attribute ("Id", raw_convert<string>(i));
902                 e->add_child_text (_notification[i] ? "1" : "0");
903         }
904
905         if (_barco_username) {
906                 /* [XML] BarcoUsername Username for logging into Barco's servers when downloading server certificates. */
907                 root->add_child("BarcoUsername")->add_child_text(*_barco_username);
908         }
909         if (_barco_password) {
910                 /* [XML] BarcoPassword Password for logging into Barco's servers when downloading server certificates. */
911                 root->add_child("BarcoPassword")->add_child_text(*_barco_password);
912         }
913
914         if (_christie_username) {
915                 /* [XML] ChristieUsername Username for logging into Christie's servers when downloading server certificates. */
916                 root->add_child("ChristieUsername")->add_child_text(*_christie_username);
917         }
918         if (_christie_password) {
919                 /* [XML] ChristiePassword Password for logging into Christie's servers when downloading server certificates. */
920                 root->add_child("ChristiePassword")->add_child_text(*_christie_password);
921         }
922
923         if (_gdc_username) {
924                 /* [XML] GDCUsername Username for logging into GDC's servers when downloading server certificates. */
925                 root->add_child("GDCUsername")->add_child_text(*_gdc_username);
926         }
927         if (_gdc_password) {
928                 /* [XML] GDCPassword Password for logging into GDC's servers when downloading server certificates. */
929                 root->add_child("GDCPassword")->add_child_text(*_gdc_password);
930         }
931
932         /* [XML] PlayerMode <code>window</code> for a single window, <code>full</code> for full-screen and <code>dual</code> for full screen playback
933            with controls on another monitor.
934         */
935         switch (_player_mode) {
936         case PLAYER_MODE_WINDOW:
937                 root->add_child("PlayerMode")->add_child_text("window");
938                 break;
939         case PLAYER_MODE_FULL:
940                 root->add_child("PlayerMode")->add_child_text("full");
941                 break;
942         case PLAYER_MODE_DUAL:
943                 root->add_child("PlayerMode")->add_child_text("dual");
944                 break;
945         }
946
947         /* [XML] ImageDisplay Screen number to put image on in dual-screen player mode. */
948         root->add_child("ImageDisplay")->add_child_text(raw_convert<string>(_image_display));
949         switch (_video_view_type) {
950         case VIDEO_VIEW_SIMPLE:
951                 root->add_child("VideoViewType")->add_child_text("simple");
952                 break;
953         case VIDEO_VIEW_OPENGL:
954                 root->add_child("VideoViewType")->add_child_text("opengl");
955                 break;
956         }
957         /* [XML] RespectKDMValidityPeriods 1 to refuse to use KDMs that are out of date, 0 to ignore KDM dates. */
958         root->add_child("RespectKDMValidityPeriods")->add_child_text(_respect_kdm_validity_periods ? "1" : "0");
959         if (_player_debug_log_file) {
960                 /* [XML] PlayerLogFile Filename to use for player debug logs. */
961                 root->add_child("PlayerDebugLogFile")->add_child_text(_player_debug_log_file->string());
962         }
963         if (_player_content_directory) {
964                 /* [XML] PlayerContentDirectory Directory to use for player content in the dual-screen mode. */
965                 root->add_child("PlayerContentDirectory")->add_child_text(_player_content_directory->string());
966         }
967         if (_player_playlist_directory) {
968                 /* [XML] PlayerPlaylistDirectory Directory to use for player playlists in the dual-screen mode. */
969                 root->add_child("PlayerPlaylistDirectory")->add_child_text(_player_playlist_directory->string());
970         }
971         if (_player_kdm_directory) {
972                 /* [XML] PlayerKDMDirectory Directory to use for player KDMs in the dual-screen mode. */
973                 root->add_child("PlayerKDMDirectory")->add_child_text(_player_kdm_directory->string());
974         }
975         if (_audio_mapping) {
976                 _audio_mapping->as_xml (root->add_child("AudioMapping"));
977         }
978         for (auto const& i: _custom_languages) {
979                 root->add_child("CustomLanguage")->add_child_text(i.to_string());
980         }
981         if (_add_files_path) {
982                 /* [XML] AddFilesPath The default path that will be offered in the picker when adding files to a film. */
983                 root->add_child("AddFilesPath")->add_child_text(_add_files_path->string());
984         }
985
986         auto target = config_write_file();
987
988         try {
989                 auto const s = doc.write_to_string_formatted ();
990                 boost::filesystem::path tmp (string(target.string()).append(".tmp"));
991                 auto f = fopen_boost (tmp, "w");
992                 if (!f) {
993                         throw FileError (_("Could not open file for writing"), tmp);
994                 }
995                 checked_fwrite (s.c_str(), s.bytes(), f, tmp);
996                 fclose (f);
997                 boost::filesystem::remove (target);
998                 boost::filesystem::rename (tmp, target);
999         } catch (xmlpp::exception& e) {
1000                 string s = e.what ();
1001                 trim (s);
1002                 throw FileError (s, target);
1003         }
1004 }
1005
1006
1007 template <class T>
1008 void
1009 write_file (string root_node, string node, string version, list<shared_ptr<T>> things, boost::filesystem::path file)
1010 {
1011         xmlpp::Document doc;
1012         auto root = doc.create_root_node (root_node);
1013         root->add_child("Version")->add_child_text(version);
1014
1015         for (auto i: things) {
1016                 i->as_xml (root->add_child(node));
1017         }
1018
1019         try {
1020                 doc.write_to_file_formatted (file.string() + ".tmp");
1021                 boost::filesystem::remove (file);
1022                 boost::filesystem::rename (file.string() + ".tmp", file);
1023         } catch (xmlpp::exception& e) {
1024                 string s = e.what ();
1025                 trim (s);
1026                 throw FileError (s, file);
1027         }
1028 }
1029
1030
1031 void
1032 Config::write_cinemas () const
1033 {
1034         write_file ("Cinemas", "Cinema", "1", _cinemas, _cinemas_file);
1035 }
1036
1037
1038 void
1039 Config::write_dkdm_recipients () const
1040 {
1041         write_file ("DKDMRecipients", "DKDMRecipient", "1", _dkdm_recipients, _dkdm_recipients_file);
1042 }
1043
1044
1045 boost::filesystem::path
1046 Config::default_directory_or (boost::filesystem::path a) const
1047 {
1048         return directory_or (_default_directory, a);
1049 }
1050
1051 boost::filesystem::path
1052 Config::default_kdm_directory_or (boost::filesystem::path a) const
1053 {
1054         return directory_or (_default_kdm_directory, a);
1055 }
1056
1057 boost::filesystem::path
1058 Config::directory_or (optional<boost::filesystem::path> dir, boost::filesystem::path a) const
1059 {
1060         if (!dir) {
1061                 return a;
1062         }
1063
1064         boost::system::error_code ec;
1065         auto const e = boost::filesystem::exists (*dir, ec);
1066         if (ec || !e) {
1067                 return a;
1068         }
1069
1070         return *dir;
1071 }
1072
1073 void
1074 Config::drop ()
1075 {
1076         delete _instance;
1077         _instance = 0;
1078 }
1079
1080 void
1081 Config::changed (Property what)
1082 {
1083         Changed (what);
1084 }
1085
1086 void
1087 Config::set_kdm_email_to_default ()
1088 {
1089         _kdm_subject = _("KDM delivery: $CPL_NAME");
1090
1091         _kdm_email = _(
1092                 "Dear Projectionist\n\n"
1093                 "Please find attached KDMs for $CPL_NAME.\n\n"
1094                 "Cinema: $CINEMA_NAME\n"
1095                 "Screen(s): $SCREENS\n\n"
1096                 "The KDMs are valid from $START_TIME until $END_TIME.\n\n"
1097                 "Best regards,\nDCP-o-matic"
1098                 );
1099 }
1100
1101 void
1102 Config::set_notification_email_to_default ()
1103 {
1104         _notification_subject = _("DCP-o-matic notification");
1105
1106         _notification_email = _(
1107                 "$JOB_NAME: $JOB_STATUS"
1108                 );
1109 }
1110
1111 void
1112 Config::reset_kdm_email ()
1113 {
1114         set_kdm_email_to_default ();
1115         changed ();
1116 }
1117
1118 void
1119 Config::reset_notification_email ()
1120 {
1121         set_notification_email_to_default ();
1122         changed ();
1123 }
1124
1125 void
1126 Config::set_cover_sheet_to_default ()
1127 {
1128         _cover_sheet = _(
1129                 "$CPL_NAME\n\n"
1130                 "Type: $TYPE\n"
1131                 "Format: $CONTAINER\n"
1132                 "Audio: $AUDIO\n"
1133                 "Audio Language: $AUDIO_LANGUAGE\n"
1134                 "Subtitle Language: $SUBTITLE_LANGUAGE\n"
1135                 "Length: $LENGTH\n"
1136                 "Size: $SIZE\n"
1137                 );
1138 }
1139
1140 void
1141 Config::add_to_history (boost::filesystem::path p)
1142 {
1143         add_to_history_internal (_history, p);
1144 }
1145
1146 /** Remove non-existant items from the history */
1147 void
1148 Config::clean_history ()
1149 {
1150         clean_history_internal (_history);
1151 }
1152
1153 void
1154 Config::add_to_player_history (boost::filesystem::path p)
1155 {
1156         add_to_history_internal (_player_history, p);
1157 }
1158
1159 /** Remove non-existant items from the player history */
1160 void
1161 Config::clean_player_history ()
1162 {
1163         clean_history_internal (_player_history);
1164 }
1165
1166 void
1167 Config::add_to_history_internal (vector<boost::filesystem::path>& h, boost::filesystem::path p)
1168 {
1169         /* Remove existing instances of this path in the history */
1170         h.erase (remove (h.begin(), h.end(), p), h.end ());
1171
1172         h.insert (h.begin (), p);
1173         if (h.size() > HISTORY_SIZE) {
1174                 h.pop_back ();
1175         }
1176
1177         changed (HISTORY);
1178 }
1179
1180 void
1181 Config::clean_history_internal (vector<boost::filesystem::path>& h)
1182 {
1183         auto old = h;
1184         h.clear ();
1185         for (auto i: old) {
1186                 try {
1187                         if (boost::filesystem::is_directory(i)) {
1188                                 h.push_back (i);
1189                         }
1190                 } catch (...) {
1191                         /* We couldn't find out if it's a directory for some reason; just ignore it */
1192                 }
1193         }
1194 }
1195
1196
1197 bool
1198 Config::have_existing (string file)
1199 {
1200         return boost::filesystem::exists (read_path(file));
1201 }
1202
1203
1204 void
1205 Config::read_cinemas (cxml::Document const & f)
1206 {
1207         _cinemas.clear ();
1208         for (auto i: f.node_children("Cinema")) {
1209                 /* Slightly grotty two-part construction of Cinema here so that we can use
1210                    shared_from_this.
1211                 */
1212                 auto cinema = make_shared<Cinema>(i);
1213                 cinema->read_screens (i);
1214                 _cinemas.push_back (cinema);
1215         }
1216 }
1217
1218 void
1219 Config::set_cinemas_file (boost::filesystem::path file)
1220 {
1221         if (file == _cinemas_file) {
1222                 return;
1223         }
1224
1225         _cinemas_file = file;
1226
1227         if (boost::filesystem::exists (_cinemas_file)) {
1228                 /* Existing file; read it in */
1229                 cxml::Document f ("Cinemas");
1230                 f.read_file (_cinemas_file);
1231                 read_cinemas (f);
1232         }
1233
1234         changed (OTHER);
1235 }
1236
1237
1238 void
1239 Config::read_dkdm_recipients (cxml::Document const & f)
1240 {
1241         _dkdm_recipients.clear ();
1242         for (auto i: f.node_children("DKDMRecipient")) {
1243                 _dkdm_recipients.push_back (shared_ptr<DKDMRecipient>(new DKDMRecipient(i)));
1244         }
1245 }
1246
1247
1248 void
1249 Config::save_template (shared_ptr<const Film> film, string name) const
1250 {
1251         film->write_template (template_write_path(name));
1252 }
1253
1254
1255 list<string>
1256 Config::templates () const
1257 {
1258         if (!boost::filesystem::exists(read_path("templates"))) {
1259                 return {};
1260         }
1261
1262         list<string> n;
1263         for (auto const& i: boost::filesystem::directory_iterator(read_path("templates"))) {
1264                 n.push_back (i.path().filename().string());
1265         }
1266         return n;
1267 }
1268
1269 bool
1270 Config::existing_template (string name) const
1271 {
1272         return boost::filesystem::exists (template_read_path(name));
1273 }
1274
1275
1276 boost::filesystem::path
1277 Config::template_read_path (string name) const
1278 {
1279         return read_path("templates") / tidy_for_filename (name);
1280 }
1281
1282
1283 boost::filesystem::path
1284 Config::template_write_path (string name) const
1285 {
1286         return write_path("templates") / tidy_for_filename (name);
1287 }
1288
1289
1290 void
1291 Config::rename_template (string old_name, string new_name) const
1292 {
1293         boost::filesystem::rename (template_read_path(old_name), template_write_path(new_name));
1294 }
1295
1296 void
1297 Config::delete_template (string name) const
1298 {
1299         boost::filesystem::remove (template_write_path(name));
1300 }
1301
1302 /** @return Path to the config.xml containing the actual settings, following a link if required */
1303 boost::filesystem::path
1304 config_file (boost::filesystem::path main)
1305 {
1306         cxml::Document f ("Config");
1307         if (!boost::filesystem::exists (main)) {
1308                 /* It doesn't exist, so there can't be any links; just return it */
1309                 return main;
1310         }
1311
1312         /* See if there's a link */
1313         try {
1314                 f.read_file (main);
1315                 auto link = f.optional_string_child("Link");
1316                 if (link) {
1317                         return *link;
1318                 }
1319         } catch (xmlpp::exception& e) {
1320                 /* There as a problem reading the main configuration file,
1321                    so there can't be a link.
1322                 */
1323         }
1324
1325         return main;
1326 }
1327
1328
1329 boost::filesystem::path
1330 Config::config_read_file ()
1331 {
1332         return config_file (read_path("config.xml"));
1333 }
1334
1335
1336 boost::filesystem::path
1337 Config::config_write_file ()
1338 {
1339         return config_file (write_path("config.xml"));
1340 }
1341
1342
1343 void
1344 Config::reset_cover_sheet ()
1345 {
1346         set_cover_sheet_to_default ();
1347         changed ();
1348 }
1349
1350 void
1351 Config::link (boost::filesystem::path new_file) const
1352 {
1353         xmlpp::Document doc;
1354         doc.create_root_node("Config")->add_child("Link")->add_child_text(new_file.string());
1355         try {
1356                 doc.write_to_file_formatted(write_path("config.xml").string());
1357         } catch (xmlpp::exception& e) {
1358                 string s = e.what ();
1359                 trim (s);
1360                 throw FileError (s, write_path("config.xml"));
1361         }
1362 }
1363
1364 void
1365 Config::copy_and_link (boost::filesystem::path new_file) const
1366 {
1367         write ();
1368         boost::filesystem::copy_file (config_read_file(), new_file, boost::filesystem::copy_option::overwrite_if_exists);
1369         link (new_file);
1370 }
1371
1372 bool
1373 Config::have_write_permission () const
1374 {
1375         auto f = fopen_boost (config_write_file(), "r+");
1376         if (!f) {
1377                 return false;
1378         }
1379
1380         fclose (f);
1381         return true;
1382 }
1383
1384 /** @param  output_channels Number of output channels in use.
1385  *  @return Audio mapping for this output channel count (may be a default).
1386  */
1387 AudioMapping
1388 Config::audio_mapping (int output_channels)
1389 {
1390         if (!_audio_mapping || _audio_mapping->output_channels() != output_channels) {
1391                 /* Set up a default */
1392                 _audio_mapping = AudioMapping (MAX_DCP_AUDIO_CHANNELS, output_channels);
1393                 if (output_channels == 2) {
1394                         /* Special case for stereo output.
1395                            Map so that Lt = L(-3dB) + Ls(-3dB) + C(-6dB) + Lfe(-10dB)
1396                            Rt = R(-3dB) + Rs(-3dB) + C(-6dB) + Lfe(-10dB)
1397                         */
1398                         _audio_mapping->set (dcp::Channel::LEFT,   0, 1 / sqrt(2));  // L   -> Lt
1399                         _audio_mapping->set (dcp::Channel::RIGHT,  1, 1 / sqrt(2));  // R   -> Rt
1400                         _audio_mapping->set (dcp::Channel::CENTRE, 0, 1 / 2.0);      // C   -> Lt
1401                         _audio_mapping->set (dcp::Channel::CENTRE, 1, 1 / 2.0);      // C   -> Rt
1402                         _audio_mapping->set (dcp::Channel::LFE,    0, 1 / sqrt(10)); // Lfe -> Lt
1403                         _audio_mapping->set (dcp::Channel::LFE,    1, 1 / sqrt(10)); // Lfe -> Rt
1404                         _audio_mapping->set (dcp::Channel::LS,     0, 1 / sqrt(2));  // Ls  -> Lt
1405                         _audio_mapping->set (dcp::Channel::RS,     1, 1 / sqrt(2));  // Rs  -> Rt
1406                 } else {
1407                         /* 1:1 mapping */
1408                         for (int i = 0; i < min (MAX_DCP_AUDIO_CHANNELS, output_channels); ++i) {
1409                                 _audio_mapping->set (i, i, 1);
1410                         }
1411                 }
1412         }
1413
1414         return *_audio_mapping;
1415 }
1416
1417 void
1418 Config::set_audio_mapping (AudioMapping m)
1419 {
1420         _audio_mapping = m;
1421         changed (AUDIO_MAPPING);
1422 }
1423
1424 void
1425 Config::set_audio_mapping_to_default ()
1426 {
1427         DCPOMATIC_ASSERT (_audio_mapping);
1428         auto const ch = _audio_mapping->output_channels ();
1429         _audio_mapping = boost::none;
1430         _audio_mapping = audio_mapping (ch);
1431         changed (AUDIO_MAPPING);
1432 }
1433
1434
1435 void
1436 Config::add_custom_language (dcp::LanguageTag tag)
1437 {
1438         if (find(_custom_languages.begin(), _custom_languages.end(), tag) == _custom_languages.end()) {
1439                 _custom_languages.push_back (tag);
1440                 changed ();
1441         }
1442 }
1443