+
+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)
+{
+ auto iter = _initial_paths.find(id);
+ DCPOMATIC_ASSERT(iter != _initial_paths.end());
+ iter->second = path;
+ changed();
+}
+
+
+optional<boost::filesystem::path>
+Config::initial_path(string id) const
+{
+ auto iter = _initial_paths.find(id);
+ 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