summaryrefslogtreecommitdiffstats
path: root/src/Client/CommandParser.cpp
diff options
context:
space:
mode:
authorMatthias Schiffer <matthias@gamezock.de>2008-09-10 03:26:49 +0200
committerMatthias Schiffer <matthias@gamezock.de>2008-09-10 03:26:49 +0200
commit707344b4d161cb5a11e7f78d7622cb7cd1a791f6 (patch)
tree8879f226c610e25fc532d64f40f2fe382e6d8371 /src/Client/CommandParser.cpp
parent8dd9bc2815347435c8f92bb329a0209b50660618 (diff)
downloadmad-707344b4d161cb5a11e7f78d7622cb7cd1a791f6.tar
mad-707344b4d161cb5a11e7f78d7622cb7cd1a791f6.zip
Client erweitert; Status-Befehl angefangen
Diffstat (limited to 'src/Client/CommandParser.cpp')
-rw-r--r--src/Client/CommandParser.cpp116
1 files changed, 116 insertions, 0 deletions
diff --git a/src/Client/CommandParser.cpp b/src/Client/CommandParser.cpp
new file mode 100644
index 0000000..ebf4b2c
--- /dev/null
+++ b/src/Client/CommandParser.cpp
@@ -0,0 +1,116 @@
+/*
+ * CommandParser.cpp
+ *
+ * Copyright (C) 2008 Matthias Schiffer <matthias@gamezock.de>
+ *
+ * This program 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "CommandParser.h"
+#include <Common/Request/CoreStatusRequest.h>
+#include <Common/Request/DisconnectRequest.h>
+
+#include <iostream>
+
+namespace Mad {
+namespace Client {
+
+bool CommandParser::split(const std::string &str, std::vector<std::string> &ret) {
+ std::string temp;
+ bool quoteSingle = false, quoteDouble = false, escape = false;
+
+ size_t beg = 0;
+
+ for(size_t cur = 0; cur < str.length(); ++cur) {
+ if(!escape) {
+ if(str[cur] == ' ' && !quoteSingle && !quoteDouble) {
+ if(cur == beg && temp.empty()) {
+ ++beg;
+ }
+ else {
+ temp += str.substr(beg, cur-beg);
+ ret.push_back(temp);
+ temp.clear();
+ beg = cur+1;
+ }
+
+ continue;
+ }
+
+ if(str[cur] == '"' && !quoteSingle) {
+ temp += str.substr(beg, cur-beg);
+ beg = cur+1;
+
+ quoteDouble = !quoteDouble;
+ continue;
+ }
+ if(str[cur] == '\'' && !quoteDouble) {
+ temp += str.substr(beg, cur-beg);
+ beg = cur+1;
+
+ quoteSingle = !quoteSingle;
+ continue;
+ }
+
+ if(str[cur] == '\\') {
+ escape = true;
+ continue;
+ }
+ }
+
+ if(escape && ((!quoteSingle && !quoteDouble) || (quoteSingle && str[cur] == '\'') || (quoteDouble && (str[cur] == '"' || str[cur] == '\\')))) {
+ temp += str.substr(beg, cur-beg-1);
+ beg = cur;
+ }
+
+ escape = false;
+ }
+
+ temp += str.substr(beg, std::string::npos);
+ ret.push_back(temp);
+
+ return true;
+}
+
+bool CommandParser::parse(const std::string &cmd) {
+ std::vector<std::string> splitCmd;
+
+ split(cmd, splitCmd);
+
+ if(splitCmd.empty())
+ return true;
+
+ if(splitCmd[0] == "quit") {
+ requestDisconnect();
+ }
+ else if(splitCmd[0] == "status") {
+ activeRequests++;
+ Common::Request::CoreStatusRequest::send(connection, *requestManager, sigc::mem_fun(this, &CommandParser::requestFinished));
+ }
+ else {
+ std::cerr << "Unknown command \"" << splitCmd[0] << "\"." << std::endl;
+ }
+
+ return true;
+}
+
+void CommandParser::requestDisconnect() {
+ activeRequests++;
+ disconnect = true;
+
+ Common::Request::DisconnectRequest::send(connection, *requestManager, sigc::mem_fun(this, &CommandParser::requestFinished));
+}
+
+}
+}