+XMLNode&
+Port::get_state () const
+{
+ XMLNode* root = new XMLNode (state_node_name);
+
+ root->set_property (X_("name"), AudioEngine::instance()->make_port_name_relative (name()));
+
+ if (receives_input()) {
+ root->set_property (X_("direction"), X_("input"));
+ } else {
+ root->set_property (X_("direction"), X_("output"));
+ }
+
+ vector<string> c;
+
+ get_connections (c);
+
+ for (vector<string>::const_iterator i = c.begin(); i != c.end(); ++i) {
+ XMLNode* child = new XMLNode (X_("Connection"));
+ child->set_property (X_("other"), *i);
+ root->add_child_nocopy (*child);
+ }
+
+ return *root;
+}
+
+int
+Port::set_state (const XMLNode& node, int)
+{
+ if (node.name() != state_node_name) {
+ return -1;
+ }
+
+ std::string str;
+ if (node.get_property (X_("name"), str)) {
+ set_name (str);
+ }
+
+ const XMLNodeList& children (node.children());
+
+ _connections.clear ();
+
+ for (XMLNodeList::const_iterator c = children.begin(); c != children.end(); ++c) {
+
+ if ((*c)->name() != X_("Connection")) {
+ continue;
+ }
+
+ if (!(*c)->get_property (X_("other"), str)) {
+ continue;
+ }
+
+ _connections.insert (str);
+ }
+
+ return 0;
+}