[Libreoffice-commits] core.git: desktop/inc desktop/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Fri Feb 22 14:38:10 UTC 2019


 desktop/inc/lib/init.hxx    |    8 ++++++-
 desktop/source/lib/init.cxx |   50 +++++++++++++++++++++++++++++---------------
 2 files changed, 41 insertions(+), 17 deletions(-)

New commits:
commit 8410ce037ab27a38b0449c7666f1676374803496
Author:     Ashod Nakashian <ashod.nakashian at collabora.co.uk>
AuthorDate: Thu Feb 14 10:52:33 2019 -0500
Commit:     Ashod Nakashian <ashnakash at gmail.com>
CommitDate: Fri Feb 22 15:37:33 2019 +0100

    LOK: Cache JSON payloads
    
    Change-Id: I81f74027363d4b2959c053057851cf01fc94af8b
    Reviewed-on: https://gerrit.libreoffice.org/67892
    Tested-by: Jenkins
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/desktop/inc/lib/init.hxx b/desktop/inc/lib/init.hxx
index 66696757292a..f2f6f5399649 100644
--- a/desktop/inc/lib/init.hxx
+++ b/desktop/inc/lib/init.hxx
@@ -104,10 +104,16 @@ namespace desktop {
             RectangleAndPart& setRectangleAndPart(const std::string& payload);
             /// Return the parsed RectangleAndPart instance.
             const RectangleAndPart& getRectangleAndPart() const;
+            /// Parse and set the JSON object and return it. Clobbers PayloadString.
+            boost::property_tree::ptree& setJson(const std::string& payload);
+            /// Set a Json object and update PayloadString.
+            void setJson(const boost::property_tree::ptree& rTree);
+            /// Return the parsed JSON instance.
+            const boost::property_tree::ptree& getJson() const;
 
             int Type;
             std::string PayloadString;
-            boost::variant<boost::blank, RectangleAndPart> PayloadObject;
+            boost::variant<boost::blank, RectangleAndPart, boost::property_tree::ptree> PayloadObject;
         };
 
         typedef std::vector<CallbackData> queue_type;
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index d2e732e53497..6b7f8d699e8d 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -28,6 +28,7 @@
 #include <memory>
 #include <iostream>
 #include <boost/property_tree/json_parser.hpp>
+#include <boost/algorithm/string.hpp>
 
 #include <LibreOfficeKit/LibreOfficeKit.h>
 #include <LibreOfficeKit/LibreOfficeKitEnums.h>
@@ -466,6 +467,33 @@ const RectangleAndPart& CallbackFlushHandler::CallbackData::getRectangleAndPart(
     return boost::get<RectangleAndPart>(PayloadObject);
 }
 
+boost::property_tree::ptree& CallbackFlushHandler::CallbackData::setJson(const std::string& payload)
+{
+    boost::property_tree::ptree aTree;
+    std::stringstream aStream(payload);
+    boost::property_tree::read_json(aStream, aTree);
+
+    // Let boost normalize the payload so it always matches the cache.
+    setJson(aTree);
+
+    return boost::get<boost::property_tree::ptree>(PayloadObject);
+}
+
+void CallbackFlushHandler::CallbackData::setJson(const boost::property_tree::ptree& rTree)
+{
+    std::stringstream aJSONStream;
+    constexpr bool bPretty = false; // Don't waste time and bloat logs.
+    boost::property_tree::write_json(aJSONStream, rTree, bPretty);
+    PayloadString = boost::trim_copy(aJSONStream.str());
+
+    PayloadObject = rTree;
+}
+
+const boost::property_tree::ptree& CallbackFlushHandler::CallbackData::getJson() const
+{
+    return boost::get<boost::property_tree::ptree>(PayloadObject);
+}
+
 }
 
 namespace {
@@ -1155,9 +1183,7 @@ void CallbackFlushHandler::queue(const int type, const char* data)
             case LOK_CALLBACK_WINDOW:
             {
                 // reading JSON by boost might be slow?
-                boost::property_tree::ptree aTree;
-                std::stringstream aStream(payload);
-                boost::property_tree::read_json(aStream, aTree);
+                boost::property_tree::ptree& aTree = aCallbackData.setJson(payload);
                 const unsigned nLOKWindowId = aTree.get<unsigned>("id", 0);
                 if (aTree.get<std::string>("action", "") == "invalidate")
                 {
@@ -1169,9 +1195,7 @@ void CallbackFlushHandler::queue(const int type, const char* data)
                         removeAll([&nLOKWindowId] (const queue_type::value_type& elem) {
                                 if (elem.Type == LOK_CALLBACK_WINDOW)
                                 {
-                                    boost::property_tree::ptree aOldTree;
-                                    std::stringstream aOldStream(elem.PayloadString);
-                                    boost::property_tree::read_json(aOldStream, aOldTree);
+                                    const boost::property_tree::ptree& aOldTree = elem.getJson();
                                     const unsigned nOldDialogId = aOldTree.get<unsigned>("id", 0);
                                     if (aOldTree.get<std::string>("action", "") == "invalidate" &&
                                         nLOKWindowId == nOldDialogId)
@@ -1186,15 +1210,13 @@ void CallbackFlushHandler::queue(const int type, const char* data)
                     {
                         // if we have to invalidate all of the window, ignore
                         // any part invalidation message
-                        auto invAllExist = std::any_of(m_queue.rbegin(), m_queue.rend(),
+                        const auto invAllExist = std::any_of(m_queue.rbegin(), m_queue.rend(),
                                                        [&nLOKWindowId] (const queue_type::value_type& elem)
                                                        {
                                                            if (elem.Type != LOK_CALLBACK_WINDOW)
                                                                return false;
 
-                                                           boost::property_tree::ptree aOldTree;
-                                                           std::stringstream aOldStream(elem.PayloadString);
-                                                           boost::property_tree::read_json(aOldStream, aOldTree);
+                                                           const boost::property_tree::ptree& aOldTree = elem.getJson();
                                                            const unsigned nOldDialogId = aOldTree.get<unsigned>("id", 0);
                                                            return aOldTree.get<std::string>("action", "") == "invalidate" &&
                                                                nLOKWindowId == nOldDialogId &&
@@ -1218,9 +1240,7 @@ void CallbackFlushHandler::queue(const int type, const char* data)
                                 if (elem.Type != LOK_CALLBACK_WINDOW)
                                     return false;
 
-                                boost::property_tree::ptree aOldTree;
-                                std::stringstream aOldStream(elem.PayloadString);
-                                boost::property_tree::read_json(aOldStream, aOldTree);
+                                const boost::property_tree::ptree& aOldTree = elem.getJson();
                                 if (aOldTree.get<std::string>("action", "") == "invalidate")
                                 {
                                     const unsigned nOldDialogId = aOldTree.get<unsigned>("id", 0);
@@ -1273,9 +1293,7 @@ void CallbackFlushHandler::queue(const int type, const char* data)
                         }
 
                         aTree.put("rectangle", aNewRect.toString().getStr());
-                        std::stringstream aJSONStream;
-                        boost::property_tree::write_json(aJSONStream, aTree);
-                        payload = aJSONStream.str();
+                        aCallbackData.setJson(aTree);
                     }
                 }
             }


More information about the Libreoffice-commits mailing list