common/Protocol.cpp | 109 +++++++++++++++++++++++----------------------------- common/Protocol.hpp | 9 +++- 2 files changed, 57 insertions(+), 61 deletions(-)
New commits: commit cd85d8a7f13f21e69ca17f792079dd96fa3c8325 Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Mon Jan 30 20:43:27 2017 -0500 wsd: improved protocol helpers Change-Id: I434fd9d6bb3248a8b9c27bb6c8565369c95786b5 Reviewed-on: https://gerrit.libreoffice.org/33860 Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> Tested-by: Ashod Nakashian <ashnak...@gmail.com> diff --git a/common/Protocol.cpp b/common/Protocol.cpp index a6a24b9..030517c 100644 --- a/common/Protocol.cpp +++ b/common/Protocol.cpp @@ -74,85 +74,67 @@ namespace LOOLProtocol bool getTokenInteger(const std::string& token, const std::string& name, int& value) { - size_t nextIdx; - try - { - if (token.size() < name.size() + 2 || - token.substr(0, name.size()) != name || - token[name.size()] != '=' || - (value = std::stoi(token.substr(name.size() + 1), &nextIdx), false) || - nextIdx != token.size() - name.size() - 1) - { - return false; - } - } - catch (std::invalid_argument&) + if (token.size() > (name.size() + 1) && + token.compare(0, name.size(), name) == 0 && + token[name.size()] == '=') { - return false; + const char* str = token.data() + name.size() + 1; + char* endptr = nullptr; + value = strtol(str, &endptr, 10); + return (endptr > str); } - return true; + return false; } bool getTokenUInt64(const std::string& token, const std::string& name, uint64_t& value) { - size_t nextIdx; - try - { - if (token.size() < name.size() + 2 || - token.substr(0, name.size()) != name || - token[name.size()] != '=' || - (value = std::stoull(token.substr(name.size() + 1), &nextIdx), false) || - nextIdx != token.size() - name.size() - 1) - { - return false; - } - } - catch (std::invalid_argument&) + if (token.size() > (name.size() + 1) && + token.compare(0, name.size(), name) == 0 && + token[name.size()] == '=') { - return false; + const char* str = token.data() + name.size() + 1; + char* endptr = nullptr; + value = strtoull(str, &endptr, 10); + return (endptr > str); } - return true; + return false; } bool getTokenString(const std::string& token, const std::string& name, std::string& value) { - try + if (token.size() > (name.size() + 1) && + token.compare(0, name.size(), name) == 0 && + token[name.size()] == '=') { - if (token.size() < name.size() + 2 || - token.substr(0, name.size()) != name || - token[name.size()] != '=') - { - return false; - } - } - catch (std::invalid_argument&) - { - return false; + value = token.substr(name.size() + 1); + return true; } - value = token.substr(name.size() + 1); - return true; + return false; } - bool getTokenKeyword(const std::string& token, const std::string& name, const std::map<std::string, int>& map, int& value) + bool getTokenKeyword(const std::string& token, const std::string& name, + const std::map<std::string, int>& map, int& value) { - if (token.size() < name.size() + 2 || - token.substr(0, name.size()) != name || - token[name.size()] != '=') - return false; - - std::string t = token.substr(name.size()+1); - if (t[0] == '\'' && t[t.size()-1] == '\'') - t = t.substr(1, t.size()-2); + std::string t; + if (getTokenString(token, name, t)) + { + if (t[0] == '\'' && t[t.size() - 1] == '\'') + { + t = t.substr(1, t.size() - 2); + } - auto p = map.find(t); - if (p == map.cend()) - return false; + const auto p = map.find(t); + if (p != map.cend()) + { + value = p->second; + return true; + } + } - value = p->second; - return true; + return false; } bool getTokenInteger(const Poco::StringTokenizer& tokens, const std::string& name, int& value) @@ -185,10 +167,17 @@ namespace LOOLProtocol return false; } - bool getTokenIntegerFromMessage(const std::string& message, const std::string& name, int& value) + bool getTokenInteger(const std::vector<std::string>& tokens, const std::string& name, int& value) { - Poco::StringTokenizer tokens(message, " \n", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM); - return getTokenInteger(tokens, name, value); + for (const auto& pair : tokens) + { + if (getTokenInteger(pair, name, value)) + { + return true; + } + } + + return false; } bool getTokenStringFromMessage(const std::string& message, const std::string& name, std::string& value) diff --git a/common/Protocol.hpp b/common/Protocol.hpp index 8188ca0..c404874 100644 --- a/common/Protocol.hpp +++ b/common/Protocol.hpp @@ -73,6 +73,9 @@ namespace LOOLProtocol bool getTokenInteger(const Poco::StringTokenizer& tokens, const std::string& name, int& value); bool getTokenString(const Poco::StringTokenizer& tokens, const std::string& name, std::string& value); bool getTokenKeyword(const Poco::StringTokenizer& tokens, const std::string& name, const std::map<std::string, int>& map, int& value); + + bool getTokenInteger(const std::vector<std::string>& tokens, const std::string& name, int& value); + inline bool getTokenString(const std::vector<std::string>& tokens, const std::string& name, std::string& value) @@ -88,7 +91,6 @@ namespace LOOLProtocol return false; } - bool getTokenIntegerFromMessage(const std::string& message, const std::string& name, int& value); bool getTokenStringFromMessage(const std::string& message, const std::string& name, std::string& value); bool getTokenKeywordFromMessage(const std::string& message, const std::string& name, const std::map<std::string, int>& map, int& value); @@ -135,6 +137,11 @@ namespace LOOLProtocol return tokenize(s.data(), s.size()); } + inline bool getTokenIntegerFromMessage(const std::string& message, const std::string& name, int& value) + { + return getTokenInteger(tokenize(message), name, value); + } + inline size_t getDelimiterPosition(const char* message, const int length, const char delim) { if (message && length > 0) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits