X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fexport_filename.cc;h=1c8c53d117bc683fa4266c9afa0704f0a9577e8a;hb=736b6a3e573b59fd83eed8af6f86811a874449fb;hp=539d4f2027183f646ac4fb60f9c094b5cdce1800;hpb=3b89d9eaa03406a5e03648f47734211f09b89d62;p=ardour.git diff --git a/libs/ardour/export_filename.cc b/libs/ardour/export_filename.cc index 539d4f2027..1c8c53d117 100644 --- a/libs/ardour/export_filename.cc +++ b/libs/ardour/export_filename.cc @@ -18,23 +18,30 @@ */ -#include "ardour/export_filename.h" +#include + +#include +#include #include "pbd/xml++.h" -#include "pbd/convert.h" +#include "pbd/string_convert.h" #include "pbd/enumwriter.h" +#include "pbd/localtime_r.h" +#include "ardour/libardour_visibility.h" #include "ardour/session.h" #include "ardour/session_directory.h" -#include "ardour/export_timespan.h" +#include "ardour/export_filename.h" #include "ardour/export_format_specification.h" #include "ardour/export_channel_configuration.h" -#include "ardour/export_failed.h" +#include "ardour/export_timespan.h" +#include "ardour/utils.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace PBD; using namespace Glib; +using std::string; namespace ARDOUR { @@ -42,24 +49,33 @@ namespace ARDOUR ExportFilename::ExportFilename (Session & session) : include_label (false), include_session (false), + use_session_snapshot_name (false), include_revision (false), include_channel_config (false), + include_format_name (false), include_channel (false), include_timespan (true), // Include timespan name always include_time (false), include_date (false), session (session), - revision (1) + revision (1), + date_format (D_None), + time_format (T_None) { time_t rawtime; std::time (&rawtime); - time_struct = localtime (&rawtime); - - folder = session.session_directory().export_path().to_string(); - - XMLNode * instant_node = session.instant_xml ("ExportFilename"); - if (instant_node) { - set_state (*instant_node); + localtime_r (&rawtime, &time_struct); + + folder = session.session_directory().export_path(); + + XMLNode * extra_node = session.extra_xml ("ExportFilename"); + /* Legacy sessions used Session instant.xml for this */ + if (!extra_node) { + session.instant_xml ("ExportFilename"); + } + + if (extra_node) { + set_state (*extra_node); } } @@ -68,22 +84,24 @@ ExportFilename::get_state () { XMLNode * node = new XMLNode ("ExportFilename"); XMLNode * child; - + FieldPair dir = analyse_folder(); child = node->add_child ("Folder"); - child->add_property ("relative", dir.first ? "true" : "false"); - child->add_property ("path", dir.second); - + child->set_property ("relative", dir.first); + child->set_property ("path", dir.second); + add_field (node, "label", include_label, label); add_field (node, "session", include_session); + add_field (node, "snapshot", use_session_snapshot_name); + add_field (node, "timespan", include_timespan); add_field (node, "revision", include_revision); add_field (node, "time", include_time, enum_2_string (time_format)); add_field (node, "date", include_date, enum_2_string (date_format)); - - XMLNode * instant_node = new XMLNode ("ExportRevision"); - instant_node->add_property ("revision", to_string (revision, std::dec)); - session.add_instant_xml (*instant_node); - + + XMLNode * extra_node = new XMLNode ("ExportRevision"); + extra_node->set_property ("revision", revision); + session.add_extra_xml (*extra_node); + return *node; } @@ -91,152 +109,196 @@ int ExportFilename::set_state (const XMLNode & node) { XMLNode * child; - XMLProperty * prop; FieldPair pair; - + child = node.child ("Folder"); if (!child) { return -1; } - + folder = ""; - - if ((prop = child->property ("relative"))) { - if (!prop->value().compare ("true")) { - folder = session.session_directory().root_path().to_string(); + + bool is_relative; + if (child->get_property ("relative", is_relative) && is_relative) { + folder = session.session_directory ().root_path (); + } + + std::string tmp; + if (child->get_property ("path", tmp)) { + tmp = Glib::build_filename (folder, tmp); + if (!Glib::file_test (tmp, Glib::FILE_TEST_EXISTS)) { + warning << string_compose (_("Existing export folder for this session (%1) does not exist - ignored"), tmp) << endmsg; + } else { + folder = tmp; } } - - if ((prop = child->property ("path"))) { - folder += prop->value(); + + if (folder.empty() || !Glib::file_test (folder, FileTest (FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) { + folder = session.session_directory().export_path(); } - - + pair = get_field (node, "label"); include_label = pair.first; label = pair.second; - + pair = get_field (node, "session"); include_session = pair.first; - + + pair = get_field (node, "snapshot"); + use_session_snapshot_name = pair.first; + + pair = get_field (node, "timespan"); + include_timespan = pair.first; + pair = get_field (node, "revision"); include_revision = pair.first; - + pair = get_field (node, "time"); include_time = pair.first; time_format = (TimeFormat) string_2_enum (pair.second, time_format); - + pair = get_field (node, "date"); include_date = pair.first; date_format = (DateFormat) string_2_enum (pair.second, date_format); - XMLNode * instant_node = session.instant_xml ("ExportRevision"); - if (instant_node && (prop = instant_node->property ("revision"))) { - revision = atoi (prop->value()); + XMLNode * extra_node = session.extra_xml ("ExportRevision"); + /* Legacy sessions used Session instant.xml for this */ + if (!extra_node) { + extra_node = session.instant_xml ("ExportRevision"); + } + + if (extra_node) { + extra_node->get_property ("revision", revision); } return 0; } -ustring -ExportFilename::get_path (FormatPtr format) const +string +ExportFilename::get_path (ExportFormatSpecPtr format) const { - ustring path = folder; + string path; bool filename_empty = true; - - path += "/"; - + bool with_timespan = include_timespan; + + if (!include_session + && !include_label + && !include_revision + && !include_timespan + && !include_channel_config + && !include_channel + && !include_date + && !include_format_name) { + with_timespan = true; + } + if (include_session) { path += filename_empty ? "" : "_"; - path += session.name(); + if (use_session_snapshot_name) { + path += session.snap_name(); + } else { + path += session.name(); + } filename_empty = false; } - + if (include_label) { path += filename_empty ? "" : "_"; path += label; filename_empty = false; } - + if (include_revision) { path += filename_empty ? "" : "_"; path += "r"; - path += to_string (revision, std::dec); + path += to_string (revision); filename_empty = false; } - - if (include_timespan && timespan) { + + if (with_timespan && timespan) { path += filename_empty ? "" : "_"; path += timespan->name(); filename_empty = false; } - + if (include_channel_config && channel_config) { path += filename_empty ? "" : "_"; path += channel_config->name(); filename_empty = false; } - + if (include_channel) { path += filename_empty ? "" : "_"; path += "channel"; - path += to_string (channel, std::dec); + path += to_string (channel); filename_empty = false; } - + if (include_date) { path += filename_empty ? "" : "_"; path += get_date_format_str (date_format); filename_empty = false; } - + if (include_time) { path += filename_empty ? "" : "_"; path += get_time_format_str (time_format); filename_empty = false; } - + + if (include_format_name) { + path += filename_empty ? "" : "_"; + path += format->name(); + filename_empty = false; + } + + if (path.empty ()) { + path = "export"; + } + path += "."; path += format->extension (); - - return path; + + path = legalize_for_universal_path (path); + + return Glib::build_filename (folder, path); } -ustring +string ExportFilename::get_time_format_str (TimeFormat format) const { switch ( format ) { case T_None: return _("No Time"); - + case T_NoDelim: return get_formatted_time ("%H%M"); - + case T_Delim: return get_formatted_time ("%H.%M"); - + default: return _("Invalid time format"); } } -ustring +string ExportFilename::get_date_format_str (DateFormat format) const { switch (format) { case D_None: return _("No Date"); - + case D_BE: return get_formatted_time ("%Y%m%d"); - + case D_ISO: return get_formatted_time ("%Y-%m-%d"); - + case D_BEShortY: return get_formatted_time ("%y%m%d"); - + case D_ISOShortY: return get_formatted_time ("%y-%m-%d"); - + default: return _("Invalid date format"); } @@ -246,7 +308,7 @@ void ExportFilename::set_time_format (TimeFormat format) { time_format = format; - + if (format == T_None) { include_time = false; } else { @@ -258,7 +320,7 @@ void ExportFilename::set_date_format (DateFormat format) { date_format = format; - + if (format == D_None) { include_date = false; } else { @@ -267,75 +329,66 @@ ExportFilename::set_date_format (DateFormat format) } void -ExportFilename::set_label (ustring value) +ExportFilename::set_label (string value) { label = value; include_label = !value.compare (""); } bool -ExportFilename::set_folder (ustring path) +ExportFilename::set_folder (string path) { // TODO check folder existence folder = path; return true; } -ustring -ExportFilename::get_formatted_time (ustring const & format) const +string +ExportFilename::get_formatted_time (string const & format) const { char buffer [80]; - strftime (buffer, 80, format.c_str(), time_struct); - - ustring return_value (buffer); + strftime (buffer, 80, format.c_str(), &time_struct); + + string return_value (buffer); return return_value; } void -ExportFilename::add_field (XMLNode * node, ustring const & name, bool enabled, ustring const & value) +ExportFilename::add_field (XMLNode * node, string const & name, bool enabled, string const & value) { XMLNode * child = node->add_child ("Field"); - + if (!child) { std::cerr << "Error adding a field to ExportFilename XML-tree" << std::endl; return; } - - child->add_property ("name", name); - child->add_property ("enabled", enabled ? "true" : "false"); + + child->set_property ("name", name); + child->set_property ("enabled", enabled); if (!value.empty()) { - child->add_property ("value", value); + child->set_property ("value", value); } } ExportFilename::FieldPair -ExportFilename::get_field (XMLNode const & node, ustring const & name) +ExportFilename::get_field (XMLNode const & node, string const & name) { FieldPair pair; pair.first = false; XMLNodeList children = node.children(); - + for (XMLNodeList::iterator it = children.begin(); it != children.end(); ++it) { - XMLProperty * prop = (*it)->property ("name"); - if (prop && !prop->value().compare (name)) { - - prop = (*it)->property ("enabled"); - if (prop && !prop->value().compare ("true")) { - pair.first = true; - } else { - pair.first = false; - } - - prop = (*it)->property ("value"); - if (prop) { - pair.second = prop->value(); - } - + std::string str; + if ((*it)->get_property ("name", str) && name == str) { + + (*it)->get_property ("enabled", pair.first); + (*it)->get_property ("value", pair.second); + return pair; } } - + return pair; } @@ -343,12 +396,12 @@ ExportFilename::FieldPair ExportFilename::analyse_folder () { FieldPair pair; - - ustring session_dir = session.session_directory().root_path().to_string(); - ustring::size_type session_dir_len = session_dir.length(); - - ustring folder_beginning = folder.substr (0, session_dir_len); - + + string session_dir = session.session_directory().root_path(); + string::size_type session_dir_len = session_dir.length(); + + string folder_beginning = folder.substr (0, session_dir_len); + if (!folder_beginning.compare (session_dir)) { pair.first = true; pair.second = folder.substr (session_dir_len); @@ -356,7 +409,7 @@ ExportFilename::analyse_folder () pair.first = false; pair.second = folder; } - + return pair; }