[Libreoffice-commits] online.git: common/MessageQueue.cpp common/StringVector.cpp common/StringVector.hpp kit/ChildSession.cpp kit/ForKit.cpp kit/Kit.cpp test/WhiteBoxTests.cpp tools/Connect.cpp tools/KitClient.cpp wsd/Admin.cpp wsd/ClientSession.cpp wsd/DocumentBroker.cpp wsd/FileServer.cpp wsd/TileCache.cpp

Miklos Vajna (via logerrit) logerrit at kemper.freedesktop.org
Mon Mar 9 08:46:55 UTC 2020


 common/MessageQueue.cpp |    4 -
 common/StringVector.cpp |   30 ++++++++
 common/StringVector.hpp |    6 +
 kit/ChildSession.cpp    |  166 ++++++++++++++++++++++++------------------------
 kit/ForKit.cpp          |    4 -
 kit/Kit.cpp             |   18 ++---
 test/WhiteBoxTests.cpp  |   15 ++++
 tools/Connect.cpp       |    2 
 tools/KitClient.cpp     |    6 -
 wsd/Admin.cpp           |   42 ++++++------
 wsd/ClientSession.cpp   |   72 ++++++++++----------
 wsd/DocumentBroker.cpp  |    2 
 wsd/FileServer.cpp      |    7 +-
 wsd/TileCache.cpp       |    6 -
 14 files changed, 216 insertions(+), 164 deletions(-)

New commits:
commit a7d3efdd4ea921430442ae427fb4c25a2d9afcc8
Author:     Miklos Vajna <vmiklos at collabora.com>
AuthorDate: Mon Mar 9 09:05:30 2020 +0100
Commit:     Andras Timar <andras.timar at collabora.com>
CommitDate: Mon Mar 9 09:46:33 2020 +0100

    Introduce StringVector::equals()
    
    Allows comparing tokens with C strings without a heap allocation. Do the
    same when comparing two tokens from two different StringVectors.
    
    And use it at all places where operator ==() has an argument, which is a
    StringVector::operator []() result.
    
    Change-Id: Id36eff96767ab99b235ecbd12fb14446a3efa869
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/90201
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>

diff --git a/common/MessageQueue.cpp b/common/MessageQueue.cpp
index 84987b278..5482b4f79 100644
--- a/common/MessageQueue.cpp
+++ b/common/MessageQueue.cpp
@@ -366,13 +366,13 @@ std::string TileQueue::removeCallbackDuplicate(const std::string& callbackMsg)
             if (queuedTokens.size() < 3)
                 continue;
 
-            if (!isViewCallback && (queuedTokens[1] == tokens[1] && queuedTokens[2] == tokens[2]))
+            if (!isViewCallback && (queuedTokens.equals(1, tokens, 1) && queuedTokens.equals(2, tokens, 2)))
             {
                 LOG_TRC("Remove obsolete callback: " << std::string(it.data(), it.size()) << " -> " << LOOLProtocol::getAbbreviatedMessage(callbackMsg));
                 getQueue().erase(getQueue().begin() + i);
                 break;
             }
-            else if (isViewCallback && (queuedTokens[1] == tokens[1] && queuedTokens[2] == tokens[2]))
+            else if (isViewCallback && (queuedTokens.equals(1, tokens, 1) && queuedTokens.equals(2, tokens, 2)))
             {
                 // we additionally need to ensure that the payload is about
                 // the same viewid (otherwise we'd merge them all views into
diff --git a/common/StringVector.cpp b/common/StringVector.cpp
index 4527e593e..aab884881 100644
--- a/common/StringVector.cpp
+++ b/common/StringVector.cpp
@@ -86,4 +86,34 @@ std::string StringVector::cat(const std::string& separator, size_t offset) const
     return ret;
 }
 
+bool StringVector::equals(size_t index, const char* string) const
+{
+    if (index >= _tokens.size())
+    {
+        return false;
+    }
+
+    const StringToken& token = _tokens[index];
+    return _string.compare(token._index, token._length, string) == 0;
+}
+
+bool StringVector::equals(size_t index, const StringVector& other, size_t otherIndex)
+{
+    if (index >= _tokens.size())
+    {
+        return false;
+    }
+
+    if (otherIndex >= other._tokens.size())
+    {
+        return false;
+    }
+
+    const StringToken& token = _tokens[index];
+    const StringToken& otherToken = other._tokens[otherIndex];
+    int ret = _string.compare(token._index, token._length, other._string, otherToken._index,
+                              otherToken._length);
+    return ret == 0;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/common/StringVector.hpp b/common/StringVector.hpp
index 4255e9d54..5008277fd 100644
--- a/common/StringVector.hpp
+++ b/common/StringVector.hpp
@@ -69,6 +69,12 @@ public:
 
     /// Concats tokens starting from begin, using separator as separator.
     std::string cat(const std::string& separator, size_t begin) const;
+
+    /// Compares the nth token with string.
+    bool equals(size_t index, const char* string) const;
+
+    /// Compares the nth token with the mth token from an other StringVector.
+    bool equals(size_t index, const StringVector& other, size_t otherIndex);
 };
 
 #endif
diff --git a/kit/ChildSession.cpp b/kit/ChildSession.cpp
index 3cd8642bd..bc9573030 100644
--- a/kit/ChildSession.cpp
+++ b/kit/ChildSession.cpp
@@ -114,7 +114,7 @@ bool ChildSession::_handleInput(const char *buffer, int length)
         updateLastActivityTime();
     }
 
-    if (tokens.size() > 0 && tokens[0] == "useractive" && getLOKitDocument() != nullptr)
+    if (tokens.size() > 0 && tokens.equals(0, "useractive") && getLOKitDocument() != nullptr)
     {
         LOG_DBG("Handling message after inactivity of " << getInactivityMS() << "ms.");
         setIsActive(true);
@@ -183,16 +183,16 @@ bool ChildSession::_handleInput(const char *buffer, int length)
         LOG_TRC("Finished replaying messages.");
     }
 
-    if (tokens[0] == "dummymsg")
+    if (tokens.equals(0, "dummymsg"))
     {
         // Just to update the activity of a view-only client.
         return true;
     }
-    else if (tokens[0] == "commandvalues")
+    else if (tokens.equals(0, "commandvalues"))
     {
         return getCommandValues(buffer, length, tokens);
     }
-    else if (tokens[0] == "load")
+    else if (tokens.equals(0, "load"))
     {
         if (_isDocLoaded)
         {
@@ -214,44 +214,44 @@ bool ChildSession::_handleInput(const char *buffer, int length)
         sendTextFrame("error: cmd=" + tokens[0] + " kind=nodocloaded");
         return false;
     }
-    else if (tokens[0] == "renderfont")
+    else if (tokens.equals(0, "renderfont"))
     {
         sendFontRendering(buffer, length, tokens);
     }
-    else if (tokens[0] == "setclientpart")
+    else if (tokens.equals(0, "setclientpart"))
     {
         return setClientPart(buffer, length, tokens);
     }
-    else if (tokens[0] == "selectclientpart")
+    else if (tokens.equals(0, "selectclientpart"))
     {
         return selectClientPart(buffer, length, tokens);
     }
-    else if (tokens[0] == "moveselectedclientparts")
+    else if (tokens.equals(0, "moveselectedclientparts"))
     {
         return moveSelectedClientParts(buffer, length, tokens);
     }
-    else if (tokens[0] == "setpage")
+    else if (tokens.equals(0, "setpage"))
     {
         return setPage(buffer, length, tokens);
     }
-    else if (tokens[0] == "status")
+    else if (tokens.equals(0, "status"))
     {
         return getStatus(buffer, length);
     }
-    else if (tokens[0] == "paintwindow")
+    else if (tokens.equals(0, "paintwindow"))
     {
         return renderWindow(buffer, length, tokens);
     }
-    else if (tokens[0] == "resizewindow")
+    else if (tokens.equals(0, "resizewindow"))
     {
         return resizeWindow(buffer, length, tokens);
     }
-    else if (tokens[0] == "tile" || tokens[0] == "tilecombine")
+    else if (tokens.equals(0, "tile") || tokens.equals(0, "tilecombine"))
     {
         assert(false && "Tile traffic should go through the DocumentBroker-LoKit WS.");
     }
-    else if (tokens[0] == "requestloksession" ||
-             tokens[0] == "canceltiles")
+    else if (tokens.equals(0, "requestloksession") ||
+             tokens.equals(0, "canceltiles"))
     {
         // Just ignore these.
         // FIXME: We probably should do something for "canceltiles" at least?
@@ -261,105 +261,105 @@ bool ChildSession::_handleInput(const char *buffer, int length)
         // All other commands are such that they always require a LibreOfficeKitDocument session,
         // i.e. need to be handled in a child process.
 
-        assert(tokens[0] == "clientzoom" ||
-               tokens[0] == "clientvisiblearea" ||
-               tokens[0] == "outlinestate" ||
-               tokens[0] == "downloadas" ||
-               tokens[0] == "getchildid" ||
-               tokens[0] == "gettextselection" ||
-               tokens[0] == "getclipboard" ||
-               tokens[0] == "setclipboard" ||
-               tokens[0] == "paste" ||
-               tokens[0] == "insertfile" ||
-               tokens[0] == "key" ||
-               tokens[0] == "textinput" ||
-               tokens[0] == "windowkey" ||
-               tokens[0] == "mouse" ||
-               tokens[0] == "windowmouse" ||
-               tokens[0] == "windowgesture" ||
-               tokens[0] == "uno" ||
-               tokens[0] == "selecttext" ||
-               tokens[0] == "windowselecttext" ||
-               tokens[0] == "selectgraphic" ||
-               tokens[0] == "resetselection" ||
-               tokens[0] == "saveas" ||
-               tokens[0] == "useractive" ||
-               tokens[0] == "userinactive" ||
-               tokens[0] == "windowcommand" ||
-               tokens[0] == "asksignaturestatus" ||
-               tokens[0] == "signdocument" ||
-               tokens[0] == "uploadsigneddocument" ||
-               tokens[0] == "exportsignanduploaddocument" ||
-               tokens[0] == "rendershapeselection" ||
-               tokens[0] == "removetextcontext" ||
-               tokens[0] == "dialogevent" ||
-               tokens[0] == "completefunction");
-
-        if (tokens[0] == "clientzoom")
+        assert(tokens.equals(0, "clientzoom") ||
+               tokens.equals(0, "clientvisiblearea") ||
+               tokens.equals(0, "outlinestate") ||
+               tokens.equals(0, "downloadas") ||
+               tokens.equals(0, "getchildid") ||
+               tokens.equals(0, "gettextselection") ||
+               tokens.equals(0, "getclipboard") ||
+               tokens.equals(0, "setclipboard") ||
+               tokens.equals(0, "paste") ||
+               tokens.equals(0, "insertfile") ||
+               tokens.equals(0, "key") ||
+               tokens.equals(0, "textinput") ||
+               tokens.equals(0, "windowkey") ||
+               tokens.equals(0, "mouse") ||
+               tokens.equals(0, "windowmouse") ||
+               tokens.equals(0, "windowgesture") ||
+               tokens.equals(0, "uno") ||
+               tokens.equals(0, "selecttext") ||
+               tokens.equals(0, "windowselecttext") ||
+               tokens.equals(0, "selectgraphic") ||
+               tokens.equals(0, "resetselection") ||
+               tokens.equals(0, "saveas") ||
+               tokens.equals(0, "useractive") ||
+               tokens.equals(0, "userinactive") ||
+               tokens.equals(0, "windowcommand") ||
+               tokens.equals(0, "asksignaturestatus") ||
+               tokens.equals(0, "signdocument") ||
+               tokens.equals(0, "uploadsigneddocument") ||
+               tokens.equals(0, "exportsignanduploaddocument") ||
+               tokens.equals(0, "rendershapeselection") ||
+               tokens.equals(0, "removetextcontext") ||
+               tokens.equals(0, "dialogevent") ||
+               tokens.equals(0, "completefunction"));
+
+        if (tokens.equals(0, "clientzoom"))
         {
             return clientZoom(buffer, length, tokens);
         }
-        else if (tokens[0] == "clientvisiblearea")
+        else if (tokens.equals(0, "clientvisiblearea"))
         {
             return clientVisibleArea(buffer, length, tokens);
         }
-        else if (tokens[0] == "outlinestate")
+        else if (tokens.equals(0, "outlinestate"))
         {
             return outlineState(buffer, length, tokens);
         }
-        else if (tokens[0] == "downloadas")
+        else if (tokens.equals(0, "downloadas"))
         {
             return downloadAs(buffer, length, tokens);
         }
-        else if (tokens[0] == "getchildid")
+        else if (tokens.equals(0, "getchildid"))
         {
             return getChildId();
         }
-        else if (tokens[0] == "gettextselection") // deprecated.
+        else if (tokens.equals(0, "gettextselection")) // deprecated.
         {
             return getTextSelection(buffer, length, tokens);
         }
-        else if (tokens[0] == "getclipboard")
+        else if (tokens.equals(0, "getclipboard"))
         {
             return getClipboard(buffer, length, tokens);
         }
-        else if (tokens[0] == "setclipboard")
+        else if (tokens.equals(0, "setclipboard"))
         {
             return setClipboard(buffer, length, tokens);
         }
-        else if (tokens[0] == "paste")
+        else if (tokens.equals(0, "paste"))
         {
             return paste(buffer, length, tokens);
         }
-        else if (tokens[0] == "insertfile")
+        else if (tokens.equals(0, "insertfile"))
         {
             return insertFile(buffer, length, tokens);
         }
-        else if (tokens[0] == "key")
+        else if (tokens.equals(0, "key"))
         {
             return keyEvent(buffer, length, tokens, LokEventTargetEnum::Document);
         }
-        else if (tokens[0] == "textinput")
+        else if (tokens.equals(0, "textinput"))
         {
             return extTextInputEvent(buffer, length, tokens);
         }
-        else if (tokens[0] == "windowkey")
+        else if (tokens.equals(0, "windowkey"))
         {
             return keyEvent(buffer, length, tokens, LokEventTargetEnum::Window);
         }
-        else if (tokens[0] == "mouse")
+        else if (tokens.equals(0, "mouse"))
         {
             return mouseEvent(buffer, length, tokens, LokEventTargetEnum::Document);
         }
-        else if (tokens[0] == "windowmouse")
+        else if (tokens.equals(0, "windowmouse"))
         {
             return mouseEvent(buffer, length, tokens, LokEventTargetEnum::Window);
         }
-        else if (tokens[0] == "windowgesture")
+        else if (tokens.equals(0, "windowgesture"))
         {
             return gestureEvent(buffer, length, tokens);
         }
-        else if (tokens[0] == "uno")
+        else if (tokens.equals(0, "uno"))
         {
             // SpellCheckApplySuggestion might contain non separator spaces
             if (tokens[1].find(".uno:SpellCheckApplySuggestion") != std::string::npos ||
@@ -372,69 +372,69 @@ bool ChildSession::_handleInput(const char *buffer, int length)
             }
             return unoCommand(buffer, length, tokens);
         }
-        else if (tokens[0] == "selecttext")
+        else if (tokens.equals(0, "selecttext"))
         {
             return selectText(buffer, length, tokens, LokEventTargetEnum::Document);
         }
-        else if (tokens[0] == "windowselecttext")
+        else if (tokens.equals(0, "windowselecttext"))
         {
             return selectText(buffer, length, tokens, LokEventTargetEnum::Window);
         }
-        else if (tokens[0] == "selectgraphic")
+        else if (tokens.equals(0, "selectgraphic"))
         {
             return selectGraphic(buffer, length, tokens);
         }
-        else if (tokens[0] == "resetselection")
+        else if (tokens.equals(0, "resetselection"))
         {
             return resetSelection(buffer, length, tokens);
         }
-        else if (tokens[0] == "saveas")
+        else if (tokens.equals(0, "saveas"))
         {
             return saveAs(buffer, length, tokens);
         }
-        else if (tokens[0] == "useractive")
+        else if (tokens.equals(0, "useractive"))
         {
             setIsActive(true);
         }
-        else if (tokens[0] == "userinactive")
+        else if (tokens.equals(0, "userinactive"))
         {
             setIsActive(false);
         }
-        else if (tokens[0] == "windowcommand")
+        else if (tokens.equals(0, "windowcommand"))
         {
             sendWindowCommand(buffer, length, tokens);
         }
-        else if (tokens[0] == "signdocument")
+        else if (tokens.equals(0, "signdocument"))
         {
             signDocumentContent(buffer, length, tokens);
         }
-        else if (tokens[0] == "asksignaturestatus")
+        else if (tokens.equals(0, "asksignaturestatus"))
         {
             askSignatureStatus(buffer, length, tokens);
         }
 #if !MOBILEAPP
-        else if (tokens[0] == "uploadsigneddocument")
+        else if (tokens.equals(0, "uploadsigneddocument"))
         {
             return uploadSignedDocument(buffer, length, tokens);
         }
-        else if (tokens[0] == "exportsignanduploaddocument")
+        else if (tokens.equals(0, "exportsignanduploaddocument"))
         {
             return exportSignAndUploadDocument(buffer, length, tokens);
         }
 #endif
-        else if (tokens[0] == "rendershapeselection")
+        else if (tokens.equals(0, "rendershapeselection"))
         {
             return renderShapeSelection(buffer, length, tokens);
         }
-        else if (tokens[0] == "removetextcontext")
+        else if (tokens.equals(0, "removetextcontext"))
         {
             return removeTextContext(buffer, length, tokens);
         }
-        else if (tokens[0] == "dialogevent")
+        else if (tokens.equals(0, "dialogevent"))
         {
             return dialogEvent(buffer, length, tokens);
         }
-        else if (tokens[0] == "completefunction")
+        else if (tokens.equals(0, "completefunction"))
         {
             return completeFunction(buffer, length, tokens);
         }
@@ -2363,7 +2363,7 @@ void ChildSession::loKitCallback(const int type, const std::string& payload)
                               " width=" + std::to_string(width) +
                               " height=" + std::to_string(height));
             }
-            else if (tokens.size() == 2 && tokens[0] == "EMPTY")
+            else if (tokens.size() == 2 && tokens.equals(0, "EMPTY"))
             {
                 const std::string part = (_docType != "text" ? tokens[1].c_str() : "0"); // Writer renders everything as part 0.
                 sendTextFrame("invalidatetiles: EMPTY, " + part);
diff --git a/kit/ForKit.cpp b/kit/ForKit.cpp
index b1fe997a0..4ebd57907 100644
--- a/kit/ForKit.cpp
+++ b/kit/ForKit.cpp
@@ -101,7 +101,7 @@ public:
         try
         {
             StringVector tokens = LOOLProtocol::tokenize(message);
-            if (tokens.size() == 2 && tokens[0] == "spawn")
+            if (tokens.size() == 2 && tokens.equals(0, "spawn"))
             {
                 const int count = std::stoi(tokens[1]);
                 if (count > 0)
@@ -114,7 +114,7 @@ public:
                     LOG_WRN("Cannot spawn " << tokens[1] << " children as requested.");
                 }
             }
-            else if (tokens.size() == 3 && tokens[0] == "setconfig")
+            else if (tokens.size() == 3 && tokens.equals(0, "setconfig"))
             {
                 // Currently only rlimit entries are supported.
                 if (!Rlimit::handleSetrlimitCommand(tokens))
diff --git a/kit/Kit.cpp b/kit/Kit.cpp
index 188e95586..0b417f5e4 100644
--- a/kit/Kit.cpp
+++ b/kit/Kit.cpp
@@ -1874,17 +1874,17 @@ public:
 
                 const StringVector tokens = LOOLProtocol::tokenize(input.data(), input.size());
 
-                if (tokens[0] == "eof")
+                if (tokens.equals(0, "eof"))
                 {
                     LOG_INF("Received EOF. Finishing.");
                     break;
                 }
 
-                if (tokens[0] == "tile")
+                if (tokens.equals(0, "tile"))
                 {
                     renderTile(tokens);
                 }
-                else if (tokens[0] == "tilecombine")
+                else if (tokens.equals(0, "tilecombine"))
                 {
                     renderCombinedTiles(tokens);
                 }
@@ -1892,7 +1892,7 @@ public:
                 {
                     forwardToChild(tokens[0], input);
                 }
-                else if (tokens[0] == "callback")
+                else if (tokens.equals(0, "callback"))
                 {
                     if (tokens.size() >= 3)
                     {
@@ -2126,7 +2126,7 @@ protected:
         {
             LOG_DBG("Too late, TerminationFlag is set, we're going down");
         }
-        else if (tokens[0] == "session")
+        else if (tokens.equals(0, "session"))
         {
             const std::string& sessionId = tokens[1];
             const std::string& docKey = tokens[2];
@@ -2148,14 +2148,14 @@ protected:
                 LOG_DBG("CreateSession failed.");
             }
         }
-        else if (tokens[0] == "exit")
+        else if (tokens.equals(0, "exit"))
         {
             LOG_INF("Setting TerminationFlag due to 'exit' command from parent.");
             SigUtil::setTerminationFlag();
             document.reset();
         }
-        else if (tokens[0] == "tile" || tokens[0] == "tilecombine" || tokens[0] == "canceltiles" ||
-                tokens[0] == "paintwindow" || tokens[0] == "resizewindow" ||
+        else if (tokens.equals(0, "tile") || tokens.equals(0, "tilecombine") || tokens.equals(0, "canceltiles") ||
+                tokens.equals(0, "paintwindow") || tokens.equals(0, "resizewindow") ||
                 LOOLProtocol::getFirstToken(tokens[0], '-') == "child")
         {
             if (document)
@@ -2167,7 +2167,7 @@ protected:
                 LOG_WRN("No document while processing " << tokens[0] << " request.");
             }
         }
-        else if (tokens.size() == 3 && tokens[0] == "setconfig")
+        else if (tokens.size() == 3 && tokens.equals(0, "setconfig"))
         {
 #if !MOBILEAPP
             // Currently only rlimit entries are supported.
diff --git a/test/WhiteBoxTests.cpp b/test/WhiteBoxTests.cpp
index 5c843adea..4b0912a33 100644
--- a/test/WhiteBoxTests.cpp
+++ b/test/WhiteBoxTests.cpp
@@ -817,6 +817,21 @@ void WhiteBoxTests::testStringVector()
     // Test operator []().
     CPPUNIT_ASSERT_EQUAL(std::string("a"), vector[0]);
     CPPUNIT_ASSERT_EQUAL(std::string(""), vector[2]);
+
+    // Test equals().
+    CPPUNIT_ASSERT(vector.equals(0, "a"));
+    CPPUNIT_ASSERT(!vector.equals(0, "A"));
+    CPPUNIT_ASSERT(vector.equals(1, "b"));
+    CPPUNIT_ASSERT(!vector.equals(1, "B"));
+    CPPUNIT_ASSERT(!vector.equals(2, ""));
+
+    // Test equals(), StringVector argument version.
+    StringVector vector2;
+    vector2.push_back("a");
+    vector2.push_back("B");
+
+    CPPUNIT_ASSERT(vector.equals(0, vector2, 0));
+    CPPUNIT_ASSERT(!vector.equals(0, vector2, 1));
 }
 
 CPPUNIT_TEST_SUITE_REGISTRATION(WhiteBoxTests);
diff --git a/tools/Connect.cpp b/tools/Connect.cpp
index 0fcd3ab4c..8593b0a35 100644
--- a/tools/Connect.cpp
+++ b/tools/Connect.cpp
@@ -92,7 +92,7 @@ public:
                     std::string firstLine = getFirstLine(buffer, n);
                     StringVector tokens(LOOLProtocol::tokenize(firstLine, ' '));
 
-                    if (std::getenv("DISPLAY") != nullptr && tokens[0] == "tile:")
+                    if (std::getenv("DISPLAY") != nullptr && tokens.equals(0, "tile:"))
                     {
                         TemporaryFile pngFile;
                         std::ofstream pngStream(pngFile.path(), std::ios::binary);
diff --git a/tools/KitClient.cpp b/tools/KitClient.cpp
index 3a58adc63..f7226aa47 100644
--- a/tools/KitClient.cpp
+++ b/tools/KitClient.cpp
@@ -94,7 +94,7 @@ protected:
             if (tokens.size() == 0)
                 continue;
 
-            if (tokens[0] == "?" || tokens[0] == "help")
+            if (tokens.equals(0, "?") || tokens.equals(0, "help"))
             {
                 std::cout <<
                     "Commands mimic LOOL protocol but we talk directly to LOKit:" << std::endl <<
@@ -103,7 +103,7 @@ protected:
                     "    tile part pixelwidth pixelheight docposx docposy doctilewidth doctileheight" << std::endl <<
                     "        calls LibreOfficeKitDocument::paintTile" << std::endl;
             }
-            else if (tokens[0] == "status")
+            else if (tokens.equals(0, "status"))
             {
                 if (tokens.size() != 1)
                 {
@@ -116,7 +116,7 @@ protected:
                     std::cout << "  " << i << ": '" << loKitDocument->pClass->getPartName(loKitDocument, i) << "'" << std::endl;
                 }
             }
-            else if (tokens[0] == "tile")
+            else if (tokens.equals(0, "tile"))
             {
                 if (tokens.size() != 8)
                 {
diff --git a/wsd/Admin.cpp b/wsd/Admin.cpp
index ec16ee757..7532206a5 100644
--- a/wsd/Admin.cpp
+++ b/wsd/Admin.cpp
@@ -63,7 +63,7 @@ void AdminSocketHandler::handleMessage(const std::vector<char> &payload)
 
     AdminModel& model = _admin->getModel();
 
-    if (tokens[0] == "auth")
+    if (tokens.equals(0, "auth"))
     {
         if (tokens.size() < 2)
         {
@@ -100,59 +100,59 @@ void AdminSocketHandler::handleMessage(const std::vector<char> &payload)
         shutdown();
         return;
     }
-    else if (tokens[0] == "documents" ||
-             tokens[0] == "active_users_count" ||
-             tokens[0] == "active_docs_count" ||
-             tokens[0] == "mem_stats" ||
-             tokens[0] == "cpu_stats" ||
-             tokens[0] == "sent_activity" ||
-             tokens[0] == "recv_activity")
+    else if (tokens.equals(0, "documents") ||
+             tokens.equals(0, "active_users_count") ||
+             tokens.equals(0, "active_docs_count") ||
+             tokens.equals(0, "mem_stats") ||
+             tokens.equals(0, "cpu_stats") ||
+             tokens.equals(0, "sent_activity") ||
+             tokens.equals(0, "recv_activity"))
     {
         const std::string result = model.query(tokens[0]);
         if (!result.empty())
             sendTextFrame(tokens[0] + ' ' + result);
     }
-    else if (tokens[0] == "history")
+    else if (tokens.equals(0, "history"))
     {
         sendTextFrame("{ \"History\": " + model.getAllHistory() + "}");
     }
-    else if (tokens[0] == "version")
+    else if (tokens.equals(0, "version"))
     {
         // Send LOOL version information
         sendTextFrame("loolserver " + LOOLWSD::getVersionJSON());
         // Send LOKit version information
         sendTextFrame("lokitversion " + LOOLWSD::LOKitVersion);
     }
-    else if (tokens[0] == "subscribe" && tokens.size() > 1)
+    else if (tokens.equals(0, "subscribe") && tokens.size() > 1)
     {
         for (std::size_t i = 0; i < tokens.size() - 1; i++)
         {
             model.subscribe(_sessionId, tokens[i + 1]);
         }
     }
-    else if (tokens[0] == "unsubscribe" && tokens.size() > 1)
+    else if (tokens.equals(0, "unsubscribe") && tokens.size() > 1)
     {
         for (std::size_t i = 0; i < tokens.size() - 1; i++)
         {
             model.unsubscribe(_sessionId, tokens[i + 1]);
         }
     }
-    else if (tokens[0] == "mem_consumed")
+    else if (tokens.equals(0, "mem_consumed"))
         sendTextFrame("mem_consumed " + std::to_string(_admin->getTotalMemoryUsage()));
 
-    else if (tokens[0] == "total_avail_mem")
+    else if (tokens.equals(0, "total_avail_mem"))
         sendTextFrame("total_avail_mem " + std::to_string(_admin->getTotalAvailableMemory()));
 
-    else if (tokens[0] == "sent_bytes")
+    else if (tokens.equals(0, "sent_bytes"))
         sendTextFrame("sent_bytes " + std::to_string(model.getSentBytesTotal() / 1024));
 
-    else if (tokens[0] == "recv_bytes")
+    else if (tokens.equals(0, "recv_bytes"))
         sendTextFrame("recv_bytes " + std::to_string(model.getRecvBytesTotal() / 1024));
 
-    else if (tokens[0] == "uptime")
+    else if (tokens.equals(0, "uptime"))
         sendTextFrame("uptime " + std::to_string(model.getServerUptime()));
 
-    else if (tokens[0] == "kill" && tokens.size() == 2)
+    else if (tokens.equals(0, "kill") && tokens.size() == 2)
     {
         try
         {
@@ -165,7 +165,7 @@ void AdminSocketHandler::handleMessage(const std::vector<char> &payload)
             LOG_WRN("Invalid PID to kill: " << tokens[1]);
         }
     }
-    else if (tokens[0] == "settings")
+    else if (tokens.equals(0, "settings"))
     {
         // for now, we have only these settings
         std::ostringstream oss;
@@ -185,13 +185,13 @@ void AdminSocketHandler::handleMessage(const std::vector<char> &payload)
 
         sendTextFrame(oss.str());
     }
-    else if (tokens[0] == "shutdown")
+    else if (tokens.equals(0, "shutdown"))
     {
         LOG_INF("Shutdown requested by admin.");
         SigUtil::requestShutdown();
         return;
     }
-    else if (tokens[0] == "set" && tokens.size() > 1)
+    else if (tokens.equals(0, "set") && tokens.size() > 1)
     {
         for (size_t i = 1; i < tokens.size(); i++)
         {
diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp
index 4bd43e445..696411fbf 100644
--- a/wsd/ClientSession.cpp
+++ b/wsd/ClientSession.cpp
@@ -337,7 +337,7 @@ bool ClientSession::_handleInput(const char *buffer, int length)
         updateLastActivityTime();
         docBroker->updateLastActivityTime();
     }
-    if (tokens[0] == "loolclient")
+    if (tokens.equals(0, "loolclient"))
     {
         if (tokens.size() < 2)
         {
@@ -363,12 +363,12 @@ bool ClientSession::_handleInput(const char *buffer, int length)
         return true;
     }
 
-    if (tokens[0] == "jserror")
+    if (tokens.equals(0, "jserror"))
     {
         LOG_ERR(std::string(buffer, length));
         return true;
     }
-    else if (tokens[0] == "load")
+    else if (tokens.equals(0, "load"))
     {
         if (getDocURL() != "")
         {
@@ -442,16 +442,16 @@ bool ClientSession::_handleInput(const char *buffer, int length)
         sendTextFrame("error: cmd=" + tokens[0] + " kind=nodocloaded");
         return false;
     }
-    else if (tokens[0] == "canceltiles")
+    else if (tokens.equals(0, "canceltiles"))
     {
         docBroker->cancelTileRequests(shared_from_this());
         return true;
     }
-    else if (tokens[0] == "commandvalues")
+    else if (tokens.equals(0, "commandvalues"))
     {
         return getCommandValues(buffer, length, tokens, docBroker);
     }
-    else if (tokens[0] == "closedocument")
+    else if (tokens.equals(0, "closedocument"))
     {
         // If this session is the owner of the file & 'EnableOwnerTermination' feature
         // is turned on by WOPI, let it close all sessions
@@ -470,46 +470,46 @@ bool ClientSession::_handleInput(const char *buffer, int length)
 
         return true;
     }
-    else if (tokens[0] == "versionrestore")
+    else if (tokens.equals(0, "versionrestore"))
     {
-        if (tokens.size() > 1 && tokens[1] == "prerestore")
+        if (tokens.size() > 1 && tokens.equals(1, "prerestore"))
         {
             // green signal to WOPI host to restore the version *after* saving
             // any unsaved changes, if any, to the storage
             docBroker->closeDocument("versionrestore: prerestore_ack");
         }
     }
-    else if (tokens[0] == "partpagerectangles")
+    else if (tokens.equals(0, "partpagerectangles"))
     {
         // We don't support partpagerectangles any more, will be removed in the
         // next version
         sendTextFrame("partpagerectangles: ");
         return true;
     }
-    else if (tokens[0] == "ping")
+    else if (tokens.equals(0, "ping"))
     {
         std::string count = std::to_string(docBroker->getRenderedTileCount());
         sendTextFrame("pong rendercount=" + count);
         return true;
     }
-    else if (tokens[0] == "renderfont")
+    else if (tokens.equals(0, "renderfont"))
     {
         return sendFontRendering(buffer, length, tokens, docBroker);
     }
-    else if (tokens[0] == "status" || tokens[0] == "statusupdate")
+    else if (tokens.equals(0, "status") || tokens.equals(0, "statusupdate"))
     {
         assert(firstLine.size() == static_cast<size_t>(length));
         return forwardToChild(firstLine, docBroker);
     }
-    else if (tokens[0] == "tile")
+    else if (tokens.equals(0, "tile"))
     {
         return sendTile(buffer, length, tokens, docBroker);
     }
-    else if (tokens[0] == "tilecombine")
+    else if (tokens.equals(0, "tilecombine"))
     {
         return sendCombinedTiles(buffer, length, tokens, docBroker);
     }
-    else if (tokens[0] == "save")
+    else if (tokens.equals(0, "save"))
     {
         if (isReadOnly())
         {
@@ -541,7 +541,7 @@ bool ClientSession::_handleInput(const char *buffer, int length)
                                     isAutosave, isExitSave, extendedData);
         }
     }
-    else if (tokens[0] == "savetostorage")
+    else if (tokens.equals(0, "savetostorage"))
     {
         int force = 0;
         if (tokens.size() > 1)
@@ -552,7 +552,7 @@ bool ClientSession::_handleInput(const char *buffer, int length)
             docBroker->broadcastMessage("commandresult: { \"command\": \"savetostorage\", \"success\": true }");
         }
     }
-    else if (tokens[0] == "clientvisiblearea")
+    else if (tokens.equals(0, "clientvisiblearea"))
     {
         int x;
         int y;
@@ -576,7 +576,7 @@ bool ClientSession::_handleInput(const char *buffer, int length)
             return forwardToChild(std::string(buffer, length), docBroker);
         }
     }
-    else if (tokens[0] == "setclientpart")
+    else if (tokens.equals(0, "setclientpart"))
     {
         if(!_isTextDocument)
         {
@@ -595,7 +595,7 @@ bool ClientSession::_handleInput(const char *buffer, int length)
             }
         }
     }
-    else if (tokens[0] == "selectclientpart")
+    else if (tokens.equals(0, "selectclientpart"))
     {
         if(!_isTextDocument)
         {
@@ -614,7 +614,7 @@ bool ClientSession::_handleInput(const char *buffer, int length)
             }
         }
     }
-    else if (tokens[0] == "moveselectedclientparts")
+    else if (tokens.equals(0, "moveselectedclientparts"))
     {
         if(!_isTextDocument)
         {
@@ -631,7 +631,7 @@ bool ClientSession::_handleInput(const char *buffer, int length)
             }
         }
     }
-    else if (tokens[0] == "clientzoom")
+    else if (tokens.equals(0, "clientzoom"))
     {
         int tilePixelWidth, tilePixelHeight, tileTwipWidth, tileTwipHeight;
         if (tokens.size() != 5 ||
@@ -655,7 +655,7 @@ bool ClientSession::_handleInput(const char *buffer, int length)
             return forwardToChild(std::string(buffer, length), docBroker);
         }
     }
-    else if (tokens[0] == "tileprocessed")
+    else if (tokens.equals(0, "tileprocessed"))
     {
         std::string tileID;
         if (tokens.size() != 2 ||
@@ -681,7 +681,7 @@ bool ClientSession::_handleInput(const char *buffer, int length)
         docBroker->sendRequestedTiles(shared_from_this());
         return true;
     }
-    else if (tokens[0] == "removesession") {
+    else if (tokens.equals(0, "removesession")) {
         if (tokens.size() > 1 && (_isDocumentOwner || !isReadOnly()))
         {
             std::string sessionId = Util::encodeId(std::stoi(tokens[1]), 4);
@@ -691,7 +691,7 @@ bool ClientSession::_handleInput(const char *buffer, int length)
         else
             LOG_WRN("Readonly session '" << getId() << "' trying to kill another view");
     }
-    else if (tokens[0] == "renamefile")
+    else if (tokens.equals(0, "renamefile"))
     {
         std::string encodedWopiFilename;
         if (tokens.size() < 2 || !getTokenString(tokens[1], "filename", encodedWopiFilename))
@@ -705,11 +705,11 @@ bool ClientSession::_handleInput(const char *buffer, int length)
         docBroker->saveAsToStorage(getId(), "", wopiFilename, true);
         return true;
     }
-    else if (tokens[0] == "dialogevent")
+    else if (tokens.equals(0, "dialogevent"))
     {
         return forwardToChild(firstLine, docBroker);
     }
-    else if (tokens[0] == "completefunction")
+    else if (tokens.equals(0, "completefunction"))
     {
         int temp;
         if (tokens.size() != 2 ||
@@ -725,7 +725,7 @@ bool ClientSession::_handleInput(const char *buffer, int length)
     }
     else
     {
-        if (tokens[0] == "key")
+        if (tokens.equals(0, "key"))
             _keyEvents++;
 
         if (!filterMessage(firstLine))
@@ -739,7 +739,7 @@ bool ClientSession::_handleInput(const char *buffer, int length)
         }
         else
         {
-            assert(tokens[0] == "requestloksession");
+            assert(tokens.equals(0, "requestloksession"));
             return true;
         }
     }
@@ -924,7 +924,7 @@ bool ClientSession::filterMessage(const std::string& message) const
     StringVector tokens(LOOLProtocol::tokenize(message, ' '));
 
     // Set allowed flag to false depending on if particular WOPI properties are set
-    if (tokens[0] == "downloadas")
+    if (tokens.equals(0, "downloadas"))
     {
         std::string id;
         if (tokens.size() >= 3 && getTokenString(tokens[2], "id", id))
@@ -946,7 +946,7 @@ bool ClientSession::filterMessage(const std::string& message) const
             LOG_WRN("No value of id in downloadas message");
         }
     }
-    else if (tokens[0] == "gettextselection" || tokens[0] == ".uno:Copy")
+    else if (tokens.equals(0, "gettextselection") || tokens.equals(0, ".uno:Copy"))
     {
         if (_wopiFileInfo && _wopiFileInfo->getDisableCopy())
         {
@@ -958,13 +958,13 @@ bool ClientSession::filterMessage(const std::string& message) const
     {
         // By default, don't allow anything
         allowed = false;
-        if (tokens[0] == "userinactive" || tokens[0] == "useractive" || tokens[0] == "saveas")
+        if (tokens.equals(0, "userinactive") || tokens.equals(0, "useractive") || tokens.equals(0, "saveas"))
         {
             allowed = true;
         }
-        else if (tokens[0] == "uno")
+        else if (tokens.equals(0, "uno"))
         {
-            if (tokens.size() > 1 && tokens[1] == ".uno:ExecuteSearch")
+            if (tokens.size() > 1 && tokens.equals(1, ".uno:ExecuteSearch"))
             {
                 allowed = true;
             }
@@ -1270,12 +1270,12 @@ bool ClientSession::handleKitToClientMessage(const char* buffer, const int lengt
         return true;
     }
 #endif
-    else if (tokens.size() == 2 && tokens[0] == "statechanged:")
+    else if (tokens.size() == 2 && tokens.equals(0, "statechanged:"))
     {
         StringVector stateTokens(LOOLProtocol::tokenize(tokens[1], '='));
-        if (stateTokens.size() == 2 && stateTokens[0] == ".uno:ModifiedStatus")
+        if (stateTokens.size() == 2 && stateTokens.equals(0, ".uno:ModifiedStatus"))
         {
-            docBroker->setModified(stateTokens[1] == "true");
+            docBroker->setModified(stateTokens.equals(1, "true"));
         }
         else
         {
diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp
index e6a95c050..b9e7e983c 100644
--- a/wsd/DocumentBroker.cpp
+++ b/wsd/DocumentBroker.cpp
@@ -2048,7 +2048,7 @@ bool DocumentBroker::forwardToChild(const std::string& viewId, const std::string
         assert(!_uriJailed.empty());
 
         StringVector tokens = LOOLProtocol::tokenize(msg);
-        if (tokens.size() > 1 && tokens[1] == "load")
+        if (tokens.size() > 1 && tokens.equals(1, "load"))
         {
             // The json options must come last.
             msg = tokens[0] + ' ' + tokens[1] + ' ' + tokens[2];
diff --git a/wsd/FileServer.cpp b/wsd/FileServer.cpp
index d7db1e80c..ce9e12756 100644
--- a/wsd/FileServer.cpp
+++ b/wsd/FileServer.cpp
@@ -147,8 +147,8 @@ bool isConfigAuthOk(const std::string& userProvidedUsr, const std::string& userP
         std::vector<unsigned char> saltData;
         StringVector tokens = LOOLProtocol::tokenize(securePass, '.');
         if (tokens.size() != 5 ||
-            tokens[0] != "pbkdf2" ||
-            tokens[1] != "sha512" ||
+            !tokens.equals(0, "pbkdf2") ||
+            !tokens.equals(1, "sha512") ||
             !Util::dataFromHexString(tokens[3], saltData))
         {
             LOG_ERR("Incorrect format detected for secure_password in config file." << useLoolconfig);
@@ -167,7 +167,8 @@ bool isConfigAuthOk(const std::string& userProvidedUsr, const std::string& userP
             stream << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(userProvidedPwdHash[j]);
 
         // now compare the hashed user-provided pwd against the stored hash
-        return stream.str() == tokens[4];
+        std::string string = stream.str();
+        return tokens.equals(4, string.c_str());
 #else
         const std::string pass = config.getString("admin_console.password", "");
         LOG_ERR("The config file has admin_console.secure_password setting, "
diff --git a/wsd/TileCache.cpp b/wsd/TileCache.cpp
index 3211e336e..5ef10804f 100644
--- a/wsd/TileCache.cpp
+++ b/wsd/TileCache.cpp
@@ -323,13 +323,13 @@ std::pair<int, Util::Rectangle> TileCache::parseInvalidateMsg(const std::string&
 {
     StringVector tokens = LOOLProtocol::tokenize(tiles);
 
-    assert(tokens.size() > 0 && tokens[0] == "invalidatetiles:");
+    assert(tokens.size() > 0 && tokens.equals(0, "invalidatetiles:"));
 
-    if (tokens.size() == 2 && tokens[1] == "EMPTY")
+    if (tokens.size() == 2 && tokens.equals(1, "EMPTY"))
     {
         return std::pair<int, Util::Rectangle>(-1, Util::Rectangle(0, 0, INT_MAX, INT_MAX));
     }
-    else if (tokens.size() == 3 && tokens[1] == "EMPTY,")
+    else if (tokens.size() == 3 && tokens.equals(1, "EMPTY,"))
     {
         int part = 0;
         if (stringToInteger(tokens[2], part))


More information about the Libreoffice-commits mailing list