X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fconfig.cc;h=7f457439d98f0f8a2b1b4c2fcf22b68cc74a8f0c;hb=73654117144c6de0ec4efe39ddc88485df546cc9;hp=80598c7e9d8ed6fe091f1561a5650b1b51a5cf9c;hpb=e7afdb813259857ddd82a904dfaa56a6bee9ae75;p=dcpomatic.git diff --git a/src/lib/config.cc b/src/lib/config.cc index 80598c7e9..7f457439d 100644 --- a/src/lib/config.cc +++ b/src/lib/config.cc @@ -1,19 +1,20 @@ /* Copyright (C) 2012-2016 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + DCP-o-matic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with DCP-o-matic. If not, see . */ @@ -28,7 +29,8 @@ #include "cinema.h" #include "util.h" #include "cross.h" -#include "raw_convert.h" +#include +#include #include #include #include @@ -56,8 +58,10 @@ 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; /** Construct default configuration */ Config::Config () @@ -84,6 +88,7 @@ Config::set_defaults () _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 = 100000000; _default_audio_delay = 0; _default_interop = false; @@ -104,6 +109,10 @@ Config::set_defaults () _win32_console = false; #endif _cinemas_file = path ("cinemas.xml"); + _show_hints_before_make_dcp = true; + _kdm_filename_format = dcp::NameFormat ("KDM %f %c %s"); + _dcp_metadata_filename_format = dcp::NameFormat ("%t_%i"); + _dcp_asset_filename_format = dcp::NameFormat ("%t_%i"); _allowed_dcp_frame_rates.clear (); _allowed_dcp_frame_rates.push_back (24); @@ -140,18 +149,8 @@ Config::create_certificate_chain () void Config::read () +try { - if (!have_existing ("config.xml")) { - cout << "No existing config.xml; creating chains.\n"; - /* 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 (); - cout << "Writing config.\n"; - write (); - return; - } - cxml::Document f ("Config"); f.read_file (path ("config.xml")); optional c; @@ -207,6 +206,8 @@ Config::read () _default_dcp_content_type = DCPContentType::from_isdcf_name (c.get ()); } + _default_dcp_audio_channels = f.optional_number_child("DefaultDCPAudioChannels").get_value_or (6); + if (f.optional_string_child ("DCPMetadataIssuer")) { _dcp_issuer = f.string_child ("DCPMetadataIssuer"); } else if (f.optional_string_child ("DCPIssuer")) { @@ -293,6 +294,10 @@ Config::read () } _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 = 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_%i")); + _dcp_asset_filename_format = dcp::NameFormat (f.optional_string_child("DCPAssetFilenameFormat").get_value_or ("%t_%i")); /* Replace any cinemas from config.xml with those from the configured file */ if (boost::filesystem::exists (_cinemas_file)) { @@ -301,6 +306,19 @@ Config::read () read_cinemas (f); } } +catch (...) { + if (have_existing ("config.xml")) { + /* We have a config file but it didn't load */ + FailedToLoad (); + } + 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 (); +} + /** @return Filename to write configuration to */ boost::filesystem::path @@ -331,16 +349,7 @@ Config::instance () { if (_instance == 0) { _instance = new Config; - try { - _instance->read (); - } catch (exception& e) { - /* configuration load failed; never mind, just - stick with the default. - */ - cerr << "dcpomatic: warning: configuration did not load (" << e.what() << "); using defaults\n"; - } catch (...) { - cerr << "dcpomatic: warning: configuration did not load; using defaults\n"; - } + _instance->read (); } return _instance; @@ -388,6 +397,7 @@ Config::write_config_xml () const if (_default_dcp_content_type) { root->add_child("DefaultDCPContentType")->add_child_text (_default_dcp_content_type->isdcf_name ()); } + root->add_child("DefaultDCPAudioChannels")->add_child_text (raw_convert (_default_dcp_audio_channels)); root->add_child("DCPIssuer")->add_child_text (_dcp_issuer); root->add_child("DCPCreator")->add_child_text (_dcp_creator); @@ -444,6 +454,10 @@ 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("KDMFilenameFormat")->add_child_text (_kdm_filename_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 ()); try { doc.write_to_file_formatted (path("config.xml").string ()); @@ -500,7 +514,6 @@ Config::drop () void Config::changed (Property what) { - cout << what << " changed in config.\n"; Changed (what); }