[Libreoffice-commits] online.git: Branch 'distro/collabora/collabora-online-1-9' - 2 commits - loolwsd/ChildSession.cpp loolwsd/ChildSession.hpp

Ashod Nakashian ashod.nakashian at collabora.co.uk
Tue Nov 1 13:29:19 UTC 2016


 loolwsd/ChildSession.cpp |   73 +++++++++++++++++++++++++++++------------------
 loolwsd/ChildSession.hpp |    3 +
 2 files changed, 48 insertions(+), 28 deletions(-)

New commits:
commit ab6b78f965fffc4d4c2ccb9b26620707ac89b59d
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Tue Nov 1 09:24:14 2016 -0400

    loolwsd: save and replay doc state changes
    
    Document state changes come in with the same
    event ID. We need to store them in a separate
    map (also renamed the old 'states' map to 'events').
    
    All important events are now replayed correctly and traced.
    
    Change-Id: I52346b0d252730ba5cedb091b14898479c2a52c5
    Reviewed-on: https://gerrit.libreoffice.org/30466
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
    Tested-by: Ashod Nakashian <ashnakash at gmail.com>
    (cherry picked from commit e08503e2757700a7b566d9fc8c8b300b4af78fee)

diff --git a/loolwsd/ChildSession.cpp b/loolwsd/ChildSession.cpp
index 3606439..ede393e 100644
--- a/loolwsd/ChildSession.cpp
+++ b/loolwsd/ChildSession.cpp
@@ -111,11 +111,19 @@ bool ChildSession::_handleInput(const char *buffer, int length)
         sendTextFrame("setpart: part=" + std::to_string(curPart));
 
         //TODO: Is the order of these important?
-        for (const auto& pair : _lastDocStates)
+        for (const auto& pair : _lastDocEvents)
         {
+            const auto typeName = LOKitHelper::kitCallbackTypeToString(pair.first);
+            LOG_TRC("Replaying missed event: " << typeName << ": " << pair.second);
             loKitCallback(pair.first, pair.second);
         }
 
+        for (const auto& pair : _lastDocStates)
+        {
+            LOG_TRC("Replaying missed state-change: STATE_CHANED: " << pair.second);
+            loKitCallback(LOK_CALLBACK_STATE_CHANGED, pair.second);
+        }
+
         Log::debug("Finished replaying messages.");
     }
 
@@ -938,6 +946,8 @@ bool ChildSession::setPage(const char* /*buffer*/, int /*length*/, StringTokeniz
 void ChildSession::loKitCallback(const int nType, const std::string& rPayload)
 {
     const auto typeName = LOKitHelper::kitCallbackTypeToString(nType);
+    Log::trace() << "CallbackWorker::callback [" << getName() << "]: "
+                 << typeName << " [" << rPayload << "]." << Log::end;
 
     if (isCloseFrame())
     {
@@ -951,6 +961,41 @@ void ChildSession::loKitCallback(const int nType, const std::string& rPayload)
     }
     else if (!isActive())
     {
+        // Cache important notifications to replay them when our client
+        // goes inactive and loses them.
+        if (nType == LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR ||
+            nType == LOK_CALLBACK_CURSOR_VISIBLE ||
+            nType == LOK_CALLBACK_CELL_CURSOR ||
+            nType == LOK_CALLBACK_CELL_FORMULA ||
+            nType == LOK_CALLBACK_GRAPHIC_SELECTION ||
+            nType == LOK_CALLBACK_TEXT_SELECTION ||
+            nType == LOK_CALLBACK_TEXT_SELECTION_START ||
+            nType == LOK_CALLBACK_TEXT_SELECTION_END ||
+            nType == LOK_CALLBACK_DOCUMENT_SIZE_CHANGED ||
+            nType == LOK_CALLBACK_INVALIDATE_VIEW_CURSOR ||
+            nType == LOK_CALLBACK_TEXT_VIEW_SELECTION ||
+            nType == LOK_CALLBACK_CELL_VIEW_CURSOR ||
+            nType == LOK_CALLBACK_GRAPHIC_VIEW_SELECTION ||
+            nType == LOK_CALLBACK_VIEW_CURSOR_VISIBLE ||
+            nType == LOK_CALLBACK_VIEW_LOCK)
+        {
+            auto lock(getLock());
+
+            _lastDocEvents[nType] = rPayload;
+        }
+
+        if (nType == LOK_CALLBACK_STATE_CHANGED)
+        {
+            std::string name;
+            std::string value;
+            if (LOOLProtocol::parseNameValuePair(rPayload, name, value, '='))
+            {
+                auto lock(getLock());
+
+                _lastDocStates[name] = rPayload;
+            }
+        }
+
         // Pass save notifications through.
         if (nType != LOK_CALLBACK_UNO_COMMAND_RESULT || rPayload.find(".uno:Save") == std::string::npos)
         {
@@ -959,33 +1004,6 @@ void ChildSession::loKitCallback(const int nType, const std::string& rPayload)
         }
     }
 
-    Log::trace() << "CallbackWorker::callback [" << getName() << "]: "
-                 << typeName << " [" << rPayload << "]." << Log::end;
-
-    // Cache important notifications to replay them when our client
-    // goes inactive and loses them.
-    if (nType == LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR ||
-        nType == LOK_CALLBACK_CURSOR_VISIBLE ||
-        nType == LOK_CALLBACK_CELL_CURSOR ||
-        nType == LOK_CALLBACK_CELL_FORMULA ||
-        nType == LOK_CALLBACK_GRAPHIC_SELECTION ||
-        nType == LOK_CALLBACK_TEXT_SELECTION ||
-        nType == LOK_CALLBACK_TEXT_SELECTION_START ||
-        nType == LOK_CALLBACK_TEXT_SELECTION_END ||
-        nType == LOK_CALLBACK_DOCUMENT_SIZE_CHANGED ||
-        nType == LOK_CALLBACK_INVALIDATE_VIEW_CURSOR ||
-        nType == LOK_CALLBACK_TEXT_VIEW_SELECTION ||
-        nType == LOK_CALLBACK_CELL_VIEW_CURSOR ||
-        nType == LOK_CALLBACK_GRAPHIC_VIEW_SELECTION ||
-        nType == LOK_CALLBACK_VIEW_CURSOR_VISIBLE ||
-        nType == LOK_CALLBACK_VIEW_LOCK ||
-        nType == LOK_CALLBACK_STATE_CHANGED)
-    {
-        auto lock(getLock());
-
-        _lastDocStates[nType] = rPayload;
-    }
-
     switch (nType)
     {
     case LOK_CALLBACK_INVALIDATE_TILES:
diff --git a/loolwsd/ChildSession.hpp b/loolwsd/ChildSession.hpp
index 4730f72..624090c 100644
--- a/loolwsd/ChildSession.hpp
+++ b/loolwsd/ChildSession.hpp
@@ -127,7 +127,8 @@ private:
 
     std::shared_ptr<lok::Document> _loKitDocument;
     std::string _docType;
-    std::map<int, std::string> _lastDocStates;
+    std::map<std::string, std::string> _lastDocStates;
+    std::map<int, std::string> _lastDocEvents;
 
     /// Synchronize _loKitDocument access.
     /// This should be owned by Document.
commit 811d592706ad037364c45029fb4aa597c53c022e
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Tue Nov 1 08:59:55 2016 -0400

    loolwsd: replay state change events when re-activating a client
    
    Change-Id: Id2181c8426712320a9fffacd7d8d350f1476580a
    Reviewed-on: https://gerrit.libreoffice.org/30465
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
    Tested-by: Ashod Nakashian <ashnakash at gmail.com>
    (cherry picked from commit 56b1f224989efa8a02ab33ce68671484b1ca243c)

diff --git a/loolwsd/ChildSession.cpp b/loolwsd/ChildSession.cpp
index e1a5bbe..3606439 100644
--- a/loolwsd/ChildSession.cpp
+++ b/loolwsd/ChildSession.cpp
@@ -978,7 +978,8 @@ void ChildSession::loKitCallback(const int nType, const std::string& rPayload)
         nType == LOK_CALLBACK_CELL_VIEW_CURSOR ||
         nType == LOK_CALLBACK_GRAPHIC_VIEW_SELECTION ||
         nType == LOK_CALLBACK_VIEW_CURSOR_VISIBLE ||
-        nType == LOK_CALLBACK_VIEW_LOCK)
+        nType == LOK_CALLBACK_VIEW_LOCK ||
+        nType == LOK_CALLBACK_STATE_CHANGED)
     {
         auto lock(getLock());
 


More information about the Libreoffice-commits mailing list