[Libreoffice-commits] online.git: common/Message.hpp wsd/ClientSession.cpp wsd/ClientSession.hpp wsd/TileCache.cpp
Ashod Nakashian
ashod.nakashian at collabora.co.uk
Thu Jan 26 02:08:41 UTC 2017
common/Message.hpp | 31 +++++++++++++++++++++++--------
wsd/ClientSession.cpp | 22 ++++------------------
wsd/ClientSession.hpp | 8 ++------
wsd/TileCache.cpp | 10 ++++------
4 files changed, 33 insertions(+), 38 deletions(-)
New commits:
commit acc029a4113349ccc88bf77accd264f4584574e0
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date: Sat Jan 21 23:50:08 2017 -0500
wsd: autodetect message type
Change-Id: I0f3ab61867ea067f24050acb15660fa93fc7bbb5
Reviewed-on: https://gerrit.libreoffice.org/33437
Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
Tested-by: Ashod Nakashian <ashnakash at gmail.com>
diff --git a/common/Message.hpp b/common/Message.hpp
index cc7063e..5be6186 100644
--- a/common/Message.hpp
+++ b/common/Message.hpp
@@ -27,14 +27,13 @@ public:
/// Construct a text message.
/// message must include the full first-line.
Message(const std::string& message,
- const enum Dir dir,
- const enum Type type = Type::Text) :
+ const enum Dir dir) :
_data(message.data(), message.data() + message.size()),
_tokens(LOOLProtocol::tokenize(_data.data(), _data.size())),
_id(makeId(dir)),
_firstLine(LOOLProtocol::getFirstLine(_data.data(), _data.size())),
_abbr(_id + ' ' + LOOLProtocol::getAbbreviatedMessage(_data.data(), _data.size())),
- _type(type)
+ _type(detectType())
{
}
@@ -43,14 +42,13 @@ public:
/// message must include the full first-line.
Message(const std::string& message,
const enum Dir dir,
- const enum Type type,
const size_t reserve) :
_data(std::max(reserve, message.size())),
_tokens(LOOLProtocol::tokenize(message)),
_id(makeId(dir)),
_firstLine(LOOLProtocol::getFirstLine(message)),
_abbr(_id + ' ' + LOOLProtocol::getAbbreviatedMessage(message)),
- _type(type)
+ _type(detectType())
{
_data.resize(message.size());
std::memcpy(_data.data(), message.data(), message.size());
@@ -60,14 +58,13 @@ public:
/// Note: p must include the full first-line.
Message(const char* p,
const size_t len,
- const enum Dir dir,
- const enum Type type) :
+ const enum Dir dir) :
_data(p, p + len),
_tokens(LOOLProtocol::tokenize(_data.data(), _data.size())),
_id(makeId(dir)),
_firstLine(LOOLProtocol::getFirstLine(_data.data(), _data.size())),
_abbr(_id + ' ' + LOOLProtocol::getAbbreviatedMessage(_data.data(), _data.size())),
- _type(type)
+ _type(detectType())
{
}
@@ -114,6 +111,24 @@ private:
return (dir == Dir::In ? 'i' : 'o') + std::to_string(++Counter);
}
+ Type detectType() const
+ {
+ if (_tokens[0] == "tile:" ||
+ _tokens[0] == "tilecombine:" ||
+ _tokens[0] == "renderfont:")
+ {
+ return Type::Binary;
+ }
+
+ if (_data[_data.size() - 1] == '}')
+ {
+ return Type::JSON;
+ }
+
+ // All others are plain text.
+ return Type::Text;
+ }
+
private:
std::vector<char> _data;
const std::vector<std::string> _tokens;
diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp
index 12b8fb8..6437d00 100644
--- a/wsd/ClientSession.cpp
+++ b/wsd/ClientSession.cpp
@@ -536,9 +536,7 @@ bool ClientSession::handleKitToClientMessage(const char* buffer, const int lengt
errorKind == "passwordrequired:to-modify" ||
errorKind == "wrongpassword")
{
- const auto payload = std::make_shared<Message>(buffer, length,
- Message::Dir::Out,
- Message::Type::Text);
+ const auto payload = std::make_shared<Message>(buffer, length, Message::Dir::Out);
forwardToClient(payload);
LOG_WRN("Document load failed: " << errorKind);
return false;
@@ -606,9 +604,7 @@ bool ClientSession::handleKitToClientMessage(const char* buffer, const int lengt
docBroker->setLoaded();
// Forward the status response to the client.
- const auto payload = std::make_shared<Message>(buffer, length,
- Message::Dir::Out,
- Message::Type::Text);
+ const auto payload = std::make_shared<Message>(buffer, length, Message::Dir::Out);
return forwardToClient(payload);
}
else if (tokens[0] == "commandvalues:")
@@ -676,9 +672,7 @@ bool ClientSession::handleKitToClientMessage(const char* buffer, const int lengt
getTokenString(tokens[2], "char", text);
assert(firstLine.size() < static_cast<std::string::size_type>(length));
docBroker->tileCache().saveRendering(font+text, "font", buffer + firstLine.size() + 1, length - firstLine.size() - 1);
- const auto payload = std::make_shared<Message>(buffer, length,
- Message::Dir::Out,
- Message::Type::Binary);
+ const auto payload = std::make_shared<Message>(buffer, length, Message::Dir::Out);
return forwardToClient(payload);
}
}
@@ -687,16 +681,8 @@ bool ClientSession::handleKitToClientMessage(const char* buffer, const int lengt
LOG_INF("Ignoring notification on password protected document: " << firstLine);
}
- // 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.
- const bool isBinary = buffer[length - 1] != '}' && firstLine.find('{') == std::string::npos;
-
// Forward everything else.
- const auto payload = std::make_shared<Message>(buffer, length,
- Message::Dir::Out,
- isBinary ? Message::Type::Binary
- : Message::Type::Text);
+ const auto payload = std::make_shared<Message>(buffer, length, Message::Dir::Out);
return forwardToClient(payload);
}
diff --git a/wsd/ClientSession.hpp b/wsd/ClientSession.hpp
index 706fae1..234b8fd 100644
--- a/wsd/ClientSession.hpp
+++ b/wsd/ClientSession.hpp
@@ -50,18 +50,14 @@ public:
bool sendBinaryFrame(const char* buffer, int length) override
{
- auto payload = std::make_shared<Message>(buffer, length,
- Message::Dir::Out,
- Message::Type::Binary);
+ auto payload = std::make_shared<Message>(buffer, length, Message::Dir::Out);
enqueueSendMessage(payload);
return true;
}
bool sendTextFrame(const char* buffer, const int length) override
{
- auto payload = std::make_shared<Message>(buffer, length,
- Message::Dir::Out,
- Message::Type::Text);
+ auto payload = std::make_shared<Message>(buffer, length, Message::Dir::Out);
enqueueSendMessage(payload);
return true;
}
diff --git a/wsd/TileCache.cpp b/wsd/TileCache.cpp
index 9c4b6f4..270031c 100644
--- a/wsd/TileCache.cpp
+++ b/wsd/TileCache.cpp
@@ -169,9 +169,8 @@ void TileCache::saveTileAndNotify(const TileDesc& tile, const char *data, const
// Send to first subscriber as-is (without cache marker).
auto payload = std::make_shared<Message>(response,
- Message::Dir::Out,
- Message::Type::Binary,
- response.size() + 1 + size);
+ Message::Dir::Out,
+ response.size() + 1 + size);
payload->append("\n", 1);
payload->append(data, size);
@@ -190,9 +189,8 @@ void TileCache::saveTileAndNotify(const TileDesc& tile, const char *data, const
// Create a new Payload.
payload.reset();
payload = std::make_shared<Message>(response,
- Message::Dir::Out,
- Message::Type::Binary,
- response.size() + size);
+ Message::Dir::Out,
+ response.size() + size);
payload->append(data, size);
for (size_t i = 1; i < subscriberCount; ++i)
More information about the Libreoffice-commits
mailing list