From 20b765b8befa32eed913e16d68f03a65459a605d Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 21 Oct 2011 22:29:51 +0000 Subject: Make engine receivers depend only on ServerInterface. git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@3572 a436a847-0d15-0410-975c-d299462d15a1 --- include/ingen/ServerInterface.hpp | 4 +--- src/client/HTTPEngineSender.hpp | 2 +- src/client/OSCEngineSender.hpp | 2 +- src/gui/ConnectWindow.cpp | 4 ++-- src/server/HTTPEngineReceiver.cpp | 22 +++++++--------------- src/server/HTTPEngineReceiver.hpp | 30 +++++++++++++++++++----------- src/server/OSCEngineReceiver.cpp | 21 ++++++--------------- src/server/OSCEngineReceiver.hpp | 27 ++++++++++++--------------- src/server/Request.hpp | 4 ++-- src/server/ServerInterfaceImpl.cpp | 6 ++++-- src/server/ServerInterfaceImpl.hpp | 5 ++--- 11 files changed, 57 insertions(+), 70 deletions(-) diff --git a/include/ingen/ServerInterface.hpp b/include/ingen/ServerInterface.hpp index 1b5fd56d..c779089d 100644 --- a/include/ingen/ServerInterface.hpp +++ b/include/ingen/ServerInterface.hpp @@ -39,7 +39,7 @@ public: virtual Raul::URI uri() const = 0; // Responses - virtual void set_next_response_id(int32_t id) = 0; + virtual void respond_to(ClientInterface* client, int32_t id) = 0; virtual void disable_responses() = 0; // Client registration @@ -47,9 +47,7 @@ public: virtual void unregister_client(const Raul::URI& uri) = 0; // Requests - virtual void ping() = 0; - virtual void get(const Raul::URI& uri) = 0; }; diff --git a/src/client/HTTPEngineSender.hpp b/src/client/HTTPEngineSender.hpp index 9ecf3013..14439e39 100644 --- a/src/client/HTTPEngineSender.hpp +++ b/src/client/HTTPEngineSender.hpp @@ -59,7 +59,7 @@ public: inline int32_t next_id() { int32_t ret = (_id == -1) ? -1 : _id++; return ret; } - void set_next_response_id(int32_t id) { _id = id; } + void respond_to(ClientInterface* client, int32_t id) { _id = id; } void disable_responses() { _id = -1; } void attach(int32_t ping_id, bool block); diff --git a/src/client/OSCEngineSender.hpp b/src/client/OSCEngineSender.hpp index 3aea974e..75569ec0 100644 --- a/src/client/OSCEngineSender.hpp +++ b/src/client/OSCEngineSender.hpp @@ -53,7 +53,7 @@ public: inline int32_t next_id() { int32_t ret = (_id == -1) ? -1 : _id++; return ret; } - void set_next_response_id(int32_t id) { _id = id; } + void respond_to(ClientInterface* client, int32_t id) { _id = id; } void disable_responses() { _id = -1; } void attach(int32_t ping_id, bool block); diff --git a/src/gui/ConnectWindow.cpp b/src/gui/ConnectWindow.cpp index f3987779..9ccdb192 100644 --- a/src/gui/ConnectWindow.cpp +++ b/src/gui/ConnectWindow.cpp @@ -374,7 +374,7 @@ ConnectWindow::gtk_callback() sigc::mem_fun(this, &ConnectWindow::on_response)); _ping_id = abs(rand()) / 2 * 2; // avoid -1 - App::instance().engine()->set_next_response_id(_ping_id); + App::instance().engine()->respond_to(App::instance().client().get(), _ping_id); App::instance().engine()->ping(); if (_widgets_loaded) { @@ -391,7 +391,7 @@ ConnectWindow::gtk_callback() const float ms_since_last = (now.tv_sec - last.tv_sec) * 1000.0f + (now.tv_usec - last.tv_usec) * 0.001f; if (ms_since_last > 1000) { - App::instance().engine()->set_next_response_id(_ping_id); + App::instance().engine()->respond_to(App::instance().client().get(), _ping_id); App::instance().engine()->ping(); last = now; } diff --git a/src/server/HTTPEngineReceiver.cpp b/src/server/HTTPEngineReceiver.cpp index 69859ad2..a7b4ee1f 100644 --- a/src/server/HTTPEngineReceiver.cpp +++ b/src/server/HTTPEngineReceiver.cpp @@ -27,18 +27,16 @@ #include "raul/log.hpp" #include "ingen/ClientInterface.hpp" -#include "ingen/shared/Module.hpp" +#include "ingen/ServerInterface.hpp" #include "ingen/serialisation/Parser.hpp" #include "ingen/serialisation/Serialiser.hpp" +#include "ingen/shared/Module.hpp" +#include "ingen/shared/Store.hpp" #include "ClientBroadcaster.hpp" #include "Engine.hpp" -#include "EngineStore.hpp" -#include "EventSource.hpp" #include "HTTPClientSender.hpp" #include "HTTPEngineReceiver.hpp" -#include "ServerInterfaceImpl.hpp" -#include "ThreadManager.hpp" #define LOG(s) s << "[HTTPEngineReceiver] " @@ -51,9 +49,9 @@ using namespace Serialisation; namespace Server { -HTTPEngineReceiver::HTTPEngineReceiver(Engine& engine, - SharedPtr interface, - uint16_t port) +HTTPEngineReceiver::HTTPEngineReceiver(Engine& engine, + SharedPtr interface, + uint16_t port) : _engine(engine) , _interface(interface) , _server(soup_server_new(SOUP_SERVER_PORT, port, NULL)) @@ -67,8 +65,6 @@ HTTPEngineReceiver::HTTPEngineReceiver(Engine& engine, if (!engine.world()->parser() || !engine.world()->serialiser()) engine.world()->load_module("serialisation"); - _interface->set_name("HTTPEngineReceiver"); - _interface->start(); _receive_thread->set_name("HTTPEngineReceiver Listener"); _receive_thread->start(); } @@ -76,7 +72,6 @@ HTTPEngineReceiver::HTTPEngineReceiver(Engine& engine, HTTPEngineReceiver::~HTTPEngineReceiver() { _receive_thread->stop(); - _interface->stop(); delete _receive_thread; if (_server) { @@ -94,7 +89,7 @@ HTTPEngineReceiver::message_callback(SoupServer* server, void* data) { HTTPEngineReceiver* me = (HTTPEngineReceiver*)data; - ServerInterfaceImpl* interface = me->_interface.get(); + ServerInterface* interface = me->_interface.get(); using namespace Ingen::Shared; @@ -221,9 +216,6 @@ HTTPEngineReceiver::message_callback(SoupServer* server, } } -/** Override the semaphore driven _run method of ServerInterfaceImpl - * to wait on HTTP requests and process them immediately in this thread. - */ void HTTPEngineReceiver::ReceiveThread::_run() { diff --git a/src/server/HTTPEngineReceiver.hpp b/src/server/HTTPEngineReceiver.hpp index 9e38a0f0..e17efe05 100644 --- a/src/server/HTTPEngineReceiver.hpp +++ b/src/server/HTTPEngineReceiver.hpp @@ -29,23 +29,27 @@ typedef struct _SoupMessage SoupMessage; typedef struct SoupClientContext SoupClientContext; namespace Ingen { + +class ServerInterface; + namespace Server { -class ServerInterfaceImpl; class Engine; class HTTPEngineReceiver { public: - HTTPEngineReceiver(Engine& engine, - SharedPtr interface, - uint16_t port); + HTTPEngineReceiver(Engine& engine, + SharedPtr interface, + uint16_t port); ~HTTPEngineReceiver(); private: struct ReceiveThread : public Raul::Thread { - explicit ReceiveThread(HTTPEngineReceiver& receiver) : _receiver(receiver) {} + explicit ReceiveThread(HTTPEngineReceiver& receiver) + : _receiver(receiver) + {} virtual void _run(); private: HTTPEngineReceiver& _receiver; @@ -53,13 +57,17 @@ private: friend class ReceiveThread; - static void message_callback(SoupServer* server, SoupMessage* msg, const char* path, - GHashTable *query, SoupClientContext* client, void* data); + static void message_callback(SoupServer* server, + SoupMessage* msg, + const char* path, + GHashTable *query, + SoupClientContext* client, + void* data); - Engine& _engine; - SharedPtr _interface; - ReceiveThread* _receive_thread; - SoupServer* _server; + Engine& _engine; + SharedPtr _interface; + ReceiveThread* _receive_thread; + SoupServer* _server; }; } // namespace Server diff --git a/src/server/OSCEngineReceiver.cpp b/src/server/OSCEngineReceiver.cpp index 3151255c..6c462d7a 100644 --- a/src/server/OSCEngineReceiver.cpp +++ b/src/server/OSCEngineReceiver.cpp @@ -57,9 +57,9 @@ namespace Server { * See the "Client OSC Namespace Documentation" for details.

*/ -OSCEngineReceiver::OSCEngineReceiver(Engine& engine, - SharedPtr interface, - uint16_t port) +OSCEngineReceiver::OSCEngineReceiver(Engine& engine, + SharedPtr interface, + uint16_t port) : _engine(engine) , _interface(interface) , _server(NULL) @@ -190,19 +190,10 @@ OSCEngineReceiver::set_response_address_cb(const char* path, const char* types, const lo_address addr = lo_message_get_source(msg); char* const url = lo_address_get_url(addr); - const SharedPtr r = me->_interface->request(); - - /* Different address than last time, have to do a lookup */ - if (!r || !r->client() || strcmp(url, r->client()->uri().c_str())) { - ClientInterface* client = me->_engine.broadcaster()->client(url); - Request* req = (client) - ? new Request(client, id) - : new Request(); - me->_interface->set_request(SharedPtr(req)); - } - if (id != -1) { - me->_interface->set_next_response_id(id); + // TODO: Cache client + ClientInterface* client = me->_engine.broadcaster()->client(url); + me->_interface->respond_to(client, id); } else { me->_interface->disable_responses(); } diff --git a/src/server/OSCEngineReceiver.hpp b/src/server/OSCEngineReceiver.hpp index 66e0542a..fe16ac1a 100644 --- a/src/server/OSCEngineReceiver.hpp +++ b/src/server/OSCEngineReceiver.hpp @@ -23,16 +23,19 @@ #include #include "raul/Thread.hpp" +#include "raul/URI.hpp" + +#include "ingen/Resource.hpp" -#include "Request.hpp" #include "ingen-config.h" namespace Ingen { +class ServerInterface; + namespace Server { class Engine; -class ServerInterfaceImpl; /* Some boilerplate killing macros... */ #define LO_HANDLER_ARGS const char* path, const char* types, lo_arg** argv, int argc, lo_message msg @@ -47,22 +50,16 @@ inline static int name##_cb(LO_HANDLER_ARGS, void* myself)\ /* FIXME: Make this receive and preprocess in the same thread? */ -/** Receives OSC messages from liblo. - * - * This inherits from ServerInterfaceImpl and calls it's own functions - * via OSC. It's not actually a directly callable ServerInterface (it's - * callable via OSC...) so it should be implemented-as-a (privately inherit) - * ServerInterfaceImpl, but it needs to be public so it's an EventSource - * the Driver can use. This probably should be fixed somehow.. +/** Receive OSC messages and call interface functions. * * \ingroup engine */ class OSCEngineReceiver { public: - OSCEngineReceiver(Engine& engine, - SharedPtr interface, - uint16_t port); + OSCEngineReceiver(Engine& engine, + SharedPtr interface, + uint16_t port); ~OSCEngineReceiver(); @@ -122,9 +119,9 @@ private: LO_HANDLER(set_property); LO_HANDLER(property_set); - Engine& _engine; - SharedPtr _interface; - lo_server _server; + Engine& _engine; + SharedPtr _interface; + lo_server _server; }; } // namespace Server diff --git a/src/server/Request.hpp b/src/server/Request.hpp index 98c224ad..49546b7f 100644 --- a/src/server/Request.hpp +++ b/src/server/Request.hpp @@ -45,8 +45,8 @@ public: , _id(id) {} - int32_t id() const { return _id; } - void set_id(int32_t id) { _id = id; } + int32_t id() const { return _id; } + void set_id(int32_t id) { _id = id; } ClientInterface* client() const { return _client; } void set_client(ClientInterface* client) { _client = client; } diff --git a/src/server/ServerInterfaceImpl.cpp b/src/server/ServerInterfaceImpl.cpp index fcf9cc00..bc9e56c4 100644 --- a/src/server/ServerInterfaceImpl.cpp +++ b/src/server/ServerInterfaceImpl.cpp @@ -60,10 +60,12 @@ ServerInterfaceImpl::now() const } void -ServerInterfaceImpl::set_next_response_id(int32_t id) +ServerInterfaceImpl::respond_to(ClientInterface* client, int32_t id) { - if (_request) + if (_request) { + _request->set_client(client); _request->set_id(id); + } } void diff --git a/src/server/ServerInterfaceImpl.hpp b/src/server/ServerInterfaceImpl.hpp index 1afbafce..ba96d051 100644 --- a/src/server/ServerInterfaceImpl.hpp +++ b/src/server/ServerInterfaceImpl.hpp @@ -53,7 +53,8 @@ public: Raul::URI uri() const { return "http://drobilla.net/ns/ingen#internal"; } - void set_next_response_id(int32_t id); + virtual void respond_to(ClientInterface* client, int32_t id); + virtual void disable_responses(); // Client registration virtual void register_client(ClientInterface* client); @@ -100,8 +101,6 @@ public: SharedPtr request() { return _request; } void set_request(SharedPtr r) { _request = r; } - virtual void disable_responses(); - protected: SharedPtr _request; ///< NULL if responding disabled Engine& _engine; -- cgit v1.2.1