Config* Config::_instance = 0;
int const Config::_current_version = 3;
-boost::signals2::signal<void ()> Config::FailedToLoad;
+boost::signals2::signal<void (Config::LoadFailure)> Config::FailedToLoad;
boost::signals2::signal<void (string)> Config::Warning;
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 ();
}
_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;
_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);
set_kdm_email_to_default ();
set_notification_email_to_default ();
set_cover_sheet_to_default ();
+
+ _export.set_defaults();
}
void
void
Config::read ()
+{
+ read_config();
+ read_cinemas();
+ read_dkdm_recipients();
+}
+
+
+void
+Config::read_config()
try
{
cxml::Document f ("Config");
_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);
_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 (boost::filesystem::exists (_cinemas_file)) {
- cxml::Document f ("Cinemas");
- f.read_file (_cinemas_file);
- read_cinemas (f);
+ 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");
- if (boost::filesystem::exists (_dkdm_recipients_file)) {
- cxml::Document f ("DKDMRecipients");
- f.read_file (_dkdm_recipients_file);
- read_dkdm_recipients (f);
- }
+ _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 ();
+ FailedToLoad(LoadFailure::CONFIG);
}
set_defaults ();
/* Make a new set of signing certificates and key */
_signer_chain = create_certificate_chain ();
/* And similar for decryption of KDMs */
_decryption_chain = create_certificate_chain ();
- write ();
+ write_config();
+}
+
+
+void
+Config::read_cinemas()
+{
+ if (boost::filesystem::exists (_cinemas_file)) {
+ try {
+ cxml::Document f("Cinemas");
+ f.read_file(_cinemas_file);
+ read_cinemas(f);
+ } catch (...) {
+ backup();
+ FailedToLoad(LoadFailure::CINEMAS);
+ write_cinemas();
+ }
+ }
+}
+
+
+void
+Config::read_dkdm_recipients()
+{
+ if (boost::filesystem::exists (_dkdm_recipients_file)) {
+ try {
+ cxml::Document f("DKDMRecipients");
+ f.read_file(_dkdm_recipients_file);
+ read_dkdm_recipients(f);
+ } catch (...) {
+ backup();
+ FailedToLoad(LoadFailure::DKDM_RECIPIENTS);
+ write_dkdm_recipients();
+ }
+ }
}
+
/** @return Singleton instance */
Config *
Config::instance ()
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 ());
/* [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. */
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
root->add_child("WriteKDMsToDisk")->add_child_text(_write_kdms_to_disk ? "1" : "0");
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) {
{
_cover_sheet = _(
"$CPL_NAME\n\n"
+ "CPL Filename: $CPL_FILENAME\n"
"Type: $TYPE\n"
"Format: $CONTAINER\n"
"Audio: $AUDIO\n"
add_to_history_internal (_history, p);
}
-/** Remove non-existant items from the history */
+/** Remove non-existent items from the history */
void
Config::clean_history ()
{
read_cinemas (f);
}
+ changed (CINEMAS);
changed (OTHER);
}
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.