From 42936aa5d924ca89fe3d887fd0ffeb7a281b547e Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 16 Aug 2008 18:45:27 +0000 Subject: Add missing Store.cpp. More serialisation work. git-svn-id: http://svn.drobilla.net/lad/ingen@1402 a436a847-0d15-0410-975c-d299462d15a1 --- src/libs/client/ClientStore.cpp | 2 +- src/libs/engine/Engine.cpp | 14 ++-- src/libs/engine/Engine.hpp | 2 +- src/libs/engine/HTTPEngineReceiver.cpp | 30 ++++++++- src/libs/engine/events/AllNotesOffEvent.cpp | 2 +- src/libs/engine/events/ClearPatchEvent.cpp | 6 +- src/libs/engine/events/ConnectionEvent.cpp | 4 +- src/libs/engine/events/CreateNodeEvent.cpp | 8 +-- src/libs/engine/events/CreatePatchEvent.cpp | 8 +-- src/libs/engine/events/CreatePortEvent.cpp | 8 +-- src/libs/engine/events/DestroyEvent.cpp | 10 +-- .../engine/events/DisablePortMonitoringEvent.cpp | 2 +- src/libs/engine/events/DisconnectAllEvent.cpp | 4 +- src/libs/engine/events/DisconnectionEvent.cpp | 4 +- src/libs/engine/events/EnablePatchEvent.cpp | 2 +- .../engine/events/EnablePortBroadcastingEvent.cpp | 2 +- src/libs/engine/events/MidiLearnEvent.cpp | 2 +- src/libs/engine/events/NoteEvent.cpp | 2 +- src/libs/engine/events/RenameEvent.cpp | 12 ++-- src/libs/engine/events/RequestAllObjectsEvent.cpp | 2 +- src/libs/engine/events/RequestMetadataEvent.cpp | 2 +- src/libs/engine/events/RequestObjectEvent.cpp | 2 +- src/libs/engine/events/RequestPortValueEvent.cpp | 2 +- src/libs/engine/events/SetMetadataEvent.cpp | 2 +- src/libs/engine/events/SetPolyphonicEvent.cpp | 2 +- src/libs/engine/events/SetPolyphonyEvent.cpp | 2 +- src/libs/engine/events/SetPortValueEvent.cpp | 4 +- src/libs/gui/App.cpp | 42 ++++++------ src/libs/gui/App.hpp | 4 +- src/libs/gui/PatchCanvas.cpp | 2 +- src/libs/gui/UploadPatchWindow.cpp | 3 +- src/libs/serialisation/Serialiser.cpp | 75 +++++++++++++--------- src/libs/serialisation/Serialiser.hpp | 14 ++-- src/libs/serialisation/serialisation.cpp | 4 +- src/libs/serialisation/serialisation.hpp | 5 +- src/libs/shared/Store.cpp | 63 ++++++++++++++++++ src/progs/ingen/main.cpp | 1 + 37 files changed, 227 insertions(+), 128 deletions(-) create mode 100644 src/libs/shared/Store.cpp (limited to 'src') diff --git a/src/libs/client/ClientStore.cpp b/src/libs/client/ClientStore.cpp index 96f0dfa8..3c7f17aa 100644 --- a/src/libs/client/ClientStore.cpp +++ b/src/libs/client/ClientStore.cpp @@ -58,7 +58,7 @@ ClientStore::ClientStore(SharedPtr engine, SharedPtrbegin(); - i != object_store()->end(); ++i) { + for (EngineStore::iterator i = engine_store()->begin(); + i != engine_store()->end(); ++i) { if ( ! PtrCast(i->second)->parent() ) i->second.reset(); } @@ -93,10 +93,10 @@ Engine::~Engine() } -EngineStore* -Engine::object_store() const +SharedPtr +Engine::engine_store() const { - return dynamic_cast(_world->store.get()); + return PtrCast(_world->store); } @@ -270,8 +270,8 @@ Engine::deactivate() _event_source->deactivate(); - /*for (Tree::iterator i = _object_store->objects().begin(); - i != _object_store->objects().end(); ++i) + /*for (Tree::iterator i = _engine_store->objects().begin(); + i != _engine_store->objects().end(); ++i) if ((*i)->as_node() != NULL && (*i)->as_node()->parent() == NULL) (*i)->as_node()->deactivate();*/ diff --git a/src/libs/engine/Engine.hpp b/src/libs/engine/Engine.hpp index dd8f3b15..26884f73 100644 --- a/src/libs/engine/Engine.hpp +++ b/src/libs/engine/Engine.hpp @@ -92,7 +92,7 @@ public: ClientBroadcaster* broadcaster() const { return _broadcaster; } NodeFactory* node_factory() const { return _node_factory; } - EngineStore* object_store() const; + SharedPtr engine_store() const; /** Return the active driver for the given type */ Driver* driver(DataType type, EventType event_type); diff --git a/src/libs/engine/HTTPEngineReceiver.cpp b/src/libs/engine/HTTPEngineReceiver.cpp index b9cd1d7b..7427f18d 100644 --- a/src/libs/engine/HTTPEngineReceiver.cpp +++ b/src/libs/engine/HTTPEngineReceiver.cpp @@ -17,6 +17,7 @@ #include #include +#include #include #include "types.hpp" #include @@ -55,7 +56,7 @@ HTTPEngineReceiver::HTTPEngineReceiver(Engine& engine, uint16_t port) if (engine.world()->serialisation_module) { if (!engine.world()->serialiser) engine.world()->serialiser = SharedPtr( - Ingen::Serialisation::new_serialiser(engine.world())); + Ingen::Serialisation::new_serialiser(engine.world(), engine.engine_store())); if (!engine.world()->loader) engine.world()->loader = SharedPtr( @@ -129,9 +130,27 @@ HTTPEngineReceiver::message_callback(SoupServer* server, SoupMessage* msg, const return; } +#if 0 + SoupMessageHeaders* in_head = msg->request_headers; + const char* str = soup_message_headers_get(in_head, "Accept"); + cout << "Accept: " << str << endl; +#endif + // Serialise object - string base_uri = string("ingen:").append(start->second->path()); - const string response = serialiser->to_string(start->second, base_uri, GraphObject::Variables()); + const string response = serialiser->to_string(start->second, "http://example.org", + GraphObject::Variables()); + +#if 0 + FILE* xhtml_file = fopen("/home/dave/ingen_ui.xhtml", "r"); + string response; + while (!feof(xhtml_file)) { + int c = fgetc(xhtml_file); + if (c != EOF) + response += (char)c; + } + fclose(xhtml_file); +#endif + soup_message_set_status (msg, SOUP_STATUS_OK); soup_message_set_response (msg, "text/plain", SOUP_MEMORY_COPY, response.c_str(), response.length()); @@ -152,9 +171,14 @@ HTTPEngineReceiver::message_callback(SoupServer* server, SoupMessage* msg, const soup_message_set_status (msg, SOUP_STATUS_INTERNAL_SERVER_ERROR); return; } + + //cout << "POST: " << msg->request_body->data << endl; // Load object soup_message_set_status (msg, SOUP_STATUS_NOT_IMPLEMENTED); + } else if (msg->method == SOUP_METHOD_POST) { + //cout << "PUT: " << msg->request_body->data << endl; + soup_message_set_status (msg, SOUP_STATUS_NOT_IMPLEMENTED); } else { soup_message_set_status (msg, SOUP_STATUS_NOT_IMPLEMENTED); } diff --git a/src/libs/engine/events/AllNotesOffEvent.cpp b/src/libs/engine/events/AllNotesOffEvent.cpp index 6012ea92..fcb68b31 100644 --- a/src/libs/engine/events/AllNotesOffEvent.cpp +++ b/src/libs/engine/events/AllNotesOffEvent.cpp @@ -50,7 +50,7 @@ AllNotesOffEvent::execute(ProcessContext& context) Event::execute(context); if (_patch == NULL && _patch_path != "") - _patch = _engine.object_store()->find_patch(_patch_path); + _patch = _engine.engine_store()->find_patch(_patch_path); //if (_patch != NULL) // for (Raul::List::iterator j = _patch->midi_in_nodes().begin(); j != _patch->midi_in_nodes().end(); ++j) diff --git a/src/libs/engine/events/ClearPatchEvent.cpp b/src/libs/engine/events/ClearPatchEvent.cpp index 30b69915..c1fb0749 100644 --- a/src/libs/engine/events/ClearPatchEvent.cpp +++ b/src/libs/engine/events/ClearPatchEvent.cpp @@ -47,13 +47,13 @@ ClearPatchEvent::ClearPatchEvent(Engine& engine, SharedPtr responder, void ClearPatchEvent::pre_process() { - EngineStore::Objects::iterator patch_iterator = _engine.object_store()->find(_patch_path); + EngineStore::Objects::iterator patch_iterator = _engine.engine_store()->find(_patch_path); - if (patch_iterator != _engine.object_store()->end()) { + if (patch_iterator != _engine.engine_store()->end()) { _patch = PtrCast(patch_iterator->second); if (_patch) { _process = _patch->enabled(); - _removed_table = _engine.object_store()->remove_children(patch_iterator); + _removed_table = _engine.engine_store()->remove_children(patch_iterator); _patch->nodes().clear(); _patch->connections().clear(); _ports_array = _patch->build_ports_array(); diff --git a/src/libs/engine/events/ConnectionEvent.cpp b/src/libs/engine/events/ConnectionEvent.cpp index 55286ffd..24b80dee 100644 --- a/src/libs/engine/events/ConnectionEvent.cpp +++ b/src/libs/engine/events/ConnectionEvent.cpp @@ -62,8 +62,8 @@ ConnectionEvent::pre_process() return; } - _src_port = _engine.object_store()->find_port(_src_port_path); - _dst_port = _engine.object_store()->find_port(_dst_port_path); + _src_port = _engine.engine_store()->find_port(_src_port_path); + _dst_port = _engine.engine_store()->find_port(_dst_port_path); if (_src_port == NULL || _dst_port == NULL) { _error = PORT_NOT_FOUND; diff --git a/src/libs/engine/events/CreateNodeEvent.cpp b/src/libs/engine/events/CreateNodeEvent.cpp index d1d21a36..49cbb58e 100644 --- a/src/libs/engine/events/CreateNodeEvent.cpp +++ b/src/libs/engine/events/CreateNodeEvent.cpp @@ -73,13 +73,13 @@ CreateNodeEvent::CreateNodeEvent(Engine& engine, SharedPtr responder, void CreateNodeEvent::pre_process() { - if (_engine.object_store()->find_object(_path) != NULL) { + if (_engine.engine_store()->find_object(_path) != NULL) { _node_already_exists = true; QueuedEvent::pre_process(); return; } - _patch = _engine.object_store()->find_patch(_path.parent()); + _patch = _engine.engine_store()->find_patch(_path.parent()); PluginImpl* const plugin = (_plugin_uri != "") ? _engine.node_factory()->plugin(_plugin_uri) @@ -98,8 +98,8 @@ CreateNodeEvent::pre_process() // This can be done here because the audio thread doesn't touch the // node tree - just the process order array _patch->add_node(new PatchImpl::Nodes::Node(_node)); - //_node->add_to_store(_engine.object_store()); - _engine.object_store()->add(_node); + //_node->add_to_store(_engine.engine_store()); + _engine.engine_store()->add(_node); // FIXME: not really necessary to build process order since it's not connected, // just append to the list diff --git a/src/libs/engine/events/CreatePatchEvent.cpp b/src/libs/engine/events/CreatePatchEvent.cpp index 2b396cbb..e054412f 100644 --- a/src/libs/engine/events/CreatePatchEvent.cpp +++ b/src/libs/engine/events/CreatePatchEvent.cpp @@ -45,7 +45,7 @@ CreatePatchEvent::CreatePatchEvent(Engine& engine, SharedPtr responde void CreatePatchEvent::pre_process() { - if (_path == "/" || _engine.object_store()->find_object(_path) != NULL) { + if (_path == "/" || _engine.engine_store()->find_object(_path) != NULL) { _error = OBJECT_EXISTS; QueuedEvent::pre_process(); return; @@ -57,7 +57,7 @@ CreatePatchEvent::pre_process() return; } - _parent = _engine.object_store()->find_patch(_path.parent()); + _parent = _engine.engine_store()->find_patch(_path.parent()); if (_parent == NULL) { _error = PARENT_NOT_FOUND; QueuedEvent::pre_process(); @@ -80,8 +80,8 @@ CreatePatchEvent::pre_process() _patch->activate(); // Insert into EngineStore - //_patch->add_to_store(_engine.object_store()); - _engine.object_store()->add(_patch); + //_patch->add_to_store(_engine.engine_store()); + _engine.engine_store()->add(_patch); QueuedEvent::pre_process(); } diff --git a/src/libs/engine/events/CreatePortEvent.cpp b/src/libs/engine/events/CreatePortEvent.cpp index b8ef244f..e767f522 100644 --- a/src/libs/engine/events/CreatePortEvent.cpp +++ b/src/libs/engine/events/CreatePortEvent.cpp @@ -72,14 +72,14 @@ CreatePortEvent::CreatePortEvent(Engine& engine, void CreatePortEvent::pre_process() { - if (_error == UNKNOWN_TYPE || _engine.object_store()->find_object(_path)) { + if (_error == UNKNOWN_TYPE || _engine.engine_store()->find_object(_path)) { QueuedEvent::pre_process(); return; } // FIXME: this is just a mess :/ - _patch = _engine.object_store()->find_patch(_path.parent()); + _patch = _engine.engine_store()->find_patch(_path.parent()); if (_patch != NULL) { assert(_patch->path() == _path.parent()); @@ -106,8 +106,8 @@ CreatePortEvent::pre_process() _ports_array->at(_patch->num_ports()-1) = _patch_port; - //_patch_port->add_to_store(_engine.object_store()); - _engine.object_store()->add(_patch_port); + //_patch_port->add_to_store(_engine.engine_store()); + _engine.engine_store()->add(_patch_port); if (!_patch->parent()) { if (_type == "ingen:AudioPort") diff --git a/src/libs/engine/events/DestroyEvent.cpp b/src/libs/engine/events/DestroyEvent.cpp index 6d1fc3fb..9c9db2db 100644 --- a/src/libs/engine/events/DestroyEvent.cpp +++ b/src/libs/engine/events/DestroyEvent.cpp @@ -37,7 +37,7 @@ namespace Ingen { DestroyEvent::DestroyEvent(Engine& engine, SharedPtr responder, FrameTime time, QueuedEventSource* source, const string& path, bool block) : QueuedEvent(engine, responder, time, source, source) , _path(path) - , _store_iterator(engine.object_store()->end()) + , _store_iterator(engine.engine_store()->end()) , _driver_port(NULL) , _patch_node_listnode(NULL) , _patch_port_listnode(NULL) @@ -58,17 +58,17 @@ DestroyEvent::~DestroyEvent() void DestroyEvent::pre_process() { - _store_iterator = _engine.object_store()->find(_path); + _store_iterator = _engine.engine_store()->find(_path); - if (_store_iterator != _engine.object_store()->end()) { + if (_store_iterator != _engine.engine_store()->end()) { _node = PtrCast(_store_iterator->second); if (!_node) _port = PtrCast(_store_iterator->second); } - if (_store_iterator != _engine.object_store()->end()) { - _removed_table = _engine.object_store()->remove(_store_iterator); + if (_store_iterator != _engine.engine_store()->end()) { + _removed_table = _engine.engine_store()->remove(_store_iterator); } if (_node != NULL && _path != "/") { diff --git a/src/libs/engine/events/DisablePortMonitoringEvent.cpp b/src/libs/engine/events/DisablePortMonitoringEvent.cpp index 02d64c0b..cecc8dfd 100644 --- a/src/libs/engine/events/DisablePortMonitoringEvent.cpp +++ b/src/libs/engine/events/DisablePortMonitoringEvent.cpp @@ -44,7 +44,7 @@ DisablePortMonitoringEvent::DisablePortMonitoringEvent(Engine& engi void DisablePortMonitoringEvent::pre_process() { - _port = _engine.object_store()->find_port(_port_path); + _port = _engine.engine_store()->find_port(_port_path); QueuedEvent::pre_process(); } diff --git a/src/libs/engine/events/DisconnectAllEvent.cpp b/src/libs/engine/events/DisconnectAllEvent.cpp index 78c2b23b..77b1b1b3 100644 --- a/src/libs/engine/events/DisconnectAllEvent.cpp +++ b/src/libs/engine/events/DisconnectAllEvent.cpp @@ -76,7 +76,7 @@ void DisconnectAllEvent::pre_process() { if (_lookup) { - _parent = _engine.object_store()->find_patch(_parent_path); + _parent = _engine.engine_store()->find_patch(_parent_path); if (_parent == NULL) { _error = PARENT_NOT_FOUND; @@ -84,7 +84,7 @@ DisconnectAllEvent::pre_process() return; } - GraphObjectImpl* object = _engine.object_store()->find_object(_path); + GraphObjectImpl* object = _engine.engine_store()->find_object(_path); if (object == NULL) { _error = OBJECT_NOT_FOUND; diff --git a/src/libs/engine/events/DisconnectionEvent.cpp b/src/libs/engine/events/DisconnectionEvent.cpp index d796877f..86ad8b4e 100644 --- a/src/libs/engine/events/DisconnectionEvent.cpp +++ b/src/libs/engine/events/DisconnectionEvent.cpp @@ -83,8 +83,8 @@ DisconnectionEvent::pre_process() return; } - _src_port = _engine.object_store()->find_port(_src_port_path); - _dst_port = _engine.object_store()->find_port(_dst_port_path); + _src_port = _engine.engine_store()->find_port(_src_port_path); + _dst_port = _engine.engine_store()->find_port(_dst_port_path); } if (_src_port == NULL || _dst_port == NULL) { diff --git a/src/libs/engine/events/EnablePatchEvent.cpp b/src/libs/engine/events/EnablePatchEvent.cpp index aff5885b..48657146 100644 --- a/src/libs/engine/events/EnablePatchEvent.cpp +++ b/src/libs/engine/events/EnablePatchEvent.cpp @@ -39,7 +39,7 @@ EnablePatchEvent::EnablePatchEvent(Engine& engine, SharedPtr responde void EnablePatchEvent::pre_process() { - _patch = _engine.object_store()->find_patch(_patch_path); + _patch = _engine.engine_store()->find_patch(_patch_path); if (_enable && _patch) { /* Any event that requires a new process order will set the patch's diff --git a/src/libs/engine/events/EnablePortBroadcastingEvent.cpp b/src/libs/engine/events/EnablePortBroadcastingEvent.cpp index cb7dc5ec..1d3d2c9e 100644 --- a/src/libs/engine/events/EnablePortBroadcastingEvent.cpp +++ b/src/libs/engine/events/EnablePortBroadcastingEvent.cpp @@ -46,7 +46,7 @@ EnablePortBroadcastingEvent::EnablePortBroadcastingEvent(Engine& en void EnablePortBroadcastingEvent::pre_process() { - _port = _engine.object_store()->find_port(_port_path); + _port = _engine.engine_store()->find_port(_port_path); QueuedEvent::pre_process(); } diff --git a/src/libs/engine/events/MidiLearnEvent.cpp b/src/libs/engine/events/MidiLearnEvent.cpp index 3e8947b7..45216e70 100644 --- a/src/libs/engine/events/MidiLearnEvent.cpp +++ b/src/libs/engine/events/MidiLearnEvent.cpp @@ -51,7 +51,7 @@ MidiLearnEvent::MidiLearnEvent(Engine& engine, SharedPtr responder, S void MidiLearnEvent::pre_process() { - _node = _engine.object_store()->find_node(_node_path); + _node = _engine.engine_store()->find_node(_node_path); _response_event = new MidiLearnResponseEvent(_engine, _node_path + "/Controller_Number", _time); QueuedEvent::pre_process(); diff --git a/src/libs/engine/events/NoteEvent.cpp b/src/libs/engine/events/NoteEvent.cpp index d5f2cf76..d74d5cd0 100644 --- a/src/libs/engine/events/NoteEvent.cpp +++ b/src/libs/engine/events/NoteEvent.cpp @@ -65,7 +65,7 @@ NoteEvent::execute(ProcessContext& context) // Lookup if neccessary if (!_node) - _node = _engine.object_store()->find_node(_node_path); + _node = _engine.engine_store()->find_node(_node_path); // FIXME: barf diff --git a/src/libs/engine/events/RenameEvent.cpp b/src/libs/engine/events/RenameEvent.cpp index 73426a59..164676aa 100644 --- a/src/libs/engine/events/RenameEvent.cpp +++ b/src/libs/engine/events/RenameEvent.cpp @@ -37,7 +37,7 @@ RenameEvent::RenameEvent(Engine& engine, SharedPtr responder, SampleC _name(name), _new_path("/"), _parent_patch(NULL), - _store_iterator(engine.object_store()->end()), + _store_iterator(engine.engine_store()->end()), _error(NO_ERROR) { /* @@ -64,21 +64,21 @@ RenameEvent::pre_process() _new_path = _old_path.parent().base() + _name; - _store_iterator = _engine.object_store()->find(_old_path); - if (_store_iterator == _engine.object_store()->end()) { + _store_iterator = _engine.engine_store()->find(_old_path); + if (_store_iterator == _engine.engine_store()->end()) { _error = OBJECT_NOT_FOUND; QueuedEvent::pre_process(); return; } - if (_engine.object_store()->find_object(_new_path)) { + if (_engine.engine_store()->find_object(_new_path)) { _error = OBJECT_EXISTS; QueuedEvent::pre_process(); return; } SharedPtr< Table > > removed - = _engine.object_store()->remove(_store_iterator); + = _engine.engine_store()->remove(_store_iterator); assert(removed->size() > 0); @@ -96,7 +96,7 @@ RenameEvent::pre_process() i->first = child_new_path; } - _engine.object_store()->add(*removed.get()); + _engine.engine_store()->add(*removed.get()); QueuedEvent::pre_process(); } diff --git a/src/libs/engine/events/RequestAllObjectsEvent.cpp b/src/libs/engine/events/RequestAllObjectsEvent.cpp index 94e34f3b..d57080aa 100644 --- a/src/libs/engine/events/RequestAllObjectsEvent.cpp +++ b/src/libs/engine/events/RequestAllObjectsEvent.cpp @@ -45,7 +45,7 @@ RequestAllObjectsEvent::post_process() _responder->respond_ok(); // Everything is a child of the root patch, so this sends it all - PatchImpl* root = _engine.object_store()->find_patch("/"); + PatchImpl* root = _engine.engine_store()->find_patch("/"); if (root && _responder->client()) ObjectSender::send_patch(_responder->client(), root, true); diff --git a/src/libs/engine/events/RequestMetadataEvent.cpp b/src/libs/engine/events/RequestMetadataEvent.cpp index cf428c05..4a7571bb 100644 --- a/src/libs/engine/events/RequestMetadataEvent.cpp +++ b/src/libs/engine/events/RequestMetadataEvent.cpp @@ -41,7 +41,7 @@ void RequestMetadataEvent::pre_process() { if (_responder->client()) { - _object = _engine.object_store()->find_object(_path); + _object = _engine.engine_store()->find_object(_path); if (_object == NULL) { QueuedEvent::pre_process(); return; diff --git a/src/libs/engine/events/RequestObjectEvent.cpp b/src/libs/engine/events/RequestObjectEvent.cpp index c1c93129..88479482 100644 --- a/src/libs/engine/events/RequestObjectEvent.cpp +++ b/src/libs/engine/events/RequestObjectEvent.cpp @@ -44,7 +44,7 @@ RequestObjectEvent::RequestObjectEvent(Engine& engine, SharedPtr resp void RequestObjectEvent::pre_process() { - _object = _engine.object_store()->find_object(_path); + _object = _engine.engine_store()->find_object(_path); QueuedEvent::pre_process(); } diff --git a/src/libs/engine/events/RequestPortValueEvent.cpp b/src/libs/engine/events/RequestPortValueEvent.cpp index 1e09662b..20203f88 100644 --- a/src/libs/engine/events/RequestPortValueEvent.cpp +++ b/src/libs/engine/events/RequestPortValueEvent.cpp @@ -43,7 +43,7 @@ RequestPortValueEvent::RequestPortValueEvent(Engine& engine, SharedPtrfind_port(_port_path); + _port = _engine.engine_store()->find_port(_port_path); QueuedEvent::pre_process(); } diff --git a/src/libs/engine/events/SetMetadataEvent.cpp b/src/libs/engine/events/SetMetadataEvent.cpp index 14293037..3e41a510 100644 --- a/src/libs/engine/events/SetMetadataEvent.cpp +++ b/src/libs/engine/events/SetMetadataEvent.cpp @@ -41,7 +41,7 @@ SetMetadataEvent::SetMetadataEvent(Engine& engine, SharedPtr responde void SetMetadataEvent::pre_process() { - _object = _engine.object_store()->find_object(_path); + _object = _engine.engine_store()->find_object(_path); if (_object == NULL) { QueuedEvent::pre_process(); return; diff --git a/src/libs/engine/events/SetPolyphonicEvent.cpp b/src/libs/engine/events/SetPolyphonicEvent.cpp index d2ff97aa..bce65ba9 100644 --- a/src/libs/engine/events/SetPolyphonicEvent.cpp +++ b/src/libs/engine/events/SetPolyphonicEvent.cpp @@ -44,7 +44,7 @@ SetPolyphonicEvent::SetPolyphonicEvent(Engine& engine, SharedPtr resp void SetPolyphonicEvent::pre_process() { - _object = _engine.object_store()->find_object(_path); + _object = _engine.engine_store()->find_object(_path); QueuedEvent::pre_process(); } diff --git a/src/libs/engine/events/SetPolyphonyEvent.cpp b/src/libs/engine/events/SetPolyphonyEvent.cpp index 2a22da2f..17222330 100644 --- a/src/libs/engine/events/SetPolyphonyEvent.cpp +++ b/src/libs/engine/events/SetPolyphonyEvent.cpp @@ -43,7 +43,7 @@ SetPolyphonyEvent::SetPolyphonyEvent(Engine& engine, SharedPtr respon void SetPolyphonyEvent::pre_process() { - _patch = _engine.object_store()->find_patch(_patch_path); + _patch = _engine.engine_store()->find_patch(_patch_path); if (_patch && _poly > _patch->internal_polyphony()) _patch->prepare_internal_poly(_poly); diff --git a/src/libs/engine/events/SetPortValueEvent.cpp b/src/libs/engine/events/SetPortValueEvent.cpp index ee9be86e..01263d2c 100644 --- a/src/libs/engine/events/SetPortValueEvent.cpp +++ b/src/libs/engine/events/SetPortValueEvent.cpp @@ -94,7 +94,7 @@ SetPortValueEvent::pre_process() if (_queued) { if (_port == NULL) { if (Path::is_valid(_port_path)) - _port = _engine.object_store()->find_port(_port_path); + _port = _engine.engine_store()->find_port(_port_path); else _error = ILLEGAL_PATH; } @@ -115,7 +115,7 @@ SetPortValueEvent::execute(ProcessContext& context) if (_error == NO_ERROR && _port == NULL) { if (Path::is_valid(_port_path)) - _port = _engine.object_store()->find_port(_port_path); + _port = _engine.engine_store()->find_port(_port_path); else _error = ILLEGAL_PATH; } diff --git a/src/libs/gui/App.cpp b/src/libs/gui/App.cpp index a0a877d5..34f04f35 100644 --- a/src/libs/gui/App.cpp +++ b/src/libs/gui/App.cpp @@ -73,18 +73,6 @@ App::App(Ingen::Shared::World* world) , _world(world) , _enable_signal(true) { - // FIXME: defer loading of serialisation module until needed - if (!world->serialisation_module) - world->serialisation_module = Ingen::Shared::load_module("ingen_serialisation"); - - if (world->serialisation_module) - if (!world->serialiser) - world->serialiser = SharedPtr( - Ingen::Serialisation::new_serialiser(world)); - - if (!world->serialiser) - cerr << "WARNING: Failed to load ingen_serialisation module, save disabled." << endl; - Glib::RefPtr glade_xml = GladeFactory::new_glade_reference(); glade_xml->get_widget_derived("connect_win", _connect_window); @@ -93,18 +81,7 @@ App::App(Ingen::Shared::World* world) glade_xml->get_widget("about_win", _about_dialog); _about_dialog->property_program_name() = "Ingen"; - Redland::World& rdf_world = *world->rdf_world; - - rdf_world.add_prefix("xsd", "http://www.w3.org/2001/XMLSchema#"); - rdf_world.add_prefix("ingen", "http://drobilla.net/ns/ingen#"); - rdf_world.add_prefix("ingenuity", "http://drobilla.net/ns/ingenuity#"); - rdf_world.add_prefix("lv2", "http://lv2plug.in/ns/lv2core#"); - rdf_world.add_prefix("lv2_midi", "http://lv2plug.in/ns/ext/midi"); - rdf_world.add_prefix("rdfs", "http://www.w3.org/2000/01/rdf-schema#"); - rdf_world.add_prefix("doap", "http://usefulinc.com/ns/doap#"); - rdf_world.add_prefix("dc", "http://purl.org/dc/elements/1.1/"); - - PluginModel::set_rdf_world(rdf_world); + PluginModel::set_rdf_world(*world->rdf_world); #ifdef HAVE_SLV2 PluginModel::set_slv2_world(world->slv2_world); @@ -197,6 +174,23 @@ App::detach() _world->engine.reset(); } } + + +const SharedPtr& +App::serialiser() +{ + if (!_serialiser) { + if (!_world->serialisation_module) + _world->serialisation_module = Ingen::Shared::load_module("ingen_serialisation"); + + if (_world->serialisation_module) + _serialiser = SharedPtr(Ingen::Serialisation::new_serialiser(_world, _store)); + + if (!_serialiser) + cerr << "WARNING: Failed to load ingen_serialisation module, save disabled." << endl; + } + return _serialiser; +} void diff --git a/src/libs/gui/App.hpp b/src/libs/gui/App.hpp index c6a6c66c..a13259ad 100644 --- a/src/libs/gui/App.hpp +++ b/src/libs/gui/App.hpp @@ -106,7 +106,8 @@ public: const SharedPtr& client() const { return _client; } const SharedPtr& store() const { return _store; } const SharedPtr& loader() const { return _loader; } - const SharedPtr& serialiser() const { return _world->serialiser; } + + const SharedPtr& serialiser(); static inline App& instance() { assert(_instance); return *_instance; } @@ -139,6 +140,7 @@ protected: SharedPtr _client; SharedPtr _store; + SharedPtr _serialiser; SharedPtr _loader; Configuration* _configuration; diff --git a/src/libs/gui/PatchCanvas.cpp b/src/libs/gui/PatchCanvas.cpp index c92eeb43..59011721 100644 --- a/src/libs/gui/PatchCanvas.cpp +++ b/src/libs/gui/PatchCanvas.cpp @@ -539,7 +539,7 @@ PatchCanvas::destroy_selection() void PatchCanvas::copy_selection() { - Serialiser serialiser(*App::instance().world()); + Serialiser serialiser(*App::instance().world(), App::instance().store()); serialiser.start_to_string(""); for (list >::iterator m = _selected_items.begin(); m != _selected_items.end(); ++m) { diff --git a/src/libs/gui/UploadPatchWindow.cpp b/src/libs/gui/UploadPatchWindow.cpp index b14f7e2c..2ca54f3c 100644 --- a/src/libs/gui/UploadPatchWindow.cpp +++ b/src/libs/gui/UploadPatchWindow.cpp @@ -24,6 +24,7 @@ #include #include "module/global.hpp" #include "module/World.hpp" +#include "client/ClientStore.hpp" #include "interface/EngineInterface.hpp" #include "serialisation/Serialiser.hpp" #include "client/PatchModel.hpp" @@ -247,7 +248,7 @@ UploadPatchWindow::upload_clicked() _upload_progress->set_fraction(0.0); _upload_progress->set_text(""); - Serialiser s(*App::instance().world()); + Serialiser s(*App::instance().world(), App::instance().store()); const string uri = string("http://rdf.drobilla.net/ingen_patches/") .append(symbol).append(".ingen.ttl"); diff --git a/src/libs/serialisation/Serialiser.cpp b/src/libs/serialisation/Serialiser.cpp index 8d5bb1a7..d2f2031f 100644 --- a/src/libs/serialisation/Serialiser.cpp +++ b/src/libs/serialisation/Serialiser.cpp @@ -53,8 +53,8 @@ namespace Ingen { namespace Serialisation { -Serialiser::Serialiser(Shared::World& world) - : _store(world.store) +Serialiser::Serialiser(Shared::World& world, SharedPtr store) + : _store(store) , _world(*world.rdf_world) { } @@ -148,22 +148,37 @@ Serialiser::finish() ret = _model->serialise_to_string(); _base_uri = ""; +#ifdef USE_BLANK_NODES _node_map.clear(); - +#endif return ret; } + +Redland::Node +Serialiser::patch_path_to_rdf_node(const Path& path) +{ +#ifdef USE_BLANK_NODES + if (path == _root_object->path()) { + return Redland::Node(_model->world(), Redland::Node::RESOURCE, _base_uri); + } else { + assert(path.length() > _root_object->path().length()); + return Redland::Node(_model->world(), Redland::Node::RESOURCE, + _base_uri + string("#") + path.substr(_root_object->path().length())); + } +#else + return path_to_rdf_node(path); +#endif +} + + /** Convert a path to an RDF blank node ID for serializing. */ Redland::Node -Serialiser::path_to_node_id(const Path& path) +Serialiser::path_to_rdf_node(const Path& path) { - assert(_model); - - if (path == _root_object->path()) - return Redland::Node(_model->world(), Redland::Node::RESOURCE, _base_uri); - +#if USE_BLANK_NODES NodeMap::iterator i = _node_map.find(path); if (i != _node_map.end()) { assert(i->second); @@ -175,6 +190,16 @@ Serialiser::path_to_node_id(const Path& path) _node_map[path] = id; return id; } +#else + assert(_model); + assert(path.substr(0, _root_object->path().length()) == _root_object->path()); + + if (path == _root_object->path()) + return Redland::Node(_model->world(), Redland::Node::RESOURCE, _base_uri); + else + return Redland::Node(_model->world(), Redland::Node::RESOURCE, + path.substr(_root_object->path().base().length()-1)); +#endif } @@ -243,13 +268,13 @@ Serialiser::serialise(SharedPtr object) throw (std::logic_error) SharedPtr node = PtrCast(object); if (node) { - serialise_node(node, path_to_node_id(node->path())); + serialise_node(node, path_to_rdf_node(node->path())); return; } SharedPtr port = PtrCast(object); if (port) { - serialise_port(port.get(), path_to_node_id(port->path())); + serialise_port(port.get(), path_to_rdf_node(port->path())); return; } @@ -258,25 +283,12 @@ Serialiser::serialise(SharedPtr object) throw (std::logic_error) } -Redland::Node -Serialiser::patch_path_to_rdf_id(const Path& path) -{ - if (path == _root_object->path()) { - return Redland::Node(_model->world(), Redland::Node::RESOURCE, _base_uri); - } else { - assert(path.length() > _root_object->path().length()); - return Redland::Node(_model->world(), Redland::Node::RESOURCE, - _base_uri + string("#") + path.substr(_root_object->path().length())); - } -} - - void Serialiser::serialise_patch(SharedPtr patch) { assert(_model); - const Redland::Node patch_id = patch_path_to_rdf_id(patch->path()); + const Redland::Node patch_id = patch_path_to_rdf_node(patch->path()); _model->add_statement( patch_id, @@ -301,7 +313,6 @@ Serialiser::serialise_patch(SharedPtr patch) serialise_variables(patch_id, patch->variables()); - //for (GraphObject::const_iterator n = patch->children_begin(); n != patch->children_end(); ++n) { for (GraphObject::const_iterator n = _store->children_begin(patch); n != _store->children_end(patch); ++n) { @@ -311,10 +322,10 @@ Serialiser::serialise_patch(SharedPtr patch) SharedPtr patch = PtrCast(n->second); SharedPtr node = PtrCast(n->second); if (patch) { - _model->add_statement(patch_id, "ingen:node", patch_path_to_rdf_id(patch->path())); + _model->add_statement(patch_id, "ingen:node", patch_path_to_rdf_node(patch->path())); serialise_patch(patch); } else if (node) { - const Redland::Node node_id = path_to_node_id(n->second->path()); + const Redland::Node node_id = path_to_rdf_node(n->second->path()); _model->add_statement(patch_id, "ingen:node", node_id); serialise_node(node, node_id); } @@ -322,7 +333,7 @@ Serialiser::serialise_patch(SharedPtr patch) for (uint32_t i=0; i < patch->num_ports(); ++i) { Port* p = patch->port(i); - const Redland::Node port_id = path_to_node_id(p->path()); + const Redland::Node port_id = path_to_rdf_node(p->path()); _model->add_statement(patch_id, "ingen:port", port_id); serialise_port(p, port_id); } @@ -379,7 +390,7 @@ Serialiser::serialise_node(SharedPtr node, const Redland::Node& no for (uint32_t i=0; i < node->num_ports(); ++i) { Port* p = node->port(i); assert(p); - const Redland::Node port_id = path_to_node_id(p->path()); + const Redland::Node port_id = path_to_rdf_node(p->path()); serialise_port(p, port_id); _model->add_statement(node_id, "ingen:port", port_id); } @@ -422,8 +433,8 @@ Serialiser::serialise_connection(SharedPtr connection) throw (std::l if (!_model) throw std::logic_error("serialise_connection called without serialization in progress"); - const Redland::Node src_node = path_to_node_id(connection->src_port_path()); - const Redland::Node dst_node = path_to_node_id(connection->dst_port_path()); + const Redland::Node src_node = path_to_rdf_node(connection->src_port_path()); + const Redland::Node dst_node = path_to_rdf_node(connection->dst_port_path()); /* This would allow associating data with the connection... */ /*const Redland::Node connection_node = _world.blank_id(); diff --git a/src/libs/serialisation/Serialiser.hpp b/src/libs/serialisation/Serialiser.hpp index eb3a8810..5810f259 100644 --- a/src/libs/serialisation/Serialiser.hpp +++ b/src/libs/serialisation/Serialiser.hpp @@ -56,7 +56,7 @@ namespace Serialisation { class Serialiser { public: - Serialiser(Shared::World& world); + Serialiser(Shared::World& world, SharedPtr store); void to_file(SharedPtr object, const std::string& filename); @@ -85,18 +85,20 @@ private: void serialise_variables(Redland::Node subject, const GraphObject::Variables& variables); - Redland::Node path_to_node_id(const Path& path); - Redland::Node patch_path_to_rdf_id(const Path& path); - - typedef std::map NodeMap; + Redland::Node path_to_rdf_node(const Path& path); + Redland::Node patch_path_to_rdf_node(const Path& path); SharedPtr _root_object; SharedPtr _store; Mode _mode; - NodeMap _node_map; std::string _base_uri; Redland::World& _world; Redland::Model* _model; + +#ifdef USE_BLANK_NODES + typedef std::map NodeMap; + NodeMap _node_map; +#endif }; diff --git a/src/libs/serialisation/serialisation.cpp b/src/libs/serialisation/serialisation.cpp index 49b8d465..3ece3772 100644 --- a/src/libs/serialisation/serialisation.cpp +++ b/src/libs/serialisation/serialisation.cpp @@ -33,10 +33,10 @@ new_loader() Ingen::Serialisation::Serialiser* -new_serialiser(Ingen::Shared::World* world) +new_serialiser(Ingen::Shared::World* world, SharedPtr store) { assert(world->rdf_world); - return new Serialiser(*world); + return new Serialiser(*world, store); } diff --git a/src/libs/serialisation/serialisation.hpp b/src/libs/serialisation/serialisation.hpp index 8f6e8291..abae159c 100644 --- a/src/libs/serialisation/serialisation.hpp +++ b/src/libs/serialisation/serialisation.hpp @@ -20,7 +20,7 @@ namespace Ingen { -namespace Shared { class World; } +namespace Shared { class World; class Store; } namespace Serialisation { @@ -31,7 +31,8 @@ class Serialiser; extern "C" { extern Loader* new_loader(); - extern Serialiser* new_serialiser(Ingen::Shared::World* world); + extern Serialiser* new_serialiser(Ingen::Shared::World* world, + SharedPtr store); } diff --git a/src/libs/shared/Store.cpp b/src/libs/shared/Store.cpp new file mode 100644 index 00000000..88fb9cb8 --- /dev/null +++ b/src/libs/shared/Store.cpp @@ -0,0 +1,63 @@ +/* This file is part of Ingen. + * Copyright (C) 2008 Dave Robillard + * + * Ingen is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * Ingen is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include "Store.hpp" + +using namespace std; +using namespace Raul; + +namespace Ingen { +namespace Shared { + + +Store::const_iterator +Store::children_begin(SharedPtr o) const +{ + const_iterator parent = find(o->path()); + assert(parent != end()); + ++parent; + return parent; +} + + +Store::const_iterator +Store::children_end(SharedPtr o) const +{ + const_iterator parent = find(o->path()); + assert(parent != end()); + return find_descendants_end(parent); +} + + +SharedPtr +Store::find_child(SharedPtr parent, const string& child_name) const +{ + const_iterator pi = find(parent->path()); + assert(pi != end()); + const_iterator children_end = find_descendants_end(pi); + const_iterator child = find(pi, children_end, parent->path().base() + child_name); + if (child != end()) + return child->second; + else + return SharedPtr(); +} + + +} // namespace Shared +} // namespace Ingen diff --git a/src/progs/ingen/main.cpp b/src/progs/ingen/main.cpp index b4e930a4..2fe368f7 100644 --- a/src/progs/ingen/main.cpp +++ b/src/progs/ingen/main.cpp @@ -96,6 +96,7 @@ main(int argc, char** argv) world->rdf_world->add_prefix("ingen", "http://drobilla.net/ns/ingen#"); world->rdf_world->add_prefix("ingenuity", "http://drobilla.net/ns/ingenuity#"); world->rdf_world->add_prefix("lv2", "http://lv2plug.in/ns/lv2core#"); + world->rdf_world->add_prefix("lv2_midi", "http://lv2plug.in/ns/ext/midi"); world->rdf_world->add_prefix("rdfs", "http://www.w3.org/2000/01/rdf-schema#"); world->rdf_world->add_prefix("doap", "http://usefulinc.com/ns/doap#"); world->rdf_world->add_prefix("dc", "http://purl.org/dc/elements/1.1/"); -- cgit v1.2.1