From 1b830d59428f51179094f917a09b0acc16f31c8e Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 16 Mar 2012 22:36:06 +0000 Subject: continue the saga of Rewrite The XML Node So That It Can Be Used To Set Another Object's State by descending into an IO node to fix the names of its ports as used in connection info. allows copies of sends etc. to retain the same connections as the original (with new names, obviously) git-svn-id: svn://localhost/ardour2/branches/3.0@11717 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/ardour/io.h | 1 + libs/ardour/io.cc | 40 ++++++++++++++++++++++++++++++++++++++++ libs/ardour/io_processor.cc | 2 +- 3 files changed, 42 insertions(+), 1 deletion(-) (limited to 'libs/ardour') diff --git a/libs/ardour/ardour/io.h b/libs/ardour/ardour/io.h index 88706ecea1..2451611b1b 100644 --- a/libs/ardour/ardour/io.h +++ b/libs/ardour/ardour/io.h @@ -144,6 +144,7 @@ class IO : public SessionObject, public Latent XMLNode& get_state (void); int set_state (const XMLNode&, int version); int set_state_2X (const XMLNode&, int, bool); + static void prepare_for_reset (XMLNode&, const std::string&); class BoolCombiner { public: diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc index 3805d7ac83..93ab043308 100644 --- a/libs/ardour/io.cc +++ b/libs/ardour/io.cc @@ -614,6 +614,8 @@ IO::set_state (const XMLNode& node, int version) return -1; } + cerr << "IO::set state, connecting legal ? " << connecting_legal << endl; + if (connecting_legal) { if (make_connections (node, version, false)) { @@ -956,6 +958,44 @@ IO::make_connections (const XMLNode& node, int version, bool in) return 0; } +void +IO::prepare_for_reset (XMLNode& node, const std::string& name) +{ + /* reset name */ + node.add_property ("name", name); + + /* now find connections and reset the name of the port + in one so that when we re-use it it will match + the name of the thing we're applying it to. + */ + + XMLProperty* prop; + XMLNodeList children = node.children(); + + for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) { + + if ((*i)->name() == "Port") { + + prop = (*i)->property (X_("name")); + + if (prop) { + string new_name; + string old = prop->value(); + string::size_type slash = old.find ('/'); + + if (slash != string::npos) { + /* port name is of form: / */ + + new_name = name; + new_name += old.substr (old.find ('/')); + + prop->set_value (new_name); + } + } + } + } +} + int IO::make_connections_2X (const XMLNode& node, int /*version*/, bool in) diff --git a/libs/ardour/io_processor.cc b/libs/ardour/io_processor.cc index e1d1461bcd..d5e0f3e0eb 100644 --- a/libs/ardour/io_processor.cc +++ b/libs/ardour/io_processor.cc @@ -318,6 +318,6 @@ IOProcessor::prepare_for_reset (XMLNode &state, const std::string& name) XMLNode* io_node = state.child (IO::state_node_name.c_str()); if (io_node) { - io_node->add_property ("name", name); + IO::prepare_for_reset (*io_node, name); } } -- cgit v1.2.3