diff options
-rw-r--r-- | src/Client/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/Client/Requests/UserLists/UserListUploadRequest.cpp | 71 | ||||
-rw-r--r-- | src/Client/Requests/UserLists/UserListUploadRequest.h | 51 | ||||
-rw-r--r-- | src/Client/UserListCommands.cpp | 53 |
4 files changed, 167 insertions, 9 deletions
diff --git a/src/Client/CMakeLists.txt b/src/Client/CMakeLists.txt index 30fb722..dda77f3 100644 --- a/src/Client/CMakeLists.txt +++ b/src/Client/CMakeLists.txt @@ -14,6 +14,7 @@ mad_library(Client Requests/UserLists/UserListListRequest.h Requests/UserLists/UserListDownloadRequest.h Requests/UserLists/UserListDownloadRequest.cpp Requests/UserLists/UserListDiffListRequest.h + Requests/UserLists/UserListUploadRequest.h Requests/UserLists/UserListUploadRequest.cpp Application.cpp Application.h CommandParser.cpp CommandParser.h diff --git a/src/Client/Requests/UserLists/UserListUploadRequest.cpp b/src/Client/Requests/UserLists/UserListUploadRequest.cpp new file mode 100644 index 0000000..28251d8 --- /dev/null +++ b/src/Client/Requests/UserLists/UserListUploadRequest.cpp @@ -0,0 +1,71 @@ +/* + * UserListUploadRequest.cpp + * + * Copyright (C) 2009 Matthias Schiffer <matthias@gamezock.de> + * + * 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 <http://www.gnu.org/licenses/>. + */ + +#include "UserListUploadRequest.h" +#include <Common/UserLists/Util.h> + +namespace Mad { +namespace Client { +namespace UserLists { + +void UserListUploadRequest::sendRequest() { + Common::XmlData packet; + packet.setType("UploadUserList"); + packet.set("name", name); + + sendPacket(packet); +} + +void UserListUploadRequest::handlePacket(boost::shared_ptr<const Common::XmlData> packet) { + if(packet->getType() == "Error") { + signalFinished(Core::Exception(packet->get<const Core::String&>("Where"), + static_cast<Core::Exception::ErrorCode>(packet->get<long>("ErrorCode")), + packet->get<long>("SubCode"), packet->get<long>("SubSubCode"))); + return; + } + else if(packet->getType() == "OK") { + if(canceled) { + signalFinished(packet, Core::Exception(Core::Exception::DUPLICATE_ENTRY)); + } + else { + signalFinished(packet); + } + } + else if(packet->getType() != "Continue") { + signalFinished(Core::Exception(Core::Exception::UNEXPECTED_PACKET)); + return; // TODO Logging + } + + if(!overwrite && packet->get<bool>("exists")) { + Common::XmlData ret; + ret.setType("Cancel"); + sendPacket(ret); + canceled = true; + return; + } + + Common::XmlData ret; + ret.setType("UploadUserList"); + Common::UserLists::Util::serializeUserList(userList.get(), &ret); + sendPacket(ret); +} + +} +} +} diff --git a/src/Client/Requests/UserLists/UserListUploadRequest.h b/src/Client/Requests/UserLists/UserListUploadRequest.h new file mode 100644 index 0000000..c270b40 --- /dev/null +++ b/src/Client/Requests/UserLists/UserListUploadRequest.h @@ -0,0 +1,51 @@ +/* + * UserListUploadRequest.h + * + * Copyright (C) 2009 Matthias Schiffer <matthias@gamezock.de> + * + * 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 <http://www.gnu.org/licenses/>. + */ + +#ifndef MAD_COMMON_USERLISTUPLOADREQUEST_H_ +#define MAD_COMMON_USERLISTUPLOADREQUEST_H_ + +#include <Common/Request.h> +#include <Common/UserLists/UserList.h> + +namespace Mad { +namespace Client { + +namespace UserLists { + +class UserListUploadRequest : public Common::Request { + private: + Core::String name; + boost::shared_ptr<const Common::UserLists::UserList> userList; + bool overwrite; + bool canceled; + + protected: + virtual void sendRequest(); + virtual void handlePacket(boost::shared_ptr<const Common::XmlData> packet); + + public: + UserListUploadRequest(Common::Application *application, const Core::String &name0, boost::shared_ptr<const Common::UserLists::UserList> userList0, bool overwrite0 = false) + : Request(application), name(name0), userList(userList0), overwrite(overwrite0), canceled(false) {} +}; + +} +} +} + +#endif /* MAD_COMMON_USERLISTUPLOADREQUEST_H_ */ diff --git a/src/Client/UserListCommands.cpp b/src/Client/UserListCommands.cpp index d602579..581b060 100644 --- a/src/Client/UserListCommands.cpp +++ b/src/Client/UserListCommands.cpp @@ -24,6 +24,7 @@ #include "Requests/UserLists/UserListListRequest.h" #include "Requests/UserLists/UserListDownloadRequest.h" #include "Requests/UserLists/UserListDiffListRequest.h" +#include "Requests/UserLists/UserListUploadRequest.h" #include <Common/RequestManager.h> #include <Common/UserLists/UserList.h> @@ -188,7 +189,7 @@ void UserListCommands::showListCommand(CommandParser *commandParser, const std:: } } -void UserListCommands::importCommand(CommandParser* /*commandParser*/, const std::vector<Core::String> &args) { +void UserListCommands::importCommand(CommandParser *commandParser, const std::vector<Core::String> &args) { if(args.size() < 3) { std::cerr << args[0] << " " << args[1] << ": No filename given." << std::endl; printUsage("import"); @@ -238,9 +239,9 @@ void UserListCommands::importCommand(CommandParser* /*commandParser*/, const std std::cout << std::endl << std::endl; std::cout << "Does the first line of the worksheet contain the column names? (Y/n) " << std::flush; - std::string input; - std::getline(std::cin, input); - if(input.empty() || (input[0] != 'n' && input[0] != 'N')) { + Core::String input = Core::String::getline(std::cin); + input.toLower(); + if(input.isEmpty() || input[0] != 'n') { (*sheet)->useFirstRowAsColumnNames(true); } @@ -248,7 +249,7 @@ void UserListCommands::importCommand(CommandParser* /*commandParser*/, const std printSheet(**sheet, 10); std::cout << std::endl << std ::endl; - Common::UserLists::UserList userList; + boost::shared_ptr<Common::UserLists::UserList> userList(new Common::UserLists::UserList); const std::vector<XLSSheet::RowType> &rows = (*sheet)->getRows(); unsigned id = 1; @@ -264,11 +265,45 @@ void UserListCommands::importCommand(CommandParser* /*commandParser*/, const std entry.setDetail((*sheet)->getColumnName(col), row[col]); } - userList.addUser(entry); + userList->addUser(entry); } - printUserList(userList); - std::cout << std::endl << std ::endl; + bool overwrite = false; + Core::String name; + + while(true) { + if(!overwrite) { + std::cout << "Save the user list as: " << std::flush; + name = Core::String::getline(std::cin); + } + + boost::shared_ptr<UserLists::UserListUploadRequest> request(new UserLists::UserListUploadRequest( + commandParser->application, name, userList, overwrite)); + commandParser->application->getRequestManager()->sendRequest(commandParser->connection, request); + request->wait(); + + std::pair<boost::shared_ptr<const Common::XmlData>, Core::Exception> result = request->getResult(); + if(result.second) { + if(!overwrite && result.second.getErrorCode() == Core::Exception::DUPLICATE_ENTRY) { + std::cout << "There is already a user list stored under that name. Overwrite? (y/N) " << std::flush; + input = Core::String::getline(std::cin); + std::cout << std::endl; + + input.toLower(); + if(!input.isEmpty() && input[0] == 'y') + overwrite = true; + + continue; + } + + std::cerr << "An error occurred during your request: " << result.second.what() << "." << std::endl; + return; + } + + break; + } + + std::cout << "User list stored." << std::endl << std::endl; } catch(Core::Exception e) { std::cerr << "The file can't be read: " << e.what() << "." << std::endl; @@ -416,7 +451,7 @@ void UserListCommands::printPadded(const Core::String &str, boost::int32_t lengt } void UserListCommands::printDelimiter(boost::int32_t length) { - printPadded(Core::String(std::string(length, '-').c_str()), length); + printPadded(Core::String::fromString(std::string(length, '-')), length); } |