Basic release notes support (#2282).
[dcpomatic.git] / src / lib / config.cc
index 3334e6fbf164b72123eb46f0ebde307be40b9305..cb2ec8885569daf56736690c70b52b6f5b725905 100644 (file)
@@ -78,6 +78,8 @@ boost::signals2::signal<bool (Config::BadReason)> Config::Bad;
 Config::Config ()
         /* DKDMs are not considered a thing to reset on set_defaults() */
        : _dkdms (new DKDMGroup ("root"))
+       , _default_kdm_duration (1, RoughDuration::Unit::WEEKS)
+       , _export(this)
 {
        set_defaults ();
 }
@@ -99,6 +101,7 @@ Config::set_defaults ()
        _allow_any_dcp_frame_rate = false;
        _allow_any_container = false;
        _allow_96khz_audio = false;
+       _use_all_audio_channels = false;
        _show_experimental_audio_processors = false;
        _language = optional<string> ();
        _default_still_length = 10;
@@ -188,7 +191,9 @@ Config::set_defaults ()
        _write_kdms_to_disk = true;
        _email_kdms = false;
        _default_kdm_type = dcp::Formulation::MODIFIED_TRANSITIONAL_1;
+       _default_kdm_duration = RoughDuration(1, RoughDuration::Unit::WEEKS);
        _auto_crop_threshold = 0.1;
+       _last_release_notes_version = boost::none;
 
        _allowed_dcp_frame_rates.clear ();
        _allowed_dcp_frame_rates.push_back (24);
@@ -201,6 +206,8 @@ Config::set_defaults ()
        set_kdm_email_to_default ();
        set_notification_email_to_default ();
        set_cover_sheet_to_default ();
+
+       _export.set_defaults();
 }
 
 void
@@ -409,6 +416,7 @@ try
        _allow_any_dcp_frame_rate = f.optional_bool_child ("AllowAnyDCPFrameRate").get_value_or (false);
        _allow_any_container = f.optional_bool_child ("AllowAnyContainer").get_value_or (false);
        _allow_96khz_audio = f.optional_bool_child("Allow96kHzAudio").get_value_or(false);
+       _use_all_audio_channels = f.optional_bool_child("UseAllAudioChannels").get_value_or(false);
        _show_experimental_audio_processors = f.optional_bool_child ("ShowExperimentalAudioProcessors").get_value_or (false);
 
        _log_types = f.optional_number_child<int> ("LogTypes").get_value_or (LogEntry::TYPE_GENERAL | LogEntry::TYPE_WARNING | LogEntry::TYPE_ERROR);
@@ -580,7 +588,15 @@ try
        _write_kdms_to_disk = f.optional_bool_child("WriteKDMsToDisk").get_value_or(true);
        _email_kdms = f.optional_bool_child("EmailKDMs").get_value_or(false);
        _default_kdm_type = dcp::string_to_formulation(f.optional_string_child("DefaultKDMType").get_value_or("modified-transitional-1"));
+       if (auto duration = f.optional_node_child("DefaultKDMDuration")) {
+               _default_kdm_duration = RoughDuration(duration);
+       } else {
+               _default_kdm_duration = RoughDuration(1, RoughDuration::Unit::WEEKS);
+       }
        _auto_crop_threshold = f.optional_number_child<double>("AutoCropThreshold").get_value_or(0.1);
+       _last_release_notes_version = f.optional_string_child("LastReleaseNotesVersion");
+
+       _export.read(f.optional_node_child("Export"));
 
        if (boost::filesystem::exists (_cinemas_file)) {
                cxml::Document f ("Cinemas");
@@ -725,6 +741,7 @@ Config::write_config () const
                /* [XML:opt] DefaultKDMDirectory Default directory to write KDMs to. */
                root->add_child("DefaultKDMDirectory")->add_child_text (_default_kdm_directory->string ());
        }
+       _default_kdm_duration.as_xml(root->add_child("DefaultKDMDuration"));
        /* [XML] MailServer Hostname of SMTP server to use. */
        root->add_child("MailServer")->add_child_text (_mail_server);
        /* [XML] MailPort Port number to use on SMTP server. */
@@ -790,6 +807,8 @@ Config::write_config () const
        root->add_child("AllowAnyContainer")->add_child_text (_allow_any_container ? "1" : "0");
        /* [XML] Allow96kHzAudio 1 to allow users to make DCPs with 96kHz audio, 0 to always make 48kHz DCPs */
        root->add_child("Allow96kHzAudio")->add_child_text(_allow_96khz_audio ? "1" : "0");
+       /* [XML] UseAllAudioChannels 1 to allow users to map audio to all 16 DCP channels, 0 to limit to the channels used in standard DCPs */
+       root->add_child("UseAllAudioChannels")->add_child_text(_use_all_audio_channels ? "1" : "0");
        /* [XML] ShowExperimentalAudioProcessors 1 to offer users the (experimental) audio upmixer processors, 0 to hide them */
        root->add_child("ShowExperimentalAudioProcessors")->add_child_text (_show_experimental_audio_processors ? "1" : "0");
        /* [XML] LogTypes Types of logging to write; a bitfield where 1 is general notes, 2 warnings, 4 errors, 8 debug information related
@@ -1017,18 +1036,23 @@ Config::write_config () const
        root->add_child("EmailKDMs")->add_child_text(_email_kdms ? "1" : "0");
        root->add_child("DefaultKDMType")->add_child_text(dcp::formulation_to_string(_default_kdm_type));
        root->add_child("AutoCropThreshold")->add_child_text(raw_convert<string>(_auto_crop_threshold));
+       if (_last_release_notes_version) {
+               root->add_child("LastReleaseNotesVersion")->add_child_text(*_last_release_notes_version);
+       }
+
+       _export.write(root->add_child("Export"));
 
        auto target = config_write_file();
 
        try {
                auto const s = doc.write_to_string_formatted ();
                boost::filesystem::path tmp (string(target.string()).append(".tmp"));
-               auto f = fopen_boost (tmp, "w");
+               dcp::File f(tmp, "w");
                if (!f) {
                        throw FileError (_("Could not open file for writing"), tmp);
                }
-               checked_fwrite (s.c_str(), s.bytes(), f, tmp);
-               fclose (f);
+               f.checked_write(s.c_str(), s.bytes());
+               f.close();
                boost::filesystem::remove (target);
                boost::filesystem::rename (tmp, target);
        } catch (xmlpp::exception& e) {
@@ -1408,13 +1432,8 @@ Config::copy_and_link (boost::filesystem::path new_file) const
 bool
 Config::have_write_permission () const
 {
-       auto f = fopen_boost (config_write_file(), "r+");
-       if (!f) {
-               return false;
-       }
-
-       fclose (f);
-       return true;
+       dcp::File f(config_write_file(), "r+");
+       return static_cast<bool>(f);
 }
 
 /** @param  output_channels Number of output channels in use.