From 26c1290391eb5540d6e2c5f6eceb877e0075d087 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 23 Sep 2009 14:20:58 +0200 Subject: Client: UserListManager client --- src/Client/UserListCommands.cpp | 198 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 src/Client/UserListCommands.cpp (limited to 'src/Client/UserListCommands.cpp') diff --git a/src/Client/UserListCommands.cpp b/src/Client/UserListCommands.cpp new file mode 100644 index 0000000..eb4aee1 --- /dev/null +++ b/src/Client/UserListCommands.cpp @@ -0,0 +1,198 @@ +/* + * UserListCommands.cpp + * + * Copyright (C) 2009 Matthias Schiffer + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along + * with this program. If not, see . + */ + +#include "UserListCommands.h" +#include "Application.h" +#include "Requests/UserLists/UserListListRequest.h" +#include "Requests/UserLists/UserListDownloadRequest.h" +#include "Requests/UserLists/UserListDiffListRequest.h" + +#include +#include +#include + +#include + +namespace Mad { +namespace Client { + +const UserListCommands::Command UserListCommands::commands[] = { + {{"help", "?", 0}, "help [command]", "Display usage information about user list commands", "Display usage information about a user list command. If no command is given, display a list of all available user list commands.", &UserListCommands::helpCommand}, + {{"list", "ls", 0}, "list", "List the stored user lists", "List the stored user lists.", &UserListCommands::listCommand}, + {{"show_list", "sl", 0}, "show_list list", "Displays a user list", "Displays a user list.", &UserListCommands::showListCommand}, + {{0}, 0, 0, 0, 0} +}; + +const UserListCommands::Command* UserListCommands::findCommand(const std::string& command) { + for(int i = 0; commands[i].commands[0] != 0; ++i) { + for(int j = 0; commands[i].commands[j] != 0; ++j) { + if(command == commands[i].commands[j]) { + return &commands[i]; + } + } + } + + return 0; +} + +void UserListCommands::printUsage(const std::string& command) { + const UserListCommands::Command *cmd = findCommand(command); + + if(cmd) + std::cerr << "Usage: " << "user_lists " << cmd->cmdline << std::endl; +} + + +void UserListCommands::helpCommand(CommandParser* /*commandParser*/, const std::vector &args) { + if(args.size() <= 2) { + std::cout << "Available commands:" << std::endl << std::endl; + + for(int i = 0; commands[i].commands[0] != 0; ++i) { + std::cout << commands[i].commands[0]; + + for(int j = 1; commands[i].commands[j] != 0; ++j) + std::cout << ", " << commands[i].commands[j]; + + std::cout << std::endl << "\t" << commands[i].desc << std::endl; + } + } + else if(args.size() == 3) { + const Command* command = findCommand(args[2]); + + if(command) { + std::cout << "Usage: " << "user_lists " << command->cmdline << std::endl << std::endl; + std::cout << command->longdesc << std::endl << std::endl; + } + else + std::cerr << args[0] << " " << args[1] << ": Command '" << args[2] << "' doesn't exist." << std::endl; + } + else { + std::cerr << args[0] << " " << args[1] << ": Too many arguments." << std::endl; + printUsage("help"); + } +} + +void UserListCommands::listCommand(CommandParser *commandParser, const std::vector& /*args*/) { + boost::shared_ptr userListRequest(new Requests::UserLists::UserListListRequest(commandParser->application)); + boost::shared_ptr userListDiffRequest(new Requests::UserLists::UserListDiffListRequest(commandParser->application)); + + commandParser->application->getRequestManager()->sendRequest(commandParser->connection, userListRequest); + commandParser->application->getRequestManager()->sendRequest(commandParser->connection, userListDiffRequest); + + userListRequest->wait(); + userListDiffRequest->wait(); + + std::pair, Core::Exception> userListResult = userListRequest->getResult(); + std::pair, Core::Exception> userListDiffResult = userListDiffRequest->getResult(); + + if(userListResult.second) { + std::cerr << "An error occurred during your request: " << userListResult.second.what() << "." << std::endl; + return; + } + else if(!userListResult.first || !userListDiffResult.first || userListDiffResult.second) { + std::cerr << "An error occurred during your request: " << userListDiffResult.second.what() << "." << std::endl; + return; + } + + const Common::XmlData::List *userLists = userListResult.first->getList("userLists"); + const Common::XmlData::List *userListDiffs = userListDiffResult.first->getList("userListDiffs"); + + if(userLists->isEmpty()) { + std::cout << "There aren't any user lists stored on the server." << std::endl; + } + else { + if(userLists->getSize() == 1) + std::cout << "There is 1 user list stored on the server:" << std::endl; + else + std::cout << "There are " << userLists->getSize() << " user lists stored on the server:" << std::endl; + + for(Common::XmlData::List::const_iterator userList = userLists->begin(); userList != userLists->end(); ++userList) { + std::cout << " " << userList->get("name") << std::endl; + } + } + + std::cout << std::endl; + + if(!userListDiffs->isEmpty()) { + if(userListDiffs->getSize() == 1) + std::cout << "There is 1 user list difference record stored on the server:" << std::endl; + else + std::cout << "There are " << userListDiffs->getSize() << " user list difference records stored on the server:" << std::endl; + + for(Common::XmlData::List::const_iterator diff = userListDiffs->begin(); diff != userListDiffs->end(); ++diff) { + std::cout << " " << diff->get("name") << std::endl; + } + } +} + +void UserListCommands::showListCommand(CommandParser *commandParser, const std::vector &args) { + if(args.size() < 3) { + std::cerr << args[0] << " " << args[1] << ": No list name given." << std::endl; + printUsage("show_list"); + return; + } + else if(args.size() == 3) { + boost::shared_ptr request( + new Requests::UserLists::UserListDownloadRequest(commandParser->application, args[2])); + commandParser->application->getRequestManager()->sendRequest(commandParser->connection, request); + request->wait(); + + std::pair, Core::Exception> result = request->getResult(); + + if(!result.first || result.second) { + std::cerr << "An error occurred during your request: " << result.second.what() << "." << std::endl; + return; + } + + boost::shared_ptr userList = Common::UserLists::Util::deserializeUserList(result.first.get()); + + std::cout << "User list '" << args[2] << "':" << std::endl; + + for(Common::UserLists::UserList::iterator user = userList->begin(); user != userList->end(); ++user) { + std::cout << " " << user->getName() << std::endl; + } + + std::cout << std::endl; + } + else { + std::cerr << args[0] << " " << args[1] << ": Too many arguments." << std::endl; + printUsage("show_list"); + return; + } +} + + +void UserListCommands::userListCommand(CommandParser *commandParser, const std::vector &args) { + std::string cmd; + + if(args.size() < 2) + cmd = "help"; + else + cmd = args[1]; + + const Command* command = findCommand(cmd); + + if(command) + command->function(commandParser, args); + else + std::cerr << args[0] << ": Unknown command '" << cmd << "'." << std::endl; +} + +} +} -- cgit v1.2.3