Add PlaylistEditorRestrictedMenus option, similar to PlayerRestrictedMenus.
[dcpomatic.git] / src / lib / config.cc
index d830c44b04cb1ad3d6ca0d39331823c18c72d8a6..160ef7645b008d0326b6fb329e3196bc851d7c27 100644 (file)
@@ -32,6 +32,7 @@
 #include "filter.h"
 #include "log.h"
 #include "ratio.h"
+#include "unzipper.h"
 #include "zipper.h"
 #include <dcp/certificate_chain.h>
 #include <dcp/name_format.h>
@@ -176,6 +177,8 @@ Config::set_defaults ()
        _gdc_username = optional<string>();
        _gdc_password = optional<string>();
        _player_mode = PLAYER_MODE_WINDOW;
+       _player_restricted_menus = false;
+       _playlist_editor_restricted_menus = false;
        _image_display = 0;
        _video_view_type = VIDEO_VIEW_SIMPLE;
        _respect_kdm_validity_periods = true;
@@ -196,6 +199,7 @@ Config::set_defaults ()
        _initial_paths["DebugLogPath"] = boost::none;
        _initial_paths["CinemaDatabasePath"] = boost::none;
        _initial_paths["ConfigFilePath"] = boost::none;
+       _initial_paths["Preferences"] = boost::none;
        _use_isdcf_name_by_default = true;
        _write_kdms_to_disk = true;
        _email_kdms = false;
@@ -218,12 +222,9 @@ Config::set_defaults ()
        set_notification_email_to_default ();
        set_cover_sheet_to_default ();
 
-       _gpu_binary_location = "";
-       _enable_gpu = false;
-       _selected_gpu = 0;
-       _gpu_license_server = "";
-       _gpu_license_port = 5000;
-       _gpu_license = "";
+#ifdef DCPOMATIC_GROK
+       _grok = boost::none;
+#endif
 
        _main_divider_sash_position = {};
        _main_content_divider_sash_position = {};
@@ -593,6 +594,9 @@ try
                _player_mode = PLAYER_MODE_DUAL;
        }
 
+       _player_restricted_menus = f.optional_bool_child("PlayerRestrictedMenus").get_value_or(false);
+       _playlist_editor_restricted_menus = f.optional_bool_child("PlaylistEditorRestrictedMenus").get_value_or(false);
+
        _image_display = f.optional_number_child<int>("ImageDisplay").get_value_or(0);
        auto vc = f.optional_string_child("VideoViewType");
        if (vc && *vc == "opengl") {
@@ -647,12 +651,11 @@ try
        _allow_smpte_bv20 = f.optional_bool_child("AllowSMPTEBv20").get_value_or(false);
        _isdcf_name_part_length = f.optional_number_child<int>("ISDCFNamePartLength").get_value_or(14);
 
-       _enable_gpu = f.optional_bool_child("EnableGpu").get_value_or(false);
-       _gpu_binary_location = f.string_child("GpuBinaryLocation");
-       _selected_gpu = f.number_child<int>("SelectedGpu");
-       _gpu_license_server = f.string_child ("GpuLicenseServer");
-       _gpu_license_port = f.number_child<int> ("GpuLicensePort");
-       _gpu_license = f.string_child("GpuLicense");
+#ifdef DCPOMATIC_GROK
+       if (auto grok = f.optional_node_child("Grok")) {
+               _grok = Grok(grok);
+       }
+#endif
 
        _export.read(f.optional_node_child("Export"));
 }
@@ -1077,6 +1080,14 @@ Config::write_config () const
                break;
        }
 
+       if (_player_restricted_menus) {
+               root->add_child("PlayerRestrictedMenus")->add_child_text("1");
+       }
+
+       if (_playlist_editor_restricted_menus) {
+               root->add_child("PlaylistEditorRestrictedMenus")->add_child_text("1");
+       }
+
        /* [XML] ImageDisplay Screen number to put image on in dual-screen player mode. */
        root->add_child("ImageDisplay")->add_child_text(raw_convert<string>(_image_display));
        switch (_video_view_type) {
@@ -1140,12 +1151,11 @@ Config::write_config () const
        /* [XML] ISDCFNamePartLength Maximum length of the "name" part of an ISDCF name, which should be 14 according to the standard */
        root->add_child("ISDCFNamePartLength")->add_child_text(raw_convert<string>(_isdcf_name_part_length));
 
-       root->add_child("GpuBinaryLocation")->add_child_text (_gpu_binary_location.string());
-       root->add_child("EnableGpu")->add_child_text ((_enable_gpu ? "1" : "0"));
-       root->add_child("SelectedGpu")->add_child_text (raw_convert<string> (_selected_gpu));
-       root->add_child("GpuLicenseServer")->add_child_text (_gpu_license_server);
-       root->add_child("GpuLicensePort")->add_child_text (raw_convert<string> (_gpu_license_port));
-       root->add_child("GpuLicense")->add_child_text (_gpu_license);
+#ifdef DCPOMATIC_GROK
+       if (_grok) {
+               _grok->as_xml(root->add_child("Grok"));
+       }
+#endif
 
        _export.write(root->add_child("Export"));
 
@@ -1240,7 +1250,7 @@ void
 Config::drop ()
 {
        delete _instance;
-       _instance = 0;
+       _instance = nullptr;
 }
 
 void
@@ -1652,6 +1662,38 @@ save_all_config_as_zip (boost::filesystem::path zip_file)
 }
 
 
+void
+Config::load_from_zip(boost::filesystem::path zip_file)
+{
+       Unzipper unzipper(zip_file);
+       dcp::write_string_to_file(unzipper.get("config.xml"), config_write_file());
+
+       try {
+               dcp::write_string_to_file(unzipper.get("cinemas.xml"), cinemas_file());
+               dcp::write_string_to_file(unzipper.get("dkdm_recipient.xml"), dkdm_recipients_file());
+       } catch (std::runtime_error&) {}
+
+       read();
+
+       changed(Property::USE_ANY_SERVERS);
+       changed(Property::SERVERS);
+       changed(Property::CINEMAS);
+       changed(Property::DKDM_RECIPIENTS);
+       changed(Property::SOUND);
+       changed(Property::SOUND_OUTPUT);
+       changed(Property::PLAYER_CONTENT_DIRECTORY);
+       changed(Property::PLAYER_PLAYLIST_DIRECTORY);
+       changed(Property::PLAYER_DEBUG_LOG);
+       changed(Property::HISTORY);
+       changed(Property::SHOW_EXPERIMENTAL_AUDIO_PROCESSORS);
+       changed(Property::AUDIO_MAPPING);
+       changed(Property::AUTO_CROP_THRESHOLD);
+       changed(Property::ALLOW_SMPTE_BV20);
+       changed(Property::ISDCF_NAME_PART_LENGTH);
+       changed(Property::OTHER);
+}
+
+
 void
 Config::set_initial_path(string id, boost::filesystem::path path)
 {
@@ -1666,7 +1708,44 @@ optional<boost::filesystem::path>
 Config::initial_path(string id) const
 {
        auto iter = _initial_paths.find(id);
-       DCPOMATIC_ASSERT(iter != _initial_paths.end());
+       if (iter == _initial_paths.end()) {
+               return {};
+       }
        return iter->second;
 }
 
+
+#ifdef DCPOMATIC_GROK
+
+Config::Grok::Grok(cxml::ConstNodePtr node)
+       : enable(node->bool_child("Enable"))
+       , binary_location(node->string_child("BinaryLocation"))
+       , selected(node->number_child<int>("Selected"))
+       , licence_server(node->string_child("LicenceServer"))
+       , licence_port(node->number_child<int>("LicencePort"))
+       , licence(node->string_child("Licence"))
+{
+
+}
+
+
+void
+Config::Grok::as_xml(xmlpp::Element* node) const
+{
+       node->add_child("BinaryLocation")->add_child_text(binary_location.string());
+       node->add_child("Enable")->add_child_text((enable ? "1" : "0"));
+       node->add_child("Selected")->add_child_text(raw_convert<string>(selected));
+       node->add_child("LicenceServer")->add_child_text(licence_server);
+       node->add_child("LicencePort")->add_child_text(raw_convert<string>(licence_port));
+       node->add_child("Licence")->add_child_text(licence);
+}
+
+
+void
+Config::set_grok(Grok const& grok)
+{
+       _grok = grok;
+       changed(GROK);
+}
+
+#endif