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

Ashod Nakashian ashod.nakashian at collabora.co.uk
Mon Aug 15 03:18:44 UTC 2016


 loolwsd/ChildSession.cpp |   10 ++++------
 loolwsd/ChildSession.hpp |   27 ++++++++++++++++++++-------
 loolwsd/LOOLKit.cpp      |   13 +++++--------
 3 files changed, 29 insertions(+), 21 deletions(-)

New commits:
commit 5af1f18e364068e4b0dc1cac5a71b6dc5afd3bb4
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Sun Aug 14 18:02:51 2016 -0400

    loolwsd: convert function-object callbacks to abstract interface
    
    Change-Id: Ia2e832659f8deddd55b8be6507c2d7406f110085
    Reviewed-on: https://gerrit.libreoffice.org/28133
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
    Tested-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/loolwsd/ChildSession.cpp b/loolwsd/ChildSession.cpp
index 07d57ff..d712c07 100644
--- a/loolwsd/ChildSession.cpp
+++ b/loolwsd/ChildSession.cpp
@@ -35,14 +35,12 @@ std::recursive_mutex ChildSession::Mutex;
 ChildSession::ChildSession(const std::string& id,
                            std::shared_ptr<WebSocket> ws,
                            const std::string& jailId,
-                           OnLoadCallback onLoad,
-                           OnUnloadCallback onUnload) :
+                           IDocumentManager& docManager) :
     LOOLSession(id, Kind::ToMaster, ws),
     _multiView(std::getenv("LOK_VIEW_CALLBACK")),
     _jailId(jailId),
     _viewId(0),
-    _onLoad(std::move(onLoad)),
-    _onUnload(std::move(onUnload))
+    _docManager(docManager)
 {
     Log::info("ChildSession ctor [" + getName() + "].");
 }
@@ -65,7 +63,7 @@ void ChildSession::disconnect()
         if (_multiView && _loKitDocument)
             _loKitDocument->setView(_viewId);
 
-        _onUnload(getId());
+        _docManager.onUnload(getId());
 
         LOOLSession::disconnect();
     }
@@ -334,7 +332,7 @@ bool ChildSession::loadDocument(const char * /*buffer*/, int /*length*/, StringT
 
     std::unique_lock<std::recursive_mutex> lock(Mutex);
 
-    _loKitDocument = _onLoad(getId(), _jailedFilePath, _docPassword, renderOpts, _haveDocPassword);
+    _loKitDocument = _docManager.onLoad(getId(), _jailedFilePath, _docPassword, renderOpts, _haveDocPassword);
     if (!_loKitDocument)
     {
         Log::error("Failed to get LoKitDocument instance.");
diff --git a/loolwsd/ChildSession.hpp b/loolwsd/ChildSession.hpp
index ce58a4e..3cb3202 100644
--- a/loolwsd/ChildSession.hpp
+++ b/loolwsd/ChildSession.hpp
@@ -19,9 +19,24 @@
 #include "LOOLSession.hpp"
 #include "LibreOfficeKit.hpp"
 
-class CallbackWorker;
-typedef std::function<std::shared_ptr<lok::Document>(const std::string&, const std::string&, const std::string&, const std::string&, bool)> OnLoadCallback;
-typedef std::function<void(const std::string&)> OnUnloadCallback;
+/// An abstract interface that defines the
+/// DocumentManager interface and functionality.
+class IDocumentManager
+{
+public:
+    /// Reqest loading a document, or a new view, if one exists.
+    virtual
+    std::shared_ptr<lok::Document> onLoad(const std::string& sessionId,
+                                          const std::string& jailedFilePath,
+                                          const std::string& docPassword,
+                                          const std::string& renderOpts,
+                                          const bool haveDocPassword) = 0;
+
+    /// Unload a client session, which unloads the document
+    /// if it is the last and only.
+    virtual
+    void onUnload(const std::string& sessionId) = 0;
+};
 
 /// Represents a client session, with the socket end-point,
 /// and handles all incoming UI traffic.
@@ -38,8 +53,7 @@ public:
     ChildSession(const std::string& id,
                  std::shared_ptr<Poco::Net::WebSocket> ws,
                  const std::string& jailId,
-                 OnLoadCallback onLoad,
-                 OnUnloadCallback onUnload);
+                 IDocumentManager& docManager);
     virtual ~ChildSession();
 
     bool getStatus(const char *buffer, int length);
@@ -87,8 +101,7 @@ private:
     /// View ID, returned by createView() or 0 by default.
     int _viewId;
     std::map<int, std::string> _lastDocStates;
-    OnLoadCallback _onLoad;
-    OnUnloadCallback _onUnload;
+    IDocumentManager& _docManager;
 
     /// Synchronize _loKitDocument acess.
     /// This should be owned by Document.
diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp
index a05c7e1..e4fdb44 100644
--- a/loolwsd/LOOLKit.cpp
+++ b/loolwsd/LOOLKit.cpp
@@ -367,7 +367,7 @@ public:
 /// per process. But for security reasons don't.
 /// However, we could have a loolkit instance
 /// per user or group of users (a trusted circle).
-class Document : public Runnable
+class Document : public Runnable, public IDocumentManager
 {
 public:
     /// We have two types of password protected documents
@@ -490,10 +490,7 @@ public:
             auto ws = std::make_shared<WebSocket>(cs, request, response);
             ws->setReceiveTimeout(0);
 
-            auto session = std::make_shared<ChildSession>(sessionId, ws, _jailId,
-                           [this](const std::string& id, const std::string& uri, const std::string& docPassword,
-                                  const std::string& renderOpts, bool haveDocPassword) { return onLoad(id, uri, docPassword, renderOpts, haveDocPassword); },
-                           [this](const std::string& id) { onUnload(id); });
+            auto session = std::make_shared<ChildSession>(sessionId, ws, _jailId, *this);
 
             auto thread = std::make_shared<Connection>(session, ws);
             const auto aInserted = _connections.emplace(intSessionId, thread);
@@ -826,7 +823,7 @@ private:
                                           const std::string& uri,
                                           const std::string& docPassword,
                                           const std::string& renderOpts,
-                                          bool haveDocPassword)
+                                          const bool haveDocPassword) override
     {
         Log::info("Session " + sessionId + " is loading. " + std::to_string(_clientViews) + " views loaded.");
 
@@ -864,7 +861,7 @@ private:
         return _loKitDocument;
     }
 
-    void onUnload(const std::string& sessionId)
+    void onUnload(const std::string& sessionId) override
     {
         Log::info("Unloading [" + sessionId + "].");
         const unsigned intSessionId = Util::decodeId(sessionId);
@@ -902,7 +899,7 @@ private:
                                         const std::string& uri,
                                         const std::string& docPassword,
                                         const std::string& renderOpts,
-                                        bool haveDocPassword)
+                                        const bool haveDocPassword)
     {
         const unsigned intSessionId = Util::decodeId(sessionId);
         const auto it = _connections.find(intSessionId);


More information about the Libreoffice-commits mailing list