loolwsd/DocumentBroker.cpp | 30 ++++++++++++++++++++++++++++++ loolwsd/DocumentBroker.hpp | 20 +++++++++++++++++++- loolwsd/LOOLWSD.cpp | 1 + 3 files changed, 50 insertions(+), 1 deletion(-)
New commits: commit 10417c9447ec1d34a8a599daf28ac4339a37930a Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Sun May 1 20:39:36 2016 -0400 loolwsd: establish communication with child from DocumentBroker The WebSocket that each child created with WSD is not used except to request the child to load the document a client requests. Beyond this point, it was not utilized for anything. In fact, there are no handlers in WSD for messages coming from the child; it is a one-way communication. That is until now. With the move to unify communication between WSD and each child, DocumentBroker can now receive and handle messages from its ChildProcess. Change-Id: Ie7f030a92db8303cd7087fff2325f136a49bc7fc Reviewed-on: https://gerrit.libreoffice.org/24581 Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> Tested-by: Ashod Nakashian <ashnak...@gmail.com> diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp index 8f50e32..52e30f0 100644 --- a/loolwsd/DocumentBroker.cpp +++ b/loolwsd/DocumentBroker.cpp @@ -17,6 +17,27 @@ #include "LOOLWSD.hpp" #include "Storage.hpp" #include "TileCache.hpp" +#include "LOOLProtocol.hpp" + +using namespace LOOLProtocol; + +void ChildProcess::socketProcessor() +{ + IoUtil::SocketProcessor(_ws, + [this](const std::vector<char>& payload) + { + auto docBroker = this->_docBroker.lock(); + if (docBroker) + { + return docBroker->handleInput(payload); + } + + Log::warn("No DocumentBroker to handle child message: [" + LOOLProtocol::getAbbreviatedMessage(payload) + "]."); + return true; + }, + []() { }, + [this]() { return !!this->_stop; }); +} namespace { @@ -79,6 +100,7 @@ DocumentBroker::DocumentBroker(const Poco::URI& uriPublic, { assert(!_docKey.empty()); assert(!_childRoot.empty()); + Log::info("DocumentBroker [" + _uriPublic.toString() + "] created. DocKey: [" + _docKey + "]"); } @@ -359,6 +381,14 @@ size_t DocumentBroker::removeSession(const std::string& id) return _sessions.size(); } +bool DocumentBroker::handleInput(const std::vector<char>& payload) +{ + Log::trace("DocumentBroker got child message: [" + LOOLProtocol::getAbbreviatedMessage(payload) + "]."); + + //TODO: Handle message. + return true; +} + bool DocumentBroker::canDestroy() { std::unique_lock<std::mutex> lock(_mutex); diff --git a/loolwsd/DocumentBroker.hpp b/loolwsd/DocumentBroker.hpp index 965ced3..efdedc3 100644 --- a/loolwsd/DocumentBroker.hpp +++ b/loolwsd/DocumentBroker.hpp @@ -17,6 +17,7 @@ #include <memory> #include <mutex> #include <string> +#include <thread> #include <map> #include <Poco/URI.h> @@ -39,8 +40,10 @@ public: /// @param ws is the control WebSocket to the child. ChildProcess(const Poco::Process::PID pid, const std::shared_ptr<Poco::Net::WebSocket>& ws) : _pid(pid), - _ws(ws) + _ws(ws), + _stop(false) { + _thread = std::thread([this]() { this->socketProcessor(); }); Log::info("ChildProcess ctor [" + std::to_string(_pid) + "]."); } @@ -57,8 +60,15 @@ public: } } + void setDocumentBroker(const std::shared_ptr<DocumentBroker>& docBroker) + { + _docBroker = docBroker; + } + void close(const bool rude) { + _stop = true; + _thread.join(); _ws.reset(); if (_pid != -1) { @@ -95,8 +105,14 @@ public: } private: + void socketProcessor(); + +private: Poco::Process::PID _pid; std::shared_ptr<Poco::Net::WebSocket> _ws; + std::weak_ptr<DocumentBroker> _docBroker; + std::thread _thread; + std::atomic<bool> _stop; }; /// DocumentBroker is responsible for setting up a document @@ -184,6 +200,8 @@ public: bool canDestroy(); bool isMarkedToDestroy() const { return _markToDestroy; } + bool handleInput(const std::vector<char>& payload); + private: /// Sends the .uno:Save command to LoKit. diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp index 5de9afc..1266417 100644 --- a/loolwsd/LOOLWSD.cpp +++ b/loolwsd/LOOLWSD.cpp @@ -533,6 +533,7 @@ private: // Set one we just created. Log::debug("New DocumentBroker for docKey [" + docKey + "]."); docBroker = std::make_shared<DocumentBroker>(uriPublic, docKey, LOOLWSD::ChildRoot, child); + child->setDocumentBroker(docBroker); } // Validate the broker. _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits