wsd/ClientSession.cpp | 21 ++++++--------------- wsd/ClientSession.hpp | 7 +++---- wsd/DocumentBroker.cpp | 13 +------------ wsd/PrisonerSession.cpp | 31 ++++++++++++------------------- wsd/PrisonerSession.hpp | 10 ++++------ 5 files changed, 26 insertions(+), 56 deletions(-)
New commits: commit 1f3d9ee457148fcc9eff3fbd3da66002010eb8bb Author: Ashod Nakashian <[email protected]> Date: Sat Jan 21 20:31:22 2017 -0500 wsd: ClientSession now encapsulates PrisonerSession No need to expose PrisonerSession via ClientSession when the marshalling of messages can be done by ClientSession directly. PrisonerSession can now be removed altogether. Change-Id: I131e41f5d9ae50be7244fb92a6f391a757502111 Reviewed-on: https://gerrit.libreoffice.org/33431 Reviewed-by: Ashod Nakashian <[email protected]> Tested-by: Ashod Nakashian <[email protected]> diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp index 3bc76de..63ca129 100644 --- a/wsd/ClientSession.cpp +++ b/wsd/ClientSession.cpp @@ -43,6 +43,7 @@ ClientSession::ClientSession(const std::string& id, { LOG_INF("ClientSession ctor [" << getName() << "]."); + _peer = std::make_shared<PrisonerSession>(*this, docBroker); _senderThread = std::thread([this]{ senderThread(); }); } @@ -62,21 +63,6 @@ bool ClientSession::isLoaded() const return _isLoadRequested && _peer && _peer->gotStatus(); } -void ClientSession::bridgePrisonerSession() -{ - auto docBroker = getDocumentBroker(); - if (docBroker) - { - _peer = std::make_shared<PrisonerSession>(shared_from_this(), docBroker); - } - else - { - const std::string msg = "No valid DocBroker while bridging Prisoner Session for " + getName(); - LOG_ERR(msg); - throw std::runtime_error(msg); - } -} - bool ClientSession::_handleInput(const char *buffer, int length) { LOG_TRC(getName() << ": handling [" << getAbbreviatedMessage(buffer, length) << "]."); @@ -495,4 +481,9 @@ void ClientSession::senderThread() LOG_DBG(getName() << " SenderThread finished"); } +bool ClientSession::handleKitToClientMessage(const char* data, const int size) +{ + return _peer->handleInput(data, size); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/wsd/ClientSession.hpp b/wsd/ClientSession.hpp index 5d97d70..b6211a7 100644 --- a/wsd/ClientSession.hpp +++ b/wsd/ClientSession.hpp @@ -37,16 +37,15 @@ public: bool isLoaded() const; - /// Create and connect Prisoner Session between DocumentBroker and us. - void bridgePrisonerSession(); - std::shared_ptr<PrisonerSession> getPeer() const { return _peer; } - const std::string getUserId() const { return _userId; } void setUserId(const std::string& userId) { _userId = userId; } void setUserName(const std::string& userName) { _userName = userName; } void setDocumentOwner(const bool documentOwner) { _isDocumentOwner = documentOwner; } bool isDocumentOwner() const { return _isDocumentOwner; } + /// Handle kit-to-client message. + bool handleKitToClientMessage(const char* data, const int size); + using Session::sendTextFrame; bool sendBinaryFrame(const char* buffer, int length) override diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp index 1d699a2..38d13c1 100644 --- a/wsd/DocumentBroker.cpp +++ b/wsd/DocumentBroker.cpp @@ -651,9 +651,6 @@ size_t DocumentBroker::addSession(std::shared_ptr<ClientSession>& session) const std::string aMessage = "session " + id + ' ' + _docKey; _childProcess->sendTextFrame(aMessage); - // Now we are ready to bridge between the kit and client. - session->bridgePrisonerSession(); - // Tell the admin console about this new doc Admin::instance().addDoc(_docKey, getPid(), getFilename(), id); @@ -1032,15 +1029,7 @@ bool DocumentBroker::forwardToClient(const std::string& prefix, const std::vecto const auto it = _sessions.find(sid); if (it != _sessions.end()) { - const auto peer = it->second->getPeer(); - if (peer) - { - return peer->handleInput(data, size); - } - else - { - LOG_WRN("Client session [" << sid << "] has no peer to forward message: " << message); - } + return it->second->handleKitToClientMessage(data, size); } else { diff --git a/wsd/PrisonerSession.cpp b/wsd/PrisonerSession.cpp index d05a9a6..9a2b0cf 100644 --- a/wsd/PrisonerSession.cpp +++ b/wsd/PrisonerSession.cpp @@ -32,9 +32,9 @@ using namespace LOOLProtocol; using Poco::Path; using Poco::StringTokenizer; -PrisonerSession::PrisonerSession(std::shared_ptr<ClientSession> clientSession, +PrisonerSession::PrisonerSession(ClientSession& clientSession, std::shared_ptr<DocumentBroker> docBroker) : - Session("ToPrisoner-" + clientSession->getId(), clientSession->getId(), nullptr), + Session("ToPrisoner-" + clientSession.getId(), clientSession.getId(), nullptr), _docBroker(std::move(docBroker)), _peer(clientSession), _curPart(0), @@ -56,12 +56,6 @@ bool PrisonerSession::_handleInput(const char *buffer, int length) LOOLWSD::dumpOutgoingTrace(_docBroker->getJailId(), getId(), firstLine); - 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); @@ -111,7 +105,7 @@ bool PrisonerSession::_handleInput(const char *buffer, int length) const auto payload = std::make_shared<Message>(buffer, length, Message::Dir::Out, Message::Type::Text); - forwardToPeer(peer, payload); + forwardToPeer(payload); LOG_WRN("Document load failed: " << errorKind); return false; } @@ -151,7 +145,7 @@ bool PrisonerSession::_handleInput(const char *buffer, int length) } } - peer->setSaveAsUrl(url); + _peer.setSaveAsUrl(url); return true; } else if (tokens.count() == 2 && tokens[0] == "statechanged:") @@ -181,7 +175,7 @@ bool PrisonerSession::_handleInput(const char *buffer, int length) const auto payload = std::make_shared<Message>(buffer, length, Message::Dir::Out, Message::Type::Text); - return forwardToPeer(peer, payload); + return forwardToPeer(payload); } else if (tokens[0] == "commandvalues:") { @@ -251,7 +245,7 @@ bool PrisonerSession::_handleInput(const char *buffer, int length) const auto payload = std::make_shared<Message>(buffer, length, Message::Dir::Out, Message::Type::Binary); - return forwardToPeer(peer, payload); + return forwardToPeer(payload); } } else @@ -269,20 +263,19 @@ bool PrisonerSession::_handleInput(const char *buffer, int length) Message::Dir::Out, isBinary ? Message::Type::Binary : Message::Type::Text); - return forwardToPeer(peer, payload); + return forwardToPeer(payload); } -bool PrisonerSession::forwardToPeer(const std::shared_ptr<ClientSession>& clientSession, - const std::shared_ptr<Message>& payload) +bool PrisonerSession::forwardToPeer(const std::shared_ptr<Message>& payload) { const auto& message = payload->abbr(); - if (clientSession->isCloseFrame()) + if (_peer.isCloseFrame()) { LOG_TRC(getName() << ": peer began the closing handshake. Dropping forward message [" << message << "]."); return true; } - else if (clientSession->isHeadless()) + else if (_peer.isHeadless()) { // Fail silently and return as there is no actual websocket // connection in this case. @@ -290,8 +283,8 @@ bool PrisonerSession::forwardToPeer(const std::shared_ptr<ClientSession>& client return true; } - LOG_TRC(getName() << " -> " << clientSession->getName() << ": " << message); - clientSession->enqueueSendMessage(payload); + LOG_TRC(getName() << " -> " << _peer.getName() << ": " << message); + _peer.enqueueSendMessage(payload); return true; } diff --git a/wsd/PrisonerSession.hpp b/wsd/PrisonerSession.hpp index 12d607c..a79e51e 100644 --- a/wsd/PrisonerSession.hpp +++ b/wsd/PrisonerSession.hpp @@ -18,11 +18,10 @@ class ClientSession; /// Represents an internal session to a Kit process, in the WSD process. /// This doesn't really have a direct connection to any Kit process, rather /// all communication to said Kit process is really handled by DocumentBroker. -class PrisonerSession final : public Session, - public std::enable_shared_from_this<PrisonerSession> +class PrisonerSession final : public Session { public: - PrisonerSession(std::shared_ptr<ClientSession> clientSession, + PrisonerSession(ClientSession& clientSession, std::shared_ptr<DocumentBroker> docBroker); virtual ~PrisonerSession(); @@ -34,12 +33,11 @@ private: /// Handle messages from the Kit to the client. virtual bool _handleInput(const char* buffer, int length) override; - bool forwardToPeer(const std::shared_ptr<ClientSession>& clientSession, - const std::shared_ptr<Message>& payload); + bool forwardToPeer(const std::shared_ptr<Message>& payload); private: std::shared_ptr<DocumentBroker> _docBroker; - std::weak_ptr<ClientSession> _peer; + ClientSession& _peer; int _curPart; bool _gotStatus; }; _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
