diff options
Diffstat (limited to 'ingen/AtomWriter.hpp')
-rw-r--r-- | ingen/AtomWriter.hpp | 49 |
1 files changed, 39 insertions, 10 deletions
diff --git a/ingen/AtomWriter.hpp b/ingen/AtomWriter.hpp index 20d152e6..aca1f5bb 100644 --- a/ingen/AtomWriter.hpp +++ b/ingen/AtomWriter.hpp @@ -23,7 +23,7 @@ #include "ingen/Interface.hpp" #include "ingen/URIs.hpp" #include "ingen/ingen.h" -#include "lv2/lv2plug.in/ns/ext/atom/forge.h" +#include "lv2/lv2plug.in/ns/ext/atom/Forge.hpp" namespace Ingen { @@ -36,8 +36,6 @@ class INGEN_API AtomWriter : public Interface public: AtomWriter(URIMap& map, URIs& uris, AtomSink& sink); - ~AtomWriter(); - Raul::URI uri() const { return Raul::URI("ingen:/clients/atom_writer"); } @@ -62,19 +60,50 @@ public: void operator()(const Undo&); private: + using ScopedObject = lv2::atom::Forge::ScopedObject; + + struct ScopedEmitter + { + ScopedEmitter(AtomWriter& writer) : writer(writer) {} + ~ScopedEmitter() { writer.finish_msg(); } + + ScopedEmitter(const ScopedEmitter&) = delete; + ScopedEmitter& operator=(const ScopedEmitter&) = delete; + + AtomWriter& writer; + }; + + struct ScopedMessage + { + ScopedMessage(AtomWriter& writer, + const LV2_URID type, + const int32_t seq = 0) + : emitter(writer) + , object(writer._forge, 0, type) + { + if (seq) { + object.key(writer._uris.patch_sequenceNumber); + writer._forge.write(seq); + } + } + + ScopedEmitter emitter; + ScopedObject object; + }; + void forge_uri(const Raul::URI& uri); - void forge_properties(const Properties& properties); + void forge_properties(ScopedObject& object, const Properties& properties); void forge_arc(const Raul::Path& tail, const Raul::Path& head); void forge_request(LV2_Atom_Forge_Frame* frame, LV2_URID type, int32_t id); - void forge_context(Resource::Graph ctx); + void forge_context(ScopedMessage& message, Resource::Graph ctx); void finish_msg(); - URIMap& _map; - URIs& _uris; - AtomSink& _sink; - AtomForgeSink _out; - LV2_Atom_Forge _forge; + URIMap& _map; + URIs& _uris; + AtomSink& _sink; + AtomForgeSink _out; + lv2::atom::Forge _forge; }; } // namespace Ingen |