[Libreoffice-commits] online.git: loolwsd/ChildProcessSession.cpp loolwsd/ChildProcessSession.hpp loolwsd/DocumentBroker.cpp loolwsd/LOOLKit.cpp loolwsd/LOOLSession.hpp loolwsd/MasterProcessSession.hpp

Ashod Nakashian ashod.nakashian at collabora.co.uk
Wed May 4 10:36:56 UTC 2016


 loolwsd/ChildProcessSession.cpp  |  151 ---------------------------------------
 loolwsd/ChildProcessSession.hpp  |    2 
 loolwsd/DocumentBroker.cpp       |    4 +
 loolwsd/LOOLKit.cpp              |  146 +++++++++++++++++++++++++++++++++++++
 loolwsd/LOOLSession.hpp          |    4 -
 loolwsd/MasterProcessSession.hpp |    4 -
 6 files changed, 153 insertions(+), 158 deletions(-)

New commits:
commit df67c4a31c1f7ccd26d861300787e0033eddd9f1
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Tue May 3 07:47:58 2016 -0400

    loolwsd: move tilecombine handling into lokit
    
    Change-Id: I32854769c5260444b0e97c112a141028f1cda179
    Reviewed-on: https://gerrit.libreoffice.org/24641
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
    Tested-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/loolwsd/ChildProcessSession.cpp b/loolwsd/ChildProcessSession.cpp
index 5ca7d6e..6843b24 100644
--- a/loolwsd/ChildProcessSession.cpp
+++ b/loolwsd/ChildProcessSession.cpp
@@ -441,14 +441,10 @@ bool ChildProcessSession::_handleInput(const char *buffer, int length)
     {
         return getStatus(buffer, length);
     }
-    else if (tokens[0] == "tile")
+    else if (tokens[0] == "tile" || tokens[0] == "tilecombine")
     {
         assert(!"Tile traffic should go through the DocumentBroker-LoKit WS.");
     }
-    else if (tokens[0] == "tilecombine")
-    {
-        sendCombinedTiles(buffer, length, tokens);
-    }
     else
     {
         // All other commands are such that they always require a LibreOfficeKitDocument session,
@@ -725,151 +721,6 @@ namespace {
     }
 }
 
-void ChildProcessSession::sendCombinedTiles(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
-{
-    int part, pixelWidth, pixelHeight, tileWidth, tileHeight;
-    std::string tilePositionsX, tilePositionsY;
-    std::string reqTimestamp;
-
-    if (tokens.count() < 8 ||
-        !getTokenInteger(tokens[1], "part", part) ||
-        !getTokenInteger(tokens[2], "width", pixelWidth) ||
-        !getTokenInteger(tokens[3], "height", pixelHeight) ||
-        !getTokenString (tokens[4], "tileposx", tilePositionsX) ||
-        !getTokenString (tokens[5], "tileposy", tilePositionsY) ||
-        !getTokenInteger(tokens[6], "tilewidth", tileWidth) ||
-        !getTokenInteger(tokens[7], "tileheight", tileHeight))
-    {
-        sendTextFrame("error: cmd=tilecombine kind=syntax");
-        return;
-    }
-
-    if (part < 0 || pixelWidth <= 0 || pixelHeight <= 0
-       || tileWidth <= 0 || tileHeight <= 0
-       || tilePositionsX.empty() || tilePositionsY.empty())
-    {
-        sendTextFrame("error: cmd=tilecombine kind=invalid");
-        return;
-    }
-
-    if (tokens.count() > 8)
-        getTokenString(tokens[8], "timestamp", reqTimestamp);
-
-    bool makeSlow = delayAndRewritePart(part);
-
-    Util::Rectangle renderArea;
-
-    StringTokenizer positionXtokens(tilePositionsX, ",", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
-    StringTokenizer positionYtokens(tilePositionsY, ",", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
-
-    size_t numberOfPositions = positionYtokens.count();
-    // check that number of positions for X and Y is the same
-    if (numberOfPositions != positionYtokens.count())
-    {
-        sendTextFrame("error: cmd=tilecombine kind=invalid");
-        return;
-    }
-
-    std::vector<Util::Rectangle> tiles;
-    tiles.reserve(numberOfPositions);
-
-    for (size_t i = 0; i < numberOfPositions; ++i)
-    {
-        int x = 0;
-        if (!stringToInteger(positionXtokens[i], x))
-        {
-            sendTextFrame("error: cmd=tilecombine kind=syntax");
-            return;
-        }
-
-        int y = 0;
-        if (!stringToInteger(positionYtokens[i], y))
-        {
-            sendTextFrame("error: cmd=tilecombine kind=syntax");
-            return;
-        }
-
-        Util::Rectangle rectangle(x, y, tileWidth, tileHeight);
-
-        if (tiles.empty())
-        {
-            renderArea = rectangle;
-        }
-        else
-        {
-            renderArea.extend(rectangle);
-        }
-
-        tiles.push_back(rectangle);
-    }
-
-    if (_docType != "text" && part != _loKitDocument->pClass->getPart(_loKitDocument))
-    {
-        _loKitDocument->pClass->setPart(_loKitDocument, part);
-    }
-
-    LibreOfficeKitTileMode mode = static_cast<LibreOfficeKitTileMode>(_loKitDocument->pClass->getTileMode(_loKitDocument));
-
-    int tilesByX = renderArea.getWidth() / tileWidth;
-    int tilesByY = renderArea.getHeight() / tileHeight;
-
-    int pixmapWidth = tilesByX * pixelWidth;
-    int pixmapHeight = tilesByY * pixelHeight;
-
-    const size_t pixmapSize = 4 * pixmapWidth * pixmapHeight;
-
-    std::vector<unsigned char> pixmap(pixmapSize, 0);
-
-    Timestamp timestamp;
-    _loKitDocument->pClass->paintTile(_loKitDocument, pixmap.data(), pixmapWidth, pixmapHeight,
-                                      renderArea.getLeft(), renderArea.getTop(),
-                                      renderArea.getWidth(), renderArea.getHeight());
-
-    Log::debug() << "paintTile (combined) called, tile at [" << renderArea.getLeft() << ", " << renderArea.getTop() << "]"
-                << " (" << renderArea.getWidth() << ", " << renderArea.getHeight() << ") rendered in "
-                << double(timestamp.elapsed())/1000 <<  "ms" << Log::end;
-
-    for (Util::Rectangle& tileRect : tiles)
-    {
-        std::string response = "tile: part=" + std::to_string(part) +
-                               " width=" + std::to_string(pixelWidth) +
-                               " height=" + std::to_string(pixelHeight) +
-                               " tileposx=" + std::to_string(tileRect.getLeft()) +
-                               " tileposy=" + std::to_string(tileRect.getTop()) +
-                               " tilewidth=" + std::to_string(tileWidth) +
-                               " tileheight=" + std::to_string(tileHeight);
-
-        if (reqTimestamp != "")
-            response += " timestamp=" + reqTimestamp;
-
-#if ENABLE_DEBUG
-        response += " renderid=" + Util::UniqueId();
-#endif
-
-        response += "\n";
-
-        std::vector<char> output;
-        output.reserve(pixelWidth * pixelHeight * 4 + response.size());
-        output.resize(response.size());
-
-        std::copy(response.begin(), response.end(), output.begin());
-
-        int positionX = (tileRect.getLeft() - renderArea.getLeft()) / tileWidth;
-        int positionY = (tileRect.getTop() - renderArea.getTop())  / tileHeight;
-
-        if (!Util::encodeSubBufferToPNG(pixmap.data(), positionX * pixelWidth, positionY * pixelHeight, pixelWidth, pixelHeight, pixmapWidth, pixmapHeight, output, mode))
-        {
-            sendTextFrame("error: cmd=tile kind=failure");
-            return;
-        }
-
-        sendBinaryFrame(output.data(), output.size());
-    }
-
-    if (makeSlow)
-        delay();
-}
-
 bool ChildProcessSession::clientZoom(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
 {
     int tilePixelWidth, tilePixelHeight, tileTwipWidth, tileTwipHeight;
diff --git a/loolwsd/ChildProcessSession.hpp b/loolwsd/ChildProcessSession.hpp
index ec6855e..8a760cb 100644
--- a/loolwsd/ChildProcessSession.hpp
+++ b/loolwsd/ChildProcessSession.hpp
@@ -67,8 +67,6 @@ public:
  protected:
     virtual bool loadDocument(const char *buffer, int length, Poco::StringTokenizer& tokens) override;
 
-    virtual void sendCombinedTiles(const char *buffer, int length, Poco::StringTokenizer& tokens) override;
-
     virtual void sendFontRendering(const char *buffer, int length, Poco::StringTokenizer& tokens) override;
 
     bool clientZoom(const char *buffer, int length, Poco::StringTokenizer& tokens);
diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp
index a390320..9f5c0a3 100644
--- a/loolwsd/DocumentBroker.cpp
+++ b/loolwsd/DocumentBroker.cpp
@@ -393,6 +393,10 @@ void DocumentBroker::handleTileRequest(int part, int width, int height, int tile
                                        int tilePosY, int tileWidth, int tileHeight,
                                        const std::shared_ptr<MasterProcessSession>& session)
 {
+    Log::trace() << "Tile request for part: " << part << ", width: " << width << ", height: " << height
+                 << ", tilePosX: " << tilePosX << ", tilePosY: " << tilePosY << ", tileWidth: " << tileWidth
+                 << ", tileHeight: " << tileHeight << Log::end;
+
     std::unique_lock<std::mutex> lock(_mutex);
 
     std::unique_ptr<std::fstream> cachedTile = tileCache().lookupTile(part, width, height, tilePosX, tilePosY, tileWidth, tileHeight);
diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp
index a5269a9..2262e78 100644
--- a/loolwsd/LOOLKit.cpp
+++ b/loolwsd/LOOLKit.cpp
@@ -661,6 +661,152 @@ public:
         ws->sendFrame(output.data(), length, WebSocket::FRAME_BINARY);
     }
 
+    void sendCombinedTiles(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
+    {
+        int part, pixelWidth, pixelHeight, tileWidth, tileHeight;
+        std::string tilePositionsX, tilePositionsY;
+        std::string reqTimestamp;
+
+        if (tokens.count() < 8 ||
+            !getTokenInteger(tokens[1], "part", part) ||
+            !getTokenInteger(tokens[2], "width", pixelWidth) ||
+            !getTokenInteger(tokens[3], "height", pixelHeight) ||
+            !getTokenString (tokens[4], "tileposx", tilePositionsX) ||
+            !getTokenString (tokens[5], "tileposy", tilePositionsY) ||
+            !getTokenInteger(tokens[6], "tilewidth", tileWidth) ||
+            !getTokenInteger(tokens[7], "tileheight", tileHeight))
+        {
+            //sendTextFrame("error: cmd=tilecombine kind=syntax");
+            return;
+        }
+
+        if (part < 0 || pixelWidth <= 0 || pixelHeight <= 0
+           || tileWidth <= 0 || tileHeight <= 0
+           || tilePositionsX.empty() || tilePositionsY.empty())
+        {
+            //sendTextFrame("error: cmd=tilecombine kind=invalid");
+            return;
+        }
+
+        if (tokens.count() > 8)
+            getTokenString(tokens[8], "timestamp", reqTimestamp);
+/*
+        bool makeSlow = delayAndRewritePart(part);
+
+        Util::Rectangle renderArea;
+
+        StringTokenizer positionXtokens(tilePositionsX, ",", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
+        StringTokenizer positionYtokens(tilePositionsY, ",", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
+
+        size_t numberOfPositions = positionYtokens.count();
+        // check that number of positions for X and Y is the same
+        if (numberOfPositions != positionYtokens.count())
+        {
+            sendTextFrame("error: cmd=tilecombine kind=invalid");
+            return;
+        }
+
+        std::vector<Util::Rectangle> tiles;
+        tiles.reserve(numberOfPositions);
+
+        for (size_t i = 0; i < numberOfPositions; ++i)
+        {
+            int x = 0;
+            if (!stringToInteger(positionXtokens[i], x))
+            {
+                sendTextFrame("error: cmd=tilecombine kind=syntax");
+                return;
+            }
+
+            int y = 0;
+            if (!stringToInteger(positionYtokens[i], y))
+            {
+                sendTextFrame("error: cmd=tilecombine kind=syntax");
+                return;
+            }
+
+            Util::Rectangle rectangle(x, y, tileWidth, tileHeight);
+
+            if (tiles.empty())
+            {
+                renderArea = rectangle;
+            }
+            else
+            {
+                renderArea.extend(rectangle);
+            }
+
+            tiles.push_back(rectangle);
+        }
+
+        if (_docType != "text" && part != _loKitDocument->pClass->getPart(_loKitDocument))
+        {
+            _loKitDocument->pClass->setPart(_loKitDocument, part);
+        }
+
+        LibreOfficeKitTileMode mode = static_cast<LibreOfficeKitTileMode>(_loKitDocument->pClass->getTileMode(_loKitDocument));
+
+        int tilesByX = renderArea.getWidth() / tileWidth;
+        int tilesByY = renderArea.getHeight() / tileHeight;
+
+        int pixmapWidth = tilesByX * pixelWidth;
+        int pixmapHeight = tilesByY * pixelHeight;
+
+        const size_t pixmapSize = 4 * pixmapWidth * pixmapHeight;
+
+        std::vector<unsigned char> pixmap(pixmapSize, 0);
+
+        Timestamp timestamp;
+        _loKitDocument->pClass->paintTile(_loKitDocument, pixmap.data(), pixmapWidth, pixmapHeight,
+                                          renderArea.getLeft(), renderArea.getTop(),
+                                          renderArea.getWidth(), renderArea.getHeight());
+
+        Log::debug() << "paintTile (combined) called, tile at [" << renderArea.getLeft() << ", " << renderArea.getTop() << "]"
+                    << " (" << renderArea.getWidth() << ", " << renderArea.getHeight() << ") rendered in "
+                    << double(timestamp.elapsed())/1000 <<  "ms" << Log::end;
+
+        for (Util::Rectangle& tileRect : tiles)
+        {
+            std::string response = "tile: part=" + std::to_string(part) +
+                                   " width=" + std::to_string(pixelWidth) +
+                                   " height=" + std::to_string(pixelHeight) +
+                                   " tileposx=" + std::to_string(tileRect.getLeft()) +
+                                   " tileposy=" + std::to_string(tileRect.getTop()) +
+                                   " tilewidth=" + std::to_string(tileWidth) +
+                                   " tileheight=" + std::to_string(tileHeight);
+
+            if (reqTimestamp != "")
+                response += " timestamp=" + reqTimestamp;
+
+#if ENABLE_DEBUG
+            response += " renderid=" + Util::UniqueId();
+#endif
+
+            response += "\n";
+
+            std::vector<char> output;
+            output.reserve(pixelWidth * pixelHeight * 4 + response.size());
+            output.resize(response.size());
+
+            std::copy(response.begin(), response.end(), output.begin());
+
+            int positionX = (tileRect.getLeft() - renderArea.getLeft()) / tileWidth;
+            int positionY = (tileRect.getTop() - renderArea.getTop())  / tileHeight;
+
+            if (!Util::encodeSubBufferToPNG(pixmap.data(), positionX * pixelWidth, positionY * pixelHeight, pixelWidth, pixelHeight, pixmapWidth, pixmapHeight, output, mode))
+            {
+                sendTextFrame("error: cmd=tile kind=failure");
+                return;
+            }
+
+            sendBinaryFrame(output.data(), output.size());
+        }
+
+        if (makeSlow)
+            delay();
+        */
+    }
+
 private:
 
     static void ViewCallback(int , const char* , void* )
diff --git a/loolwsd/LOOLSession.hpp b/loolwsd/LOOLSession.hpp
index 9864562..13fa109 100644
--- a/loolwsd/LOOLSession.hpp
+++ b/loolwsd/LOOLSession.hpp
@@ -87,10 +87,6 @@ protected:
 
     virtual bool loadDocument(const char *buffer, int length, Poco::StringTokenizer& tokens) = 0;
 
-    virtual void sendTile(const char *buffer, int length, Poco::StringTokenizer& tokens) = 0;
-
-    virtual void sendCombinedTiles(const char *buffer, int length, Poco::StringTokenizer& tokens) = 0;
-
     virtual void sendFontRendering(const char *buffer, int length, Poco::StringTokenizer& tokens) = 0;
 
     void updateLastActivityTime()
diff --git a/loolwsd/MasterProcessSession.hpp b/loolwsd/MasterProcessSession.hpp
index c3e1662..19a4788 100644
--- a/loolwsd/MasterProcessSession.hpp
+++ b/loolwsd/MasterProcessSession.hpp
@@ -60,9 +60,9 @@ public:
  protected:
     virtual bool loadDocument(const char *buffer, int length, Poco::StringTokenizer& tokens) override;
 
-    virtual void sendTile(const char *buffer, int length, Poco::StringTokenizer& tokens) override;
+    virtual void sendTile(const char *buffer, int length, Poco::StringTokenizer& tokens);
 
-    virtual void sendCombinedTiles(const char *buffer, int length, Poco::StringTokenizer& tokens) override;
+    virtual void sendCombinedTiles(const char *buffer, int length, Poco::StringTokenizer& tokens);
 
     virtual void sendFontRendering(const char *buffer, int length, Poco::StringTokenizer& tokens) override;
 


More information about the Libreoffice-commits mailing list