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 <vmik...@collabora.com> AuthorDate: Mon Mar 9 09:05:30 2020 +0100 Commit: Andras Timar <andras.ti...@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.me...@collabora.com> Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@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)) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits