loolwsd/ClientSession.cpp | 113 +--------------- loolwsd/ClientSession.hpp | 23 +-- loolwsd/PrisonerSession.cpp | 309 -------------------------------------------- 3 files changed, 23 insertions(+), 422 deletions(-)
New commits: commit 7b0da5ceae4a7c5f8ce3ee390ae89102a8fb64cd Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Mon May 16 19:20:35 2016 -0400 loolwsd: MasterProcessSession splitting: moved ClientSession handlers Change-Id: I1a660cd17027e1c7290882a301a15b77b3e4940f Reviewed-on: https://gerrit.libreoffice.org/25042 Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> Tested-by: Ashod Nakashian <ashnak...@gmail.com> diff --git a/loolwsd/ClientSession.cpp b/loolwsd/ClientSession.cpp index 401831d..b4b8205 100644 --- a/loolwsd/ClientSession.cpp +++ b/loolwsd/ClientSession.cpp @@ -21,7 +21,7 @@ #include "LOOLWSD.hpp" #include "ClientSession.hpp" #include "PrisonerSession.hpp" -#include "MasterProcessSession.hpp" +#include "ClientSession.hpp" #include "Rectangle.hpp" #include "Storage.hpp" #include "TileCache.hpp" @@ -200,45 +200,7 @@ bool ClientSession::loadDocument(const char* /*buffer*/, int /*length*/, StringT return false; } -/* -void ClientSession::setEditLock(const bool value) -{ - // Update the sate and forward to child. - _bEditLock = value; - const auto msg = std::string("editlock: ") + (value ? "1" : "0"); - forwardToPeer(msg.data(), msg.size()); -} -*/ - -#if 0 -using namespace LOOLProtocol; - -using Poco::Path; -using Poco::StringTokenizer; - -MasterProcessSession::MasterProcessSession(const std::string& id, - const Kind kind, - std::shared_ptr<Poco::Net::WebSocket> ws, - std::shared_ptr<DocumentBroker> docBroker, - std::shared_ptr<BasicTileQueue> queue) : - LOOLSession(id, kind, ws), - _curPart(0), - _loadPart(-1), - _docBroker(docBroker), - _queue(queue) -{ - Log::info("MasterProcessSession ctor [" + getName() + "]."); -} - -MasterProcessSession::~MasterProcessSession() -{ - Log::info("~MasterProcessSession dtor [" + getName() + "]."); - - // Release the save-as queue. - _saveAsQueue.put(""); -} - -bool MasterProcessSession::getStatus(const char *buffer, int length) +bool ClientSession::getStatus(const char *buffer, int length) { const std::string status = _docBroker->tileCache().getTextFile("status.txt"); if (!status.empty()) @@ -263,16 +225,16 @@ bool MasterProcessSession::getStatus(const char *buffer, int length) forwardToPeer(buffer, length); return true; } - -void MasterProcessSession::setEditLock(const bool value) +/* +void ClientSession::setEditLock(const bool value) { // Update the sate and forward to child. _bEditLock = value; const auto msg = std::string("editlock: ") + (value ? "1" : "0"); forwardToPeer(msg.data(), msg.size()); } - -bool MasterProcessSession::getCommandValues(const char *buffer, int length, StringTokenizer& tokens) +*/ +bool ClientSession::getCommandValues(const char *buffer, int length, StringTokenizer& tokens) { std::string command; if (tokens.count() != 2 || !getTokenString(tokens[1], "command", command)) @@ -294,7 +256,7 @@ bool MasterProcessSession::getCommandValues(const char *buffer, int length, Stri return true; } -bool MasterProcessSession::getPartPageRectangles(const char *buffer, int length) +bool ClientSession::getPartPageRectangles(const char *buffer, int length) { const std::string partPageRectangles = _docBroker->tileCache().getTextFile("partpagerectangles.txt"); if (partPageRectangles.size() > 0) @@ -309,13 +271,7 @@ bool MasterProcessSession::getPartPageRectangles(const char *buffer, int length) return true; } -std::string MasterProcessSession::getSaveAs() -{ - const auto payload = _saveAsQueue.get(); - return std::string(payload.data(), payload.size()); -} - -void MasterProcessSession::sendFontRendering(const char *buffer, int length, StringTokenizer& tokens) +void ClientSession::sendFontRendering(const char *buffer, int length, StringTokenizer& tokens) { std::string font; if (tokens.count() < 2 || @@ -351,7 +307,7 @@ void MasterProcessSession::sendFontRendering(const char *buffer, int length, Str forwardToPeer(buffer, length); } -void MasterProcessSession::sendTile(const char * /*buffer*/, int /*length*/, StringTokenizer& tokens) +void ClientSession::sendTile(const char * /*buffer*/, int /*length*/, StringTokenizer& tokens) { try { @@ -365,7 +321,7 @@ void MasterProcessSession::sendTile(const char * /*buffer*/, int /*length*/, Str } } -void MasterProcessSession::sendCombinedTiles(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens) +void ClientSession::sendCombinedTiles(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens) { int part, pixelWidth, pixelHeight, tileWidth, tileHeight; std::string tilePositionsX, tilePositionsY; @@ -438,53 +394,4 @@ void MasterProcessSession::sendCombinedTiles(const char* /*buffer*/, int /*lengt } } -void MasterProcessSession::dispatchChild() -{ - std::ostringstream oss; - oss << "load"; - oss << " url=" << _docBroker->getPublicUri().toString(); - oss << " jail=" << _docBroker->getJailedUri().toString(); - - if (_loadPart >= 0) - oss << " part=" + std::to_string(_loadPart); - - if (_haveDocPassword) - oss << " password=" << _docPassword; - - if (!_docOptions.empty()) - oss << " options=" << _docOptions; - - const auto loadRequest = oss.str(); - forwardToPeer(loadRequest.c_str(), loadRequest.size()); -} - -void MasterProcessSession::forwardToPeer(const char *buffer, int length) -{ - const auto message = getAbbreviatedMessage(buffer, length); - - auto peer = _peer.lock(); - if (!peer) - { - throw Poco::ProtocolException(getName() + ": no peer to forward to: [" + message + "]."); - } - else if (peer->isCloseFrame()) - { - Log::trace(getName() + ": peer began the closing handshake. Dropping forward message [" + message + "]."); - return; - } - - Log::trace(getName() + " -> " + peer->getName() + ": " + message); - peer->sendBinaryFrame(buffer, length); -} - -bool MasterProcessSession::shutdownPeer(Poco::UInt16 statusCode, const std::string& message) -{ - auto peer = _peer.lock(); - if (peer && !peer->isCloseFrame()) - { - peer->_ws->shutdown(statusCode, message); - } - return peer != nullptr; -} -#endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/loolwsd/ClientSession.hpp b/loolwsd/ClientSession.hpp index 19f27e1..1f4bb74 100644 --- a/loolwsd/ClientSession.hpp +++ b/loolwsd/ClientSession.hpp @@ -52,9 +52,20 @@ public: private: virtual bool _handleInput(const char *buffer, int length) override; + virtual bool getStatus(const char *buffer, int length) override; + + virtual bool getCommandValues(const char *buffer, int length, Poco::StringTokenizer& tokens) override; + + virtual bool getPartPageRectangles(const char *buffer, int length) override; bool loadDocument(const char *buffer, int length, Poco::StringTokenizer& tokens); + virtual void sendTile(const char *buffer, int length, Poco::StringTokenizer& tokens); + + virtual void sendCombinedTiles(const char *buffer, int length, Poco::StringTokenizer& tokens); + + virtual void sendFontRendering(const char *buffer, int length, Poco::StringTokenizer& tokens) override; + private: // If this document holds the edit lock. @@ -74,12 +85,6 @@ private: std::shared_ptr<BasicTileQueue> queue); virtual ~MasterProcessSession(); - virtual bool getStatus(const char *buffer, int length) override; - - virtual bool getCommandValues(const char *buffer, int length, Poco::StringTokenizer& tokens) override; - - virtual bool getPartPageRectangles(const char *buffer, int length) override; - /** * Return the URL of the saved-as document when it's ready. If called * before it's ready, the call blocks till then. @@ -97,12 +102,6 @@ public: bool _bLoadError = false; protected: - virtual void sendTile(const char *buffer, int length, Poco::StringTokenizer& tokens); - - virtual void sendCombinedTiles(const char *buffer, int length, Poco::StringTokenizer& tokens); - - virtual void sendFontRendering(const char *buffer, int length, Poco::StringTokenizer& tokens) override; - private: void dispatchChild(); void forwardToPeer(const char *buffer, int length); diff --git a/loolwsd/PrisonerSession.cpp b/loolwsd/PrisonerSession.cpp index 9257616..4078d71 100644 --- a/loolwsd/PrisonerSession.cpp +++ b/loolwsd/PrisonerSession.cpp @@ -21,7 +21,7 @@ #include "LOOLWSD.hpp" #include "ClientSession.hpp" #include "PrisonerSession.hpp" -#include "MasterProcessSession.hpp" +#include "PrisonerSession.hpp" #include "Rectangle.hpp" #include "Storage.hpp" #include "TileCache.hpp" @@ -119,7 +119,7 @@ bool PrisonerSession::_handleInput(const char *buffer, int length) if (peer) { // Save as completed, inform the other (Kind::ToClient) - // MasterProcessSession about it. + // PrisonerSession about it. const std::string filePrefix("file:///"); if (url.find(filePrefix) == 0) @@ -213,309 +213,4 @@ bool PrisonerSession::_handleInput(const char *buffer, int length) return true; } -#if 0 -using namespace LOOLProtocol; - -using Poco::Path; -using Poco::StringTokenizer; - -MasterProcessSession::MasterProcessSession(const std::string& id, - const Kind kind, - std::shared_ptr<Poco::Net::WebSocket> ws, - std::shared_ptr<DocumentBroker> docBroker, - std::shared_ptr<BasicTileQueue> queue) : - LOOLSession(id, kind, ws), - _curPart(0), - _loadPart(-1), - _docBroker(docBroker), - _queue(queue) -{ - Log::info("MasterProcessSession ctor [" + getName() + "]."); -} - -MasterProcessSession::~MasterProcessSession() -{ - Log::info("~MasterProcessSession dtor [" + getName() + "]."); - - // Release the save-as queue. - _saveAsQueue.put(""); -} - -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"); - if (!status.empty()) - { - sendTextFrame(status); - - // And let clients know if they hold the edit lock. - std::string message = "editlock: "; - message += std::to_string(isEditLocked()); - Log::debug("Forwarding [" + message + "] in response to status."); - sendTextFrame(message); - - return true; - } - - if (_peer.expired()) - { - Log::trace("Dispatching child to handle [getStatus]."); - dispatchChild(); - } - - forwardToPeer(buffer, length); - return true; -} - -void MasterProcessSession::setEditLock(const bool value) -{ - // Update the sate and forward to child. - _bEditLock = value; - const auto msg = std::string("editlock: ") + (value ? "1" : "0"); - forwardToPeer(msg.data(), msg.size()); -} - -bool MasterProcessSession::getCommandValues(const char *buffer, int length, StringTokenizer& tokens) -{ - std::string command; - if (tokens.count() != 2 || !getTokenString(tokens[1], "command", command)) - { - sendTextFrame("error: cmd=commandvalues kind=syntax"); - return false; - } - - const std::string cmdValues = _docBroker->tileCache().getTextFile("cmdValues" + command + ".txt"); - if (cmdValues.size() > 0) - { - sendTextFrame(cmdValues); - return true; - } - - if (_peer.expired()) - dispatchChild(); - forwardToPeer(buffer, length); - return true; -} - -bool MasterProcessSession::getPartPageRectangles(const char *buffer, int length) -{ - const std::string partPageRectangles = _docBroker->tileCache().getTextFile("partpagerectangles.txt"); - if (partPageRectangles.size() > 0) - { - sendTextFrame(partPageRectangles); - return true; - } - - if (_peer.expired()) - dispatchChild(); - forwardToPeer(buffer, length); - return true; -} - -std::string MasterProcessSession::getSaveAs() -{ - const auto payload = _saveAsQueue.get(); - return std::string(payload.data(), payload.size()); -} - -void MasterProcessSession::sendFontRendering(const char *buffer, int length, StringTokenizer& tokens) -{ - std::string font; - if (tokens.count() < 2 || - !getTokenString(tokens[1], "font", font)) - { - sendTextFrame("error: cmd=renderfont kind=syntax"); - return; - } - - const std::string response = "renderfont: " + Poco::cat(std::string(" "), tokens.begin() + 1, tokens.end()) + "\n"; - - std::vector<char> output; - output.resize(response.size()); - std::memcpy(output.data(), response.data(), response.size()); - - std::unique_ptr<std::fstream> cachedRendering = _docBroker->tileCache().lookupRendering(font, "font"); - if (cachedRendering && cachedRendering->is_open()) - { - cachedRendering->seekg(0, std::ios_base::end); - size_t pos = output.size(); - std::streamsize size = cachedRendering->tellg(); - output.resize(pos + size); - cachedRendering->seekg(0, std::ios_base::beg); - cachedRendering->read(output.data() + pos, size); - cachedRendering->close(); - - sendBinaryFrame(output.data(), output.size()); - return; - } - - if (_peer.expired()) - dispatchChild(); - forwardToPeer(buffer, length); -} - -void MasterProcessSession::sendTile(const char * /*buffer*/, int /*length*/, StringTokenizer& tokens) -{ - try - { - auto tileDesc = TileDesc::parse(tokens); - _docBroker->handleTileRequest(tileDesc, shared_from_this()); - } - catch (const std::exception& exc) - { - Log::error(std::string("Failed to process tile command: ") + exc.what() + "."); - sendTextFrame("error: cmd=tile kind=invalid"); - } -} - -void MasterProcessSession::sendCombinedTiles(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens) -{ - int part, pixelWidth, pixelHeight, tileWidth, tileHeight; - std::string tilePositionsX, tilePositionsY; - 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; - } - - std::string reqTimestamp; - size_t index = 8; - if (tokens.count() > index && tokens[index].find("timestamp") == 0) - { - getTokenString(tokens[index], "timestamp", reqTimestamp); - ++index; - } - - int id = -1; - if (tokens.count() > index && tokens[index].find("id") == 0) - { - getTokenInteger(tokens[index], "id", id); - ++index; - } - - 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 != positionXtokens.count()) - { - sendTextFrame("error: cmd=tilecombine kind=invalid"); - return; - } - - 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; - } - - const TileDesc tile(part, pixelWidth, pixelHeight, x, y, tileWidth, tileHeight); - _docBroker->handleTileRequest(tile, shared_from_this()); - } -} - -void MasterProcessSession::dispatchChild() -{ - std::ostringstream oss; - oss << "load"; - oss << " url=" << _docBroker->getPublicUri().toString(); - oss << " jail=" << _docBroker->getJailedUri().toString(); - - if (_loadPart >= 0) - oss << " part=" + std::to_string(_loadPart); - - if (_haveDocPassword) - oss << " password=" << _docPassword; - - if (!_docOptions.empty()) - oss << " options=" << _docOptions; - - const auto loadRequest = oss.str(); - forwardToPeer(loadRequest.c_str(), loadRequest.size()); -} - -void MasterProcessSession::forwardToPeer(const char *buffer, int length) -{ - const auto message = getAbbreviatedMessage(buffer, length); - - auto peer = _peer.lock(); - if (!peer) - { - throw Poco::ProtocolException(getName() + ": no peer to forward to: [" + message + "]."); - } - else if (peer->isCloseFrame()) - { - Log::trace(getName() + ": peer began the closing handshake. Dropping forward message [" + message + "]."); - return; - } - - Log::trace(getName() + " -> " + peer->getName() + ": " + message); - peer->sendBinaryFrame(buffer, length); -} - -bool MasterProcessSession::shutdownPeer(Poco::UInt16 statusCode, const std::string& message) -{ - auto peer = _peer.lock(); - if (peer && !peer->isCloseFrame()) - { - peer->_ws->shutdown(statusCode, message); - } - return peer != nullptr; -} -#endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits