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

Pranav Kant pranavk at collabora.co.uk
Fri Feb 19 21:57:08 UTC 2016


 loolwsd/ChildProcessSession.cpp |   21 -----------
 loolwsd/LOOLKit.cpp             |   73 ++++++++++++++++++++++++++++++++++++++--
 2 files changed, 72 insertions(+), 22 deletions(-)

New commits:
commit 10db02c208a79dc1dcaac0b96de15831a9800082
Author: Pranav Kant <pranavk at collabora.co.uk>
Date:   Sun Feb 7 21:35:00 2016 +0530

    loolwsd: Move document related callback logic to Document class
    
    There are 5 LOK callbacks currently that are triggered on LOKit,
    and not on LOKitDocument. These include status indicators, and
    document password callbacks during document load. Lets move all
    the callbacks called during document load in the Document container
    itself, and keep the callbacks called after document load in the
    Child session.
    
    Change-Id: I8e43c2baaa12023b34822954dd494780ee6dd7ca
    Reviewed-on: https://gerrit.libreoffice.org/22206
    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 5fd53ee..a2e737f 100644
--- a/loolwsd/ChildProcessSession.cpp
+++ b/loolwsd/ChildProcessSession.cpp
@@ -104,12 +104,6 @@ public:
             return std::string("LOK_CALLBACK_HYPERLINK_CLICKED");
         case LOK_CALLBACK_STATE_CHANGED:
             return std::string("LOK_CALLBACK_STATE_CHANGED");
-        case LOK_CALLBACK_STATUS_INDICATOR_START:
-            return std::string("LOK_CALLBACK_STATUS_INDICATOR_START");
-        case LOK_CALLBACK_STATUS_INDICATOR_SET_VALUE:
-            return std::string("LOK_CALLBACK_STATUS_INDICATOR_SET_VALUE");
-        case LOK_CALLBACK_STATUS_INDICATOR_FINISH:
-            return std::string("LOK_CALLBACK_STATUS_INDICATOR_FINISH");
         case LOK_CALLBACK_SEARCH_NOT_FOUND:
             return std::string("LOK_CALLBACK_SEARCH_NOT_FOUND");
         case LOK_CALLBACK_DOCUMENT_SIZE_CHANGED:
@@ -144,7 +138,7 @@ public:
             return;
         }
 
-        switch (static_cast<LibreOfficeKitCallbackType>(nType))
+        switch (nType)
         {
         case LOK_CALLBACK_INVALIDATE_TILES:
             {
@@ -223,15 +217,6 @@ public:
         case LOK_CALLBACK_STATE_CHANGED:
             _session.sendTextFrame("statechanged: " + rPayload);
             break;
-        case LOK_CALLBACK_STATUS_INDICATOR_START:
-            _session.sendTextFrame("statusindicatorstart:");
-            break;
-        case LOK_CALLBACK_STATUS_INDICATOR_SET_VALUE:
-            _session.sendTextFrame("statusindicatorsetvalue: " + rPayload);
-            break;
-        case LOK_CALLBACK_STATUS_INDICATOR_FINISH:
-            _session.sendTextFrame("statusindicatorfinish:");
-            break;
         case LOK_CALLBACK_SEARCH_NOT_FOUND:
             _session.sendTextFrame("searchnotfound: " + rPayload);
             break;
@@ -248,10 +233,6 @@ public:
         case LOK_CALLBACK_UNO_COMMAND_RESULT:
             _session.sendTextFrame("unocommandresult: " + rPayload);
             break;
-        case LOK_CALLBACK_DOCUMENT_PASSWORD:
-        case LOK_CALLBACK_DOCUMENT_PASSWORD_TO_MODIFY:
-            _session.setDocumentPassword(nType);
-            break;
         case LOK_CALLBACK_ERROR:
             {
                 Poco::JSON::Parser parser;
diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp
index 00847da..3694d42 100644
--- a/loolwsd/LOOLKit.cpp
+++ b/loolwsd/LOOLKit.cpp
@@ -473,6 +473,76 @@ public:
 
 private:
 
+    static std::string KitCallbackTypeToString (const int nType)
+    {
+        switch (nType)
+        {
+        case LOK_CALLBACK_STATUS_INDICATOR_START:
+            return std::string("LOK_CALLBACK_STATUS_INDICATOR_START");
+        case LOK_CALLBACK_STATUS_INDICATOR_SET_VALUE:
+            return std::string("LOK_CALLBACK_STATUS_INDICATOR_SET_VALUE");
+        case LOK_CALLBACK_STATUS_INDICATOR_FINISH:
+            return std::string("LOK_CALLBACK_STATUS_INDICATOR_FINISH");
+        case LOK_CALLBACK_DOCUMENT_PASSWORD:
+            return std::string("LOK_CALLBACK_DOCUMENT_PASSWORD");
+        case LOK_CALLBACK_DOCUMENT_PASSWORD_TO_MODIFY:
+            return std::string("LOK_CALLBACK_DOCUMENT_PASSWORD_TO_MODIFY");
+        }
+
+        return std::to_string(nType);
+    }
+
+
+    static void KitCallback(int nType, const char* pPayload, void* pData)
+    {
+        Document* self = reinterpret_cast<Document*>(pData);
+        if (self)
+        {
+            std::unique_lock<std::recursive_mutex> lock(self->_mutex);
+
+            // Ideally, there would be only one connection at this point of time
+            const auto& it = self->_connections.begin();
+
+            if (!it->second->isRunning())
+                Log::error() << "Error: Connection died unexpectedly" << Log::end;
+
+            auto session = it->second->getSession();
+            auto sessionLock = session->getLock();
+
+            Log::trace() << "Callback [" << session->getViewId() << "] "
+                         << KitCallbackTypeToString(nType)
+                         << " [" << pPayload << "]." << Log::end;
+
+            if (session->isDisconnected())
+            {
+                Log::trace("Skipping callback on disconnected session " + session->getName());
+                return;
+            }
+            else if (session->isInactive())
+            {
+                Log::trace("Skipping callback on inactive session " + session->getName());
+                return;
+            }
+
+            switch (nType)
+            {
+            case LOK_CALLBACK_STATUS_INDICATOR_START:
+                session->sendTextFrame("statusindicatorstart:");
+                break;
+            case LOK_CALLBACK_STATUS_INDICATOR_SET_VALUE:
+                session->sendTextFrame("statusindicatorsetvalue: " + std::string(pPayload));
+                break;
+            case LOK_CALLBACK_STATUS_INDICATOR_FINISH:
+                session->sendTextFrame("statusindicatorfinish:");
+                break;
+            case LOK_CALLBACK_DOCUMENT_PASSWORD:
+            case LOK_CALLBACK_DOCUMENT_PASSWORD_TO_MODIFY:
+                session->setDocumentPassword(nType);
+                break;
+            }
+        }
+    }
+
     static void ViewCallback(int , const char* , void* )
     {
         //TODO: Delegate the callback.
@@ -521,8 +591,7 @@ private:
 
             if ( LIBREOFFICEKIT_HAS(_loKit, registerCallback))
             {
-                // TODO: Separate the global callback from document callback
-                _loKit->pClass->registerCallback(_loKit, DocumentCallback, this);
+                _loKit->pClass->registerCallback(_loKit, KitCallback, this);
                 _loKit->pClass->setOptionalFeatures(_loKit, LOK_FEATURE_DOCUMENT_PASSWORD |
                                                     LOK_FEATURE_DOCUMENT_PASSWORD_TO_MODIFY);
             }


More information about the Libreoffice-commits mailing list