summaryrefslogtreecommitdiffstats
path: root/src/uscxml/server/HTTPServer.cpp
diff options
context:
space:
mode:
authorStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2014-01-27 19:30:19 (GMT)
committerStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2014-01-27 19:30:19 (GMT)
commit95c3505e11d22f9a022647b0c7383364682d91de (patch)
tree9c2265bb944ebb872411e7bad7d2b602e62a9704 /src/uscxml/server/HTTPServer.cpp
parente1f59bb39d4722d0693e22b362ba834256f4d79c (diff)
downloaduscxml-95c3505e11d22f9a022647b0c7383364682d91de.zip
uscxml-95c3505e11d22f9a022647b0c7383364682d91de.tar.gz
uscxml-95c3505e11d22f9a022647b0c7383364682d91de.tar.bz2
Bug fixes and thread safety for web sockets
Diffstat (limited to 'src/uscxml/server/HTTPServer.cpp')
-rw-r--r--src/uscxml/server/HTTPServer.cpp29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/uscxml/server/HTTPServer.cpp b/src/uscxml/server/HTTPServer.cpp
index 5066584..eddfe6e 100644
--- a/src/uscxml/server/HTTPServer.cpp
+++ b/src/uscxml/server/HTTPServer.cpp
@@ -489,7 +489,7 @@ void HTTPServer::processByMatchingServlet(evws_connection* conn, const WSFrame&
}
void HTTPServer::reply(const Reply& reply) {
- // we need to reply from the thread calling event_base_dispatch, just add to ist base queue!
+ // we need to reply from the thread calling event_base_dispatch, just add to its base queue!
Reply* replyCB = new Reply(reply);
HTTPServer* INSTANCE = getInstance();
event_base_once(INSTANCE->_base, -1, EV_TIMEOUT, HTTPServer::replyCallback, replyCB, NULL);
@@ -528,6 +528,33 @@ void HTTPServer::replyCallback(evutil_socket_t fd, short what, void *arg) {
delete(reply);
}
+
+void HTTPServer::wsSend(struct evws_connection *conn, enum evws_opcode opcode, const char *data, uint64_t length) {
+ HTTPServer* INSTANCE = getInstance();
+ WSData* sendCB = new WSData(conn, NULL, opcode, data, length);
+ event_base_once(INSTANCE->_base, -1, EV_TIMEOUT, HTTPServer::wsSendCallback, sendCB, NULL);
+}
+
+void HTTPServer::wsBroadcast(const char *uri, enum evws_opcode opcode, const char *data, uint64_t length) {
+ HTTPServer* INSTANCE = getInstance();
+ WSData* sendCB = new WSData(NULL, uri, opcode, data, length);
+ event_base_once(INSTANCE->_base, -1, EV_TIMEOUT, HTTPServer::wsSendCallback, sendCB, NULL);
+
+}
+
+void HTTPServer::wsSendCallback(evutil_socket_t fd, short what, void *arg) {
+ WSData* wsSend = (WSData*)arg;
+ if (wsSend->uri.size() > 0) {
+ evws_broadcast(getInstance()->_evws, wsSend->uri.c_str(), wsSend->opcode, wsSend->data.data(), wsSend->data.length());
+ } else {
+ if (evws_is_valid_connection(getInstance()->_evws, wsSend->conn) > 0) {
+ evws_send_data(wsSend->conn, wsSend->opcode, wsSend->data.data(), wsSend->data.length());
+ }
+ }
+
+ delete wsSend;
+}
+
bool HTTPServer::registerServlet(const std::string& path, HTTPServlet* servlet) {
HTTPServer* INSTANCE = getInstance();