[Libreoffice-commits] online.git: wsd/ClientSession.hpp wsd/DocumentBroker.cpp wsd/PrisonerSession.cpp wsd/SenderQueue.hpp wsd/TileCache.cpp
Ashod Nakashian
ashod.nakashian at collabora.co.uk
Mon Dec 19 05:50:49 UTC 2016
wsd/ClientSession.hpp | 8 ++------
wsd/DocumentBroker.cpp | 4 +---
wsd/PrisonerSession.cpp | 7 +++----
wsd/SenderQueue.hpp | 38 ++++++++++++++++++++++++++++++++++----
wsd/TileCache.cpp | 25 ++++++++++---------------
5 files changed, 50 insertions(+), 32 deletions(-)
New commits:
commit 58d679240cb82444a3eafd31b2320d716dfdec60
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date: Sat Dec 17 14:28:11 2016 -0500
loolwsd: better MessagePayload encapsulation and cleanup
Change-Id: I690f1044f75582b6e7f05b2026f96a0720be2cbc
Reviewed-on: https://gerrit.libreoffice.org/32156
Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
Tested-by: Ashod Nakashian <ashnakash at gmail.com>
diff --git a/wsd/ClientSession.hpp b/wsd/ClientSession.hpp
index f6bc8a5..2786e8f 100644
--- a/wsd/ClientSession.hpp
+++ b/wsd/ClientSession.hpp
@@ -49,18 +49,14 @@ public:
bool sendBinaryFrame(const char* buffer, int length) override
{
- auto payload = std::make_shared<MessagePayload>(length, MessagePayload::Type::Binary);
- auto& output = payload->data();
- std::memcpy(output.data(), buffer, length);
+ auto payload = std::make_shared<MessagePayload>(buffer, length, MessagePayload::Type::Binary);
enqueueSendMessage(payload);
return true;
}
bool sendTextFrame(const char* buffer, const int length) override
{
- auto payload = std::make_shared<MessagePayload>(length, MessagePayload::Type::Text);
- auto& output = payload->data();
- std::memcpy(output.data(), buffer, length);
+ auto payload = std::make_shared<MessagePayload>(buffer, length, MessagePayload::Type::Text);
enqueueSendMessage(payload);
return true;
}
diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp
index 17361ee..96ec511 100644
--- a/wsd/DocumentBroker.cpp
+++ b/wsd/DocumentBroker.cpp
@@ -630,9 +630,7 @@ void DocumentBroker::alertAllUsers(const std::string& msg)
{
Util::assertIsLocked(_mutex);
- auto payload = std::make_shared<MessagePayload>(msg.size(), MessagePayload::Type::Text);
- auto& output = payload->data();
- std::memcpy(output.data(), msg.data(), msg.size());
+ auto payload = std::make_shared<MessagePayload>(msg);
LOG_DBG("Alerting all users of [" << _docKey << "]: " << msg);
for (auto& it : _sessions)
diff --git a/wsd/PrisonerSession.cpp b/wsd/PrisonerSession.cpp
index 59b6a43..b6cdb24 100644
--- a/wsd/PrisonerSession.cpp
+++ b/wsd/PrisonerSession.cpp
@@ -282,10 +282,9 @@ bool PrisonerSession::forwardToPeer(const std::shared_ptr<ClientSession>& client
LOG_TRC(getName() << " -> " << clientSession->getName() << ": " << message);
- auto payload = std::make_shared<MessagePayload>(length, binary ? MessagePayload::Type::Binary
- : MessagePayload::Type::Text);
- auto& output = payload->data();
- std::memcpy(output.data(), buffer, length);
+ auto payload = std::make_shared<MessagePayload>(buffer, length,
+ binary ? MessagePayload::Type::Binary
+ : MessagePayload::Type::Text);
clientSession->enqueueSendMessage(payload);
return true;
diff --git a/wsd/SenderQueue.hpp b/wsd/SenderQueue.hpp
index 647b81a..d9aff9a 100644
--- a/wsd/SenderQueue.hpp
+++ b/wsd/SenderQueue.hpp
@@ -27,20 +27,50 @@ public:
enum class Type { Text, Binary };
- MessagePayload(const size_t size, enum Type type) :
- _data(size),
+ /// Construct a text message.
+ MessagePayload(const std::string& message) :
+ _data(message.data(), message.data() + message.size()),
+ _type(Type::Text)
+ {
+ }
+
+ /// Construct a message from a string with type and
+ /// reserve extra space (total, including message).
+ MessagePayload(const std::string& message,
+ const enum Type type,
+ const size_t reserve = 0) :
+ _data(reserve),
+ _type(type)
+ {
+ _data.resize(message.size());
+ std::memcpy(_data.data(), message.data(), message.size());
+ }
+
+ MessagePayload(const char* data,
+ const size_t size,
+ const enum Type type) :
+ _data(data, data + size),
_type(type)
{
}
- std::vector<char>& data() { return _data; }
+ size_t size() const { return _data.size(); }
+ const std::vector<char>& data() const { return _data; }
+
+ /// Append more data to the message.
+ void append(const char* data, const size_t size)
+ {
+ const auto curSize = _data.size();
+ _data.resize(curSize + size);
+ std::memcpy(_data.data() + curSize, data, size);
+ }
/// Returns true if and only if the payload is considered Binary.
bool isBinary() const { return _type == Type::Binary; }
private:
std::vector<char> _data;
- Type _type;
+ const Type _type;
};
struct SendItem
diff --git a/wsd/TileCache.cpp b/wsd/TileCache.cpp
index c00cc55..9f4b415 100644
--- a/wsd/TileCache.cpp
+++ b/wsd/TileCache.cpp
@@ -171,16 +171,12 @@ void TileCache::saveTileAndNotify(const TileDesc& tile, const char *data, const
std::string response = tile.serialize("tile:");
LOG_DBG("Sending tile message to " << subscriberCount << " subscribers: " + response);
- std::shared_ptr<MessagePayload> payload = std::make_shared<MessagePayload>(response.size() + 1 + size,
- MessagePayload::Type::Binary);
- {
- auto& output = payload->data();
-
- // Send to first subscriber as-is (without cache marker).
- std::memcpy(output.data(), response.data(), response.size());
- output[response.size()] = '\n';
- std::memcpy(output.data() + response.size() + 1, data, size);
- }
+ // Send to first subscriber as-is (without cache marker).
+ auto payload = std::make_shared<MessagePayload>(response,
+ MessagePayload::Type::Binary,
+ response.size() + 1 + size);
+ payload->append("\n", 1);
+ payload->append(data, size);
auto& firstSubscriber = tileBeingRendered->_subscribers[0];
auto firstSession = firstSubscriber.lock();
@@ -196,11 +192,10 @@ void TileCache::saveTileAndNotify(const TileDesc& tile, const char *data, const
// Create a new Payload.
payload.reset();
- payload = std::make_shared<MessagePayload>(response.size() + size, MessagePayload::Type::Binary);
- auto& output = payload->data();
-
- std::memcpy(output.data(), response.data(), response.size());
- std::memcpy(output.data() + response.size(), data, size);
+ payload = std::make_shared<MessagePayload>(response,
+ MessagePayload::Type::Binary,
+ response.size() + size);
+ payload->append(data, size);
for (size_t i = 1; i < subscriberCount; ++i)
{
More information about the Libreoffice-commits
mailing list