From dac2461ba66560c00efb43a12e35394a698b60f7 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Wed, 6 Sep 2006 19:05:23 +0000 Subject: Fixed LADSPA plugins with invalid OSC path port names (eg containing spaces). Fixed node destruction. git-svn-id: http://svn.drobilla.net/lad/ingen@114 a436a847-0d15-0410-975c-d299462d15a1 --- src/common/util/Path.h | 75 +++++++++++++++++++++++++++++++++ src/libs/engine/LADSPANode.cpp | 2 +- src/libs/engine/events/DestroyEvent.cpp | 4 +- 3 files changed, 78 insertions(+), 3 deletions(-) diff --git a/src/common/util/Path.h b/src/common/util/Path.h index d79a95c2..353ecaca 100644 --- a/src/common/util/Path.h +++ b/src/common/util/Path.h @@ -94,6 +94,81 @@ public: return true; } + /** Convert a string in to a valid full path. + * + * This will make a best effort at turning @a str into a complete, valid + * Path, and will always return one. + */ + static string pathify(const std::basic_string& str) + { + string path = str; + + if (path.length() == 0) + return "/"; // this might not be wise + + // Must start with a / + if (path.at(0) != '/') + path = string("/").append(path); + + // Must not end with a slash unless "/" + if (path.length() > 1 && path.at(path.length()-1) == '/') + path = path.substr(0, path.length()-1); // chop trailing slash + + assert(path.find_last_of("/") != string::npos); + + // Replace any invalid characters with "." (for lack of a better idea) + for (size_t i=0; i < path.length(); ++i) { + if (path.at(i) < 32 || path.at(i) > 126 + || path.at(i) == ' ' + || path.at(i) == '#' + || path.at(i) == '*' + || path.at(i) == ',' + || path.at(i) == '?' + || path.at(i) == '[' + || path.at(i) == ']' + || path.at(i) == '{' + || path.at(i) == '}') { + path[i] = '.'; + } + } + + assert(is_valid(path)); + + return path; + } + + /** Convert a string into a valid name (or "method" - tokens between slashes) + * + * This will strip all slashes and always return a valid name/method. + */ + static string nameify(const std::basic_string& str) + { + string name = str; + + if (name.length() == 0) + return "."; // this might not be wise + + // Replace any invalid characters with "." (for lack of a better idea) + for (size_t i=0; i < name.length(); ++i) { + if (name.at(i) < 32 || name.at(i) > 126 + || name.at(i) == ' ' + || name.at(i) == '#' + || name.at(i) == '*' + || name.at(i) == ',' + || name.at(i) == '?' + || name.at(i) == '[' + || name.at(i) == ']' + || name.at(i) == '{' + || name.at(i) == '}' + || name.at(i) == '/') { + name[i] = '.'; + } + } + + return name; + } + + /** Return the name of this object (everything after the last '/'). * This is the "method name" for OSC paths. */ diff --git a/src/libs/engine/LADSPANode.cpp b/src/libs/engine/LADSPANode.cpp index e6003d90..0be82819 100644 --- a/src/libs/engine/LADSPANode.cpp +++ b/src/libs/engine/LADSPANode.cpp @@ -75,7 +75,7 @@ LADSPANode::instantiate() Port* port = NULL; for (size_t j=0; j < _descriptor->PortCount; ++j) { - port_name = _descriptor->PortNames[j]; + port_name = Path::nameify(_descriptor->PortNames[j]); string::size_type slash_index; // Name mangling, to guarantee port names are unique diff --git a/src/libs/engine/events/DestroyEvent.cpp b/src/libs/engine/events/DestroyEvent.cpp index d373389b..d55a2935 100644 --- a/src/libs/engine/events/DestroyEvent.cpp +++ b/src/libs/engine/events/DestroyEvent.cpp @@ -138,8 +138,8 @@ DestroyEvent::execute(SampleCount offset) void DestroyEvent::post_process() { - assert(_source); - _source->unblock(); + if (_source) + _source->unblock(); if (m_node == NULL) { if (m_path == "/") -- cgit v1.2.1