summaryrefslogtreecommitdiff
path: root/plugins/websocket/websocketsource.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/websocket/websocketsource.cpp')
-rw-r--r--plugins/websocket/websocketsource.cpp90
1 files changed, 68 insertions, 22 deletions
diff --git a/plugins/websocket/websocketsource.cpp b/plugins/websocket/websocketsource.cpp
index 31562015..21de55a4 100644
--- a/plugins/websocket/websocketsource.cpp
+++ b/plugins/websocket/websocketsource.cpp
@@ -42,28 +42,28 @@ double totalTime=0;
double numUpdates=0;
double averageLatency=0;
+static bool doBinary = false;
+
static int lwsWrite(struct libwebsocket *lws, const char* strToWrite, int len)
{
- //std::unique_ptr<char[]> buffer(new char[LWS_SEND_BUFFER_PRE_PADDING + len + LWS_SEND_BUFFER_POST_PADDING]);
-
- //char *buf = buffer.get() + LWS_SEND_BUFFER_PRE_PADDING;
- //strcpy(buf, strToWrite);
-
- return libwebsocket_write(lws, (unsigned char*)strToWrite, len, LWS_WRITE_BINARY);
-}
+ int retval = -1;
-static int lwsWrite(struct libwebsocket *lws, const std::string& strToWrite)
-{
- std::unique_ptr<char[]> buffer(new char[LWS_SEND_BUFFER_PRE_PADDING + strToWrite.length() + LWS_SEND_BUFFER_POST_PADDING]);
+ if(doBinary)
+ {
+ retval = libwebsocket_write(lws, (unsigned char*)strToWrite, len, LWS_WRITE_BINARY);
+ }
+ else
+ {
+ std::unique_ptr<char[]> buffer(new char[LWS_SEND_BUFFER_PRE_PADDING + len + LWS_SEND_BUFFER_POST_PADDING]);
+ char *buf = buffer.get() + LWS_SEND_BUFFER_PRE_PADDING;
+ strcpy(buf, strToWrite);
- char *buf = buffer.get() + LWS_SEND_BUFFER_PRE_PADDING;
- strcpy(buf, strToWrite.c_str());
+ retval = libwebsocket_write(lws, (unsigned char*)buf, len, LWS_WRITE_TEXT);
+ }
- //NOTE: delete[] on buffer is not needed since std::unique_ptr<char[]> is used
- return libwebsocket_write(lws, (unsigned char*)buf, strToWrite.length(), LWS_WRITE_TEXT);
+ return retval;
}
-
static int callback_http_only(libwebsocket_context *context,struct libwebsocket *wsi,enum libwebsocket_callback_reasons reason,void *user, void *in, size_t len);
static struct libwebsocket_protocols protocols[] = {
{
@@ -100,7 +100,12 @@ void WebSocketSource::checkSubscriptions()
reply["data"] = prop.c_str();
reply["transactionid"] = "d293f670-f0b3-11e1-aff1-0800200c9a66";
- QByteArray replystr = QJsonDocument::fromVariant(reply).toBinaryData();
+ QByteArray replystr;
+
+ if(doBinary)
+ replystr = QJsonDocument::fromVariant(reply).toBinaryData();
+ else
+ replystr = QJsonDocument::fromVariant(reply).toJson();
lwsWrite(clientsocket, replystr.data(), replystr.length());
}
@@ -111,6 +116,12 @@ void WebSocketSource::setConfiguration(map<string, string> config)
std::string ip;
int port;
configuration = config;
+
+ if(config.find("binaryProtocol") != config.end())
+ {
+ doBinary = config["binaryProtocol"] == "true";
+ }
+
for (map<string,string>::iterator i=configuration.begin();i!=configuration.end();i++)
{
DebugOut() << __SMALLFILE__ <<":"<< __LINE__ << "Incoming setting for WebSocketSource:" << (*i).first << ":" << (*i).second << "\n";
@@ -253,16 +264,36 @@ static int callback_http_only(libwebsocket_context *context,struct libwebsocket
toSend["name"] = "getSupportedEventTypes";
toSend["transactionid"] = amb::createUuid().c_str();
- QByteArray data = QJsonDocument::fromVariant(toSend).toBinaryData();
+ QByteArray replystr;
+
+ if(doBinary)
+ replystr = QJsonDocument::fromVariant(toSend).toBinaryData();
+ else
+ replystr = QJsonDocument::fromVariant(toSend).toJson();
- lwsWrite(wsi,data.data(),data.length());
+ lwsWrite(wsi,replystr.data(),replystr.length());
break;
}
case LWS_CALLBACK_CLIENT_RECEIVE:
{
QByteArray d((char*)in,len);
- QJsonDocument doc = QJsonDocument::fromBinaryData(d);
+ QJsonDocument doc;
+
+ if(doBinary)
+ doc = QJsonDocument::fromBinaryData(d);
+ else
+ {
+ doc = QJsonDocument::fromJson(d);
+ DebugOut(7)<<d.data()<<endl;
+ }
+
+ if(doc.isNull())
+ {
+ DebugOut(DebugOut::Error)<<"Invalid message"<<endl;
+ break;
+ }
+
QVariantMap call = doc.toVariant().toMap();
string type = call["type"].toString().toStdString();
@@ -516,7 +547,12 @@ void WebSocketSource::getPropertyAsync(AsyncPropertyReply *reply)
replyvar["data"] = data;
replyvar["transactionid"] = uuid.c_str();
- QByteArray replystr = QJsonDocument::fromVariant(replyvar).toBinaryData();
+ QByteArray replystr;
+
+ if(doBinary)
+ replystr = QJsonDocument::fromVariant(replyvar).toBinaryData();
+ else
+ replystr = QJsonDocument::fromVariant(replyvar).toJson();
lwsWrite(clientsocket, replystr.data(), replystr.length());
}
@@ -550,7 +586,12 @@ void WebSocketSource::getRangePropertyAsync(AsyncRangePropertyReply *reply)
replyvar["data"] = properties;
- QByteArray replystr = QJsonDocument::fromVariant(replyvar).toBinaryData();
+ QByteArray replystr;
+
+ if(doBinary)
+ replystr = QJsonDocument::fromVariant(replyvar).toBinaryData();
+ else
+ replystr = QJsonDocument::fromVariant(replyvar).toJson();
lwsWrite(clientsocket, replystr.data(), replystr.length());
}
@@ -571,7 +612,12 @@ AsyncPropertyReply * WebSocketSource::setProperty( AsyncSetPropertyRequest reque
replyvar["data"] = data;
replyvar["transactionid"] = amb::createUuid().c_str();
- QByteArray replystr = QJsonDocument::fromVariant(replyvar).toBinaryData();
+ QByteArray replystr;
+
+ if(doBinary)
+ replystr = QJsonDocument::fromVariant(replyvar).toBinaryData();
+ else
+ replystr = QJsonDocument::fromVariant(replyvar).toJson();
lwsWrite(clientsocket, replystr.data(), replystr.length());