[Libreoffice-commits] online.git: common/Protocol.hpp common/Session.cpp common/Session.hpp kit/ChildSession.cpp kit/ChildSession.hpp kit/Kit.cpp wsd/ClientSession.cpp wsd/ClientSession.hpp wsd/TileDesc.hpp

Ashod Nakashian ashod.nakashian at collabora.co.uk
Mon Jan 23 04:37:41 UTC 2017


 common/Protocol.hpp   |   14 +++++++
 common/Session.cpp    |   10 ++---
 common/Session.hpp    |    2 -
 kit/ChildSession.cpp  |   88 +++++++++++++++++++++++++-------------------------
 kit/ChildSession.hpp  |   36 ++++++++++----------
 kit/Kit.cpp           |   12 +++---
 wsd/ClientSession.cpp |   19 +++++-----
 wsd/ClientSession.hpp |   10 ++---
 wsd/TileDesc.hpp      |   19 ++++------
 9 files changed, 111 insertions(+), 99 deletions(-)

New commits:
commit 25be7f0ab6205cb66cf3b8952b95a6ac20274eb3
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Thu Jan 19 20:44:39 2017 -0500

    wsd: use own tokenizer
    
    Change-Id: Ia6e58767e3a138d086d4e0ae287782d3ed558076
    Reviewed-on: https://gerrit.libreoffice.org/33418
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
    Tested-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/common/Protocol.hpp b/common/Protocol.hpp
index 6d4e5cb..c075339 100644
--- a/common/Protocol.hpp
+++ b/common/Protocol.hpp
@@ -73,6 +73,20 @@ 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);
+    inline bool getTokenString(const std::vector<std::string>& tokens,
+                               const std::string& name,
+                               std::string& value)
+    {
+        for (const auto& token : tokens)
+        {
+            if (getTokenString(token, name, value))
+            {
+                return true;
+            }
+        }
+
+        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);
diff --git a/common/Session.cpp b/common/Session.cpp
index 03df779..b320522 100644
--- a/common/Session.cpp
+++ b/common/Session.cpp
@@ -116,17 +116,17 @@ bool Session::sendBinaryFrame(const char *buffer, int length)
     return false;
 }
 
-void Session::parseDocOptions(const StringTokenizer& tokens, int& part, std::string& timestamp)
+void Session::parseDocOptions(const std::vector<std::string>& tokens, int& part, std::string& timestamp)
 {
     // First token is the "load" command itself.
     size_t offset = 1;
-    if (tokens.count() > 2 && tokens[1].find("part=") == 0)
+    if (tokens.size() > 2 && tokens[1].find("part=") == 0)
     {
         getTokenInteger(tokens[1], "part", part);
         ++offset;
     }
 
-    for (size_t i = offset; i < tokens.count(); ++i)
+    for (size_t i = offset; i < tokens.size(); ++i)
     {
         if (tokens[i].find("url=") == 0)
         {
@@ -163,11 +163,11 @@ void Session::parseDocOptions(const StringTokenizer& tokens, int& part, std::str
         }
     }
 
-    if (tokens.count() > offset)
+    if (tokens.size() > offset)
     {
         if (getTokenString(tokens[offset], "options", _docOptions))
         {
-            if (tokens.count() > offset + 1)
+            if (tokens.size() > offset + 1)
                 _docOptions += Poco::cat(std::string(" "), tokens.begin() + offset + 1, tokens.end());
         }
     }
diff --git a/common/Session.hpp b/common/Session.hpp
index d5fe524..c2642d9 100644
--- a/common/Session.hpp
+++ b/common/Session.hpp
@@ -74,7 +74,7 @@ protected:
     virtual ~Session();
 
     /// Parses the options of the "load" command, shared between MasterProcessSession::loadDocument() and ChildProcessSession::loadDocument().
-    void parseDocOptions(const Poco::StringTokenizer& tokens, int& part, std::string& timestamp);
+    void parseDocOptions(const std::vector<std::string>& tokens, int& part, std::string& timestamp);
 
     void updateLastActivityTime()
     {
diff --git a/kit/ChildSession.cpp b/kit/ChildSession.cpp
index a216456..0489bd9 100644
--- a/kit/ChildSession.cpp
+++ b/kit/ChildSession.cpp
@@ -76,7 +76,7 @@ bool ChildSession::_handleInput(const char *buffer, int length)
 {
     LOG_TRC(getName() + ": handling [" << getAbbreviatedMessage(buffer, length) << "].");
     const std::string firstLine = getFirstLine(buffer, length);
-    StringTokenizer tokens(firstLine, " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
+    const auto tokens = LOOLProtocol::tokenize(firstLine.data(), firstLine.size());
 
     if (LOOLProtocol::tokenIndicatesUserInteraction(tokens[0]))
     {
@@ -84,7 +84,7 @@ bool ChildSession::_handleInput(const char *buffer, int length)
         updateLastActivityTime();
     }
 
-    if (tokens.count() > 0 && tokens[0] == "useractive" && getLOKitDocument() != nullptr)
+    if (tokens.size() > 0 && tokens[0] == "useractive" && getLOKitDocument() != nullptr)
     {
         LOG_DBG("Handling message after inactivity of " << getInactivityMS() << "ms.");
         setIsActive(true);
@@ -301,10 +301,10 @@ bool ChildSession::_handleInput(const char *buffer, int length)
     return true;
 }
 
-bool ChildSession::loadDocument(const char * /*buffer*/, int /*length*/, StringTokenizer& tokens)
+bool ChildSession::loadDocument(const char * /*buffer*/, int /*length*/, const std::vector<std::string>& tokens)
 {
     int part = -1;
-    if (tokens.count() < 2)
+    if (tokens.size() < 2)
     {
         sendTextFrame("error: cmd=load kind=syntax");
         return false;
@@ -372,12 +372,12 @@ bool ChildSession::loadDocument(const char * /*buffer*/, int /*length*/, StringT
     return true;
 }
 
-bool ChildSession::sendFontRendering(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
+bool ChildSession::sendFontRendering(const char* /*buffer*/, int /*length*/, const std::vector<std::string>& tokens)
 {
     std::string font, text, decodedFont, decodedChar;
     bool bSuccess;
 
-    if (tokens.count() < 3 ||
+    if (tokens.size() < 3 ||
         !getTokenString(tokens[1], "font", font))
     {
         sendTextFrame("error: cmd=renderfont kind=syntax");
@@ -488,12 +488,12 @@ void insertUserNames(const std::map<int, UserInfo>& viewInfo, std::string& json)
 
 }
 
-bool ChildSession::getCommandValues(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
+bool ChildSession::getCommandValues(const char* /*buffer*/, int /*length*/, const std::vector<std::string>& tokens)
 {
     bool success;
     char* values;
     std::string command;
-    if (tokens.count() != 2 || !getTokenString(tokens[1], "command", command))
+    if (tokens.size() != 2 || !getTokenString(tokens[1], "command", command))
     {
         sendTextFrame("error: cmd=commandvalues kind=syntax");
         return false;
@@ -537,11 +537,11 @@ bool ChildSession::getPartPageRectangles(const char* /*buffer*/, int /*length*/)
     return true;
 }
 
-bool ChildSession::clientZoom(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
+bool ChildSession::clientZoom(const char* /*buffer*/, int /*length*/, const std::vector<std::string>& tokens)
 {
     int tilePixelWidth, tilePixelHeight, tileTwipWidth, tileTwipHeight;
 
-    if (tokens.count() != 5 ||
+    if (tokens.size() != 5 ||
         !getTokenInteger(tokens[1], "tilepixelwidth", tilePixelWidth) ||
         !getTokenInteger(tokens[2], "tilepixelheight", tilePixelHeight) ||
         !getTokenInteger(tokens[3], "tiletwipwidth", tileTwipWidth) ||
@@ -559,14 +559,14 @@ bool ChildSession::clientZoom(const char* /*buffer*/, int /*length*/, StringToke
     return true;
 }
 
-bool ChildSession::clientVisibleArea(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
+bool ChildSession::clientVisibleArea(const char* /*buffer*/, int /*length*/, const std::vector<std::string>& tokens)
 {
     int x;
     int y;
     int width;
     int height;
 
-    if (tokens.count() != 5 ||
+    if (tokens.size() != 5 ||
         !getTokenInteger(tokens[1], "x", x) ||
         !getTokenInteger(tokens[2], "y", y) ||
         !getTokenInteger(tokens[3], "width", width) ||
@@ -584,11 +584,11 @@ bool ChildSession::clientVisibleArea(const char* /*buffer*/, int /*length*/, Str
     return true;
 }
 
-bool ChildSession::downloadAs(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
+bool ChildSession::downloadAs(const char* /*buffer*/, int /*length*/, const std::vector<std::string>& tokens)
 {
     std::string name, id, format, filterOptions;
 
-    if (tokens.count() < 5 ||
+    if (tokens.size() < 5 ||
         !getTokenString(tokens[1], "name", name) ||
         !getTokenString(tokens[2], "id", id))
     {
@@ -600,7 +600,7 @@ bool ChildSession::downloadAs(const char* /*buffer*/, int /*length*/, StringToke
 
     if (getTokenString(tokens[4], "options", filterOptions))
     {
-        if (tokens.count() > 5)
+        if (tokens.size() > 5)
         {
             filterOptions += Poco::cat(std::string(" "), tokens.begin() + 5, tokens.end());
         }
@@ -632,11 +632,11 @@ bool ChildSession::getChildId()
     return true;
 }
 
-bool ChildSession::getTextSelection(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
+bool ChildSession::getTextSelection(const char* /*buffer*/, int /*length*/, const std::vector<std::string>& tokens)
 {
     std::string mimeType;
 
-    if (tokens.count() != 2 ||
+    if (tokens.size() != 2 ||
         !getTokenString(tokens[1], "mimetype", mimeType))
     {
         sendTextFrame("error: cmd=gettextselection kind=syntax");
@@ -657,11 +657,11 @@ bool ChildSession::getTextSelection(const char* /*buffer*/, int /*length*/, Stri
     return true;
 }
 
-bool ChildSession::paste(const char* buffer, int length, StringTokenizer& tokens)
+bool ChildSession::paste(const char* buffer, int length, const std::vector<std::string>& tokens)
 {
     std::string mimeType;
 
-    if (tokens.count() < 2 || !getTokenString(tokens[1], "mimetype", mimeType))
+    if (tokens.size() < 2 || !getTokenString(tokens[1], "mimetype", mimeType))
     {
         sendTextFrame("error: cmd=paste kind=syntax");
         return false;
@@ -680,10 +680,10 @@ bool ChildSession::paste(const char* buffer, int length, StringTokenizer& tokens
     return true;
 }
 
-bool ChildSession::insertFile(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
+bool ChildSession::insertFile(const char* /*buffer*/, int /*length*/, const std::vector<std::string>& tokens)
 {
     std::string name, type;
-    if (tokens.count() != 3 ||
+    if (tokens.size() != 3 ||
         !getTokenString(tokens[1], "name", name) ||
         !getTokenString(tokens[2], "type", type))
     {
@@ -711,10 +711,10 @@ bool ChildSession::insertFile(const char* /*buffer*/, int /*length*/, StringToke
     return true;
 }
 
-bool ChildSession::keyEvent(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
+bool ChildSession::keyEvent(const char* /*buffer*/, int /*length*/, const std::vector<std::string>& tokens)
 {
     int type, charcode, keycode;
-    if (tokens.count() != 4 ||
+    if (tokens.size() != 4 ||
         !getTokenKeyword(tokens[1], "type",
                          {{"input", LOK_KEYEVENT_KEYINPUT}, {"up", LOK_KEYEVENT_KEYUP}},
                          type) ||
@@ -750,7 +750,7 @@ bool ChildSession::keyEvent(const char* /*buffer*/, int /*length*/, StringTokeni
     return true;
 }
 
-bool ChildSession::mouseEvent(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
+bool ChildSession::mouseEvent(const char* /*buffer*/, int /*length*/, const std::vector<std::string>& tokens)
 {
     int type, x, y, count;
     bool success = true;
@@ -759,7 +759,7 @@ bool ChildSession::mouseEvent(const char* /*buffer*/, int /*length*/, StringToke
     int buttons = 1; // left button
     int modifier = 0;
 
-    if (tokens.count() < 5 ||
+    if (tokens.size() < 5 ||
         !getTokenKeyword(tokens[1], "type",
                          {{"buttondown", LOK_MOUSEEVENT_MOUSEBUTTONDOWN},
                           {"buttonup", LOK_MOUSEEVENT_MOUSEBUTTONUP},
@@ -773,11 +773,11 @@ bool ChildSession::mouseEvent(const char* /*buffer*/, int /*length*/, StringToke
     }
 
     // compatibility with older loleaflets
-    if (success && tokens.count() > 5 && !getTokenInteger(tokens[5], "buttons", buttons))
+    if (success && tokens.size() > 5 && !getTokenInteger(tokens[5], "buttons", buttons))
         success = false;
 
     // compatibility with older loleaflets
-    if (success && tokens.count() > 6 && !getTokenInteger(tokens[6], "modifier", modifier))
+    if (success && tokens.size() > 6 && !getTokenInteger(tokens[6], "modifier", modifier))
         success = false;
 
     if (!success)
@@ -795,9 +795,9 @@ bool ChildSession::mouseEvent(const char* /*buffer*/, int /*length*/, StringToke
     return true;
 }
 
-bool ChildSession::unoCommand(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
+bool ChildSession::unoCommand(const char* /*buffer*/, int /*length*/, const std::vector<std::string>& tokens)
 {
-    if (tokens.count() <= 1)
+    if (tokens.size() <= 1)
     {
         sendTextFrame("error: cmd=uno kind=syntax");
         return false;
@@ -810,11 +810,11 @@ bool ChildSession::unoCommand(const char* /*buffer*/, int /*length*/, StringToke
 
     getLOKitDocument()->setView(_viewId);
 
-    if (tokens.count() == 2 && tokens[1] == ".uno:fakeDiskFull")
+    if (tokens.size() == 2 && tokens[1] == ".uno:fakeDiskFull")
     {
         Util::alertAllUsers("internal", "diskfull");
     }
-    else if (tokens.count() == 2)
+    else if (tokens.size() == 2)
     {
         getLOKitDocument()->postUnoCommand(tokens[1].c_str(), nullptr, bNotify);
     }
@@ -828,10 +828,10 @@ bool ChildSession::unoCommand(const char* /*buffer*/, int /*length*/, StringToke
     return true;
 }
 
-bool ChildSession::selectText(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
+bool ChildSession::selectText(const char* /*buffer*/, int /*length*/, const std::vector<std::string>& tokens)
 {
     int type, x, y;
-    if (tokens.count() != 4 ||
+    if (tokens.size() != 4 ||
         !getTokenKeyword(tokens[1], "type",
                          {{"start", LOK_SETTEXTSELECTION_START},
                           {"end", LOK_SETTEXTSELECTION_END},
@@ -853,10 +853,10 @@ bool ChildSession::selectText(const char* /*buffer*/, int /*length*/, StringToke
     return true;
 }
 
-bool ChildSession::selectGraphic(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
+bool ChildSession::selectGraphic(const char* /*buffer*/, int /*length*/, const std::vector<std::string>& tokens)
 {
     int type, x, y;
-    if (tokens.count() != 4 ||
+    if (tokens.size() != 4 ||
         !getTokenKeyword(tokens[1], "type",
                          {{"start", LOK_SETGRAPHICSELECTION_START},
                           {"end", LOK_SETGRAPHICSELECTION_END}},
@@ -877,9 +877,9 @@ bool ChildSession::selectGraphic(const char* /*buffer*/, int /*length*/, StringT
     return true;
 }
 
-bool ChildSession::resetSelection(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
+bool ChildSession::resetSelection(const char* /*buffer*/, int /*length*/, const std::vector<std::string>& tokens)
 {
-    if (tokens.count() != 1)
+    if (tokens.size() != 1)
     {
         sendTextFrame("error: cmd=resetselection kind=syntax");
         return false;
@@ -894,11 +894,11 @@ bool ChildSession::resetSelection(const char* /*buffer*/, int /*length*/, String
     return true;
 }
 
-bool ChildSession::saveAs(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
+bool ChildSession::saveAs(const char* /*buffer*/, int /*length*/, const std::vector<std::string>& tokens)
 {
     std::string url, format, filterOptions;
 
-    if (tokens.count() < 4 ||
+    if (tokens.size() < 4 ||
         !getTokenString(tokens[1], "url", url))
     {
         sendTextFrame("error: cmd=saveas kind=syntax");
@@ -909,7 +909,7 @@ bool ChildSession::saveAs(const char* /*buffer*/, int /*length*/, StringTokenize
 
     if (getTokenString(tokens[3], "options", filterOptions))
     {
-        if (tokens.count() > 4)
+        if (tokens.size() > 4)
         {
             filterOptions += Poco::cat(std::string(" "), tokens.begin() + 4, tokens.end());
         }
@@ -935,10 +935,10 @@ bool ChildSession::saveAs(const char* /*buffer*/, int /*length*/, StringTokenize
     return true;
 }
 
-bool ChildSession::setClientPart(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
+bool ChildSession::setClientPart(const char* /*buffer*/, int /*length*/, const std::vector<std::string>& tokens)
 {
     int part;
-    if (tokens.count() < 2 ||
+    if (tokens.size() < 2 ||
         !getTokenInteger(tokens[1], "part", part))
     {
         sendTextFrame("error: cmd=setclientpart kind=invalid");
@@ -957,10 +957,10 @@ bool ChildSession::setClientPart(const char* /*buffer*/, int /*length*/, StringT
     return true;
 }
 
-bool ChildSession::setPage(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
+bool ChildSession::setPage(const char* /*buffer*/, int /*length*/, const std::vector<std::string>& tokens)
 {
     int page;
-    if (tokens.count() < 2 ||
+    if (tokens.size() < 2 ||
         !getTokenInteger(tokens[1], "page", page))
     {
         sendTextFrame("error: cmd=setpage kind=invalid");
diff --git a/kit/ChildSession.hpp b/kit/ChildSession.hpp
index b1c0fb9..0daa619 100644
--- a/kit/ChildSession.hpp
+++ b/kit/ChildSession.hpp
@@ -132,27 +132,27 @@ public:
     using Session::sendTextFrame;
 
 private:
-    bool loadDocument(const char* buffer, int length, Poco::StringTokenizer& tokens);
+    bool loadDocument(const char* buffer, int length, const std::vector<std::string>& tokens);
 
-    bool sendFontRendering(const char* buffer, int length, Poco::StringTokenizer& tokens);
-    bool getCommandValues(const char* buffer, int length, Poco::StringTokenizer& tokens);
+    bool sendFontRendering(const char* buffer, int length, const std::vector<std::string>& tokens);
+    bool getCommandValues(const char* buffer, int length, const std::vector<std::string>& tokens);
 
-    bool clientZoom(const char* buffer, int length, Poco::StringTokenizer& tokens);
-    bool clientVisibleArea(const char* buffer, int length, Poco::StringTokenizer& tokens);
-    bool downloadAs(const char* buffer, int length, Poco::StringTokenizer& tokens);
+    bool clientZoom(const char* buffer, int length, const std::vector<std::string>& tokens);
+    bool clientVisibleArea(const char* buffer, int length, const std::vector<std::string>& tokens);
+    bool downloadAs(const char* buffer, int length, const std::vector<std::string>& tokens);
     bool getChildId();
-    bool getTextSelection(const char* buffer, int length, Poco::StringTokenizer& tokens);
-    bool paste(const char* buffer, int length, Poco::StringTokenizer& tokens);
-    bool insertFile(const char* buffer, int length, Poco::StringTokenizer& tokens);
-    bool keyEvent(const char* buffer, int length, Poco::StringTokenizer& tokens);
-    bool mouseEvent(const char* buffer, int length, Poco::StringTokenizer& tokens);
-    bool unoCommand(const char* buffer, int length, Poco::StringTokenizer& tokens);
-    bool selectText(const char* buffer, int length, Poco::StringTokenizer& tokens);
-    bool selectGraphic(const char* buffer, int length, Poco::StringTokenizer& tokens);
-    bool resetSelection(const char* buffer, int length, Poco::StringTokenizer& tokens);
-    bool saveAs(const char* buffer, int length, Poco::StringTokenizer& tokens);
-    bool setClientPart(const char* buffer, int length, Poco::StringTokenizer& tokens);
-    bool setPage(const char* buffer, int length, Poco::StringTokenizer& tokens);
+    bool getTextSelection(const char* buffer, int length, const std::vector<std::string>& tokens);
+    bool paste(const char* buffer, int length, const std::vector<std::string>& tokens);
+    bool insertFile(const char* buffer, int length, const std::vector<std::string>& tokens);
+    bool keyEvent(const char* buffer, int length, const std::vector<std::string>& tokens);
+    bool mouseEvent(const char* buffer, int length, const std::vector<std::string>& tokens);
+    bool unoCommand(const char* buffer, int length, const std::vector<std::string>& tokens);
+    bool selectText(const char* buffer, int length, const std::vector<std::string>& tokens);
+    bool selectGraphic(const char* buffer, int length, const std::vector<std::string>& tokens);
+    bool resetSelection(const char* buffer, int length, const std::vector<std::string>& tokens);
+    bool saveAs(const char* buffer, int length, const std::vector<std::string>& tokens);
+    bool setClientPart(const char* buffer, int length, const std::vector<std::string>& tokens);
+    bool setPage(const char* buffer, int length, const std::vector<std::string>& tokens);
 
     void rememberEventsForInactiveUser(const int type, const std::string& payload);
 
diff --git a/kit/Kit.cpp b/kit/Kit.cpp
index ba5f5b6..fa04207 100644
--- a/kit/Kit.cpp
+++ b/kit/Kit.cpp
@@ -584,7 +584,7 @@ public:
         LOG_INF("setDocumentPassword returned");
     }
 
-    void renderTile(StringTokenizer& tokens, const std::shared_ptr<LOOLWebSocket>& ws)
+    void renderTile(const std::vector<std::string>& tokens, const std::shared_ptr<LOOLWebSocket>& ws)
     {
         assert(ws && "Expected a non-null websocket.");
         auto tile = TileDesc::parse(tokens);
@@ -652,7 +652,7 @@ public:
         ws->sendFrame(output.data(), output.size(), WebSocket::FRAME_BINARY);
     }
 
-    void renderCombinedTiles(StringTokenizer& tokens, const std::shared_ptr<LOOLWebSocket>& ws)
+    void renderCombinedTiles(const std::vector<std::string>& tokens, const std::shared_ptr<LOOLWebSocket>& ws)
     {
         assert(ws && "Expected a non-null websocket.");
         auto tileCombined = TileCombined::parse(tokens);
@@ -1360,8 +1360,7 @@ private:
                     break;
                 }
 
-                const std::string message(input.data(), input.size());
-                StringTokenizer tokens(message, " ");
+                const auto tokens = LOOLProtocol::tokenize(input.data(), input.size());
 
                 if (tokens[0] == "eof")
                 {
@@ -1387,7 +1386,8 @@ private:
                     int type = std::stoi(tokens[2]);
 
                     // payload is the rest of the message
-                    std::string payload(message.substr(tokens[0].length() + tokens[1].length() + tokens[2].length() + 3));
+                    const auto offset = tokens[0].length() + tokens[1].length() + tokens[2].length() + 3; // + delims
+                    const std::string payload(input.data() + offset, input.size() - offset);
 
                     // Forward the callback to the same view, demultiplexing is done by the LibreOffice core.
                     // TODO: replace with a map to be faster.
@@ -1422,7 +1422,7 @@ private:
                 }
                 else
                 {
-                    LOG_ERR("Unexpected tile request: [" << message << "].");
+                    LOG_ERR("Unexpected request: [" << LOOLProtocol::getAbbreviatedMessage(input) << "].");
                 }
             }
         }
diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp
index ca09eeb..4ed0b29 100644
--- a/wsd/ClientSession.cpp
+++ b/wsd/ClientSession.cpp
@@ -84,7 +84,7 @@ bool ClientSession::_handleInput(const char *buffer, int length)
 {
     LOG_TRC(getName() << ": handling [" << getAbbreviatedMessage(buffer, length) << "].");
     const std::string firstLine = getFirstLine(buffer, length);
-    StringTokenizer tokens(firstLine, " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
+    const auto tokens = LOOLProtocol::tokenize(firstLine.data(), firstLine.size());
 
     auto docBroker = getDocumentBroker();
     if (!docBroker)
@@ -242,10 +242,11 @@ bool ClientSession::_handleInput(const char *buffer, int length)
     return false;
 }
 
-bool ClientSession::loadDocument(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens,
+bool ClientSession::loadDocument(const char* /*buffer*/, int /*length*/,
+                                 const std::vector<std::string>& tokens,
                                  const std::shared_ptr<DocumentBroker>& docBroker)
 {
-    if (tokens.count() < 2)
+    if (tokens.size() < 2)
     {
         // Failed loading ends connection.
         sendTextFrame("error: cmd=load kind=syntax");
@@ -298,11 +299,11 @@ bool ClientSession::loadDocument(const char* /*buffer*/, int /*length*/, StringT
     return false;
 }
 
-bool ClientSession::getCommandValues(const char *buffer, int length, StringTokenizer& tokens,
+bool ClientSession::getCommandValues(const char *buffer, int length, const std::vector<std::string>& tokens,
                                      const std::shared_ptr<DocumentBroker>& docBroker)
 {
     std::string command;
-    if (tokens.count() != 2 || !getTokenString(tokens[1], "command", command))
+    if (tokens.size() != 2 || !getTokenString(tokens[1], "command", command))
     {
         return sendTextFrame("error: cmd=commandvalues kind=syntax");
     }
@@ -328,11 +329,11 @@ bool ClientSession::getPartPageRectangles(const char *buffer, int length,
     return forwardToChild(std::string(buffer, length), docBroker);
 }
 
-bool ClientSession::sendFontRendering(const char *buffer, int length, StringTokenizer& tokens,
+bool ClientSession::sendFontRendering(const char *buffer, int length, const std::vector<std::string>& tokens,
                                       const std::shared_ptr<DocumentBroker>& docBroker)
 {
     std::string font, text;
-    if (tokens.count() < 2 ||
+    if (tokens.size() < 2 ||
         !getTokenString(tokens[1], "font", font))
     {
         return sendTextFrame("error: cmd=renderfont kind=syntax");
@@ -362,7 +363,7 @@ bool ClientSession::sendFontRendering(const char *buffer, int length, StringToke
     return forwardToChild(std::string(buffer, length), docBroker);
 }
 
-bool ClientSession::sendTile(const char * /*buffer*/, int /*length*/, StringTokenizer& tokens,
+bool ClientSession::sendTile(const char * /*buffer*/, int /*length*/, const std::vector<std::string>& tokens,
                              const std::shared_ptr<DocumentBroker>& docBroker)
 {
     try
@@ -379,7 +380,7 @@ bool ClientSession::sendTile(const char * /*buffer*/, int /*length*/, StringToke
     return true;
 }
 
-bool ClientSession::sendCombinedTiles(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens,
+bool ClientSession::sendCombinedTiles(const char* /*buffer*/, int /*length*/, const std::vector<std::string>& tokens,
                                       const std::shared_ptr<DocumentBroker>& docBroker)
 {
     try
diff --git a/wsd/ClientSession.hpp b/wsd/ClientSession.hpp
index c946a94..ed78a44 100644
--- a/wsd/ClientSession.hpp
+++ b/wsd/ClientSession.hpp
@@ -103,21 +103,21 @@ public:
 private:
     virtual bool _handleInput(const char* buffer, int length) override;
 
-    bool loadDocument(const char* buffer, int length, Poco::StringTokenizer& tokens,
+    bool loadDocument(const char* buffer, int length, const std::vector<std::string>& tokens,
                       const std::shared_ptr<DocumentBroker>& docBroker);
     bool getStatus(const char* buffer, int length,
                    const std::shared_ptr<DocumentBroker>& docBroker);
-    bool getCommandValues(const char* buffer, int length, Poco::StringTokenizer& tokens,
+    bool getCommandValues(const char* buffer, int length, const std::vector<std::string>& tokens,
                           const std::shared_ptr<DocumentBroker>& docBroker);
     bool getPartPageRectangles(const char* buffer, int length,
                                const std::shared_ptr<DocumentBroker>& docBroker);
 
-    bool sendTile(const char* buffer, int length, Poco::StringTokenizer& tokens,
+    bool sendTile(const char* buffer, int length, const std::vector<std::string>& tokens,
                   const std::shared_ptr<DocumentBroker>& docBroker);
-    bool sendCombinedTiles(const char* buffer, int length, Poco::StringTokenizer& tokens,
+    bool sendCombinedTiles(const char* buffer, int length, const std::vector<std::string>& tokens,
                            const std::shared_ptr<DocumentBroker>& docBroker);
 
-    bool sendFontRendering(const char* buffer, int length, Poco::StringTokenizer& tokens,
+    bool sendFontRendering(const char* buffer, int length, const std::vector<std::string>& tokens,
                            const std::shared_ptr<DocumentBroker>& docBroker);
 
     bool forwardToChild(const std::string& message,
diff --git a/wsd/TileDesc.hpp b/wsd/TileDesc.hpp
index ef5420b..e213c9a 100644
--- a/wsd/TileDesc.hpp
+++ b/wsd/TileDesc.hpp
@@ -165,7 +165,7 @@ public:
     }
 
     /// Deserialize a TileDesc from a tokenized string.
-    static TileDesc parse(const Poco::StringTokenizer& tokens)
+    static TileDesc parse(const std::vector<std::string>& tokens)
     {
         // We don't expect undocumented fields and
         // assume all values to be int.
@@ -178,7 +178,7 @@ public:
 
         uint64_t oldHash = 0;
         uint64_t hash = 0;
-        for (size_t i = 0; i < tokens.count(); ++i)
+        for (size_t i = 0; i < tokens.size(); ++i)
         {
             if (LOOLProtocol::getTokenUInt64(tokens[i], "oldhash", oldHash))
                 ;
@@ -213,9 +213,7 @@ public:
     /// Deserialize a TileDesc from a string format.
     static TileDesc parse(const std::string& message)
     {
-        Poco::StringTokenizer tokens(message, " ",
-                                     Poco::StringTokenizer::TOK_IGNORE_EMPTY | Poco::StringTokenizer::TOK_TRIM);
-        return parse(tokens);
+        return parse(LOOLProtocol::tokenize(message.data(), message.size()));
     }
 
 private:
@@ -400,7 +398,7 @@ public:
     }
 
     /// Deserialize a TileDesc from a tokenized string.
-    static TileCombined parse(const Poco::StringTokenizer& tokens)
+    static TileCombined parse(const std::vector<std::string>& tokens)
     {
         // We don't expect undocumented fields and
         // assume all values to be int.
@@ -415,11 +413,12 @@ public:
         std::string versions;
         std::string oldhashes;
         std::string hashes;
-        for (size_t i = 0; i < tokens.count(); ++i)
+
+        for (const auto& token : tokens)
         {
             std::string name;
             std::string value;
-            if (LOOLProtocol::parseNameValuePair(tokens[i], name, value))
+            if (LOOLProtocol::parseNameValuePair(token, name, value))
             {
                 if (name == "tileposx")
                 {
@@ -466,9 +465,7 @@ public:
     /// Deserialize a TileDesc from a string format.
     static TileCombined parse(const std::string& message)
     {
-        Poco::StringTokenizer tokens(message, " ",
-                                     Poco::StringTokenizer::TOK_IGNORE_EMPTY | Poco::StringTokenizer::TOK_TRIM);
-        return parse(tokens);
+        return parse(LOOLProtocol::tokenize(message.data(), message.size()));
     }
 
     static TileCombined create(const std::vector<TileDesc>& tiles)


More information about the Libreoffice-commits mailing list