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

Ashod Nakashian ashod.nakashian at collabora.co.uk
Tue May 17 03:15:15 UTC 2016


 loolwsd/ChildProcessSession.hpp  |    2 
 loolwsd/ClientSession.cpp        |  359 +++------------------------------------
 loolwsd/ClientSession.hpp        |    4 
 loolwsd/LOOLSession.hpp          |    2 
 loolwsd/MasterProcessSession.cpp |   28 ---
 loolwsd/MasterProcessSession.hpp |    2 
 6 files changed, 31 insertions(+), 366 deletions(-)

New commits:
commit 8af51d0270ef4d4358027420d841356d89ce453b
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Mon May 16 19:11:34 2016 -0400

    loolwsd: MasterProcessSession splitting: moved loadDocument
    
    Change-Id: Iaf32014ab5cbceb6ca5d443a85b0d03d6ccd9876
    Reviewed-on: https://gerrit.libreoffice.org/25041
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
    Tested-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/loolwsd/ChildProcessSession.hpp b/loolwsd/ChildProcessSession.hpp
index 8a760cb..7b6275e 100644
--- a/loolwsd/ChildProcessSession.hpp
+++ b/loolwsd/ChildProcessSession.hpp
@@ -65,7 +65,7 @@ public:
     void setDocState(const int type, const std::string& payload) { _lastDocStates[type] = payload; }
 
  protected:
-    virtual bool loadDocument(const char *buffer, int length, Poco::StringTokenizer& tokens) override;
+    bool loadDocument(const char *buffer, int length, Poco::StringTokenizer& tokens);
 
     virtual void sendFontRendering(const char *buffer, int length, Poco::StringTokenizer& tokens) override;
 
diff --git a/loolwsd/ClientSession.cpp b/loolwsd/ClientSession.cpp
index 36e3185..401831d 100644
--- a/loolwsd/ClientSession.cpp
+++ b/loolwsd/ClientSession.cpp
@@ -172,6 +172,34 @@ bool ClientSession::_handleInput(const char *buffer, int length)
     return true;
 }
 
+bool ClientSession::loadDocument(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
+{
+    if (tokens.count() < 2)
+    {
+        sendTextFrame("error: cmd=load kind=syntax");
+        return false;
+    }
+
+    try
+    {
+        std::string timestamp;
+        parseDocOptions(tokens, _loadPart, timestamp);
+
+        // Finally, wait for the Child to connect to Master,
+        // link the document in jail and dispatch load to child.
+        Log::trace("Dispatching child to handle [load].");
+        dispatchChild();
+
+        return true;
+    }
+    catch (const Poco::SyntaxException&)
+    {
+        sendTextFrame("error: cmd=load kind=uriinvalid");
+    }
+
+    return false;
+}
+
 /*
 void ClientSession::setEditLock(const bool value)
 {
@@ -210,337 +238,6 @@ MasterProcessSession::~MasterProcessSession()
     _saveAsQueue.put("");
 }
 
-bool MasterProcessSession::_handleInput(const char *buffer, int length)
-{
-    const std::string firstLine = getFirstLine(buffer, length);
-    StringTokenizer tokens(firstLine, " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
-    Log::trace(getName() + ": handling [" + firstLine + "].");
-
-    if (LOOLProtocol::tokenIndicatesUserInteraction(tokens[0]))
-    {
-        // Keep track of timestamps of incoming client messages that indicate user activity.
-        updateLastActivityTime();
-    }
-
-    if (tokens[0] == "loolclient")
-    {
-        const auto versionTuple = ParseVersion(tokens[1]);
-        if (std::get<0>(versionTuple) != ProtocolMajorVersionNumber ||
-            std::get<1>(versionTuple) != ProtocolMinorVersionNumber)
-        {
-            sendTextFrame("error: cmd=loolclient kind=badversion");
-            return false;
-        }
-
-        sendTextFrame("loolserver " + GetProtocolVersion());
-        return true;
-    }
-
-    if (_kind == Kind::ToPrisoner)
-    {
-        // Note that this handles both forwarding requests from the client to the child process, and
-        // forwarding replies from the child process to the client. Or does it?
-
-        // Snoop at some messages and manipulate tile cache information as needed
-        auto peer = _peer.lock();
-
-        {
-            if (!peer)
-            {
-                throw Poco::ProtocolException("The session has not been assigned a peer.");
-            }
-
-            if (tokens[0] == "unocommandresult:")
-            {
-                const std::string stringMsg(buffer, length);
-                Log::info(getName() + "Command: " + stringMsg);
-                const auto index = stringMsg.find_first_of('{');
-                if (index != std::string::npos)
-                {
-                    const std::string stringJSON = stringMsg.substr(index);
-                    Poco::JSON::Parser parser;
-                    const auto result = parser.parse(stringJSON);
-                    const auto& object = result.extract<Poco::JSON::Object::Ptr>();
-                    if (object->get("commandName").toString() == ".uno:Save" &&
-                        object->get("success").toString() == "true")
-                    {
-                        _docBroker->save();
-                        return true;
-                    }
-                }
-            }
-
-            if (tokens[0] == "error:")
-            {
-                std::string errorCommand;
-                std::string errorKind;
-                if (getTokenString(tokens[1], "cmd", errorCommand) &&
-                    getTokenString(tokens[2], "kind", errorKind) )
-                {
-                    if (errorCommand == "load")
-                    {
-                        if (errorKind == "passwordrequired:to-view" ||
-                            errorKind == "passwordrequired:to-modify" ||
-                            errorKind == "wrongpassword")
-                        {
-                            forwardToPeer(buffer, length);
-                            peer->_bLoadError = true;
-                            return false;
-                        }
-                    }
-                }
-            }
-
-            if (tokens[0] == "curpart:" &&
-                tokens.count() == 2 &&
-                getTokenInteger(tokens[1], "part", _curPart))
-            {
-                return true;
-            }
-
-            if (tokens.count() == 2 && tokens[0] == "saveas:")
-            {
-                std::string url;
-                if (!getTokenString(tokens[1], "url", url))
-                    return true;
-
-                if (peer)
-                {
-                    // Save as completed, inform the other (Kind::ToClient)
-                    // MasterProcessSession about it.
-
-                    const std::string filePrefix("file:///");
-                    if (url.find(filePrefix) == 0)
-                    {
-                        // Rewrite file:// URLs, as they are visible to the outside world.
-                        const Path path(_docBroker->getJailRoot(), url.substr(filePrefix.length()));
-                        url = filePrefix + path.toString().substr(1);
-                    }
-                    peer->_saveAsQueue.put(url);
-                }
-
-                return true;
-            }
-            else if (tokens.count() == 2 && tokens[0] == "statechanged:")
-            {
-                StringTokenizer stateTokens(tokens[1], "=", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
-                if (stateTokens.count() == 2 && stateTokens[0] == ".uno:ModifiedStatus")
-                {
-                    if (_docBroker)
-                    {
-                        _docBroker->setModified(stateTokens[1] == "true");
-                    }
-                }
-            }
-        }
-
-        if (peer && !_isDocPasswordProtected)
-        {
-            if (tokens[0] == "tile:")
-            {
-                assert(!"Tile traffic should go through the DocumentBroker-LoKit WS.");
-            }
-            else if (tokens[0] == "status:")
-            {
-                _docBroker->setLoaded();
-                _docBroker->tileCache().saveTextFile(std::string(buffer, length), "status.txt");
-
-                // Forward the status response to the client.
-                forwardToPeer(buffer, length);
-
-                // And let clients know if they hold the edit lock.
-                std::string message = "editlock: ";
-                message += std::to_string(peer->isEditLocked());
-                Log::debug("Forwarding [" + message + "] in response to status.");
-                forwardToPeer(message.c_str(), message.size());
-                return true;
-            }
-            else if (tokens[0] == "commandvalues:")
-            {
-                const std::string stringMsg(buffer, length);
-                const auto index = stringMsg.find_first_of('{');
-                if (index != std::string::npos)
-                {
-                    const std::string stringJSON = stringMsg.substr(index);
-                    Poco::JSON::Parser parser;
-                    const auto result = parser.parse(stringJSON);
-                    const auto& object = result.extract<Poco::JSON::Object::Ptr>();
-                    const std::string commandName = object->get("commandName").toString();
-                    if (commandName.find(".uno:CharFontName") != std::string::npos ||
-                        commandName.find(".uno:StyleApply") != std::string::npos)
-                    {
-                        // other commands should not be cached
-                        _docBroker->tileCache().saveTextFile(stringMsg, "cmdValues" + commandName + ".txt");
-                    }
-                }
-            }
-            else if (tokens[0] == "partpagerectangles:")
-            {
-                if (tokens.count() > 1 && !tokens[1].empty())
-                    _docBroker->tileCache().saveTextFile(std::string(buffer, length), "partpagerectangles.txt");
-            }
-            else if (tokens[0] == "invalidatetiles:")
-            {
-                assert(firstLine.size() == static_cast<std::string::size_type>(length));
-                _docBroker->tileCache().invalidateTiles(firstLine);
-            }
-            else if (tokens[0] == "renderfont:")
-            {
-                std::string font;
-                if (tokens.count() < 2 ||
-                    !getTokenString(tokens[1], "font", font))
-                    assert(false);
-
-                assert(firstLine.size() < static_cast<std::string::size_type>(length));
-                _docBroker->tileCache().saveRendering(font, "font", buffer + firstLine.size() + 1, length - firstLine.size() - 1);
-            }
-        }
-
-        forwardToPeer(buffer, length);
-        return true;
-    }
-
-    if (_kind == Kind::ToPrisoner)
-    {
-        // Message from child process to be forwarded to client.
-
-        // I think we should never get here
-        Log::error(getName() + ": Unexpected request [" + tokens[0] + "].");
-        assert(false);
-    }
-    else if (tokens[0] == "takeedit")
-    {
-        _docBroker->takeEditLock(getId());
-        return true;
-    }
-    else if (tokens[0] == "load")
-    {
-        if (_docURL != "")
-        {
-            sendTextFrame("error: cmd=load kind=docalreadyloaded");
-            return false;
-        }
-        return loadDocument(buffer, length, tokens);
-    }
-    else if (tokens[0] != "canceltiles" &&
-             tokens[0] != "clientzoom" &&
-             tokens[0] != "clientvisiblearea" &&
-             tokens[0] != "commandvalues" &&
-             tokens[0] != "downloadas" &&
-             tokens[0] != "getchildid" &&
-             tokens[0] != "gettextselection" &&
-             tokens[0] != "paste" &&
-             tokens[0] != "insertfile" &&
-             tokens[0] != "key" &&
-             tokens[0] != "mouse" &&
-             tokens[0] != "partpagerectangles" &&
-             tokens[0] != "renderfont" &&
-             tokens[0] != "requestloksession" &&
-             tokens[0] != "resetselection" &&
-             tokens[0] != "saveas" &&
-             tokens[0] != "selectgraphic" &&
-             tokens[0] != "selecttext" &&
-             tokens[0] != "setclientpart" &&
-             tokens[0] != "setpage" &&
-             tokens[0] != "status" &&
-             tokens[0] != "tile" &&
-             tokens[0] != "tilecombine" &&
-             tokens[0] != "uno" &&
-             tokens[0] != "useractive" &&
-             tokens[0] != "userinactive")
-    {
-        sendTextFrame("error: cmd=" + tokens[0] + " kind=unknown");
-        return false;
-    }
-    else if (_docURL == "")
-    {
-        sendTextFrame("error: cmd=" + tokens[0] + " kind=nodocloaded");
-        return false;
-    }
-    else if (tokens[0] == "canceltiles")
-    {
-        if (!_peer.expired())
-            forwardToPeer(buffer, length);
-    }
-    else if (tokens[0] == "commandvalues")
-    {
-        return getCommandValues(buffer, length, tokens);
-    }
-    else if (tokens[0] == "partpagerectangles")
-    {
-        return getPartPageRectangles(buffer, length);
-    }
-    else if (tokens[0] == "renderfont")
-    {
-        sendFontRendering(buffer, length, tokens);
-    }
-    else if (tokens[0] == "status")
-    {
-        return getStatus(buffer, length);
-    }
-    else if (tokens[0] == "tile")
-    {
-        sendTile(buffer, length, tokens);
-    }
-    else if (tokens[0] == "tilecombine")
-    {
-        sendCombinedTiles(buffer, length, tokens);
-    }
-    else
-    {
-        // All other commands are such that they always require a
-        // LibreOfficeKitDocument session, i.e. need to be handled in
-        // a child process.
-
-        if (_peer.expired())
-        {
-            Log::trace("Dispatching child to handle [" + tokens[0] + "].");
-            dispatchChild();
-        }
-
-        // Allow 'downloadas' for all kinds of views irrespective of editlock
-        if (_kind == Kind::ToClient && !isEditLocked() && tokens[0] != "downloadas" &&
-            tokens[0] != "userinactive" && tokens[0] != "useractive")
-        {
-            std::string dummyFrame = "dummymsg";
-            forwardToPeer(dummyFrame.c_str(), dummyFrame.size());
-        }
-        else if (tokens[0] != "requestloksession")
-        {
-            forwardToPeer(buffer, length);
-        }
-    }
-    return true;
-}
-
-bool MasterProcessSession::loadDocument(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
-{
-    if (tokens.count() < 2)
-    {
-        sendTextFrame("error: cmd=load kind=syntax");
-        return false;
-    }
-
-    try
-    {
-        std::string timestamp;
-        parseDocOptions(tokens, _loadPart, timestamp);
-
-        // Finally, wait for the Child to connect to Master,
-        // link the document in jail and dispatch load to child.
-        Log::trace("Dispatching child to handle [load].");
-        dispatchChild();
-
-        return true;
-    }
-    catch (const Poco::SyntaxException&)
-    {
-        sendTextFrame("error: cmd=load kind=uriinvalid");
-    }
-
-    return false;
-}
-
 bool MasterProcessSession::getStatus(const char *buffer, int length)
 {
     const std::string status = _docBroker->tileCache().getTextFile("status.txt");
diff --git a/loolwsd/ClientSession.hpp b/loolwsd/ClientSession.hpp
index 980b26f..19f27e1 100644
--- a/loolwsd/ClientSession.hpp
+++ b/loolwsd/ClientSession.hpp
@@ -53,6 +53,8 @@ private:
 
     virtual bool _handleInput(const char *buffer, int length) override;
 
+    bool loadDocument(const char *buffer, int length, Poco::StringTokenizer& tokens);
+
 private:
 
     // If this document holds the edit lock.
@@ -95,8 +97,6 @@ public:
     bool _bLoadError = false;
 
  protected:
-    virtual bool loadDocument(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);
diff --git a/loolwsd/LOOLSession.hpp b/loolwsd/LOOLSession.hpp
index 13fa109..e28fd4b 100644
--- a/loolwsd/LOOLSession.hpp
+++ b/loolwsd/LOOLSession.hpp
@@ -85,8 +85,6 @@ protected:
     /// Parses the options of the "load" command, shared between MasterProcessSession::loadDocument() and ChildProcessSession::loadDocument().
     void parseDocOptions(const Poco::StringTokenizer& tokens, int& part, std::string& timestamp);
 
-    virtual bool loadDocument(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.cpp b/loolwsd/MasterProcessSession.cpp
index 91c0997..f8b94d7 100644
--- a/loolwsd/MasterProcessSession.cpp
+++ b/loolwsd/MasterProcessSession.cpp
@@ -49,34 +49,6 @@ MasterProcessSession::~MasterProcessSession()
 {
 }
 
-bool MasterProcessSession::loadDocument(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
-{
-    if (tokens.count() < 2)
-    {
-        sendTextFrame("error: cmd=load kind=syntax");
-        return false;
-    }
-
-    try
-    {
-        std::string timestamp;
-        parseDocOptions(tokens, _loadPart, timestamp);
-
-        // Finally, wait for the Child to connect to Master,
-        // link the document in jail and dispatch load to child.
-        Log::trace("Dispatching child to handle [load].");
-        dispatchChild();
-
-        return true;
-    }
-    catch (const Poco::SyntaxException&)
-    {
-        sendTextFrame("error: cmd=load kind=uriinvalid");
-    }
-
-    return false;
-}
-
 bool MasterProcessSession::getStatus(const char *buffer, int length)
 {
     const std::string status = _docBroker->tileCache().getTextFile("status.txt");
diff --git a/loolwsd/MasterProcessSession.hpp b/loolwsd/MasterProcessSession.hpp
index 5dc3b46..83437c4 100644
--- a/loolwsd/MasterProcessSession.hpp
+++ b/loolwsd/MasterProcessSession.hpp
@@ -50,8 +50,6 @@ public:
     bool _bLoadError = false;
 
  protected:
-    virtual bool loadDocument(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);


More information about the Libreoffice-commits mailing list