Add default audio language configuration (#2375).
[dcpomatic.git] / src / lib / config.cc
index 94595f9f8ac88a78d7a9df26035dac5539799b7e..d44abdfbf7685dc0d2641cc0ad105ef5c8854ab7 100644 (file)
@@ -94,6 +94,7 @@ Config::set_defaults ()
        _servers.clear ();
        _only_servers_encode = false;
        _tms_protocol = FileTransferProtocol::SCP;
+       _tms_passive = true;
        _tms_ip = "";
        _tms_path = ".";
        _tms_user = "";
@@ -105,7 +106,6 @@ Config::set_defaults ()
        _show_experimental_audio_processors = false;
        _language = optional<string> ();
        _default_still_length = 10;
-       _default_container = Ratio::from_id ("185");
        _default_dcp_content_type = DCPContentType::from_isdcf_name ("FTR");
        _default_dcp_audio_channels = 6;
        _default_j2k_bandwidth = 150000000;
@@ -207,6 +207,9 @@ Config::set_defaults ()
        set_notification_email_to_default ();
        set_cover_sheet_to_default ();
 
+       _main_divider_sash_position = {};
+       _main_content_divider_sash_position = {};
+
        _export.set_defaults();
 }
 
@@ -322,6 +325,7 @@ try
 
        _only_servers_encode = f.optional_bool_child ("OnlyServersEncode").get_value_or (false);
        _tms_protocol = static_cast<FileTransferProtocol>(f.optional_number_child<int>("TMSProtocol").get_value_or(static_cast<int>(FileTransferProtocol::SCP)));
+       _tms_passive = f.optional_bool_child("TMSPassive").get_value_or(true);
        _tms_ip = f.string_child ("TMSIP");
        _tms_path = f.string_child ("TMSPath");
        _tms_user = f.string_child ("TMSUser");
@@ -329,16 +333,6 @@ try
 
        _language = f.optional_string_child ("Language");
 
-       auto c = f.optional_string_child ("DefaultContainer");
-       if (c) {
-               _default_container = Ratio::from_id (c.get ());
-       }
-
-       if (_default_container && !_default_container->used_for_container()) {
-               Warning (_("Your default container is not valid and has been changed to Flat (1.85:1)"));
-               _default_container = Ratio::from_id ("185");
-       }
-
        _default_dcp_content_type = DCPContentType::from_isdcf_name(f.optional_string_child("DefaultDCPContentType").get_value_or("FTR"));
        _default_dcp_audio_channels = f.optional_number_child<int>("DefaultDCPAudioChannels").get_value_or (6);
 
@@ -363,6 +357,12 @@ try
        _default_j2k_bandwidth = f.optional_number_child<int>("DefaultJ2KBandwidth").get_value_or (200000000);
        _default_audio_delay = f.optional_number_child<int>("DefaultAudioDelay").get_value_or (0);
        _default_interop = f.optional_bool_child("DefaultInterop").get_value_or (false);
+       try {
+               auto al = f.optional_string_child("DefaultAudioLanguage");
+               if (al) {
+                       _default_audio_language = dcp::LanguageTag(*al);
+               }
+       } catch (std::runtime_error&) {}
 
        for (auto const& i: f.node_children("DefaultMetadata")) {
                _default_metadata[i->string_attribute("key")] = i->content();
@@ -604,11 +604,13 @@ try
        }
        _auto_crop_threshold = f.optional_number_child<double>("AutoCropThreshold").get_value_or(0.1);
        _last_release_notes_version = f.optional_string_child("LastReleaseNotesVersion");
+       _main_divider_sash_position = f.optional_number_child<int>("MainDividerSashPosition");
+       _main_content_divider_sash_position = f.optional_number_child<int>("MainContentDividerSashPosition");
 
        _export.read(f.optional_node_child("Export"));
 }
 catch (...) {
-       if (have_existing("config.xml") || have_existing("cinemas.xml") || have_existing("dkdm_recipients.xml")) {
+       if (have_existing("config.xml")) {
                backup ();
                /* We have a config file but it didn't load */
                FailedToLoad(LoadFailure::CONFIG);
@@ -618,7 +620,7 @@ catch (...) {
        _signer_chain = create_certificate_chain ();
        /* And similar for decryption of KDMs */
        _decryption_chain = create_certificate_chain ();
-       write ();
+       write_config();
 }
 
 
@@ -626,9 +628,15 @@ void
 Config::read_cinemas()
 {
        if (boost::filesystem::exists (_cinemas_file)) {
-               cxml::Document f ("Cinemas");
-               f.read_file (_cinemas_file);
-               read_cinemas (f);
+               try {
+                       cxml::Document f("Cinemas");
+                       f.read_file(_cinemas_file);
+                       read_cinemas(f);
+               } catch (...) {
+                       backup();
+                       FailedToLoad(LoadFailure::CINEMAS);
+                       write_cinemas();
+               }
        }
 }
 
@@ -637,9 +645,15 @@ void
 Config::read_dkdm_recipients()
 {
        if (boost::filesystem::exists (_dkdm_recipients_file)) {
-               cxml::Document f ("DKDMRecipients");
-               f.read_file (_dkdm_recipients_file);
-               read_dkdm_recipients (f);
+               try {
+                       cxml::Document f("DKDMRecipients");
+                       f.read_file(_dkdm_recipients_file);
+                       read_dkdm_recipients(f);
+               } catch (...) {
+                       backup();
+                       FailedToLoad(LoadFailure::DKDM_RECIPIENTS);
+                       write_dkdm_recipients();
+               }
        }
 }
 
@@ -702,6 +716,8 @@ Config::write_config () const
        root->add_child("OnlyServersEncode")->add_child_text (_only_servers_encode ? "1" : "0");
        /* [XML] TMSProtocol Protocol to use to copy files to a TMS; 0 to use SCP, 1 for FTP. */
        root->add_child("TMSProtocol")->add_child_text (raw_convert<string> (static_cast<int> (_tms_protocol)));
+       /* [XML] TMSPassive True to use PASV mode with TMS FTP connections. */
+       root->add_child("TMSPassive")->add_child_text(_tms_passive ? "1" : "0");
        /* [XML] TMSIP IP address of TMS. */
        root->add_child("TMSIP")->add_child_text (_tms_ip);
        /* [XML] TMSPath Path on the TMS to copy files to. */
@@ -714,15 +730,8 @@ Config::write_config () const
                /* [XML:opt] Language Language to use in the GUI e.g. <code>fr_FR</code>. */
                root->add_child("Language")->add_child_text (_language.get());
        }
-       if (_default_container) {
-               /* [XML:opt] DefaultContainer ID of default container
-                  to use when creating new films (<code>185</code>,<code>239</code> or
-                  <code>190</code>).
-               */
-               root->add_child("DefaultContainer")->add_child_text (_default_container->id ());
-       }
        if (_default_dcp_content_type) {
-               /* [XML:opt] DefaultDCPContentType Default content type ot use when creating new films (<code>FTR</code>, <code>SHR</code>,
+               /* [XML:opt] DefaultDCPContentType Default content type to use when creating new films (<code>FTR</code>, <code>SHR</code>,
                   <code>TLR</code>, <code>TST</code>, <code>XSN</code>, <code>RTG</code>, <code>TSR</code>, <code>POL</code>,
                   <code>PSA</code> or <code>ADV</code>). */
                root->add_child("DefaultDCPContentType")->add_child_text (_default_dcp_content_type->isdcf_name ());
@@ -752,6 +761,10 @@ Config::write_config () const
        root->add_child("DefaultAudioDelay")->add_child_text (raw_convert<string> (_default_audio_delay));
        /* [XML] DefaultInterop 1 to default new films to Interop, 0 for SMPTE. */
        root->add_child("DefaultInterop")->add_child_text (_default_interop ? "1" : "0");
+       if (_default_audio_language) {
+               /* [XML] DefaultAudioLanguage Default audio language to use for new films */
+               root->add_child("DefaultAudioLanguage")->add_child_text(_default_audio_language->to_string());
+       }
        for (auto const& i: _default_metadata) {
                auto c = root->add_child("DefaultMetadata");
                c->set_attribute("key", i.first);
@@ -1059,6 +1072,12 @@ Config::write_config () const
        if (_last_release_notes_version) {
                root->add_child("LastReleaseNotesVersion")->add_child_text(*_last_release_notes_version);
        }
+       if (_main_divider_sash_position) {
+               root->add_child("MainDividerSashPosition")->add_child_text(raw_convert<string>(*_main_divider_sash_position));
+       }
+       if (_main_content_divider_sash_position) {
+               root->add_child("MainContentDividerSashPosition")->add_child_text(raw_convert<string>(*_main_content_divider_sash_position));
+       }
 
        _export.write(root->add_child("Export"));
 
@@ -1223,7 +1242,7 @@ Config::add_to_history (boost::filesystem::path p)
        add_to_history_internal (_history, p);
 }
 
-/** Remove non-existant items from the history */
+/** Remove non-existent items from the history */
 void
 Config::clean_history ()
 {