X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fconfig.cc;h=9fdf572070b79eee467d7b0613f46b4e8fe224e6;hb=1f7f758273eb3c98356438da897b7709f8cb87f0;hp=a5a42436b24355c9f4e1605b277a49f53fcc700d;hpb=736b3a068ba5a402b541d32f270669e6e1a4e5c4;p=dcpomatic.git diff --git a/src/lib/config.cc b/src/lib/config.cc index a5a42436b..9fdf57207 100644 --- a/src/lib/config.cc +++ b/src/lib/config.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2016 Carl Hetherington + Copyright (C) 2012-2017 Carl Hetherington This file is part of DCP-o-matic. @@ -29,9 +29,9 @@ #include "cinema.h" #include "util.h" #include "cross.h" -#include "raw_convert.h" -#include "kdm_name_format.h" -#include +#include "film.h" +#include +#include #include #include #include @@ -58,6 +58,7 @@ using std::cerr; using boost::shared_ptr; using boost::optional; using boost::algorithm::trim; +using dcp::raw_convert; Config* Config::_instance = 0; boost::signals2::signal Config::FailedToLoad; @@ -71,7 +72,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 (); @@ -90,7 +92,7 @@ Config::set_defaults () _default_dcp_audio_channels = 6; _default_j2k_bandwidth = 100000000; _default_audio_delay = 0; - _default_interop = false; + _default_interop = true; _mail_server = ""; _mail_port = 25; _mail_user = ""; @@ -109,7 +111,14 @@ Config::set_defaults () #endif _cinemas_file = path ("cinemas.xml"); _show_hints_before_make_dcp = true; - _kdm_filename_format = KDMNameFormat ("KDM %f %c %s"); + _confirm_kdm_email = true; + _kdm_container_name_format = dcp::NameFormat ("KDM %f %c"); + _kdm_filename_format = dcp::NameFormat ("KDM %f %c %s"); + _dcp_metadata_filename_format = dcp::NameFormat ("%t"); + _dcp_asset_filename_format = dcp::NameFormat ("%t"); + _jump_to_selected = true; + _preview_sound = false; + _preview_sound_output = optional (); _allowed_dcp_frame_rates.clear (); _allowed_dcp_frame_rates.push_back (24); @@ -154,8 +163,18 @@ try optional version = f.optional_number_child ("Version"); - _num_local_encoding_threads = f.number_child ("NumLocalEncodingThreads"); - _default_directory = f.string_child ("DefaultDirectory"); + 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" */ + _default_directory = boost::optional (); + } boost::optional b = f.optional_number_child ("ServerPort"); if (!b) { @@ -223,6 +242,7 @@ try _default_j2k_bandwidth = f.optional_number_child("DefaultJ2KBandwidth").get_value_or (200000000); _default_audio_delay = f.optional_number_child("DefaultAudioDelay").get_value_or (0); _default_interop = f.optional_bool_child("DefaultInterop").get_value_or (false); + _default_kdm_directory = f.optional_string_child("DefaultKDMDirectory"); /* Load any cinemas from config.xml */ read_cinemas (f); @@ -292,7 +312,14 @@ try _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); - _kdm_filename_format = KDMNameFormat (f.optional_string_child("KDMFilenameFormat").get_value_or ("KDM %f %c %s")); + _confirm_kdm_email = f.optional_bool_child("ConfirmKDMEmail").get_value_or (true); + _kdm_container_name_format = dcp::NameFormat (f.optional_string_child("KDMContainerNameFormat").get_value_or ("KDM %f %c")); + _kdm_filename_format = dcp::NameFormat (f.optional_string_child("KDMFilenameFormat").get_value_or ("KDM %f %c %s")); + _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); + _preview_sound = f.optional_bool_child("PreviewSound").get_value_or (false); + _preview_sound_output = f.optional_string_child("PreviewSoundOutput"); /* Replace any cinemas from config.xml with those from the configured file */ if (boost::filesystem::exists (_cinemas_file)) { @@ -303,6 +330,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 (); } @@ -354,19 +388,22 @@ Config::instance () void Config::write () const { - write_config_xml (); - write_cinemas_xml (); + write_config (); + write_cinemas (); } void -Config::write_config_xml () const +Config::write_config () const { xmlpp::Document doc; 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("DefaultDirectory")->add_child_text (_default_directory.string ()); + 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 ()); + } root->add_child("ServerPortBase")->add_child_text (raw_convert (_server_port_base)); root->add_child("UseAnyServers")->add_child_text (_use_any_servers ? "1" : "0"); @@ -375,7 +412,7 @@ Config::write_config_xml () const } root->add_child("OnlyServersEncode")->add_child_text (_only_servers_encode ? "1" : "0"); - root->add_child("TMSProtocol")->add_child_text (raw_convert (_tms_protocol)); + root->add_child("TMSProtocol")->add_child_text (raw_convert (static_cast (_tms_protocol))); root->add_child("TMSIP")->add_child_text (_tms_ip); root->add_child("TMSPath")->add_child_text (_tms_path); root->add_child("TMSUser")->add_child_text (_tms_user); @@ -402,6 +439,9 @@ Config::write_config_xml () const root->add_child("DefaultJ2KBandwidth")->add_child_text (raw_convert (_default_j2k_bandwidth)); root->add_child("DefaultAudioDelay")->add_child_text (raw_convert (_default_audio_delay)); root->add_child("DefaultInterop")->add_child_text (_default_interop ? "1" : "0"); + if (_default_kdm_directory) { + root->add_child("DefaultKDMDirectory")->add_child_text (_default_kdm_directory->string ()); + } root->add_child("MailServer")->add_child_text (_mail_server); root->add_child("MailPort")->add_child_text (raw_convert (_mail_port)); root->add_child("MailUser")->add_child_text (_mail_user); @@ -450,7 +490,16 @@ Config::write_config_xml () const root->add_child("CinemasFile")->add_child_text (_cinemas_file.string()); root->add_child("ShowHintsBeforeMakeDCP")->add_child_text (_show_hints_before_make_dcp ? "1" : "0"); + root->add_child("ConfirmKDMEmail")->add_child_text (_confirm_kdm_email ? "1" : "0"); root->add_child("KDMFilenameFormat")->add_child_text (_kdm_filename_format.specification ()); + root->add_child("KDMContainerNameFormat")->add_child_text (_kdm_container_name_format.specification ()); + 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"); + 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()); + } try { doc.write_to_file_formatted (path("config.xml").string ()); @@ -462,7 +511,7 @@ Config::write_config_xml () const } void -Config::write_cinemas_xml () const +Config::write_cinemas () const { xmlpp::Document doc; xmlpp::Element* root = doc.create_root_node ("Cinemas"); @@ -484,17 +533,29 @@ Config::write_cinemas_xml () const boost::filesystem::path Config::default_directory_or (boost::filesystem::path a) const { - if (_default_directory.empty()) { + return directory_or (_default_directory, a); +} + +boost::filesystem::path +Config::default_kdm_directory_or (boost::filesystem::path a) const +{ + return directory_or (_default_kdm_directory, a); +} + +boost::filesystem::path +Config::directory_or (optional dir, boost::filesystem::path a) const +{ + if (!dir) { return a; } boost::system::error_code ec; - bool const e = boost::filesystem::exists (_default_directory, ec); + bool const e = boost::filesystem::exists (*dir, ec); if (ec || !e) { return a; } - return _default_directory; + return *dir; } void @@ -581,3 +642,47 @@ Config::set_cinemas_file (boost::filesystem::path file) changed (OTHER); } + +void +Config::save_template (shared_ptr film, string name) const +{ + film->write_template (template_path (name)); +} + +list +Config::templates () const +{ + if (!boost::filesystem::exists (path ("templates"))) { + return list (); + } + + list n; + for (boost::filesystem::directory_iterator i (path("templates")); i != boost::filesystem::directory_iterator(); ++i) { + n.push_back (i->path().filename().string()); + } + return n; +} + +bool +Config::existing_template (string name) const +{ + return boost::filesystem::exists (template_path (name)); +} + +boost::filesystem::path +Config::template_path (string name) const +{ + return path("templates") / tidy_for_filename (name); +} + +void +Config::rename_template (string old_name, string new_name) const +{ + boost::filesystem::rename (template_path (old_name), template_path (new_name)); +} + +void +Config::delete_template (string name) const +{ + boost::filesystem::remove (template_path (name)); +}