summaryrefslogtreecommitdiff
path: root/src/messageparser.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/messageparser.cc')
-rw-r--r--src/messageparser.cc599
1 files changed, 329 insertions, 270 deletions
diff --git a/src/messageparser.cc b/src/messageparser.cc
index 55cfe34..d59cccc 100644
--- a/src/messageparser.cc
+++ b/src/messageparser.cc
@@ -39,306 +39,365 @@
typedef std::vector<std::string> TokenVector;
typedef std::list<TokenVector> MsgTokensList;
-inline static void parse_into_msg_tokens(std::string& data,
- MsgTokensList& msgTokensList) {
- TokenVector tokenVector;
- std::string token;
- bool inside_quote = false;
- char prev_ch = '0';
- for(size_t i = 0; i < data.length(); i++) {
- char ch = data[i];
-
- switch(ch) {
- case '\"':
- if(prev_ch != '\\') {
- inside_quote = !inside_quote;
- } else {
- token += ch;
- }
- break;
- case ' ':
- if(inside_quote) {
- DEBUG(msgparser, "Appending %c\n", ch);
- token += ch;
- } else {
- if(token.empty()) continue; // skip multiple white spaces and pre white space
- DEBUG(msgparser, "Adding token %s\n", token.c_str());
- tokenVector.push_back(token);
- token.clear();
- }
- break;
- case ';':
- if(inside_quote) {
- token += ch;
- } else {
- tokenVector.push_back(token);
- msgTokensList.push_back(tokenVector);
- tokenVector.clear();
- token.clear();
- }
- break;
- default:
- token += ch;
- break;
- }
- prev_ch = ch;
- }
-
- if(token != "") {
- tokenVector.push_back(token);
- token.clear();
- }
-
- if(!tokenVector.empty()) {
- msgTokensList.push_back(tokenVector);
- tokenVector.clear();
- }
-
- /* // WARNING: Enabling this will print passwords in plaintext...
- // Debug: print tokens
- DEBUG(parser, "tokenlists: %d\n", msgTokensList.size());
- MsgTokensList::iterator j = msgTokensList.begin();
- while(j != msgTokensList.end()) {
- DEBUG(parser, " tokens: %d\n", j->size());
- int idx = 0;
- TokenVector::iterator i = j->begin();
- while(i != j->end()) {
- DEBUG(parser, " token[%d]: '%s'\n", idx++, i->c_str());
- i++;
- }
- j++;
- }
- */
+inline static void parse_into_msg_tokens(std::string& data,
+ MsgTokensList& msgTokensList)
+{
+ TokenVector tokenVector;
+ std::string token;
+ bool inside_quote = false;
+ char prev_ch = '0';
+ for(size_t i = 0; i < data.length(); i++)
+ {
+ char ch = data[i];
+
+ switch(ch)
+ {
+ case '\"':
+ if(prev_ch != '\\')
+ {
+ inside_quote = !inside_quote;
+ }
+ else
+ {
+ token += ch;
+ }
+ break;
+ case ' ':
+ if(inside_quote)
+ {
+ DEBUG(msgparser, "Appending %c\n", ch);
+ token += ch;
+ }
+ else
+ {
+ if(token.empty())
+ {
+ continue; // skip multiple white spaces and pre white space
+ }
+ DEBUG(msgparser, "Adding token %s\n", token.c_str());
+ tokenVector.push_back(token);
+ token.clear();
+ }
+ break;
+ case ';':
+ if(inside_quote)
+ {
+ token += ch;
+ }
+ else
+ {
+ tokenVector.push_back(token);
+ msgTokensList.push_back(tokenVector);
+ tokenVector.clear();
+ token.clear();
+ }
+ break;
+ default:
+ token += ch;
+ break;
+ }
+ prev_ch = ch;
+ }
+
+ if(token != "")
+ {
+ tokenVector.push_back(token);
+ token.clear();
+ }
+
+ if(!tokenVector.empty())
+ {
+ msgTokensList.push_back(tokenVector);
+ tokenVector.clear();
+ }
+
+ //// WARNING: Enabling this will print passwords in plaintext...
+ //// Debug: print tokens
+ //DEBUG(parser, "tokenlists: %d\n", msgTokensList.size());
+ //MsgTokensList::iterator j = msgTokensList.begin();
+ //while(j != msgTokensList.end())
+ //{
+ // DEBUG(parser, " tokens: %d\n", j->size());
+ // int idx = 0;
+ // TokenVector::iterator i = j->begin();
+ // while(i != j->end())
+ // {
+ // DEBUG(parser, " token[%d]: '%s'\n", idx++, i->c_str());
+ // i++;
+ // }
+ // j++;
+ //}
+
}
static taskid_t getId(std::map<std::string, taskid_t> &sym, std::string token)
{
- bool isnumeric = true;
- for(size_t i = 0; i < token.size(); i++) {
- isnumeric &= (token[i] >= '0' && token[i] <= '9');
- }
-
- DEBUG(getid, "======= %d %s\n", isnumeric, token.c_str());
-
- if(isnumeric) {
- taskid_t id = atoi(token.c_str());
- DEBUG(getid, "======= id: %d\n", id);
- return id;
- }
-
- if(sym.find(token) == sym.end()) sym[token] = task_manager.createId();
- return sym[token];
+ bool isnumeric = true;
+ for(size_t i = 0; i < token.size(); i++)
+ {
+ isnumeric &= (token[i] >= '0' && token[i] <= '9');
+ }
+
+ DEBUG(getid, "======= %d %s\n", isnumeric, token.c_str());
+
+ if(isnumeric)
+ {
+ taskid_t id = atoi(token.c_str());
+ DEBUG(getid, "======= id: %d\n", id);
+ return id;
+ }
+
+ if(sym.find(token) == sym.end())
+ {
+ sym[token] = task_manager.createId();
+ }
+
+ return sym[token];
}
inline static void create_msg_list(MsgTokensList& msgTokensList,
MessageList& msgList,
- bool clientmode) {
- size_t origin = 0;
- if(clientmode) {
- origin = 1;
- }
+ bool clientmode)
+{
+ size_t origin = 0;
+ if(clientmode)
+ {
+ origin = 1;
+ }
+
+ std::map<std::string, taskid_t> sym;
- std::map<std::string, taskid_t> sym;
+ MsgTokensList::iterator it_msg;
+ for(it_msg = msgTokensList.begin(); it_msg != msgTokensList.end(); it_msg++)
+ {
+ TokenVector t = *it_msg;
- MsgTokensList::iterator it_msg;
- for(it_msg = msgTokensList.begin(); it_msg != msgTokensList.end(); it_msg++) {
- TokenVector t = *it_msg;
+ //malformed msg
+ if(t.size() < origin+1)
+ {
+ continue;
+ }
- //malformed msg
- if(t.size() < origin+1) continue;
-
- message_t m;
+ message_t m;
- DEBUG(msgparser, "t[%d] : %s, running in clientmode: %d\n",
- (int)origin, t[origin].c_str(), clientmode);
+ DEBUG(msgparser, "t[%d] : %s, running in clientmode: %d\n",
+ (int)origin, t[origin].c_str(), clientmode);
// DEBUG(msgparser, "%d\n", t.size());
- if(t[origin] == "observe") m.cmd = cmd::observe;
- else if(t[origin] == "unobserve") m.cmd = cmd::unobserve;
- else if(t[origin] == "login") m.cmd = cmd::login;
- else if(t[origin] == "logout") m.cmd = cmd::logout;
- else if(t[origin] == "create") m.cmd = cmd::create;
- 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;
-
- switch(m.cmd) {
- case cmd::observe: {
- if(t.size() != origin+1+1) {
- DEBUG(msgparser, "Wrong number of parameters\n");
- continue;
- }
- m.observe.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str());
- break;
- }
- case cmd::unobserve: {
- if(t.size() != origin+1+1) {
- DEBUG(msgparser, "Wrong number of parameters\n");
- continue;
- }
- m.unobserve.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str());
- DEBUG(msgparser, "unobserve @ %d\n", m.unobserve.id);
- break;
- }
- case cmd::login: {
- if(t.size() != origin+1+2) {
- DEBUG(msgparser, "Wrong number of parameters\n");
- continue;
- }
- m.login.user = t[origin+1];
- m.login.password = t[origin+2];
- DEBUG(msgparser, "login %s\n", m.login.user.c_str());
- break;
- }
- case cmd::logout:
- if(t.size() != origin+1) {
- DEBUG(msgparser, "Wrong number of parameters\n");
- continue;
- }
- break;
- case cmd::create: {
- if(!clientmode && t.size() != origin+1+2) {
- DEBUG(msgparser, "Wrong number of parameters\n");
- continue;
- }
- if(clientmode && t.size() != origin+1+2) {
- DEBUG(msgparser, "Wrong number of parameters\n");
- continue;
- }
- if(clientmode) {
- m.create.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str());
- m.create.parentid = getId(sym, t[origin+2]);// atoi(t[origin+2].c_str());
- }
- else {
- m.create.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str());
- m.create.parentid = getId(sym, t[origin+2]);//atoi(t[origin+1].c_str());
- }
- break;
- }
- case cmd::remove: {
- if(t.size() != origin+1+1) {
- DEBUG(msgparser, "Wrong number of parameters\n");
- continue;
- }
- m.remove.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str());
- break;
- }
- case cmd::move: {
- if(t.size() != origin+2+1) {
- DEBUG(msgparser, "Wrong number of parameters\n");
- continue;
- }
- m.move.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str());
- m.move.parentid = getId(sym, t[origin+2]);//atoi(t[origin+2].c_str());
- break;
- }
- case cmd::update: {
- if(t.size() != origin+3+1) {
- DEBUG(msgparser, "Wrong number of parameters\n");
- continue;
- }
- m.update.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str());
- m.update.name = t[origin+2];
- m.update.value = t[origin+3];
- break;
- }
- default:
- break;
- };
- msgList.push_back(m);
- }
+ if(t[origin] == "observe") m.cmd = cmd::observe;
+ else if(t[origin] == "unobserve") m.cmd = cmd::unobserve;
+ else if(t[origin] == "login") m.cmd = cmd::login;
+ else if(t[origin] == "logout") m.cmd = cmd::logout;
+ else if(t[origin] == "create") m.cmd = cmd::create;
+ 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;
+
+ switch(m.cmd)
+ {
+ case cmd::observe:
+ {
+ if(t.size() != origin+1+1)
+ {
+ DEBUG(msgparser, "Wrong number of parameters\n");
+ continue;
+ }
+ m.observe.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str());
+ }
+ break;
+
+ case cmd::unobserve:
+ {
+ if(t.size() != origin+1+1)
+ {
+ DEBUG(msgparser, "Wrong number of parameters\n");
+ continue;
+ }
+ m.unobserve.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str());
+ DEBUG(msgparser, "unobserve @ %d\n", m.unobserve.id);
+ }
+ break;
+
+ case cmd::login:
+ {
+ if(t.size() != origin+1+2)
+ {
+ DEBUG(msgparser, "Wrong number of parameters\n");
+ continue;
+ }
+ m.login.user = t[origin+1];
+ m.login.password = t[origin+2];
+ DEBUG(msgparser, "login %s\n", m.login.user.c_str());
+ }
+ break;
+
+ case cmd::logout:
+ if(t.size() != origin+1)
+ {
+ DEBUG(msgparser, "Wrong number of parameters\n");
+ continue;
+ }
+ break;
+
+ case cmd::create:
+ {
+ if(!clientmode && t.size() != origin+1+2)
+ {
+ DEBUG(msgparser, "Wrong number of parameters\n");
+ continue;
+ }
+ if(clientmode && t.size() != origin+1+2)
+ {
+ DEBUG(msgparser, "Wrong number of parameters\n");
+ continue;
+ }
+ if(clientmode)
+ {
+ m.create.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str());
+ m.create.parentid = getId(sym, t[origin+2]);// atoi(t[origin+2].c_str());
+ }
+ else
+ {
+ m.create.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str());
+ m.create.parentid = getId(sym, t[origin+2]);//atoi(t[origin+1].c_str());
+ }
+ break;
+ }
+ case cmd::remove:
+ {
+ if(t.size() != origin+1+1)
+ {
+ DEBUG(msgparser, "Wrong number of parameters\n");
+ continue;
+ }
+ m.remove.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str());
+ }
+ break;
+ case cmd::move:
+ {
+ if(t.size() != origin+2+1)
+ {
+ DEBUG(msgparser, "Wrong number of parameters\n");
+ continue;
+ }
+ m.move.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str());
+ m.move.parentid = getId(sym, t[origin+2]);//atoi(t[origin+2].c_str());
+ }
+ break;
+ case cmd::update:
+ {
+ if(t.size() != origin+3+1)
+ {
+ DEBUG(msgparser, "Wrong number of parameters\n");
+ continue;
+ }
+ m.update.id = getId(sym, t[origin+1]);//atoi(t[origin+1].c_str());
+ m.update.name = t[origin+2];
+ m.update.value = t[origin+3];
+ }
+ break;
+ default:
+ break;
+ };
+ msgList.push_back(m);
+ }
}
-MessageList parse_msg(std::string data) {
- DEBUG(msgparser, "Parsing: '%s'\n", data.c_str());
+MessageList parse_msg(std::string data)
+{
+ DEBUG(msgparser, "Parsing: '%s'\n", data.c_str());
+
+ MsgTokensList msgTokensList;
+ parse_into_msg_tokens(data, msgTokensList);
- MsgTokensList msgTokensList;
- parse_into_msg_tokens(data, msgTokensList);
-
- MessageList msgList;
- create_msg_list(msgTokensList, msgList, false);
-
- return msgList;
+ MessageList msgList;
+ create_msg_list(msgTokensList, msgList, false);
+
+ return msgList;
}
-MessageList parse_msg_client(std::string data) {
- DEBUG(msgparser, "Parsing: '%s'\n", data.c_str());
- MsgTokensList msgTokensList;
- parse_into_msg_tokens(data, msgTokensList);
-
- MessageList msgList;
- create_msg_list(msgTokensList, msgList, true);
-
- return msgList;
+MessageList parse_msg_client(std::string data)
+{
+ DEBUG(msgparser, "Parsing: '%s'\n", data.c_str());
+ MsgTokensList msgTokensList;
+ parse_into_msg_tokens(data, msgTokensList);
+
+ MessageList msgList;
+ create_msg_list(msgTokensList, msgList, true);
+
+ return msgList;
}
-std::string msg_tostring(message_t m) {
- char* buf = NULL;
- switch(m.cmd) {
- case cmd::create: {
- asprintf(&buf, "create %d %d;",
- m.create.id,
- m.create.parentid);
- break;
- }
- case cmd::remove: {
- asprintf(&buf, "remove %d;", m.remove.id);
- break;
- }
- case cmd::move: {
- asprintf(&buf, "move %d %d;", m.move.id, m.move.parentid);
- break;
- }
- case cmd::update: {
- asprintf(&buf, "update %d \"%s\" \"%s\";",
- m.update.id, m.update.name.c_str(), m.update.value.c_str());
- break;
- };
- default:
- break;
- }
-
- std::string r;
- if(buf) {
- r = buf;
- free(buf);
- }
-
- return r;
+std::string msg_tostring(message_t m)
+{
+ char* buf = NULL;
+ switch(m.cmd)
+ {
+ case cmd::create:
+ asprintf(&buf, "create %d %d;",
+ m.create.id,
+ m.create.parentid);
+ break;
+ case cmd::remove:
+ asprintf(&buf, "remove %d;", m.remove.id);
+ break;
+ case cmd::move:
+ asprintf(&buf, "move %d %d;", m.move.id, m.move.parentid);
+ break;
+ case cmd::update:
+ asprintf(&buf, "update %d \"%s\" \"%s\";",
+ m.update.id, m.update.name.c_str(), m.update.value.c_str());
+ break;
+ default:
+ break;
+ }
+
+ std::string r;
+ if(buf)
+ {
+ r = buf;
+ free(buf);
+ }
+
+ return r;
}
-message_t create_msg_create(task_t t) {
- message_t m;
- m.cmd = cmd::create;
- m.create.id = t.id;
- m.create.parentid = t.parentid;
- return m;
+message_t create_msg_create(task_t t)
+{
+ message_t m;
+ m.cmd = cmd::create;
+ m.create.id = t.id;
+ m.create.parentid = t.parentid;
+ return m;
}
-message_t create_msg_update(task_t t, const std::string &attr) {
- message_t m;
- m.cmd = cmd::update;
- m.update.id = t.id;
- m.update.name = attr;
- m.update.value = t.attributes[attr];
- return m;
+message_t create_msg_update(task_t t, const std::string &attr)
+{
+ message_t m;
+ m.cmd = cmd::update;
+ m.update.id = t.id;
+ m.update.name = attr;
+ m.update.value = t.attributes[attr];
+ return m;
}
-message_t create_msg_remove(task_t t) {
- message_t m;
- m.cmd = cmd::remove;
- m.remove.id = t.id;
- return m;
+message_t create_msg_remove(task_t t)
+{
+ message_t m;
+ m.cmd = cmd::remove;
+ m.remove.id = t.id;
+ return m;
}
-message_t create_msg_move(taskid_t id, taskid_t to) {
- message_t m;
- m.cmd = cmd::move;
- m.move.id = id;
- m.move.parentid = to;
- return m;
+message_t create_msg_move(taskid_t id, taskid_t to)
+{
+ message_t m;
+ m.cmd = cmd::move;
+ m.move.id = id;
+ m.move.parentid = to;
+ return m;
}
#ifdef TEST_MSGPARSER