[Libreoffice-commits] online.git: loolwsd/ChildProcessSession.cpp loolwsd/ChildProcessSession.hpp

Ashod Nakashian ashod.nakashian at collabora.co.uk
Fri Apr 22 04:37:09 UTC 2016


 loolwsd/ChildProcessSession.cpp |   47 ++++++++++++++++++++++++++++++++++++----
 loolwsd/ChildProcessSession.hpp |    5 ++++
 2 files changed, 48 insertions(+), 4 deletions(-)

New commits:
commit 3a4c02b71d4666e83bba141954fcfaa288b4b59b
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Fri Apr 22 00:28:52 2016 -0400

    loolwsd: track important notifications not sent to inactive clients
    
    These notifications are important to be sent once the user
    becomes active again to sync their view with the latest.
    
    Change-Id: Id8f9fff83eea888cdcc8d6ed1d4f12111de39a6e
    Reviewed-on: https://gerrit.libreoffice.org/24288
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
    Tested-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/loolwsd/ChildProcessSession.cpp b/loolwsd/ChildProcessSession.cpp
index a5529d7..ec9448a 100644
--- a/loolwsd/ChildProcessSession.cpp
+++ b/loolwsd/ChildProcessSession.cpp
@@ -90,8 +90,22 @@ public:
         }
         else if (!_session.isActive())
         {
-            Log::trace("Skipping callback on inactive session " + _session.getName());
-            return;
+            // Pass save notifications through.
+            if (nType != LOK_CALLBACK_UNO_COMMAND_RESULT || rPayload.find(".uno:Save") == std::string::npos)
+            {
+                Log::trace("Skipping callback on inactive session " + _session.getName());
+                _session.setMissedUpdates();
+                if (nType == LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR ||
+                    nType == LOK_CALLBACK_TEXT_SELECTION ||
+                    nType == LOK_CALLBACK_TEXT_SELECTION_START ||
+                    nType == LOK_CALLBACK_TEXT_SELECTION_END ||
+                    nType == LOK_CALLBACK_DOCUMENT_SIZE_CHANGED)
+                {
+                    _session.setMissedNotif(nType, rPayload);
+                }
+
+                return;
+            }
         }
 
         switch (nType)
@@ -269,6 +283,7 @@ ChildProcessSession::ChildProcessSession(const std::string& id,
     _jailId(jailId),
     _viewId(0),
     _clientPart(0),
+    _missedUpdates(false),
     _onLoad(onLoad),
     _onUnload(onUnload),
     _callbackWorker(new CallbackWorker(_callbackQueue, *this))
@@ -307,8 +322,9 @@ void ChildProcessSession::disconnect()
 
 bool ChildProcessSession::_handleInput(const char *buffer, int length)
 {
-    if (!isActive() && _loKitDocument != nullptr)
+    if (_missedUpdates && _loKitDocument != nullptr)
     {
+        _missedUpdates = false;
         Log::debug("Handling message after inactivity of " + std::to_string(getInactivityMS()) + "ms.");
 
         // Client is getting active again.
@@ -331,7 +347,30 @@ bool ChildProcessSession::_handleInput(const char *buffer, int length)
                        " width=" + std::to_string(INT_MAX) +
                        " height=" + std::to_string(INT_MAX));
 
-        //TODO: Sync cursor.
+        for (const auto& pair : _missedNotif)
+        {
+            switch (pair.first)
+            {
+                case LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR:
+                    sendTextFrame("invalidatecursor: " + pair.second);
+                    break;
+                case LOK_CALLBACK_TEXT_SELECTION:
+                    sendTextFrame("textselection: " + pair.second);
+                    break;
+                case LOK_CALLBACK_TEXT_SELECTION_START:
+                    sendTextFrame("textselectionstart: " + pair.second);
+                    break;
+                case LOK_CALLBACK_TEXT_SELECTION_END:
+                    sendTextFrame("textselectionend: " + pair.second);
+                    break;
+                case LOK_CALLBACK_DOCUMENT_SIZE_CHANGED:
+                    getStatus("", 0);
+                    getPartPageRectangles("", 0);
+                    break;
+            }
+        }
+
+        _missedNotif.clear();
     }
 
     const std::string firstLine = getFirstLine(buffer, length);
diff --git a/loolwsd/ChildProcessSession.hpp b/loolwsd/ChildProcessSession.hpp
index b7e0af6..6e4a233 100644
--- a/loolwsd/ChildProcessSession.hpp
+++ b/loolwsd/ChildProcessSession.hpp
@@ -60,6 +60,9 @@ public:
 
     std::unique_lock<std::recursive_mutex> getLock() { return std::unique_lock<std::recursive_mutex>(Mutex); }
 
+    void setMissedUpdates() { _missedUpdates = true; }
+    void setMissedNotif(const int type, const std::string& payload) { _missedNotif.emplace(type, payload); }
+
  protected:
     virtual bool loadDocument(const char *buffer, int length, Poco::StringTokenizer& tokens) override;
 
@@ -98,6 +101,8 @@ private:
     /// View ID, returned by createView() or 0 by default.
     int _viewId;
     int _clientPart;
+    bool _missedUpdates;
+    std::map<int, std::string> _missedNotif;
     std::function<LibreOfficeKitDocument*(const std::string&, const std::string&, const std::string&, bool)> _onLoad;
     std::function<void(const std::string&)> _onUnload;
 


More information about the Libreoffice-commits mailing list