diff options
Diffstat (limited to 'src/AtomWriter.cpp')
-rw-r--r-- | src/AtomWriter.cpp | 222 |
1 files changed, 79 insertions, 143 deletions
diff --git a/src/AtomWriter.cpp b/src/AtomWriter.cpp index cf5f40ac..d4e7f863 100644 --- a/src/AtomWriter.cpp +++ b/src/AtomWriter.cpp @@ -60,18 +60,15 @@ #include "raul/Path.hpp" #include "serd/serd.h" +using namespace lv2; + namespace Ingen { AtomWriter::AtomWriter(URIMap& map, URIs& uris, AtomSink& sink) : _map(map) , _uris(uris) , _sink(sink) -{ - lv2_atom_forge_init(&_forge, &map.urid_map_feature()->urid_map); - _out.set_forge_sink(&_forge); -} - -AtomWriter::~AtomWriter() + , _forge(&map.urid_map_feature()->urid_map, _out) { } @@ -110,41 +107,34 @@ AtomWriter::message(const Message& message) void AtomWriter::operator()(const BundleBegin& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.ingen_BundleStart, message.seq); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); + ScopedMessage msg(*this, _uris.ingen_BundleStart, message.seq); } void AtomWriter::operator()(const BundleEnd& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.ingen_BundleEnd, message.seq); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); + ScopedMessage msg(*this, _uris.ingen_BundleEnd, message.seq); } void AtomWriter::forge_uri(const Raul::URI& uri) { if (serd_uri_string_has_scheme((const uint8_t*)uri.c_str())) { - lv2_atom_forge_urid(&_forge, _map.map_uri(uri.c_str())); + _forge.urid(_map.map_uri(uri.c_str())); } else { - lv2_atom_forge_uri(&_forge, uri.c_str(), uri.length()); + _forge.uri(uri); } } void -AtomWriter::forge_properties(const Properties& properties) +AtomWriter::forge_properties(ScopedObject& object, const Properties& properties) { for (auto p : properties) { - lv2_atom_forge_key(&_forge, _map.map_uri(p.first.c_str())); + object.key(_map.map_uri(p.first.c_str())); if (p.second.type() == _forge.URI) { forge_uri(Raul::URI(p.second.ptr<char>())); } else { - lv2_atom_forge_atom(&_forge, p.second.size(), p.second.type()); - lv2_atom_forge_write(&_forge, p.second.get_body(), p.second.size()); + _forge.atom(p.second.size(), p.second.type(), p.second.get_body()); } } } @@ -152,36 +142,23 @@ AtomWriter::forge_properties(const Properties& properties) void AtomWriter::forge_arc(const Raul::Path& tail, const Raul::Path& head) { - LV2_Atom_Forge_Frame arc; - lv2_atom_forge_object(&_forge, &arc, 0, _uris.ingen_Arc); - lv2_atom_forge_key(&_forge, _uris.ingen_tail); + ScopedObject arc(_forge, 0, _uris.ingen_Arc); + arc.key(_uris.ingen_tail); forge_uri(path_to_uri(tail)); - lv2_atom_forge_key(&_forge, _uris.ingen_head); + arc.key(_uris.ingen_head); forge_uri(path_to_uri(head)); - lv2_atom_forge_pop(&_forge, &arc); -} - -void -AtomWriter::forge_request(LV2_Atom_Forge_Frame* frame, LV2_URID type, int32_t id) -{ - lv2_atom_forge_object(&_forge, frame, 0, type); - - if (id) { - lv2_atom_forge_key(&_forge, _uris.patch_sequenceNumber); - lv2_atom_forge_int(&_forge, id); - } } void -AtomWriter::forge_context(Resource::Graph ctx) +AtomWriter::forge_context(ScopedMessage& msg, Resource::Graph ctx) { switch (ctx) { case Resource::Graph::EXTERNAL: - lv2_atom_forge_key(&_forge, _uris.patch_context); + msg.object.key(_uris.patch_context); forge_uri(_uris.ingen_externalContext); break; case Resource::Graph::INTERNAL: - lv2_atom_forge_key(&_forge, _uris.patch_context); + msg.object.key(_uris.patch_context); forge_uri(_uris.ingen_internalContext); break; default: break; @@ -215,20 +192,15 @@ AtomWriter::forge_context(Resource::Graph ctx) void AtomWriter::operator()(const Put& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.patch_Put, message.seq); - forge_context(message.ctx); - lv2_atom_forge_key(&_forge, _uris.patch_subject); - forge_uri(message.uri); - lv2_atom_forge_key(&_forge, _uris.patch_body); + ScopedMessage msg(*this, _uris.patch_Put, message.seq); + forge_context(msg, message.ctx); - LV2_Atom_Forge_Frame body; - lv2_atom_forge_object(&_forge, &body, 0, 0); - forge_properties(message.properties); - lv2_atom_forge_pop(&_forge, &body); + msg.object.key(_uris.patch_subject); + forge_uri(message.uri); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); + msg.object.key(_uris.patch_body); + ScopedObject body(_forge, 0, 0); + forge_properties(body, message.properties); } /** @page protocol @@ -260,26 +232,22 @@ AtomWriter::operator()(const Put& message) void AtomWriter::operator()(const Delta& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.patch_Patch, message.seq); - forge_context(message.ctx); - lv2_atom_forge_key(&_forge, _uris.patch_subject); + ScopedMessage msg(*this, _uris.patch_Patch, message.seq); + forge_context(msg, message.ctx); + msg.object.key(_uris.patch_subject); forge_uri(message.uri); - lv2_atom_forge_key(&_forge, _uris.patch_remove); - LV2_Atom_Forge_Frame remove_obj; - lv2_atom_forge_object(&_forge, &remove_obj, 0, 0); - forge_properties(message.remove); - lv2_atom_forge_pop(&_forge, &remove_obj); - - lv2_atom_forge_key(&_forge, _uris.patch_add); - LV2_Atom_Forge_Frame add_obj; - lv2_atom_forge_object(&_forge, &add_obj, 0, 0); - forge_properties(message.add); - lv2_atom_forge_pop(&_forge, &add_obj); + msg.object.key(_uris.patch_remove); + { + ScopedObject remove_obj(_forge, 0, 0); + forge_properties(remove_obj, message.remove); + } - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); + msg.object.key(_uris.patch_add); + { + ScopedObject add_obj(_forge, 0, 0); + forge_properties(add_obj, message.add); + } } /** @page protocol @@ -308,14 +276,11 @@ AtomWriter::operator()(const Delta& message) void AtomWriter::operator()(const Copy& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.patch_Copy, message.seq); - lv2_atom_forge_key(&_forge, _uris.patch_subject); + ScopedMessage msg(*this, _uris.patch_Copy, message.seq); + msg.object.key(_uris.patch_subject); forge_uri(message.old_uri); - lv2_atom_forge_key(&_forge, _uris.patch_destination); + msg.object.key(_uris.patch_destination); forge_uri(message.new_uri); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); } /** @page protocol @@ -337,14 +302,11 @@ AtomWriter::operator()(const Copy& message) void AtomWriter::operator()(const Move& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.patch_Move, message.seq); - lv2_atom_forge_key(&_forge, _uris.patch_subject); + ScopedMessage msg(*this, _uris.patch_Move, message.seq); + msg.object.key(_uris.patch_subject); forge_uri(path_to_uri(message.old_path)); - lv2_atom_forge_key(&_forge, _uris.patch_destination); + msg.object.key(_uris.patch_destination); forge_uri(path_to_uri(message.new_path)); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); } /** @page protocol @@ -365,12 +327,9 @@ AtomWriter::operator()(const Move& message) void AtomWriter::operator()(const Del& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.patch_Delete, message.seq); - lv2_atom_forge_key(&_forge, _uris.patch_subject); + ScopedMessage msg(*this, _uris.patch_Delete, message.seq); + msg.object.key(_uris.patch_subject); forge_uri(message.uri); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); } /** @page protocol @@ -390,19 +349,18 @@ AtomWriter::operator()(const Del& message) void AtomWriter::operator()(const SetProperty& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.patch_Set, message.seq); - forge_context(message.ctx); - lv2_atom_forge_key(&_forge, _uris.patch_subject); + ScopedMessage msg(*this, _uris.patch_Set, message.seq); + forge_context(msg, message.ctx); + + msg.object.key(_uris.patch_subject); forge_uri(message.subject); - lv2_atom_forge_key(&_forge, _uris.patch_property); - lv2_atom_forge_urid(&_forge, _map.map_uri(message.predicate.c_str())); - lv2_atom_forge_key(&_forge, _uris.patch_value); - lv2_atom_forge_atom(&_forge, message.value.size(), message.value.type()); - lv2_atom_forge_write(&_forge, message.value.get_body(), message.value.size()); - - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); + + msg.object.key(_uris.patch_property); + _forge.urid(_map.map_uri(message.predicate.c_str())); + + const auto& value = message.value; + msg.object.key(_uris.patch_value); + _forge.atom(value.size(), value.type(), value.get_body()); } /** @page protocol @@ -420,10 +378,7 @@ AtomWriter::operator()(const SetProperty& message) void AtomWriter::operator()(const Undo& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.ingen_Undo, message.seq); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); + ScopedMessage msg(*this, _uris.ingen_Undo, message.seq); } /** @page protocol @@ -438,10 +393,7 @@ AtomWriter::operator()(const Undo& message) void AtomWriter::operator()(const Redo& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.ingen_Redo, message.seq); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); + ScopedMessage msg(*this, _uris.ingen_Redo, message.seq); } /** @page protocol @@ -459,12 +411,9 @@ AtomWriter::operator()(const Redo& message) void AtomWriter::operator()(const Get& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.patch_Get, message.seq); - lv2_atom_forge_key(&_forge, _uris.patch_subject); + ScopedMessage msg(*this, _uris.patch_Get, message.seq); + msg.object.key(_uris.patch_subject); forge_uri(message.subject); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); } /** @page protocol @@ -493,14 +442,11 @@ AtomWriter::operator()(const Get& message) void AtomWriter::operator()(const Connect& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.patch_Put, message.seq); - lv2_atom_forge_key(&_forge, _uris.patch_subject); + ScopedMessage msg(*this, _uris.patch_Put, message.seq); + msg.object.key(_uris.patch_subject); forge_uri(path_to_uri(Raul::Path::lca(message.tail, message.head))); - lv2_atom_forge_key(&_forge, _uris.patch_body); + msg.object.key(_uris.patch_body); forge_arc(message.tail, message.head); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); } /** @page protocol @@ -522,12 +468,9 @@ AtomWriter::operator()(const Connect& message) void AtomWriter::operator()(const Disconnect& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.patch_Delete, message.seq); - lv2_atom_forge_key(&_forge, _uris.patch_body); + ScopedMessage msg(*this, _uris.patch_Delete, message.seq); + msg.object.key(_uris.patch_body); forge_arc(message.tail, message.head); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); } /** @page protocol @@ -551,21 +494,17 @@ AtomWriter::operator()(const Disconnect& message) void AtomWriter::operator()(const DisconnectAll& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.patch_Delete, message.seq); + ScopedMessage msg(*this, _uris.patch_Delete, message.seq); - lv2_atom_forge_key(&_forge, _uris.patch_subject); + msg.object.key(_uris.patch_subject); forge_uri(path_to_uri(message.graph)); - lv2_atom_forge_key(&_forge, _uris.patch_body); - LV2_Atom_Forge_Frame arc; - lv2_atom_forge_object(&_forge, &arc, 0, _uris.ingen_Arc); - lv2_atom_forge_key(&_forge, _uris.ingen_incidentTo); - forge_uri(path_to_uri(message.path)); - lv2_atom_forge_pop(&_forge, &arc); - - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); + msg.object.key(_uris.patch_body); + { + ScopedObject arc(_forge, 0, _uris.ingen_Arc); + arc.key(_uris.ingen_incidentTo); + forge_uri(path_to_uri(message.path)); + } } /** @page protocol @@ -606,18 +545,15 @@ AtomWriter::operator()(const Response& response) return; } - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.patch_Response, 0); - lv2_atom_forge_key(&_forge, _uris.patch_sequenceNumber); - lv2_atom_forge_int(&_forge, response.id); + ScopedMessage msg(*this, _uris.patch_Response, 0); + msg.object.key(_uris.patch_sequenceNumber); + _forge.write(response.id); if (!subject.empty() && Raul::URI::is_valid(subject)) { - lv2_atom_forge_key(&_forge, _uris.patch_subject); - lv2_atom_forge_uri(&_forge, subject.c_str(), subject.length()); + msg.object.key(_uris.patch_subject); + _forge.uri(subject); } - lv2_atom_forge_key(&_forge, _uris.patch_body); - lv2_atom_forge_int(&_forge, static_cast<int>(response.status)); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); + msg.object.key(_uris.patch_body); + _forge.write(static_cast<int32_t>(response.status)); } void |