loolwsd/ClientSession.cpp | 18 +++++++++--------- loolwsd/LOOLSession.cpp | 9 ++++----- loolwsd/LOOLSession.hpp | 11 ++++++++--- loolwsd/PrisonerSession.cpp | 14 ++++++++++---- 4 files changed, 31 insertions(+), 21 deletions(-)
New commits: commit ecd33e1b07793d83396f22fad38ef70cb33e4612 Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Wed Jul 27 10:56:28 2016 -0400 loolwsd: send json messages to the UI as text Change-Id: Ie5712b4ebf4f01a6650f5f7c0df5197b5b9f9208 Reviewed-on: https://gerrit.libreoffice.org/27588 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 fda1678..f3c2a00 100644 --- a/loolwsd/ClientSession.cpp +++ b/loolwsd/ClientSession.cpp @@ -147,7 +147,7 @@ bool ClientSession::_handleInput(const char *buffer, int length) { if (!_peer.expired()) { - return forwardToPeer(_peer, buffer, length); + return forwardToPeer(_peer, buffer, length, false); } } else if (tokens[0] == "commandvalues") @@ -190,11 +190,11 @@ bool ClientSession::_handleInput(const char *buffer, int length) tokens[0] != "userinactive" && tokens[0] != "useractive") { std::string dummyFrame = "dummymsg"; - return forwardToPeer(_peer, dummyFrame.c_str(), dummyFrame.size()); + return forwardToPeer(_peer, dummyFrame.c_str(), dummyFrame.size(), false); } else if (tokens[0] != "requestloksession") { - return forwardToPeer(_peer, buffer, length); + return forwardToPeer(_peer, buffer, length, false); } else { @@ -236,7 +236,7 @@ bool ClientSession::loadDocument(const char* /*buffer*/, int /*length*/, StringT oss << " options=" << _docOptions; const auto loadRequest = oss.str(); - return forwardToPeer(_peer, loadRequest.c_str(), loadRequest.size()); + return forwardToPeer(_peer, loadRequest.c_str(), loadRequest.size(), false); } catch (const Poco::SyntaxException&) { @@ -259,7 +259,7 @@ bool ClientSession::getStatus(const char *buffer, int length) return sendTextFrame(msg); } - return forwardToPeer(_peer, buffer, length); + return forwardToPeer(_peer, buffer, length, false); } bool ClientSession::setEditLock(const bool value) @@ -269,7 +269,7 @@ bool ClientSession::setEditLock(const bool value) const auto msg = "editlock: " + std::to_string(isEditLocked()); const auto mv = std::getenv("LOK_VIEW_CALLBACK") ? "1" : "0"; Log::debug("Forwarding [" + msg + "] to set editlock to " + std::to_string(value) + ". MultiView: " + mv); - return forwardToPeer(_peer, msg.data(), msg.size()); + return forwardToPeer(_peer, msg.data(), msg.size(), false); } bool ClientSession::getCommandValues(const char *buffer, int length, StringTokenizer& tokens) @@ -286,7 +286,7 @@ bool ClientSession::getCommandValues(const char *buffer, int length, StringToken return sendTextFrame(cmdValues); } - return forwardToPeer(_peer, buffer, length); + return forwardToPeer(_peer, buffer, length, false); } bool ClientSession::getPartPageRectangles(const char *buffer, int length) @@ -297,7 +297,7 @@ bool ClientSession::getPartPageRectangles(const char *buffer, int length) return sendTextFrame(partPageRectangles); } - return forwardToPeer(_peer, buffer, length); + return forwardToPeer(_peer, buffer, length, false); } bool ClientSession::sendFontRendering(const char *buffer, int length, StringTokenizer& tokens) @@ -329,7 +329,7 @@ bool ClientSession::sendFontRendering(const char *buffer, int length, StringToke return sendBinaryFrame(output.data(), output.size()); } - return forwardToPeer(_peer, buffer, length); + return forwardToPeer(_peer, buffer, length, false); } bool ClientSession::sendTile(const char * /*buffer*/, int /*length*/, StringTokenizer& tokens) diff --git a/loolwsd/LOOLSession.cpp b/loolwsd/LOOLSession.cpp index 22b4df7..d9fcfc1 100644 --- a/loolwsd/LOOLSession.cpp +++ b/loolwsd/LOOLSession.cpp @@ -75,27 +75,26 @@ LOOLSession::~LOOLSession() { } -bool LOOLSession::sendTextFrame(const std::string& text) +bool LOOLSession::sendTextFrame(const char* buffer, const int length) { if (!_ws || _ws->poll(Poco::Timespan(0), Socket::SelectMode::SELECT_ERROR)) { - Log::error(getName() + ": Bad socket while sending [" + getAbbreviatedMessage(text.c_str(), text.size()) + "]."); + Log::error(getName() + ": Bad socket while sending [" + getAbbreviatedMessage(buffer, length) + "]."); return false; } - Log::trace(getName() + " Send: " + getAbbreviatedMessage(text.c_str(), text.size())); + Log::trace(getName() + " Send: " + getAbbreviatedMessage(buffer, length)); try { std::unique_lock<std::mutex> lock(_mutex); - const int length = text.size(); if ( length > SMALL_MESSAGE_SIZE ) { const std::string nextmessage = "nextmessage: size=" + std::to_string(length); _ws->sendFrame(nextmessage.data(), nextmessage.size()); } - _ws->sendFrame(text.data(), length); + _ws->sendFrame(buffer, length); return true; } catch (const Exception& exc) diff --git a/loolwsd/LOOLSession.hpp b/loolwsd/LOOLSession.hpp index 3d6e3f3..976e6dd 100644 --- a/loolwsd/LOOLSession.hpp +++ b/loolwsd/LOOLSession.hpp @@ -41,8 +41,12 @@ public: const std::string& getName() const { return _name; } bool isDisconnected() const { return _disconnected; } - bool sendTextFrame(const std::string& text); bool sendBinaryFrame(const char *buffer, int length); + bool sendTextFrame(const char* buffer, const int length); + bool sendTextFrame(const std::string& text) + { + return sendTextFrame(text.data(), text.size()); + } bool handleInput(const char *buffer, int length); @@ -98,7 +102,7 @@ protected: } template <typename T> - bool forwardToPeer(T& p, const char *buffer, int length) + bool forwardToPeer(T& p, const char *buffer, int length, const bool binary) { const auto message = LOOLProtocol::getAbbreviatedMessage(buffer, length); @@ -121,7 +125,8 @@ protected: } Log::trace(getName() + " -> " + peer->getName() + ": " + message); - return peer->sendBinaryFrame(buffer, length); + return binary ? peer->sendBinaryFrame(buffer, length) + : peer->sendTextFrame(buffer, length); } private: diff --git a/loolwsd/PrisonerSession.cpp b/loolwsd/PrisonerSession.cpp index 0968878..5da9780 100644 --- a/loolwsd/PrisonerSession.cpp +++ b/loolwsd/PrisonerSession.cpp @@ -70,6 +70,7 @@ bool PrisonerSession::_handleInput(const char *buffer, int length) throw Poco::ProtocolException("The session has not been assigned a peer."); } + bool isBinary = true; if (tokens[0] == "unocommandresult:") { const std::string stringMsg(buffer, length); @@ -112,7 +113,7 @@ bool PrisonerSession::_handleInput(const char *buffer, int length) errorKind == "passwordrequired:to-modify" || errorKind == "wrongpassword") { - forwardToPeer(_peer, buffer, length); + forwardToPeer(_peer, buffer, length, isBinary); peer->setLoadFailed(errorKind); return false; } @@ -183,13 +184,13 @@ bool PrisonerSession::_handleInput(const char *buffer, int length) _docBroker->tileCache().saveTextFile(std::string(buffer, length), "status.txt"); // Forward the status response to the client. - forwardToPeer(_peer, buffer, length); + forwardToPeer(_peer, buffer, length, isBinary); // 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."); - return forwardToPeer(_peer, message.c_str(), message.size()); + return forwardToPeer(_peer, message.c_str(), message.size(), isBinary); } else if (tokens[0] == "commandvalues:") { @@ -254,8 +255,13 @@ bool PrisonerSession::_handleInput(const char *buffer, int length) } } + // Detect json messages, since we must send those as text even though they are multiline. + // If not, the UI will read the first line of a binary payload, assuming that's the only + // text part and the rest is binary. + isBinary = buffer[length - 1] != '}' && firstLine.find('{') == std::string::npos; + // Forward everything else. - forwardToPeer(_peer, buffer, length); + forwardToPeer(_peer, buffer, length, isBinary); return true; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits