Basic implementation of a tree view for DKDMs (#1012).
[dcpomatic.git] / src / lib / config.cc
index c0ab44923a4d8b9344de0b77a294ee12a0066e3d..c2c6592cb9f48c3228020ee8526e7070ea42be1c 100644 (file)
@@ -30,6 +30,7 @@
 #include "util.h"
 #include "cross.h"
 #include "film.h"
+#include "dkdm_wrapper.h"
 #include <dcp/raw_convert.h>
 #include <dcp/name_format.h>
 #include <dcp/certificate_chain.h>
@@ -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<void ()> Config::FailedToLoad;
 
 /** Construct default configuration */
 Config::Config ()
+        /* DKDMs are not considered a thing to reset on set_defaults() */
+       : _dkdms (new DKDMGroup ("root"))
 {
        set_defaults ();
 }
@@ -88,6 +92,7 @@ Config::set_defaults ()
        _language = optional<string> ();
        _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;
@@ -132,6 +137,7 @@ Config::set_defaults ()
        _allowed_dcp_frame_rates.push_back (60);
 
        set_kdm_email_to_default ();
+       set_cover_sheet_to_default ();
 }
 
 void
@@ -220,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 ());
@@ -308,11 +319,16 @@ try
                _decryption_chain = create_certificate_chain ();
        }
 
-       list<cxml::NodePtr> 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<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);
@@ -329,6 +345,9 @@ try
        }
        _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)) {
@@ -357,7 +376,6 @@ catch (...) {
        write ();
 }
 
-
 /** @return Filename to write configuration to */
 boost::filesystem::path
 Config::path (string file, bool create_directories)
@@ -435,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 ());
        }
@@ -493,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");
@@ -514,6 +533,7 @@ Config::write_config () const
        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 ());
@@ -607,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)
 {
@@ -707,3 +739,10 @@ Config::config_path ()
 {
        return path("config.xml", false);
 }
+
+void
+Config::reset_cover_sheet ()
+{
+       set_cover_sheet_to_default ();
+       changed ();
+}