summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/DeprecatedLoader.cpp706
-rw-r--r--src/client/DeprecatedLoader.hpp90
-rw-r--r--src/client/wscript5
-rw-r--r--src/gui/LoadPatchWindow.cpp4
-rw-r--r--src/gui/LoadRemotePatchWindow.cpp2
-rw-r--r--src/gui/ThreadedLoader.cpp51
-rw-r--r--src/gui/ThreadedLoader.hpp14
-rw-r--r--src/gui/wscript1
-rw-r--r--src/ingen/main.cpp3
-rw-r--r--src/serialisation/Parser.cpp5
-rw-r--r--src/serialisation/Parser.hpp1
11 files changed, 26 insertions, 856 deletions
diff --git a/src/client/DeprecatedLoader.cpp b/src/client/DeprecatedLoader.cpp
deleted file mode 100644
index a1e76314..00000000
--- a/src/client/DeprecatedLoader.cpp
+++ /dev/null
@@ -1,706 +0,0 @@
-/* This file is part of Ingen.
- * Copyright (C) 2007-2009 David Robillard <http://drobilla.net>
- *
- * Ingen 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.
- *
- * Ingen 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 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.,
- * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include <fstream>
-#include <vector>
-#include <algorithm>
-#include <utility> // for pair, make_pair
-#include <cassert>
-#include <cstring>
-#include <string>
-#include <cstdlib> // for atof
-#include <cmath>
-#include <libxml/parser.h>
-#include <libxml/tree.h>
-#include <libxml/xpath.h>
-#include <glibmm/miscutils.h>
-#include "raul/log.hpp"
-#include "raul/Path.hpp"
-#include "shared/LV2URIMap.hpp"
-#include "interface/EngineInterface.hpp"
-#include "DeprecatedLoader.hpp"
-
-#define LOG(s) s << "[DeprecatedLoader] "
-
-#define NS_INTERNALS "http://drobilla.net/ns/ingen-internals#"
-
-using namespace std;
-using namespace Raul;
-
-namespace Ingen {
-using namespace Shared;
-namespace Client {
-
-
-/** A single port's control setting (in a preset).
- *
- * \ingroup IngenClient
- */
-class ControlModel
-{
-public:
- ControlModel(const Path& port_path, float value)
- : _port_path(port_path)
- , _value(value)
- {
- assert(_port_path.find("//") == string::npos);
- }
-
- const Path& port_path() const { return _port_path; }
- void port_path(const string& p) { _port_path = p; }
- float value() const { return _value; }
- void value(float v) { _value = v; }
-
-private:
- Path _port_path;
- float _value;
-};
-
-
-/** Model of a preset (a collection of control settings).
- *
- * \ingroup IngenClient
- */
-class PresetModel
-{
-public:
- PresetModel(const string& base_path) : _base_path(base_path) {}
-
- /** Add a control value to this preset. An empty string for a node_name
- * means the port is on the patch itself (not a node in the patch). */
- void add_control(const string& node_name, string port_name, float value) {
- if (port_name == "note_number") // FIXME: filthy kludge
- port_name = "note";
-
- if (!node_name.empty())
- _controls.push_back(ControlModel(_base_path + node_name +"/"+ port_name, value));
- else
- _controls.push_back(ControlModel(_base_path + port_name, value));
- }
-
- const string& name() const { return _name; }
- void name(const string& n) { _name = n; }
-
- const list<ControlModel>& controls() const { return _controls; }
-
-private:
- string _name;
- string _base_path;
- list<ControlModel> _controls;
-};
-
-
-string
-DeprecatedLoader::nameify_if_invalid(const string& name)
-{
- if (Path::is_valid_name(name)) {
- return name;
- } else {
- const string new_name = Path::nameify(name);
- assert(Path::is_valid_name(new_name));
- return new_name;
- }
-}
-
-
-string
-DeprecatedLoader::translate_load_path(const string& path)
-{
- std::map<string,string>::iterator t = _load_path_translations.find(path);
-
- if (t != _load_path_translations.end()) {
- assert(Path::is_valid((*t).second));
- return (*t).second;
- } else {
- return path;
- }
-}
-
-
-/** Add a piece of data to a Properties, translating from deprecated unqualified keys
- *
- * Adds a namespace prefix for known keys, and ignores the rest.
- */
-void
-DeprecatedLoader::add_variable(GraphObject::Properties& data, string old_key, string value)
-{
- string key;
- if (old_key == "module-x")
- key = "http://drobilla.net/ns/ingenuity#canvas-x";
- else if (old_key == "module-y")
- key = "http://drobilla.net/ns/ingenuity#canvas-y";
-
- if (!key.empty()) {
- // FIXME: should this overwrite existing values?
- if (data.find(key) == data.end()) {
- // Hack to make module-x and module-y set as floats
- char* c_val = strdup(value.c_str());
- char* endptr = NULL;
-
- // FIXME: locale kludges
- char* locale = strdup(setlocale(LC_NUMERIC, NULL));
-
- float fval = strtof(c_val, &endptr);
-
- setlocale(LC_NUMERIC, locale);
- free(locale);
-
- if (endptr != c_val && *endptr == '\0')
- data.insert(make_pair(key, Atom(fval)));
- else
- data.insert(make_pair(key, value));
-
- free(c_val);
- }
- }
-}
-
-
-/** Load a patch in to the engine (and client) from a patch file.
- *
- * The name and poly from the passed PatchModel are used. If the name is
- * the empty string, the name will be loaded from the file. If the poly
- * is 0, it will be loaded from file. Otherwise the given values will
- * be used.
- *
- * @param filename Local name of file to load patch from
- *
- * @param parent_path Patch to load this patch as a child of (empty string to load
- * to the root patch)
- *
- * @param name Name of this patch (loaded/generated if the empty string)
- *
- * @param initial_data will be set last, so values passed there will override
- * any values loaded from the patch file.
- *
- * @param existing If true, the patch will be loaded into a currently
- * existing patch (ie a merging will take place). Errors will result
- * if Nodes of conflicting names exist.
- *
- * Returns the path of the newly created patch.
- */
-string
-DeprecatedLoader::load_patch(const Glib::ustring& filename,
- bool merge,
- boost::optional<Path> parent_path,
- boost::optional<Symbol> name,
- GraphObject::Properties initial_data,
- bool existing)
-{
- LOG(info) << "Loading patch " << filename << " under "
- << parent_path << " / " << name << endl;
-
- Path path("/");
- if (parent_path)
- path = *parent_path;
- if (name)
- path = path.child(*name);
-
- size_t poly = 0;
-
- /* Use parameter overridden polyphony, if given */
- GraphObject::Properties::iterator poly_param = initial_data.find(_uris->ingen_polyphony);
- if (poly_param != initial_data.end() && poly_param->second.type() == Atom::INT)
- poly = poly_param->second.get_int32();
-
- if (initial_data.find(_uris->ingen_document) == initial_data.end())
- initial_data.insert(make_pair(_uris->ingen_document, filename));
-
- xmlDocPtr doc = xmlParseFile(filename.c_str());
-
- if (!doc) {
- LOG(error) << "Unable to parse patch file." << endl;
- return "";
- }
-
- xmlNodePtr cur = xmlDocGetRootElement(doc);
-
- if (!cur) {
- LOG(error) << "Empty document." << endl;
- xmlFreeDoc(doc);
- return "";
- }
-
- if (xmlStrcmp(cur->name, (const xmlChar*) "patch")) {
- LOG(error) << "File is not an Om patch file (root node != <patch>)" << endl;
- xmlFreeDoc(doc);
- return "";
- }
-
- xmlChar* key = NULL;
- cur = cur->xmlChildrenNode;
-
- // Load Patch attributes
- while (cur != NULL) {
- key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
-
- if ((!xmlStrcmp(cur->name, (const xmlChar*)"name"))) {
- if (!merge && parent_path && !name && key) {
- if (parent_path)
- path = Path(parent_path.get()).base() + nameify_if_invalid((char*)key);
- else
- path = Path("/");
- }
- } else if ((!xmlStrcmp(cur->name, (const xmlChar*)"polyphony"))) {
- if (poly == 0) {
- poly = atoi((char*)key);
- }
- } else if (xmlStrcmp(cur->name, (const xmlChar*)"connection")
- && xmlStrcmp(cur->name, (const xmlChar*)"node")
- && xmlStrcmp(cur->name, (const xmlChar*)"subpatch")
- && xmlStrcmp(cur->name, (const xmlChar*)"filename")
- && xmlStrcmp(cur->name, (const xmlChar*)"preset")) {
- // Don't know what this tag is, add it as variable without overwriting
- // (so caller can set arbitrary parameters which will be preserved)
- if (key)
- add_variable(initial_data, (const char*)cur->name, (const char*)key);
- }
-
- xmlFree(key);
- key = NULL; // Avoid a (possible?) double free
-
- cur = cur->next;
- }
-
- if (poly == 0)
- poly = 1;
-
- // Create it, if we're not merging
- if (!existing && !path.is_root()) {
- Resource::Properties props;
- props.insert(make_pair(_uris->rdf_type, _uris->ingen_Patch));
- props.insert(make_pair(_uris->ingen_polyphony, Atom((int32_t)poly)));
- _engine->put(path, props);
- for (GraphObject::Properties::const_iterator i = initial_data.begin(); i != initial_data.end(); ++i)
- _engine->set_property(path, i->first, i->second);
- }
-
- // Load nodes
- cur = xmlDocGetRootElement(doc)->xmlChildrenNode;
- while (cur != NULL) {
- if ((!xmlStrcmp(cur->name, (const xmlChar*)"node")))
- load_node(path, doc, cur);
-
- cur = cur->next;
- }
-
- // Load subpatches
- cur = xmlDocGetRootElement(doc)->xmlChildrenNode;
- while (cur != NULL) {
- if ((!xmlStrcmp(cur->name, (const xmlChar*)"subpatch"))) {
- load_subpatch(filename.substr(0, filename.find_last_of("/")), path, doc, cur);
- }
- cur = cur->next;
- }
-
- // Load connections
- cur = xmlDocGetRootElement(doc)->xmlChildrenNode;
- while (cur != NULL) {
- if ((!xmlStrcmp(cur->name, (const xmlChar*)"connection"))) {
- load_connection(path, doc, cur);
- }
- cur = cur->next;
- }
-
- // Load presets (control values)
- cur = xmlDocGetRootElement(doc)->xmlChildrenNode;
- while (cur != NULL) {
- // I don't think Om ever wrote any preset other than "default"...
- if ((!xmlStrcmp(cur->name, (const xmlChar*)"preset"))) {
- SharedPtr<PresetModel> pm = load_preset(path, doc, cur);
- assert(pm != NULL);
- if (pm->name() == "default") {
- list<ControlModel>::const_iterator i = pm->controls().begin();
- for ( ; i != pm->controls().end(); ++i) {
- const float value = i->value();
- _engine->set_property(translate_load_path(i->port_path().str()),
- _uris->ingen_value, Atom(value));
- }
- } else {
- LOG(warn) << "Unknown preset `" << pm->name() << "'" << endl;
- }
- }
- cur = cur->next;
- }
-
- xmlFreeDoc(doc);
- xmlCleanupParser();
-
- // Done above.. late enough?
- //for (Properties::const_iterator i = data.begin(); i != data.end(); ++i)
- // _engine->set_property(subject, i->first, i->second);
-
- if (!existing)
- _engine->set_property(path, _uris->ingen_enabled, (bool)true);
-
- _load_path_translations.clear();
-
- return path.str();
-}
-
-
-bool
-DeprecatedLoader::load_node(const Path& parent, xmlDocPtr doc, const xmlNodePtr node)
-{
- xmlChar* key;
- xmlNodePtr cur = node->xmlChildrenNode;
-
- string path = "";
- bool polyphonic = false;
-
- string plugin_uri;
-
- string plugin_type; // deprecated
- string library_name; // deprecated
- string plugin_label; // deprecated
-
- GraphObject::Properties initial_data;
-
- while (cur != NULL) {
- key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
-
- if ((!xmlStrcmp(cur->name, (const xmlChar*)"name"))) {
- path = parent.base() + nameify_if_invalid((char*)key);
- } else if ((!xmlStrcmp(cur->name, (const xmlChar*)"polyphonic"))) {
- polyphonic = !strcmp((char*)key, "true");
- } else if ((!xmlStrcmp(cur->name, (const xmlChar*)"type"))) {
- plugin_type = (const char*)key;
- } else if ((!xmlStrcmp(cur->name, (const xmlChar*)"library-name"))) {
- library_name = (char*)key;
- } else if ((!xmlStrcmp(cur->name, (const xmlChar*)"plugin-label"))) {
- plugin_label = (char*)key;
- } else if ((!xmlStrcmp(cur->name, (const xmlChar*)"plugin-uri"))) {
- plugin_uri = (char*)key;
- } else if ((!xmlStrcmp(cur->name, (const xmlChar*)"port"))) {
-#if 0
- xmlNodePtr child = cur->xmlChildrenNode;
-
- string port_name;
- float user_min = 0.0;
- float user_max = 0.0;
-
- while (child != NULL) {
- key = xmlNodeListGetString(doc, child->xmlChildrenNode, 1);
-
- if ((!xmlStrcmp(child->name, (const xmlChar*)"name"))) {
- port_name = nameify_if_invalid((char*)key);
- } else if ((!xmlStrcmp(child->name, (const xmlChar*)"user-min"))) {
- user_min = atof((char*)key);
- } else if ((!xmlStrcmp(child->name, (const xmlChar*)"user-max"))) {
- user_max = atof((char*)key);
- }
-
- xmlFree(key);
- key = NULL; // Avoid a (possible?) double free
-
- child = child->next;
- }
-
- assert(path.length() > 0);
- assert(Path::is_valid(path));
-
- // FIXME: /nasty/ assumptions
- SharedPtr<PortModel> pm(new PortModel(Path(path).base() + port_name,
- PortModel::CONTROL, PortModel::INPUT, PortModel::NONE,
- 0.0, user_min, user_max));
- //pm->set_parent(nm);
- nm->add_port(pm);
-#endif
-
- } else { // Don't know what this tag is, add it as variable
- if (key)
- add_variable(initial_data, (const char*)cur->name, (const char*)key);
- }
- xmlFree(key);
- key = NULL;
-
- cur = cur->next;
- }
-
- if (path.empty()) {
- LOG(error) << "Malformed patch file (node tag has empty children)" << endl;
- LOG(error) << "Node ignored." << endl;
- return false;
- }
-
- // Compatibility hacks for old patches that represent patch ports as nodes
- if (plugin_uri.empty()) {
- bool is_port = false;
-
- Resource::Properties props;
-
- if (plugin_type == "Internal") {
- is_port = true;
- if (plugin_label == "audio_input") {
- props.insert(make_pair(_uris->rdf_type, _uris->lv2_AudioPort));
- props.insert(make_pair(_uris->rdf_type, _uris->lv2_InputPort));
- } else if (plugin_label == "audio_output") {
- props.insert(make_pair(_uris->rdf_type, _uris->lv2_AudioPort));
- props.insert(make_pair(_uris->rdf_type, _uris->lv2_OutputPort));
- } else if (plugin_label == "control_input") {
- props.insert(make_pair(_uris->rdf_type, _uris->lv2_ControlPort));
- props.insert(make_pair(_uris->rdf_type, _uris->lv2_InputPort));
- } else if (plugin_label == "control_output" ) {
- props.insert(make_pair(_uris->rdf_type, _uris->lv2_ControlPort));
- props.insert(make_pair(_uris->rdf_type, _uris->lv2_OutputPort));
- } else if (plugin_label == "midi_input") {
- props.insert(make_pair(_uris->rdf_type, _uris->ev_EventPort));
- props.insert(make_pair(_uris->rdf_type, _uris->lv2_InputPort));
- } else if (plugin_label == "midi_output" ) {
- props.insert(make_pair(_uris->rdf_type, _uris->ev_EventPort));
- props.insert(make_pair(_uris->rdf_type, _uris->lv2_OutputPort));
- } else {
- is_port = false;
- }
- }
-
- if (is_port) {
- const string old_path = path;
- const string new_path = (Path::is_valid(old_path) ? old_path : Path::pathify(old_path));
-
- if (!Path::is_valid(old_path))
- LOG(warn) << "Translating invalid port path `" << old_path << "' => `"
- << new_path << "'" << endl;
-
- // Set up translations (for connections etc) to alias both the old
- // module path and the old module/port path to the new port path
- if (old_path != new_path)
- _load_path_translations[old_path] = new_path;
- _load_path_translations[old_path + "/in"] = new_path;
- _load_path_translations[old_path + "/out"] = new_path;
-
- path = new_path;
-
- _engine->put(path, props);
-
- for (GraphObject::Properties::const_iterator i = initial_data.begin(); i != initial_data.end(); ++i)
- _engine->set_property(path, i->first, i->second);
-
- return false;
-
- } else {
- if (plugin_label == "note_in") {
- plugin_uri = NS_INTERNALS "Note";
- _load_path_translations[path + "/Frequency"] = path + "/frequency";
- _load_path_translations[path + "/Velocity"] = path + "/velocity";
- _load_path_translations[path + "/Gate"] = path + "/gate";
- _load_path_translations[path + "/Trigger"] = path + "/trigger";
- } else if (plugin_label == "control_input" || plugin_label == "midi_control_in") {
- plugin_uri = NS_INTERNALS "Controller";
- _load_path_translations[path + "/Controller_Number"] = path + "/controller";
- _load_path_translations[path + "/Logarithmic"] = path + "/logarithmic";
- _load_path_translations[path + "/Min"] = path + "/minimum";
- _load_path_translations[path + "/Max"] = path + "/maximum";
- _load_path_translations[path + "/Out"] = path + "/ar_output";
- } else if (plugin_label == "transport") {
- plugin_uri = NS_INTERNALS "Transport";
- } else if (plugin_label == "trigger_in") {
- plugin_uri = NS_INTERNALS "Trigger";
- _load_path_translations[path + "/Velocity"] = path + "/velocity";
- _load_path_translations[path + "/Gate"] = path + "/gate";
- _load_path_translations[path + "/Trigger"] = path + "/trigger";
- }
-
- if (plugin_uri.empty())
- plugin_uri = "om:" + plugin_type + ":" + library_name + ":" + plugin_label;
-
- Resource::Properties props;
- props.insert(make_pair(_uris->rdf_type, _uris->ingen_Node));
- props.insert(make_pair(_uris->rdf_instanceOf, Atom(Atom::URI, plugin_uri)));
- _engine->put(path, props);
-
- _engine->set_property(path, _uris->ingen_polyphonic, bool(polyphonic));
-
- for (GraphObject::Properties::const_iterator i = initial_data.begin(); i != initial_data.end(); ++i)
- _engine->set_property(path, i->first, i->second);
-
- return true;
- }
-
- // Not deprecated
- } else {
- Resource::Properties props;
- props.insert(make_pair(_uris->rdf_type, _uris->ingen_Node));
- props.insert(make_pair(_uris->rdf_instanceOf, Atom(Atom::URI, plugin_uri)));
- _engine->put(path, props);
- _engine->set_property(path, _uris->ingen_polyphonic, bool(polyphonic));
- for (GraphObject::Properties::const_iterator i = initial_data.begin(); i != initial_data.end(); ++i)
- _engine->set_property(path, i->first, i->second);
- return true;
- }
-
- // (shouldn't get here)
-}
-
-
-bool
-DeprecatedLoader::load_subpatch(const string& base_filename, const Path& parent, xmlDocPtr doc, const xmlNodePtr subpatch)
-{
- xmlChar *key;
- xmlNodePtr cur = subpatch->xmlChildrenNode;
-
- string name = "";
- string filename = "";
- size_t poly = 0;
-
- GraphObject::Properties initial_data;
- while (cur != NULL) {
- key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
-
- if ((!xmlStrcmp(cur->name, (const xmlChar*)"name"))) {
- name = (const char*)key;
- } else if ((!xmlStrcmp(cur->name, (const xmlChar*)"polyphony"))) {
- initial_data.insert(make_pair(_uris->ingen_polyphony, (int)poly));
- } else if ((!xmlStrcmp(cur->name, (const xmlChar*)"filename"))) {
- filename = Glib::build_filename(base_filename, (const char*)key);
- } else { // Don't know what this tag is, add it as variable
- if (key != NULL && strlen((const char*)key) > 0)
- add_variable(initial_data, (const char*)cur->name, (const char*)key);
- }
- xmlFree(key);
- key = NULL;
-
- cur = cur->next;
- }
-
- LOG(info) << "Loading subpatch " << filename << " under " << parent << endl;
- // load_patch sets the passed variable last, so values stored in the parent
- // will override values stored in the child patch file
- load_patch(filename, false, parent, Symbol(nameify_if_invalid(name)), initial_data, false);
-
- return false;
-}
-
-
-bool
-DeprecatedLoader::load_connection(const Path& parent, xmlDocPtr doc, const xmlNodePtr node)
-{
- xmlChar *key;
- xmlNodePtr cur = node->xmlChildrenNode;
-
- string source_node, source_port, dest_node, dest_port;
-
- while (cur != NULL) {
- key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
-
- if ((!xmlStrcmp(cur->name, (const xmlChar*)"source-node"))) {
- source_node = (char*)key;
- } else if ((!xmlStrcmp(cur->name, (const xmlChar*)"source-port"))) {
- source_port = (char*)key;
- } else if ((!xmlStrcmp(cur->name, (const xmlChar*)"destination-node"))) {
- dest_node = (char*)key;
- } else if ((!xmlStrcmp(cur->name, (const xmlChar*)"destination-port"))) {
- dest_port = (char*)key;
- }
-
- xmlFree(key);
- key = NULL; // Avoid a (possible?) double free
-
- cur = cur->next;
- }
-
- if (source_node.empty() || source_port.empty() || dest_node.empty() || dest_port.empty()) {
- LOG(error) << "Malformed patch file (connection tag has empty children)" << endl;
- LOG(error) << "Connection ignored." << endl;
- return false;
- }
-
- // Compatibility fixes for old (fundamentally broken) patches
- source_node = nameify_if_invalid(source_node);
- source_port = nameify_if_invalid(source_port);
- dest_node = nameify_if_invalid(dest_node);
- dest_port = nameify_if_invalid(dest_port);
-
- _engine->connect(
- translate_load_path(parent.base() + source_node +"/"+ source_port),
- translate_load_path(parent.base() + dest_node +"/"+ dest_port));
-
- return true;
-}
-
-
-/** Build a PresetModel given a pointer to a preset in a patch file. */
-SharedPtr<PresetModel>
-DeprecatedLoader::load_preset(const Path& parent, xmlDocPtr doc, const xmlNodePtr node)
-{
- xmlNodePtr cur = node->xmlChildrenNode;
- xmlChar* key;
-
- SharedPtr<PresetModel> pm(new PresetModel(parent.base()));
-
- while (cur != NULL) {
- key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
-
- if ((!xmlStrcmp(cur->name, (const xmlChar*)"name"))) {
- assert(key != NULL);
- pm->name((char*)key);
- } else if ((!xmlStrcmp(cur->name, (const xmlChar*)"control"))) {
- xmlNodePtr child = cur->xmlChildrenNode;
-
- string node_name = "", port_name = "";
- float val = 0.0;
-
- while (child != NULL) {
- key = xmlNodeListGetString(doc, child->xmlChildrenNode, 1);
-
- if ((!xmlStrcmp(child->name, (const xmlChar*)"node-name"))) {
- node_name = (char*)key;
- } else if ((!xmlStrcmp(child->name, (const xmlChar*)"port-name"))) {
- port_name = (char*)key;
- } else if ((!xmlStrcmp(child->name, (const xmlChar*)"value"))) {
- val = atof((char*)key);
- }
-
- xmlFree(key);
- key = NULL; // Avoid a (possible?) double free
-
- child = child->next;
- }
-
- // Compatibility fixes for old patch files
- if (!node_name.empty())
- node_name = nameify_if_invalid(node_name);
- port_name = nameify_if_invalid(port_name);
-
- if (port_name.empty()) {
- string msg = "Unable to parse control in patch file ( node = ";
- msg.append(node_name).append(", port = ").append(port_name).append(")");
- LOG(error) << msg << endl;
- } else {
- // FIXME: temporary compatibility, remove any slashes from port name
- // remove this soon once patches have migrated
- string::size_type slash_index;
- while ((slash_index = port_name.find("/")) != string::npos)
- port_name[slash_index] = '-';
-
- pm->add_control(node_name, port_name, val);
- }
- }
- xmlFree(key);
- key = NULL;
- cur = cur->next;
- }
- if (pm->name().empty()) {
- LOG(error) << "Preset in patch file has no name." << endl;
- pm->name("Unnamed");
- }
-
- return pm;
-}
-
-} // namespace Client
-} // namespace Ingen
diff --git a/src/client/DeprecatedLoader.hpp b/src/client/DeprecatedLoader.hpp
deleted file mode 100644
index d66233ec..00000000
--- a/src/client/DeprecatedLoader.hpp
+++ /dev/null
@@ -1,90 +0,0 @@
-/* This file is part of Ingen.
- * Copyright (C) 2007-2009 David Robillard <http://drobilla.net>
- *
- * Ingen 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.
- *
- * Ingen 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 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.,
- * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef INGEN_CLIENT_DEPRECATEDLOADER_HPP
-#define INGEN_CLIENT_DEPRECATEDLOADER_HPP
-
-#include <map>
-#include <utility>
-#include <string>
-#include <cassert>
-#include <boost/optional.hpp>
-#include <glibmm/ustring.h>
-#include <libxml/tree.h>
-#include "raul/SharedPtr.hpp"
-#include "interface/EngineInterface.hpp"
-#include "interface/GraphObject.hpp"
-#include "ObjectModel.hpp"
-
-namespace Raul { class Path; }
-
-namespace Ingen {
-
-namespace Shared { class LV2URIMap; }
-
-namespace Client {
-
-class PresetModel; // defined in DeprecatedLoader.cpp
-
-
-/** Loads deprecated (XML) patch files (from the Om days).
- *
- * \ingroup IngenClient
- */
-class DeprecatedLoader
-{
-public:
- DeprecatedLoader(
- SharedPtr<Shared::LV2URIMap> uris,
- SharedPtr<Shared::EngineInterface> engine)
- : _uris(uris)
- , _engine(engine)
- {
- assert(_engine);
- }
-
- std::string load_patch(const Glib::ustring& filename,
- bool merge,
- boost::optional<Raul::Path> parent_path,
- boost::optional<Raul::Symbol> name,
- Shared::GraphObject::Properties initial_data,
- bool existing = false);
-
-private:
- void add_variable(Shared::GraphObject::Properties& data, std::string key, std::string value);
-
- std::string nameify_if_invalid(const std::string& name);
- std::string translate_load_path(const std::string& path);
-
- SharedPtr<Shared::LV2URIMap> _uris;
- SharedPtr<Shared::EngineInterface> _engine;
-
- /// Translations of paths from the loading file to actual paths (for deprecated patches)
- std::map<std::string, std::string> _load_path_translations;
-
- bool load_node(const Raul::Path& parent, xmlDocPtr doc, const xmlNodePtr cur);
- bool load_connection(const Raul::Path& parent, xmlDocPtr doc, const xmlNodePtr cur);
- bool load_subpatch(const std::string& base_filename, const Raul::Path& parent, xmlDocPtr doc, const xmlNodePtr cur);
-
- SharedPtr<PresetModel> load_preset(const Raul::Path& parent, xmlDocPtr doc, const xmlNodePtr cur);
-};
-
-
-} // namespace Client
-} // namespace Ingen
-
-#endif // INGEN_CLIENT_DEPRECATEDLOADER_HPP
diff --git a/src/client/wscript b/src/client/wscript
index 2ab0be44..0cba8a8e 100644
--- a/src/client/wscript
+++ b/src/client/wscript
@@ -24,9 +24,6 @@ def build(bld):
HTTPEngineSender.cpp
'''
- if bld.env['HAVE_XML2'] == 1:
- obj.source += ' DeprecatedLoader.cpp '
-
if bld.env['HAVE_LIBLO'] == 1:
obj.source += ' OSCClientReceiver.cpp OSCEngineSender.cpp '
@@ -36,5 +33,5 @@ def build(bld):
obj.target = 'ingen_client'
obj.install_path = '${LIBDIR}'
obj.use = 'libingen_shared'
- autowaf.use_lib(bld, obj, 'GLIBMM LV2CORE SLV2 RAUL SORD SOUP XML2 SIGCPP LIBLO SOUP')
+ autowaf.use_lib(bld, obj, 'GLIBMM LV2CORE SLV2 RAUL SORD SOUP SIGCPP LIBLO SOUP')
diff --git a/src/gui/LoadPatchWindow.cpp b/src/gui/LoadPatchWindow.cpp
index 882f1368..81066a8c 100644
--- a/src/gui/LoadPatchWindow.cpp
+++ b/src/gui/LoadPatchWindow.cpp
@@ -175,7 +175,7 @@ LoadPatchWindow::ok_clicked()
symbol = _patch->symbol();
}
- App::instance().loader()->load_patch(true, get_uri(), Path("/"),
+ App::instance().loader()->load_patch(true, get_uri(),
parent, symbol, _initial_data);
} else {
@@ -193,7 +193,7 @@ LoadPatchWindow::ok_clicked()
symbol = avoid_symbol_clash(symbol);
- App::instance().loader()->load_patch(false, *i, Path("/"),
+ App::instance().loader()->load_patch(false, *i,
_patch->path(), symbol, _initial_data);
}
}
diff --git a/src/gui/LoadRemotePatchWindow.cpp b/src/gui/LoadRemotePatchWindow.cpp
index 0ad4d5b5..f48bd0bc 100644
--- a/src/gui/LoadRemotePatchWindow.cpp
+++ b/src/gui/LoadRemotePatchWindow.cpp
@@ -140,7 +140,7 @@ LoadRemotePatchWindow::open_clicked()
if (!_patch->path().is_root())
parent = _patch->path().parent();
- App::instance().loader()->load_patch(true, uri, Path("/"),
+ App::instance().loader()->load_patch(true, uri,
parent, symbol, _initial_data);
hide();
diff --git a/src/gui/ThreadedLoader.cpp b/src/gui/ThreadedLoader.cpp
index 2a9646e2..c60d8c4c 100644
--- a/src/gui/ThreadedLoader.cpp
+++ b/src/gui/ThreadedLoader.cpp
@@ -1,5 +1,5 @@
/* This file is part of Ingen.
- * Copyright (C) 2007-2009 David Robillard <http://drobilla.net>
+ * Copyright (C) 2007-2011 David Robillard <http://drobilla.net>
*
* Ingen 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
@@ -31,10 +31,8 @@ using namespace Raul;
namespace Ingen {
namespace GUI {
-
ThreadedLoader::ThreadedLoader(SharedPtr<Shared::LV2URIMap> uris, SharedPtr<EngineInterface> engine)
: _engine(engine)
- , _deprecated_loader(uris, engine)
{
set_name("Loader");
@@ -44,7 +42,6 @@ ThreadedLoader::ThreadedLoader(SharedPtr<Shared::LV2URIMap> uris, SharedPtr<Engi
warn << "Failed to load ingen_serialisation module, load disabled." << endl;
}
-
SharedPtr<Parser>
ThreadedLoader::parser()
{
@@ -56,7 +53,6 @@ ThreadedLoader::parser()
return world->parser();
}
-
void
ThreadedLoader::_whipped()
{
@@ -71,11 +67,10 @@ ThreadedLoader::_whipped()
}
void
-ThreadedLoader::load_patch(bool merge,
- const Glib::ustring& document_uri,
- optional<Path> data_path,
- optional<Path> engine_parent,
- optional<Symbol> engine_symbol,
+ThreadedLoader::load_patch(bool merge,
+ const Glib::ustring& document_uri,
+ optional<Path> engine_parent,
+ optional<Symbol> engine_symbol,
optional<GraphObject::Properties> engine_data)
{
_mutex.lock();
@@ -90,36 +85,22 @@ ThreadedLoader::load_patch(bool merge,
engine_base = engine_parent.get().base();
}
- // Filthy hack to load deprecated patches based on file extension
- if (document_uri.substr(document_uri.length()-3) == ".om") {
- _events.push_back(sigc::hide_return(sigc::bind(
- sigc::mem_fun(_deprecated_loader,
- &DeprecatedLoader::load_patch),
- document_uri,
- merge,
- engine_parent,
- engine_symbol,
- *engine_data,
- false)));
- } else {
- _events.push_back(sigc::hide_return(sigc::bind(
- sigc::mem_fun(world->parser().get(),
- &Ingen::Serialisation::Parser::parse_file),
- App::instance().world(),
- App::instance().world()->engine().get(),
- document_uri,
- data_path,
- engine_parent,
- engine_symbol,
- engine_data)));
- }
+ _events.push_back(
+ sigc::hide_return(
+ sigc::bind(sigc::mem_fun(world->parser().get(),
+ &Ingen::Serialisation::Parser::parse_file),
+ App::instance().world(),
+ App::instance().world()->engine().get(),
+ document_uri,
+ engine_parent,
+ engine_symbol,
+ engine_data)));
whip();
_mutex.unlock();
}
-
void
ThreadedLoader::save_patch(SharedPtr<PatchModel> model, const string& filename)
{
@@ -134,7 +115,6 @@ ThreadedLoader::save_patch(SharedPtr<PatchModel> model, const string& filename)
whip();
}
-
void
ThreadedLoader::save_patch_event(SharedPtr<PatchModel> model, const string& filename)
{
@@ -146,6 +126,5 @@ ThreadedLoader::save_patch_event(SharedPtr<PatchModel> model, const string& file
}
}
-
} // namespace GUI
} // namespace Ingen
diff --git a/src/gui/ThreadedLoader.hpp b/src/gui/ThreadedLoader.hpp
index a6389df8..96c64af3 100644
--- a/src/gui/ThreadedLoader.hpp
+++ b/src/gui/ThreadedLoader.hpp
@@ -1,5 +1,5 @@
/* This file is part of Ingen.
- * Copyright (C) 2007-2009 David Robillard <http://drobilla.net>
+ * Copyright (C) 2007-2011 David Robillard <http://drobilla.net>
*
* Ingen 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
@@ -26,7 +26,6 @@
#include "raul/Slave.hpp"
#include <glibmm/thread.h>
#include "interface/EngineInterface.hpp"
-#include "client/DeprecatedLoader.hpp"
#include "serialisation/Serialiser.hpp"
#include "serialisation/Parser.hpp"
using std::string;
@@ -40,7 +39,6 @@ using namespace Serialisation;
namespace GUI {
-
/** Thread for loading patch files.
*
* This is a seperate thread so it can send all the loading message without
@@ -55,11 +53,11 @@ namespace GUI {
class ThreadedLoader : public Raul::Slave
{
public:
- ThreadedLoader(SharedPtr<Shared::LV2URIMap> uris, SharedPtr<EngineInterface> engine);
+ ThreadedLoader(SharedPtr<Shared::LV2URIMap> uris,
+ SharedPtr<EngineInterface> engine);
void load_patch(bool merge,
const Glib::ustring& document_uri,
- optional<Raul::Path> data_path,
optional<Raul::Path> engine_parent,
optional<Raul::Symbol> engine_symbol,
optional<GraphObject::Properties> engine_data);
@@ -79,12 +77,10 @@ private:
SharedPtr<EngineInterface> _engine;
- DeprecatedLoader _deprecated_loader;
- Glib::Mutex _mutex;
- list<Closure> _events;
+ Glib::Mutex _mutex;
+ list<Closure> _events;
};
-
} // namespace GUI
} // namespace Ingen
diff --git a/src/gui/wscript b/src/gui/wscript
index 54919362..8e6bf344 100644
--- a/src/gui/wscript
+++ b/src/gui/wscript
@@ -63,7 +63,6 @@ def build(bld):
LV2CORE
SLV2
SOUP
- XML2
''')
# Glade XML UI definition
diff --git a/src/ingen/main.cpp b/src/ingen/main.cpp
index 0a3129a6..1407dfda 100644
--- a/src/ingen/main.cpp
+++ b/src/ingen/main.cpp
@@ -161,7 +161,6 @@ main(int argc, char** argv)
// Load a patch
if (conf.option("load").is_valid() && engine_interface) {
- boost::optional<Path> data_path = Path("/");
boost::optional<Path> parent;
boost::optional<Symbol> symbol;
const Raul::Atom& path_option = conf.option("path");
@@ -197,7 +196,7 @@ main(int argc, char** argv)
if (conf.option("gui").get_bool())
engine_interface->get("ingen:plugins");
world->parser()->parse_file(
- world, engine_interface.get(), uri, data_path, parent, symbol);
+ world, engine_interface.get(), uri, parent, symbol);
}
// Load GUI
diff --git a/src/serialisation/Parser.cpp b/src/serialisation/Parser.cpp
index 1fd67498..4ccb4525 100644
--- a/src/serialisation/Parser.cpp
+++ b/src/serialisation/Parser.cpp
@@ -131,7 +131,6 @@ bool
Parser::parse_file(Ingen::Shared::World* world,
Ingen::Shared::CommonInterface* target,
Glib::ustring file_uri,
- boost::optional<Raul::Path> data_path,
boost::optional<Raul::Path> parent,
boost::optional<Raul::Symbol> symbol,
boost::optional<GraphObject::Properties> data)
@@ -170,15 +169,13 @@ Parser::parse_file(Ingen::Shared::World* world,
model.load_file(filename);
LOG(info) << "Parsing " << file_uri << endl;
- if (data_path)
- LOG(info) << "Path: " << *data_path << endl;
if (parent)
LOG(info) << "Parent: " << *parent << endl;
if (symbol)
LOG(info) << "Symbol: " << *symbol << endl;
boost::optional<Path> parsed_path
- = parse(world, target, model, filename, data_path, parent, symbol, data);
+ = parse(world, target, model, filename, Path("/"), parent, symbol, data);
if (parsed_path) {
target->set_property(*parsed_path, "http://drobilla.net/ns/ingen#document",
diff --git a/src/serialisation/Parser.hpp b/src/serialisation/Parser.hpp
index d9b33956..6d1661dd 100644
--- a/src/serialisation/Parser.hpp
+++ b/src/serialisation/Parser.hpp
@@ -47,7 +47,6 @@ public:
Ingen::Shared::World* world,
Shared::CommonInterface* target,
Glib::ustring document_uri,
- boost::optional<Raul::Path> data_path=boost::optional<Raul::Path>(),
boost::optional<Raul::Path> parent=boost::optional<Raul::Path>(),
boost::optional<Raul::Symbol> symbol=boost::optional<Raul::Symbol>(),
boost::optional<Properties> data=boost::optional<Properties>());