summaryrefslogtreecommitdiff
path: root/src/messageparser.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/messageparser.cc')
-rw-r--r--src/messageparser.cc119
1 files changed, 96 insertions, 23 deletions
diff --git a/src/messageparser.cc b/src/messageparser.cc
index 7393c5c..b0a2a6f 100644
--- a/src/messageparser.cc
+++ b/src/messageparser.cc
@@ -30,6 +30,7 @@
#include <list>
#include <vector>
#include <map>
+#include <cassert>
#include <hugin.hpp>
@@ -156,7 +157,8 @@ static nodeid_t getId(std::map<std::string, nodeid_t> &sym, std::string token)
inline static void create_msg_list(MsgTokensList& msgTokensList,
MessageList& msgList,
- bool clientmode)
+ bool clientmode,
+ struct lws* wsi)
{
size_t origin = 0;
if(clientmode)
@@ -174,6 +176,8 @@ inline static void create_msg_list(MsgTokensList& msgTokensList,
//malformed msg
if(t.size() < origin+1)
{
+ msgList.push_back(create_msg_error(ErrorCode::Unknown,
+ "malformed message", wsi));
continue;
}
@@ -192,7 +196,13 @@ inline static void create_msg_list(MsgTokensList& msgTokensList,
else if(t[origin] == "remove") m.cmd = cmd::remove;
else if(t[origin] == "move") m.cmd = cmd::move;
else if(t[origin] == "update") m.cmd = cmd::update;
- else m.cmd = cmd::error;
+ else if(t[origin] == "error") m.cmd = cmd::error;
+ else
+ {
+ msgList.push_back(create_msg_error(ErrorCode::Unknown,
+ "unknown command", wsi));
+ continue;
+ }
switch(m.cmd)
{
@@ -200,7 +210,9 @@ inline static void create_msg_list(MsgTokensList& msgTokensList,
{
if(t.size() != origin+1+1)
{
- DEBUG(msgparser, "Wrong number of parameters\n");
+ msgList.push_back(
+ create_msg_error(ErrorCode::WrongNumberOfArguments,
+ "Wrong number of arguments.", wsi));
continue;
}
m.subscribe.id = getId(sym, t[origin+1]);
@@ -211,7 +223,9 @@ inline static void create_msg_list(MsgTokensList& msgTokensList,
{
if(t.size() != origin+1+1)
{
- DEBUG(msgparser, "Wrong number of parameters\n");
+ msgList.push_back(
+ create_msg_error(ErrorCode::WrongNumberOfArguments,
+ "Wrong number of arguments.", wsi));
continue;
}
m.unsubscribe.id = getId(sym, t[origin+1]);
@@ -223,7 +237,9 @@ inline static void create_msg_list(MsgTokensList& msgTokensList,
{
if(t.size() != origin+1+2)
{
- DEBUG(msgparser, "Wrong number of parameters\n");
+ msgList.push_back(
+ create_msg_error(ErrorCode::WrongNumberOfArguments,
+ "Wrong number of arguments.", wsi));
continue;
}
m.login.user = t[origin+1];
@@ -235,23 +251,27 @@ inline static void create_msg_list(MsgTokensList& msgTokensList,
case cmd::logout:
if(t.size() != origin+1)
{
- DEBUG(msgparser, "Wrong number of parameters\n");
+ msgList.push_back(
+ create_msg_error(ErrorCode::WrongNumberOfArguments,
+ "Wrong number of arguments.", wsi));
continue;
}
break;
+ case cmd::create_with_attributes:
+ // Never sent to the server
+ break;
+
case cmd::create:
{
- if(!clientmode && t.size() != origin+1+2+1)
+ if(t.size() != origin+1+2+1)
{
- DEBUG(msgparser, "Wrong number of parameters\n");
- continue;
- }
- if(clientmode && t.size() != origin+1+2+1)
- {
- DEBUG(msgparser, "Wrong number of parameters\n");
+ msgList.push_back(
+ create_msg_error(ErrorCode::WrongNumberOfArguments,
+ "Wrong number of arguments.", wsi));
continue;
}
+
if(clientmode)
{
m.create.id = getId(sym, t[origin+1]);
@@ -264,23 +284,29 @@ inline static void create_msg_list(MsgTokensList& msgTokensList,
m.create.parentid = getId(sym, t[origin+2]);
m.create.insertbeforeid = getId(sym, t[origin+3]);
}
- break;
}
+ break;
+
case cmd::remove:
{
if(t.size() != origin+1+1)
{
- DEBUG(msgparser, "Wrong number of parameters\n");
+ msgList.push_back(
+ create_msg_error(ErrorCode::WrongNumberOfArguments,
+ "Wrong number of arguments.", wsi));
continue;
}
m.remove.id = getId(sym, t[origin+1]);
}
break;
+
case cmd::move:
{
if(t.size() != origin+2+1+1)
{
- DEBUG(msgparser, "Wrong number of parameters\n");
+ msgList.push_back(
+ create_msg_error(ErrorCode::WrongNumberOfArguments,
+ "Wrong number of arguments.", wsi));
continue;
}
m.move.id = getId(sym, t[origin+1]);
@@ -288,11 +314,14 @@ inline static void create_msg_list(MsgTokensList& msgTokensList,
m.move.insertbeforeid = getId(sym, t[origin+3]);
}
break;
+
case cmd::update:
{
if(t.size() != origin+3+1)
{
- DEBUG(msgparser, "Wrong number of parameters\n");
+ msgList.push_back(
+ create_msg_error(ErrorCode::WrongNumberOfArguments,
+ "Wrong number of arguments.", wsi));
continue;
}
m.update.id = getId(sym, t[origin+1]);
@@ -300,14 +329,27 @@ inline static void create_msg_list(MsgTokensList& msgTokensList,
m.update.value = t[origin+3];
}
break;
- default:
+
+ case cmd::error:
+ {
+ if(t.size() != origin+2+1)
+ {
+ msgList.push_back(
+ create_msg_error(ErrorCode::WrongNumberOfArguments,
+ "Wrong number of arguments.", wsi));
+ continue;
+ }
+ m.error.code = static_cast<ErrorCode>(atoi(t[origin+1].data()));
+ m.error.msg = t[origin+2];
+ }
break;
};
+
msgList.push_back(m);
}
}
-MessageList parse_msg(std::string data)
+MessageList parse_msg(std::string data, struct lws* wsi)
{
DEBUG(msgparser, "Parsing: '%s'\n", data.c_str());
@@ -315,19 +357,19 @@ MessageList parse_msg(std::string data)
parse_into_msg_tokens(data, msgTokensList);
MessageList msgList;
- create_msg_list(msgTokensList, msgList, false);
+ create_msg_list(msgTokensList, msgList, false, wsi);
return msgList;
}
-MessageList parse_msg_client(std::string data)
+MessageList parse_msg_client(std::string data, struct lws* wsi)
{
DEBUG(msgparser, "Parsing: '%s'\n", data.c_str());
MsgTokensList msgTokensList;
parse_into_msg_tokens(data, msgTokensList);
MessageList msgList;
- create_msg_list(msgTokensList, msgList, true);
+ create_msg_list(msgTokensList, msgList, true, wsi);
return msgList;
}
@@ -392,7 +434,18 @@ std::vector<std::string> msg_tostring(message_t m)
m.update.attribute + "\" \"" + m.update.value + "\";";
msgs.push_back(msg);
break;
- default:
+ case cmd::error:
+ msg = "error " +
+ std::to_string(static_cast<int>(m.error.code)) + " \"" +
+ m.error.msg + "\";";
+ msgs.push_back(msg);
+ break;
+ case cmd::login:
+ case cmd::logout:
+ case cmd::subscribe:
+ case cmd::unsubscribe:
+ assert(false);
+ // The server never sends these messages so no need to serialise them.
break;
}
@@ -444,3 +497,23 @@ message_t create_msg_move(nodeid_t id, nodeid_t to, nodeid_t insertbeforeid)
m.move.insertbeforeid = insertbeforeid;
return m;
}
+
+message_t create_msg_error(ErrorCode code, const std::string &msg,
+ struct lws* wsi)
+{
+ message_t m;
+ m.cmd = cmd::error;
+ m.error.wsi = wsi;
+ m.error.code = code;
+ m.error.msg = msg;
+ return m;
+}
+
+message_t create_msg_error(const ErrorMessage &error, struct lws* wsi)
+{
+ message_t m;
+ m.cmd = cmd::error;
+ m.error = error;
+ m.error.wsi = wsi;
+ return m;
+}