X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fconfig.cc;h=c2c6592cb9f48c3228020ee8526e7070ea42be1c;hb=c94d763e07d9e7b029091e1ea64ba4f7758b3d5b;hp=79486c6025966ed67197f7f816f9d0345ef96f1b;hpb=fdb1cacf58115881bd4d3e8cca8ba389f26400df;p=dcpomatic.git diff --git a/src/lib/config.cc b/src/lib/config.cc index 79486c602..c2c6592cb 100644 --- a/src/lib/config.cc +++ b/src/lib/config.cc @@ -30,6 +30,7 @@ #include "util.h" #include "cross.h" #include "film.h" +#include "dkdm_wrapper.h" #include #include #include @@ -57,6 +58,7 @@ using std::exception; using std::cerr; using boost::shared_ptr; using boost::optional; +using boost::dynamic_pointer_cast; using boost::algorithm::trim; using dcp::raw_convert; @@ -65,6 +67,8 @@ boost::signals2::signal Config::FailedToLoad; /** Construct default configuration */ Config::Config () + /* DKDMs are not considered a thing to reset on set_defaults() */ + : _dkdms (new DKDMGroup ("root")) { set_defaults (); } @@ -72,7 +76,8 @@ Config::Config () void Config::set_defaults () { - _num_local_encoding_threads = max (2U, boost::thread::hardware_concurrency ()); + _master_encoding_threads = max (2U, boost::thread::hardware_concurrency ()); + _server_encoding_threads = max (2U, boost::thread::hardware_concurrency ()); _server_port_base = 6192; _use_any_servers = true; _servers.clear (); @@ -87,6 +92,7 @@ Config::set_defaults () _language = optional (); _default_still_length = 10; _default_container = Ratio::from_id ("185"); + _default_scale_to = 0; _default_dcp_content_type = DCPContentType::from_isdcf_name ("FTR"); _default_dcp_audio_channels = 6; _default_j2k_bandwidth = 100000000; @@ -116,6 +122,11 @@ Config::set_defaults () _dcp_metadata_filename_format = dcp::NameFormat ("%t"); _dcp_asset_filename_format = dcp::NameFormat ("%t"); _jump_to_selected = true; + for (int i = 0; i < NAG_COUNT; ++i) { + _nagged[i] = false; + } + _preview_sound = false; + _preview_sound_output = optional (); _allowed_dcp_frame_rates.clear (); _allowed_dcp_frame_rates.push_back (24); @@ -126,6 +137,7 @@ Config::set_defaults () _allowed_dcp_frame_rates.push_back (60); set_kdm_email_to_default (); + set_cover_sheet_to_default (); } void @@ -160,7 +172,13 @@ try optional version = f.optional_number_child ("Version"); - _num_local_encoding_threads = f.number_child ("NumLocalEncodingThreads"); + if (f.optional_number_child("NumLocalEncodingThreads")) { + _master_encoding_threads = _server_encoding_threads = f.optional_number_child("NumLocalEncodingThreads").get(); + } else { + _master_encoding_threads = f.number_child("MasterEncodingThreads"); + _server_encoding_threads = f.number_child("ServerEncodingThreads"); + } + _default_directory = f.optional_string_child ("DefaultDirectory"); if (_default_directory && _default_directory->empty ()) { /* We used to store an empty value for this to mean "none set" */ @@ -208,6 +226,11 @@ try _default_container = Ratio::from_id (c.get ()); } + c = f.optional_string_child ("DefaultScaleTo"); + if (c) { + _default_scale_to = Ratio::from_id (c.get ()); + } + c = f.optional_string_child ("DefaultDCPContentType"); if (c) { _default_dcp_content_type = DCPContentType::from_isdcf_name (c.get ()); @@ -296,11 +319,16 @@ try _decryption_chain = create_certificate_chain (); } - list dkdm = f.node_children ("DKDM"); - BOOST_FOREACH (cxml::NodePtr i, f.node_children ("DKDM")) { - _dkdms.push_back (dcp::EncryptedKDM (i->content ())); + if (f.optional_node_child("DKDMGroup")) { + /* New-style: all DKDMs in a group */ + _dkdms = dynamic_pointer_cast (DKDMBase::read (f.node_child("DKDMGroup"))); + } else { + /* Old-style: one or more DKDM nodes */ + _dkdms.reset (new DKDMGroup ("root")); + BOOST_FOREACH (cxml::ConstNodePtr i, f.node_children("DKDM")) { + _dkdms->add (DKDMBase::read (i)); + } } - _cinemas_file = f.optional_string_child("CinemasFile").get_value_or (path ("cinemas.xml").string ()); _show_hints_before_make_dcp = f.optional_bool_child("ShowHintsBeforeMakeDCP").get_value_or (true); _confirm_kdm_email = f.optional_bool_child("ConfirmKDMEmail").get_value_or (true); @@ -309,6 +337,17 @@ try _dcp_metadata_filename_format = dcp::NameFormat (f.optional_string_child("DCPMetadataFilenameFormat").get_value_or ("%t")); _dcp_asset_filename_format = dcp::NameFormat (f.optional_string_child("DCPAssetFilenameFormat").get_value_or ("%t")); _jump_to_selected = f.optional_bool_child("JumpToSelected").get_value_or (true); + BOOST_FOREACH (cxml::NodePtr i, f.node_children("Nagged")) { + int const id = i->number_attribute("Id"); + if (id >= 0 && id < NAG_COUNT) { + _nagged[id] = raw_convert(i->content()); + } + } + _preview_sound = f.optional_bool_child("PreviewSound").get_value_or (false); + _preview_sound_output = f.optional_string_child("PreviewSoundOutput"); + if (f.optional_string_child("CoverSheet")) { + _cover_sheet = f.optional_string_child("CoverSheet").get(); + } /* Replace any cinemas from config.xml with those from the configured file */ if (boost::filesystem::exists (_cinemas_file)) { @@ -319,6 +358,13 @@ try } catch (...) { if (have_existing ("config.xml")) { + + /* Make a copy of the configuration */ + try { + boost::filesystem::copy_file (path ("config.xml", false), path ("config.xml.backup", false)); + boost::filesystem::copy_file (path ("cinemas.xml", false), path ("cinemas.xml.backup", false)); + } catch (...) {} + /* We have a config file but it didn't load */ FailedToLoad (); } @@ -330,7 +376,6 @@ catch (...) { write (); } - /** @return Filename to write configuration to */ boost::filesystem::path Config::path (string file, bool create_directories) @@ -381,7 +426,8 @@ Config::write_config () const xmlpp::Element* root = doc.create_root_node ("Config"); root->add_child("Version")->add_child_text ("2"); - root->add_child("NumLocalEncodingThreads")->add_child_text (raw_convert (_num_local_encoding_threads)); + root->add_child("MasterEncodingThreads")->add_child_text (raw_convert (_master_encoding_threads)); + root->add_child("ServerEncodingThreads")->add_child_text (raw_convert (_server_encoding_threads)); if (_default_directory) { root->add_child("DefaultDirectory")->add_child_text (_default_directory->string ()); } @@ -407,6 +453,9 @@ Config::write_config () const if (_default_container) { root->add_child("DefaultContainer")->add_child_text (_default_container->id ()); } + if (_default_scale_to) { + root->add_child("DefaultScaleTo")->add_child_text (_default_scale_to->id ()); + } if (_default_dcp_content_type) { root->add_child("DefaultDCPContentType")->add_child_text (_default_dcp_content_type->isdcf_name ()); } @@ -465,9 +514,7 @@ Config::write_config () const root->add_child("History")->add_child_text (i->string ()); } - BOOST_FOREACH (dcp::EncryptedKDM i, _dkdms) { - root->add_child("DKDM")->add_child_text (i.as_xml ()); - } + _dkdms->as_xml (root); root->add_child("CinemasFile")->add_child_text (_cinemas_file.string()); root->add_child("ShowHintsBeforeMakeDCP")->add_child_text (_show_hints_before_make_dcp ? "1" : "0"); @@ -477,6 +524,16 @@ Config::write_config () const root->add_child("DCPMetadataFilenameFormat")->add_child_text (_dcp_metadata_filename_format.specification ()); root->add_child("DCPAssetFilenameFormat")->add_child_text (_dcp_asset_filename_format.specification ()); root->add_child("JumpToSelected")->add_child_text (_jump_to_selected ? "1" : "0"); + for (int i = 0; i < NAG_COUNT; ++i) { + xmlpp::Element* e = root->add_child ("Nagged"); + e->set_attribute ("Id", raw_convert(i)); + e->add_child_text (_nagged[i] ? "1" : "0"); + } + root->add_child("PreviewSound")->add_child_text (_preview_sound ? "1" : "0"); + if (_preview_sound_output) { + root->add_child("PreviewSoundOutput")->add_child_text (_preview_sound_output.get()); + } + root->add_child("CoverSheet")->add_child_text (_cover_sheet); try { doc.write_to_file_formatted (path("config.xml").string ()); @@ -570,6 +627,18 @@ Config::reset_kdm_email () changed (); } +void +Config::set_cover_sheet_to_default () +{ + _cover_sheet = _( + "$CPL_NAME\n\n" + "Type: $TYPE\n" + "Format: $CONTAINER\n" + "Audio: $AUDIO\n" + "Length: $LENGTH\n" + ); +} + void Config::add_to_history (boost::filesystem::path p) { @@ -663,3 +732,17 @@ Config::delete_template (string name) const { boost::filesystem::remove (template_path (name)); } + +/** @return Path to the config.xml, for telling the user what it is */ +boost::filesystem::path +Config::config_path () +{ + return path("config.xml", false); +} + +void +Config::reset_cover_sheet () +{ + set_cover_sheet_to_default (); + changed (); +}