From 707344b4d161cb5a11e7f78d7622cb7cd1a791f6 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 10 Sep 2008 03:26:49 +0200 Subject: Client erweitert; Status-Befehl angefangen --- src/madc.cpp | 51 ++++++++++++++++++++++++--------------------------- 1 file changed, 24 insertions(+), 27 deletions(-) (limited to 'src/madc.cpp') diff --git a/src/madc.cpp b/src/madc.cpp index af39f2d..f7dc143 100644 --- a/src/madc.cpp +++ b/src/madc.cpp @@ -21,7 +21,7 @@ #include "Net/IPAddress.h" #include "Common/RequestManager.h" #include "Common/Util.h" -#include "Client/RequestProcessor.h" +#include "Client/CommandParser.h" #include #include @@ -32,38 +32,36 @@ #include -static Mad::Client::RequestProcessor *processor; +static Mad::Client::CommandParser *parser; +static struct pollfd fds[2]; + static void usage(const std::string &cmd) { std::cerr << "Usage: " << cmd << " address[:port]" << std::endl; } static void handleCommand(char *cmd) { - if(!cmd) { - processor->requestDisconnect(); - rl_callback_handler_remove(); - + if(!cmd) + parser->requestDisconnect(); + else if(!*cmd) return; + else { + parser->parse(cmd); + add_history(cmd); } - if(!*cmd) - return; - - std::vector splitCmd = Mad::Common::Util::split(cmd); - - if(splitCmd.empty()) - return; - - if(splitCmd[0] == "quit") { - processor->requestDisconnect(); - + if(parser->requestsActive()) { rl_callback_handler_remove(); + fds[0].events = 0; } - else { - std::cerr << "Unknown command \"" << splitCmd[0] << "\"." << std::endl; - } +} + +static void activateReadline() { + if(parser->willDisconnect()) + return; - add_history(cmd); + rl_callback_handler_install("mad: ", handleCommand); + fds[0].events = POLLIN; } int main(int argc, char *argv[]) { @@ -93,26 +91,25 @@ int main(int argc, char *argv[]) { requestManager.registerConnection(connection); - processor = new Mad::Client::RequestProcessor(&requestManager, connection); + parser = new Mad::Client::CommandParser(&requestManager, connection); + parser->signalFinished().connect(sigc::ptr_fun(activateReadline)); - struct pollfd fds[2]; fds[0].fd = STDIN_FILENO; - fds[0].events = POLLIN; - rl_callback_handler_install("mad: ", handleCommand); + activateReadline(); while(connection->isConnected()) { fds[1] = connection->getPollfd(); if(poll(fds, 2, 10000) > 0) { - if(fds[0].revents) + if(fds[0].revents & POLLIN) rl_callback_read_char(); connection->sendReceive(fds[1].revents); } } - delete processor; + delete parser; requestManager.unregisterConnection(connection); } -- cgit v1.2.3