diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2008-09-17 12:58:33 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2008-09-17 12:58:33 +0000 |
commit | f2b007195cd75b195e38a4cd7757debac73e7792 (patch) | |
tree | 90474413776806f02794602bbb495663e07a81ea /libs/ardour/export_filename.cc | |
parent | 6ba5125e991e08a9d117b39a4c337cf453fd015d (diff) |
new files from sakari, missed last time
git-svn-id: svn://localhost/ardour2/branches/3.0@3740 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/export_filename.cc')
-rw-r--r-- | libs/ardour/export_filename.cc | 362 |
1 files changed, 362 insertions, 0 deletions
diff --git a/libs/ardour/export_filename.cc b/libs/ardour/export_filename.cc new file mode 100644 index 0000000000..b6f59d1a93 --- /dev/null +++ b/libs/ardour/export_filename.cc @@ -0,0 +1,362 @@ +/* + Copyright (C) 2008 Paul Davis + Author: Sakari Bergen + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include <ardour/export_filename.h> + +#include <pbd/xml++.h> +#include <pbd/convert.h> +#include <pbd/enumwriter.h> + +#include <ardour/session.h> +#include <ardour/session_directory.h> +#include <ardour/export_timespan.h> +#include <ardour/export_format_specification.h> +#include <ardour/export_channel_configuration.h> +#include <ardour/export_failed.h> + +#include "i18n.h" + +using namespace PBD; + +namespace ARDOUR +{ + +ExportFilename::ExportFilename (Session & session) : + include_label (false), + include_session (false), + include_revision (false), + include_channel_config (false), + include_channel (false), + include_timespan (true), // Include timespan name always + include_time (false), + include_date (false), + session (session), + revision (1) +{ + 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); + } +} + +XMLNode & +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); + + add_field (node, "label", include_label, label); + add_field (node, "session", include_session); + 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); + + return *node; +} + +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(); + } + } + + if ((prop = child->property ("path"))) { + folder += prop->value(); + } + + + 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, "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()); + } + + return 0; +} + +ustring +ExportFilename::get_path (FormatPtr format) const +{ + ustring path = folder; + bool filename_empty = true; + + path += "/"; + + if (include_session) { + path += filename_empty ? "" : "_"; + 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); + filename_empty = false; + } + + if (include_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); + 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; + } + + path += "."; + path += format->extension (); + + return path; +} + +ustring +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 +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"); + } +} + +void +ExportFilename::set_time_format (TimeFormat format) +{ + time_format = format; + + if (format == T_None) { + include_time = false; + } else { + include_time = true; + } +} + +void +ExportFilename::set_date_format (DateFormat format) +{ + date_format = format; + + if (format == D_None) { + include_date = false; + } else { + include_date = true; + } +} + +void +ExportFilename::set_label (ustring value) +{ + label = value; + include_label = !value.compare (""); +} + +bool +ExportFilename::set_folder (ustring path) +{ + // TODO check folder existence + folder = path; + return true; +} + +ustring +ExportFilename::get_formatted_time (ustring const & format) const +{ + char buffer [80]; + strftime (buffer, 80, format.c_str(), time_struct); + + ustring return_value (buffer); + return return_value; +} + +void +ExportFilename::add_field (XMLNode * node, ustring const & name, bool enabled, ustring 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"); + if (!value.empty()) { + child->add_property ("value", value); + } +} + +ExportFilename::FieldPair +ExportFilename::get_field (XMLNode const & node, ustring 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(); + } + + return pair; + } + } + + return pair; +} + +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); + + if (!folder_beginning.compare (session_dir)) { + pair.first = true; + pair.second = folder.substr (session_dir_len); + } else { + pair.first = false; + pair.second = folder; + } + + return pair; +} + +} // namespace ARDOUR |