[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