[Libreoffice-commits] online.git: loolwsd/ChildProcessSession.cpp loolwsd/ChildProcessSession.hpp
Ashod Nakashian
ashod.nakashian at collabora.co.uk
Sat Apr 23 18:13:16 UTC 2016
loolwsd/ChildProcessSession.cpp | 36 +++++++++++++++++-------------------
loolwsd/ChildProcessSession.hpp | 6 ++----
2 files changed, 19 insertions(+), 23 deletions(-)
New commits:
commit 08b31ac3f56e6408c6e0ea6e0f618b9144b2a46f
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date: Sat Apr 23 14:05:21 2016 -0400
loolwsd: simplified and improved synching re-activating clients
Change-Id: Idc07aecb33b350a0434c4310a0991a9b2ff1d738
Reviewed-on: https://gerrit.libreoffice.org/24323
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 f7e74f7..92435ba 100644
--- a/loolwsd/ChildProcessSession.cpp
+++ b/loolwsd/ChildProcessSession.cpp
@@ -78,6 +78,18 @@ public:
Log::trace() << "CallbackWorker::callback [" << _session.getViewId() << "] "
<< LOKitHelper::kitCallbackTypeToString(nType)
<< " [" << 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_TEXT_SELECTION ||
+ nType == LOK_CALLBACK_TEXT_SELECTION_START ||
+ nType == LOK_CALLBACK_TEXT_SELECTION_END ||
+ nType == LOK_CALLBACK_DOCUMENT_SIZE_CHANGED)
+ {
+ _session.setDocState(nType, rPayload);
+ }
+
if (_session.isCloseFrame())
{
Log::trace("LOKit document begin the closing handshake");
@@ -94,16 +106,6 @@ public:
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;
}
}
@@ -283,7 +285,6 @@ ChildProcessSession::ChildProcessSession(const std::string& id,
_jailId(jailId),
_viewId(0),
_clientPart(0),
- _missedUpdates(false),
_onLoad(onLoad),
_onUnload(onUnload),
_callbackWorker(new CallbackWorker(_callbackQueue, *this))
@@ -322,9 +323,11 @@ void ChildProcessSession::disconnect()
bool ChildProcessSession::_handleInput(const char *buffer, int length)
{
- if (_missedUpdates && _loKitDocument != nullptr)
+ const std::string firstLine = getFirstLine(buffer, length);
+ StringTokenizer tokens(firstLine, " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
+
+ if (tokens.count() > 0 && tokens[0] == "useractive" && _loKitDocument != nullptr)
{
- _missedUpdates = false;
Log::debug("Handling message after inactivity of " + std::to_string(getInactivityMS()) + "ms.");
// Client is getting active again.
@@ -338,7 +341,7 @@ bool ChildProcessSession::_handleInput(const char *buffer, int length)
sendTextFrame("curpart: part=" + std::to_string(curPart));
//TODO: Is the order of these important?
- for (const auto& pair : _missedNotif)
+ for (const auto& pair : _lastDocStates)
{
switch (pair.first)
{
@@ -360,13 +363,8 @@ bool ChildProcessSession::_handleInput(const char *buffer, int length)
break;
}
}
-
- _missedNotif.clear();
}
- const std::string firstLine = getFirstLine(buffer, length);
- StringTokenizer tokens(firstLine, " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
-
if (LOOLProtocol::tokenIndicatesUserInteraction(tokens[0]))
{
// Keep track of timestamps of incoming client messages that indicate user activity.
diff --git a/loolwsd/ChildProcessSession.hpp b/loolwsd/ChildProcessSession.hpp
index 6e4a233..3fb82b1 100644
--- a/loolwsd/ChildProcessSession.hpp
+++ b/loolwsd/ChildProcessSession.hpp
@@ -60,8 +60,7 @@ 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); }
+ void setDocState(const int type, const std::string& payload) { _lastDocStates[type] = payload; }
protected:
virtual bool loadDocument(const char *buffer, int length, Poco::StringTokenizer& tokens) override;
@@ -101,8 +100,7 @@ private:
/// View ID, returned by createView() or 0 by default.
int _viewId;
int _clientPart;
- bool _missedUpdates;
- std::map<int, std::string> _missedNotif;
+ std::map<int, std::string> _lastDocStates;
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