From b08a8a15fd136ab8323e282484a5a96d698dc808 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 27 Apr 2012 23:50:08 +0000 Subject: Disconnect via atom interface. git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@4287 a436a847-0d15-0410-975c-d299462d15a1 --- src/shared/AtomReader.cpp | 39 ++++++++++++++++++++++++++++++++++----- src/shared/AtomWriter.cpp | 29 +++++++++++++++++++---------- 2 files changed, 53 insertions(+), 15 deletions(-) (limited to 'src/shared') diff --git a/src/shared/AtomReader.cpp b/src/shared/AtomReader.cpp index fa14243a..99a09b44 100644 --- a/src/shared/AtomReader.cpp +++ b/src/shared/AtomReader.cpp @@ -35,11 +35,13 @@ AtomReader::AtomReader(LV2URIMap& map, URIs& uris, Forge& forge, Interface& ifac void AtomReader::get_uri(const LV2_Atom* in, Raul::Atom& out) { - if (in->type == _uris.atom_URID) { - const LV2_Atom_URID* urid = (const LV2_Atom_URID*)in; - out = _forge.alloc_uri(_map.unmap_uri(urid->body)); - } else { - out = _forge.alloc(in->size, in->type, LV2_ATOM_BODY(in)); + if (in) { + if (in->type == _uris.atom_URID) { + const LV2_Atom_URID* urid = (const LV2_Atom_URID*)in; + out = _forge.alloc_uri(_map.unmap_uri(urid->body)); + } else { + out = _forge.alloc(in->size, in->type, LV2_ATOM_BODY(in)); + } } } @@ -76,6 +78,33 @@ AtomReader::write(const LV2_Atom* msg) if (obj->body.otype == _uris.patch_Get) { _iface.set_response_id(obj->body.id); _iface.get(subject_uri); + } else if (obj->body.otype == _uris.patch_Delete) { + if (subject_uri) { + _iface.del(subject_uri); + return; + } + + const LV2_Atom_Object* body = NULL; + lv2_atom_object_get(obj, (LV2_URID)_uris.patch_body, &body, 0); + if (body && body->body.otype == _uris.ingen_Edge) { + const LV2_Atom* tail = NULL; + const LV2_Atom* head = NULL; + lv2_atom_object_get(body, + (LV2_URID)_uris.ingen_tail, &tail, + (LV2_URID)_uris.ingen_head, &head, + NULL); + + Raul::Atom tail_atom; + Raul::Atom head_atom; + get_uri(tail, tail_atom); + get_uri(head, head_atom); + if (tail_atom.is_valid() && head_atom.is_valid()) { + _iface.disconnect(Raul::Path(tail_atom.get_uri()), + Raul::Path(head_atom.get_uri())); + } else { + Raul::warn << "Delete of unknown object." << std::endl; + } + } } else if (obj->body.otype == _uris.patch_Put) { const LV2_Atom_Object* body = NULL; lv2_atom_object_get(obj, (LV2_URID)_uris.patch_body, &body, 0); diff --git a/src/shared/AtomWriter.cpp b/src/shared/AtomWriter.cpp index 4e3853e8..d77364a5 100644 --- a/src/shared/AtomWriter.cpp +++ b/src/shared/AtomWriter.cpp @@ -104,6 +104,18 @@ AtomWriter::forge_properties(const Resource::Properties& properties) } } +void +AtomWriter::forge_edge(const Raul::URI& tail, const Raul::URI& head) +{ + LV2_Atom_Forge_Frame edge; + lv2_atom_forge_blank(&_forge, &edge, 0, _uris.ingen_Edge); + lv2_atom_forge_property_head(&_forge, _uris.ingen_tail, 0); + forge_uri(tail); + lv2_atom_forge_property_head(&_forge, _uris.ingen_head, 0); + forge_uri(head); + lv2_atom_forge_pop(&_forge, &edge); +} + void AtomWriter::put(const Raul::URI& uri, const Resource::Properties& properties, @@ -180,17 +192,8 @@ AtomWriter::connect(const Raul::Path& src, lv2_atom_forge_property_head(&_forge, _uris.patch_subject, 0); forge_uri(Raul::Path::lca(src, dst)); lv2_atom_forge_property_head(&_forge, _uris.patch_body, 0); - - LV2_Atom_Forge_Frame body; - lv2_atom_forge_blank(&_forge, &body, 0, _uris.ingen_Edge); - lv2_atom_forge_property_head(&_forge, _uris.ingen_tail, 0); - forge_uri(src); - lv2_atom_forge_property_head(&_forge, _uris.ingen_head, 0); - forge_uri(dst); - lv2_atom_forge_pop(&_forge, &body); - + forge_edge(src, dst); lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); } @@ -198,6 +201,12 @@ void AtomWriter::disconnect(const Raul::URI& src, const Raul::URI& dst) { + LV2_Atom_Forge_Frame msg; + lv2_atom_forge_blank(&_forge, &msg, next_id(), _uris.patch_Delete); + lv2_atom_forge_property_head(&_forge, _uris.patch_body, 0); + forge_edge(src, dst); + lv2_atom_forge_pop(&_forge, &msg); + finish_msg(); } void -- cgit v1.2.1