#include "config.h"
#include "constants.h"
#include "cross.h"
-#include "crypto.h"
#include "dcp_content_type.h"
#include "dkdm_recipient.h"
#include "dkdm_wrapper.h"
#include "filter.h"
#include "log.h"
#include "ratio.h"
-#include "types.h"
#include "zipper.h"
#include <dcp/certificate_chain.h>
#include <dcp/name_format.h>
_language = optional<string> ();
_default_still_length = 10;
_default_dcp_content_type = DCPContentType::from_isdcf_name ("FTR");
- _default_dcp_audio_channels = 6;
+ _default_dcp_audio_channels = 8;
_default_j2k_bandwidth = 150000000;
_default_audio_delay = 0;
_default_interop = false;
_dkdm_recipients_file = read_path ("dkdm_recipients.xml");
_show_hints_before_make_dcp = true;
_confirm_kdm_email = true;
- _kdm_container_name_format = dcp::NameFormat ("KDM %f %c");
- _kdm_filename_format = dcp::NameFormat ("KDM %f %c %s");
- _dkdm_filename_format = dcp::NameFormat ("DKDM %f %c %s");
+ _kdm_container_name_format = dcp::NameFormat("KDM_%f_%c");
+ _kdm_filename_format = dcp::NameFormat("KDM_%f_%c_%s");
+ _dkdm_filename_format = dcp::NameFormat("DKDM_%f_%c_%s");
_dcp_metadata_filename_format = dcp::NameFormat ("%t");
_dcp_asset_filename_format = dcp::NameFormat ("%t");
_jump_to_selected = true;
_sound_output = optional<string> ();
_last_kdm_write_type = KDM_WRITE_FLAT;
_last_dkdm_write_type = DKDM_WRITE_INTERNAL;
+ _default_add_file_location = DefaultAddFileLocation::SAME_AS_LAST_TIME;
/* I think the scaling factor here should be the ratio of the longest frame
encode time to the shortest; if the thread count is T, longest time is L
_player_kdm_directory = boost::none;
_audio_mapping = boost::none;
_custom_languages.clear ();
- _add_files_path = boost::none;
+ _initial_paths.clear();
+ _initial_paths["AddFilesPath"] = boost::none;
+ _initial_paths["AddKDMPath"] = boost::none;
+ _initial_paths["AddDKDMPath"] = boost::none;
+ _initial_paths["SelectCertificatePath"] = boost::none;
+ _initial_paths["AddCombinerInputPath"] = boost::none;
_use_isdcf_name_by_default = true;
_write_kdms_to_disk = true;
_email_kdms = false;
_default_kdm_duration = RoughDuration(1, RoughDuration::Unit::WEEKS);
_auto_crop_threshold = 0.1;
_last_release_notes_version = boost::none;
+ _allow_smpte_bv20 = false;
+ _isdcf_name_part_length = 14;
_allowed_dcp_frame_rates.clear ();
_allowed_dcp_frame_rates.push_back (24);
try
{
cxml::Document f ("Config");
- f.read_file (config_read_file());
+ f.read_file(dcp::filesystem::fix_long_path(config_read_file()));
auto version = f.optional_number_child<int> ("Version");
if (version && *version < _current_version) {
} catch (std::runtime_error& e) {}
}
- _add_files_path = f.optional_string_child("AddFilesPath");
+ for (auto& initial: _initial_paths) {
+ initial.second = f.optional_string_child(initial.first);
+ }
_use_isdcf_name_by_default = f.optional_bool_child("UseISDCFNameByDefault").get_value_or(true);
_write_kdms_to_disk = f.optional_bool_child("WriteKDMsToDisk").get_value_or(true);
_email_kdms = f.optional_bool_child("EmailKDMs").get_value_or(false);
_main_divider_sash_position = f.optional_number_child<int>("MainDividerSashPosition");
_main_content_divider_sash_position = f.optional_number_child<int>("MainContentDividerSashPosition");
+ if (auto loc = f.optional_string_child("DefaultAddFileLocation")) {
+ if (*loc == "last") {
+ _default_add_file_location = DefaultAddFileLocation::SAME_AS_LAST_TIME;
+ } else if (*loc == "project") {
+ _default_add_file_location = DefaultAddFileLocation::SAME_AS_PROJECT;
+ }
+ }
+
+ _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);
+
_export.read(f.optional_node_child("Export"));
}
catch (...) {
void
Config::read_cinemas()
{
- if (boost::filesystem::exists (_cinemas_file)) {
+ if (dcp::filesystem::exists(_cinemas_file)) {
try {
cxml::Document f("Cinemas");
- f.read_file(_cinemas_file);
+ f.read_file(dcp::filesystem::fix_long_path(_cinemas_file));
read_cinemas(f);
} catch (...) {
backup();
void
Config::read_dkdm_recipients()
{
- if (boost::filesystem::exists (_dkdm_recipients_file)) {
+ if (dcp::filesystem::exists(_dkdm_recipients_file)) {
try {
cxml::Document f("DKDMRecipients");
- f.read_file(_dkdm_recipients_file);
+ f.read_file(dcp::filesystem::fix_long_path(_dkdm_recipients_file));
read_dkdm_recipients(f);
} catch (...) {
backup();
for (auto const& i: _custom_languages) {
root->add_child("CustomLanguage")->add_child_text(i.to_string());
}
- if (_add_files_path) {
- /* [XML] AddFilesPath The default path that will be offered in the picker when adding files to a film. */
- root->add_child("AddFilesPath")->add_child_text(_add_files_path->string());
+ for (auto const& initial: _initial_paths) {
+ if (initial.second) {
+ root->add_child(initial.first)->add_child_text(initial.second->string());
+ }
}
root->add_child("UseISDCFNameByDefault")->add_child_text(_use_isdcf_name_by_default ? "1" : "0");
root->add_child("WriteKDMsToDisk")->add_child_text(_write_kdms_to_disk ? "1" : "0");
root->add_child("MainContentDividerSashPosition")->add_child_text(raw_convert<string>(*_main_content_divider_sash_position));
}
+ root->add_child("DefaultAddFileLocation")->add_child_text(
+ _default_add_file_location == DefaultAddFileLocation::SAME_AS_LAST_TIME ? "last" : "project"
+ );
+
+ /* [XML] AllowSMPTEBv20 1 to allow the user to choose SMPTE (Bv2.0 only) as a standard, otherwise 0 */
+ root->add_child("AllowSMPTEBv20")->add_child_text(_allow_smpte_bv20 ? "1" : "0");
+ /* [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));
+
_export.write(root->add_child("Export"));
auto target = config_write_file();
}
f.checked_write(s.c_str(), s.bytes());
f.close();
- boost::filesystem::remove (target);
- boost::filesystem::rename (tmp, target);
+ dcp::filesystem::remove(target);
+ dcp::filesystem::rename(tmp, target);
} catch (xmlpp::exception& e) {
string s = e.what ();
trim (s);
try {
doc.write_to_file_formatted (file.string() + ".tmp");
- boost::filesystem::remove (file);
- boost::filesystem::rename (file.string() + ".tmp", file);
+ dcp::filesystem::remove(file);
+ dcp::filesystem::rename(file.string() + ".tmp", file);
} catch (xmlpp::exception& e) {
string s = e.what ();
trim (s);
}
boost::system::error_code ec;
- auto const e = boost::filesystem::exists (*dir, ec);
+ auto const e = dcp::filesystem::exists(*dir, ec);
if (ec || !e) {
return a;
}
add_to_history_internal (_player_history, p);
}
-/** Remove non-existant items from the player history */
+/** Remove non-existent items from the player history */
void
Config::clean_player_history ()
{
h.clear ();
for (auto i: old) {
try {
- if (boost::filesystem::is_directory(i)) {
+ if (dcp::filesystem::is_directory(i)) {
h.push_back (i);
}
} catch (...) {
bool
Config::have_existing (string file)
{
- return boost::filesystem::exists (read_path(file));
+ return dcp::filesystem::exists(read_path(file));
}
_cinemas_file = file;
- if (boost::filesystem::exists (_cinemas_file)) {
+ if (dcp::filesystem::exists(_cinemas_file)) {
/* Existing file; read it in */
cxml::Document f ("Cinemas");
- f.read_file (_cinemas_file);
+ f.read_file(dcp::filesystem::fix_long_path(_cinemas_file));
read_cinemas (f);
}
list<string>
Config::templates () const
{
- if (!boost::filesystem::exists(read_path("templates"))) {
+ if (!dcp::filesystem::exists(read_path("templates"))) {
return {};
}
list<string> n;
- for (auto const& i: boost::filesystem::directory_iterator(read_path("templates"))) {
+ for (auto const& i: dcp::filesystem::directory_iterator(read_path("templates"))) {
n.push_back (i.path().filename().string());
}
return n;
bool
Config::existing_template (string name) const
{
- return boost::filesystem::exists (template_read_path(name));
+ return dcp::filesystem::exists(template_read_path(name));
}
void
Config::rename_template (string old_name, string new_name) const
{
- boost::filesystem::rename (template_read_path(old_name), template_write_path(new_name));
+ dcp::filesystem::rename(template_read_path(old_name), template_write_path(new_name));
}
void
Config::delete_template (string name) const
{
- boost::filesystem::remove (template_write_path(name));
+ dcp::filesystem::remove(template_write_path(name));
}
/** @return Path to the config.xml containing the actual settings, following a link if required */
config_file (boost::filesystem::path main)
{
cxml::Document f ("Config");
- if (!boost::filesystem::exists (main)) {
+ if (!dcp::filesystem::exists(main)) {
/* It doesn't exist, so there can't be any links; just return it */
return main;
}
/* See if there's a link */
try {
- f.read_file (main);
+ f.read_file(dcp::filesystem::fix_long_path(main));
auto link = f.optional_string_child("Link");
if (link) {
return *link;
Config::copy_and_link (boost::filesystem::path new_file) const
{
write ();
- boost::filesystem::copy_file (config_read_file(), new_file, boost::filesystem::copy_option::overwrite_if_exists);
+ dcp::filesystem::copy_file(config_read_file(), new_file, boost::filesystem::copy_option::overwrite_if_exists);
link (new_file);
}
auto config = Config::instance();
zipper.add ("config.xml", dcp::file_to_string(config->config_read_file()));
- if (boost::filesystem::exists(config->cinemas_file())) {
+ if (dcp::filesystem::exists(config->cinemas_file())) {
zipper.add ("cinemas.xml", dcp::file_to_string(config->cinemas_file()));
}
- if (boost::filesystem::exists(config->dkdm_recipients_file())) {
+ if (dcp::filesystem::exists(config->dkdm_recipients_file())) {
zipper.add ("dkdm_recipients.xml", dcp::file_to_string(config->dkdm_recipients_file()));
}
zipper.close ();
}
+
+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);
+ DCPOMATIC_ASSERT(iter != _initial_paths.end());
+ return iter->second;
+}
+