summaryrefslogtreecommitdiff
path: root/src/msgparser.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/msgparser.cc')
-rw-r--r--src/msgparser.cc128
1 files changed, 128 insertions, 0 deletions
diff --git a/src/msgparser.cc b/src/msgparser.cc
new file mode 100644
index 0000000..ec41b3b
--- /dev/null
+++ b/src/msgparser.cc
@@ -0,0 +1,128 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set et sw=2 ts=2: */
+/***************************************************************************
+ * msgparser.cc
+ *
+ * Fri Feb 24 14:59:34 CET 2012
+ * Copyright 2012 Jonas Suhr Christensen
+ * jsc@umbraculum.org
+ ****************************************************************************/
+
+/*
+ * This file is part of Munia.
+ *
+ * Munia is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Munia is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Munia; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#include "msgparser.h"
+#include <stdlib.h>
+#include <stdio.h>
+
+inline void parse_add(msg_t& m, std::string data) {
+ int offset = 0;
+ std::string title = data.substr(offset, data.find(' ', offset) - offset);
+ offset += title.length() + 1;
+ std::string desc = data.substr(offset, data.find(' ', offset) - offset);
+ offset += desc.length() + 1;
+ std::string x_str = data.substr(offset, data.find(' ', offset) - offset);
+ int x = atoi(x_str.c_str());
+ offset += x_str.length() + 1;
+ std::string y_str = data.substr(offset, data.find(' ', offset) - offset);
+ int y = atoi(y_str.c_str());
+
+ sprintf(m.add.title, "%s", desc.c_str());
+ sprintf(m.add.desc, "%s", desc.c_str());
+ m.add.x = x;
+ m.add.y = y;
+}
+
+inline void parse_del(msg_t& m, std::string data) {
+ int offset = 0;
+ std::string id_str = data.substr(offset, data.find(' ', offset) - offset);
+ int id = atoi(id_str.c_str());
+
+ m.del.id = id;
+}
+
+inline void parse_move(msg_t& m, std::string data) {
+ int offset = 1;
+ std::string s_id = data.substr(offset, data.find(' ', offset) - offset);
+ int id = atoi(s_id.c_str());
+ offset += s_id.length() + 1;
+ std::string x_str = data.substr(offset, data.find(' ', offset) - offset);
+ int x = atoi(x_str.c_str());
+ offset += x_str.length() + 1;
+ std::string y_str = data.substr(offset, data.find(' ', offset) - offset);
+ int y = atoi(y_str.c_str());
+
+ m.move.id = id;
+ m.move.x = x;
+ m.move.y = y;
+}
+
+MsgVector parse_msg(std::string data) {
+
+ //todo: explode on ';' and handle '"' and escaping
+
+ printf("parsing: %s\n", data.c_str());
+
+ msg_t m;
+
+ std::string cmd = data.substr(0, data.find(' '));
+
+ if(cmd == "add") m.cmd = cmd::add;
+ else if(cmd == "del") m.cmd = cmd::del;
+ else if(cmd == "move") m.cmd = cmd::move;
+ else if(cmd == "update") m.cmd = cmd::update;
+ else m.cmd = cmd::error;
+
+ data = data.substr(cmd.length()+1, std::string::npos);
+
+ switch(m.cmd) {
+ case cmd::add:
+ parse_add(m, data);
+ break;
+ case cmd::del:
+ parse_del(m, data);
+ break;
+ case cmd::move:
+ parse_move(m, data);
+ break;
+ case cmd::update:
+ break;
+ default:
+ break;
+ }
+
+ MsgVector v; v.push_back(m);
+ return v;
+}
+
+#ifdef TEST_MSGPARSER
+//Additional dependency files
+//deps:
+//Required cflags (autoconf vars may be used)
+//cflags:
+//Required link options (autoconf vars may be used)
+//libs:
+#include "test.h"
+
+TEST_BEGIN;
+
+// TODO: Put some testcode here (see test.h for usable macros).
+TEST_TRUE(false, "No tests yet!");
+
+TEST_END;
+
+#endif/*TEST_MSGPARSER*/