+ /* These must be done before we call Bad as that might set one
+ of the nags.
+ */
+ BOOST_FOREACH (cxml::NodePtr i, f.node_children("Nagged")) {
+ int const id = i->number_attribute<int>("Id");
+ if (id >= 0 && id < NAG_COUNT) {
+ _nagged[id] = raw_convert<int>(i->content());
+ }
+ }
+
+ optional<BadReason> bad;
+
+ BOOST_FOREACH (dcp::Certificate const & i, _signer_chain->unordered()) {
+ if (i.has_utf8_strings()) {
+ bad = BAD_SIGNER_UTF8_STRINGS;
+ }
+ }
+
+ if (!_signer_chain->chain_valid() || !_signer_chain->private_key_valid()) {
+ bad = BAD_SIGNER_INCONSISTENT;
+ }
+
+ if (!_decryption_chain->chain_valid() || !_decryption_chain->private_key_valid()) {
+ bad = BAD_DECRYPTION_INCONSISTENT;
+ }
+
+ if (bad) {
+ optional<bool> const remake = Bad(*bad);
+ if (remake && *remake) {
+ switch (*bad) {
+ case BAD_SIGNER_UTF8_STRINGS:
+ case BAD_SIGNER_INCONSISTENT:
+ _signer_chain = create_certificate_chain ();
+ break;
+ case BAD_DECRYPTION_INCONSISTENT:
+ _decryption_chain = create_certificate_chain ();
+ break;
+ }
+ }
+ }
+
+ if (f.optional_node_child("DKDMGroup")) {
+ /* New-style: all DKDMs in a group */
+ _dkdms = dynamic_pointer_cast<DKDMGroup> (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);
+ _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);
+ /* The variable was renamed but not the XML tag */
+ _sound = f.optional_bool_child("PreviewSound").get_value_or (true);
+ _sound_output = f.optional_string_child("PreviewSoundOutput");
+ if (f.optional_string_child("CoverSheet")) {
+ _cover_sheet = f.optional_string_child("CoverSheet").get();
+ }
+ _last_player_load_directory = f.optional_string_child("LastPlayerLoadDirectory");
+ if (f.optional_string_child("LastKDMWriteType")) {
+ if (f.optional_string_child("LastKDMWriteType").get() == "flat") {
+ _last_kdm_write_type = KDM_WRITE_FLAT;
+ } else if (f.optional_string_child("LastKDMWriteType").get() == "folder") {
+ _last_kdm_write_type = KDM_WRITE_FOLDER;
+ } else if (f.optional_string_child("LastKDMWriteType").get() == "zip") {
+ _last_kdm_write_type = KDM_WRITE_ZIP;
+ }
+ }
+ if (f.optional_string_child("LastDKDMWriteType")) {
+ if (f.optional_string_child("LastDKDMWriteType").get() == "internal") {
+ _last_dkdm_write_type = DKDM_WRITE_INTERNAL;
+ } else if (f.optional_string_child("LastDKDMWriteType").get() == "file") {
+ _last_dkdm_write_type = DKDM_WRITE_FILE;
+ }
+ }
+ _frames_in_memory_multiplier = f.optional_number_child<int>("FramesInMemoryMultiplier").get_value_or(3);
+ _decode_reduction = f.optional_number_child<int>("DecodeReduction");
+ _default_notify = f.optional_bool_child("DefaultNotify").get_value_or(false);
+
+ BOOST_FOREACH (cxml::NodePtr i, f.node_children("Notification")) {
+ int const id = i->number_attribute<int>("Id");
+ if (id >= 0 && id < NOTIFICATION_COUNT) {
+ _notification[id] = raw_convert<int>(i->content());
+ }
+ }
+
+ _barco_username = f.optional_string_child("BarcoUsername");
+ _barco_password = f.optional_string_child("BarcoPassword");
+ _christie_username = f.optional_string_child("ChristieUsername");
+ _christie_password = f.optional_string_child("ChristiePassword");
+ _gdc_username = f.optional_string_child("GDCUsername");
+ _gdc_password = f.optional_string_child("GDCPassword");
+
+ optional<string> ic = f.optional_string_child("InterfaceComplexity");
+ if (ic && *ic == "full") {
+ _interface_complexity = INTERFACE_FULL;
+ }
+ optional<string> pm = f.optional_string_child("PlayerMode");
+ if (pm && *pm == "window") {
+ _player_mode = PLAYER_MODE_WINDOW;
+ } else if (pm && *pm == "full") {
+ _player_mode = PLAYER_MODE_FULL;
+ } else if (pm && *pm == "dual") {
+ _player_mode = PLAYER_MODE_DUAL;
+ }
+
+ _image_display = f.optional_number_child<int>("ImageDisplay").get_value_or(0);
+ optional<string> vc = f.optional_string_child("VideoViewType");
+ if (vc && *vc == "opengl") {
+ _video_view_type = VIDEO_VIEW_OPENGL;
+ } else if (vc && *vc == "simple") {
+ _video_view_type = VIDEO_VIEW_SIMPLE;
+ }
+ _respect_kdm_validity_periods = f.optional_bool_child("RespectKDMValidityPeriods").get_value_or(true);
+ /* PlayerLogFile is old name */
+ _player_activity_log_file = f.optional_string_child("PlayerLogFile");
+ if (!_player_activity_log_file) {
+ _player_activity_log_file = f.optional_string_child("PlayerActivityLogFile");
+ }
+ _player_debug_log_file = f.optional_string_child("PlayerDebugLogFile");
+ _player_content_directory = f.optional_string_child("PlayerContentDirectory");
+ _player_playlist_directory = f.optional_string_child("PlayerPlaylistDirectory");
+ _player_kdm_directory = f.optional_string_child("PlayerKDMDirectory");
+#ifdef DCPOMATIC_VARIANT_SWAROOP
+ _player_background_image = f.optional_string_child("PlayerBackgroundImage");
+ _kdm_server_url = f.optional_string_child("KDMServerURL").get_value_or("http://localhost:8000/{CPL}");
+ _player_watermark_theatre = f.optional_string_child("PlayerWatermarkTheatre").get_value_or("");
+ _player_watermark_period = f.optional_number_child<int>("PlayerWatermarkPeriod").get_value_or(1);
+ _player_watermark_duration = f.optional_number_child<int>("PlayerWatermarkDuration").get_value_or(150);
+ BOOST_FOREACH (cxml::ConstNodePtr i, f.node_children("RequiredMonitor")) {
+ _required_monitors.push_back(Monitor(i));
+ }
+ _player_lock_file = f.optional_string_child("PlayerLockFile");