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 <[email protected]> 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 <[email protected]> Tested-by: Ashod Nakashian <[email protected]> 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) { _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
