summaryrefslogtreecommitdiffstats
path: root/src/client/HTTPClientReceiver.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2009-05-29 03:48:09 +0000
committerDavid Robillard <d@drobilla.net>2009-05-29 03:48:09 +0000
commit90386cd6f49e2e9bfb11e7596ae6ce3ac51dfe16 (patch)
treee9d47b4de18f266691b13d63e58fedcdba398bc4 /src/client/HTTPClientReceiver.cpp
parent5245a25bafec9372d07c346457d473cfa76724df (diff)
downloadingen-90386cd6f49e2e9bfb11e7596ae6ce3ac51dfe16.tar.gz
ingen-90386cd6f49e2e9bfb11e7596ae6ce3ac51dfe16.tar.bz2
ingen-90386cd6f49e2e9bfb11e7596ae6ce3ac51dfe16.zip
Fix reconnecting to engine via various protocols (inferred from user URI) in GUI.
Separate HTTP client receiver and sender sanely. git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@2048 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/client/HTTPClientReceiver.cpp')
-rw-r--r--src/client/HTTPClientReceiver.cpp63
1 files changed, 42 insertions, 21 deletions
diff --git a/src/client/HTTPClientReceiver.cpp b/src/client/HTTPClientReceiver.cpp
index 285e797c..b8229998 100644
--- a/src/client/HTTPClientReceiver.cpp
+++ b/src/client/HTTPClientReceiver.cpp
@@ -30,9 +30,13 @@ using namespace std;
using namespace Raul;
namespace Ingen {
+
using namespace Serialisation;
+
namespace Client {
+static SoupSession* client_session = NULL;
+static HTTPClientReceiver* client_receiver = NULL;
HTTPClientReceiver::HTTPClientReceiver(
Shared::World* world,
@@ -41,15 +45,17 @@ HTTPClientReceiver::HTTPClientReceiver(
: _target(target)
, _world(world)
, _url(url)
- , _session(NULL)
{
start(false);
+ client_receiver = this;
}
HTTPClientReceiver::~HTTPClientReceiver()
{
stop();
+ if (client_receiver == this)
+ client_receiver = NULL;
}
@@ -65,7 +71,7 @@ HTTPClientReceiver::Listener::Listener(HTTPClientReceiver* receiver, const std::
string port_str = uri.substr(uri.find_last_of(":")+1);
int port = atoi(port_str.c_str());
- cout << "HTTP listen URI: " << uri << " port: " << port << endl;
+ cout << "Client HTTP listen: " << uri << " (port " << port << ")" << endl;
struct sockaddr_in servaddr;
@@ -96,6 +102,28 @@ HTTPClientReceiver::Listener::Listener(HTTPClientReceiver* receiver, const std::
}
}
+
+void
+HTTPClientReceiver::send(SoupMessage* msg)
+{
+ if (!client_session)
+ client_session = soup_session_sync_new();
+
+ soup_session_queue_message(client_session, msg, message_callback, client_receiver);
+}
+
+
+void
+HTTPClientReceiver::close_session()
+{
+ if (client_session) {
+ SoupSession* s = client_session;
+ client_session = NULL;
+ soup_session_abort(s);
+ }
+}
+
+
void
HTTPClientReceiver::update(const std::string& str)
{
@@ -134,12 +162,20 @@ HTTPClientReceiver::Listener::_run()
void
HTTPClientReceiver::message_callback(SoupSession* session, SoupMessage* msg, void* ptr)
{
+ if (ptr == NULL)
+ return;
+
HTTPClientReceiver* me = (HTTPClientReceiver*)ptr;
const string path = soup_message_get_uri(msg)->path;
/*cerr << "HTTP MESSAGE " << path << endl;
cerr << msg->response_body->data << endl;*/
+ if (msg->response_body->data == NULL) {
+ cerr << "EMPTY CLIENT MESSAGE" << endl;
+ return;
+ }
+
if (path == Path::root_uri) {
me->_target->response_ok(0);
@@ -199,31 +235,16 @@ HTTPClientReceiver::start(bool dump)
}
}
- _session = soup_session_sync_new();
- SoupMessage* msg;
-
- msg = soup_message_new("GET", _url.c_str());
- soup_session_queue_message(_session, msg, message_callback, this);
-
- msg = soup_message_new("GET", (_url + "/plugins").c_str());
- soup_session_queue_message(_session, msg, message_callback, this);
-
- msg = soup_message_new("GET", (_url + "/patch").c_str());
- soup_session_queue_message(_session, msg, message_callback, this);
-
- msg = soup_message_new("GET", (_url + "/stream").c_str());
- soup_session_queue_message(_session, msg, message_callback, this);
+ SoupMessage* msg = soup_message_new("GET", (_url + "/stream").c_str());
+ soup_session_queue_message(client_session, msg, message_callback, this);
}
void
HTTPClientReceiver::stop()
{
- if (_session != NULL) {
- //unregister_client();
- soup_session_abort(_session);
- _session = NULL;
- }
+ //unregister_client();
+ close_session();
}