[Libreoffice-commits] online.git: 2 commits - loolwsd/ClientSession.cpp loolwsd/LibreOfficeKit.hpp loolwsd/LOOLForKit.cpp loolwsd/LOOLKit.cpp loolwsd/LOOLKit.hpp loolwsd/LOOLWSD.cpp loolwsd/LOOLWSD.hpp loolwsd/protocol.txt loolwsd/Util.cpp loolwsd/Util.hpp

Pranav Kant pranavk at collabora.com
Tue Jun 21 09:07:36 UTC 2016


 loolwsd/ClientSession.cpp  |   11 +++++++++--
 loolwsd/LOOLForKit.cpp     |   12 ++++++++----
 loolwsd/LOOLKit.cpp        |   15 +++++++++++++--
 loolwsd/LOOLKit.hpp        |    3 ++-
 loolwsd/LOOLWSD.cpp        |   11 ++++++++++-
 loolwsd/LOOLWSD.hpp        |    1 +
 loolwsd/LibreOfficeKit.hpp |   13 +++++++++++++
 loolwsd/Util.cpp           |    6 +++---
 loolwsd/Util.hpp           |    4 ++--
 loolwsd/protocol.txt       |    8 +++++++-
 10 files changed, 68 insertions(+), 16 deletions(-)

New commits:
commit b83ac269fa790f674cfe5b1bd90e9d6aadc28df4
Author: Pranav Kant <pranavk at collabora.com>
Date:   Tue Jun 21 00:28:00 2016 +0530

    loolwsd: Send LOKit version information to clients
    
    Send as a response to 'loolclient' message received from the
    client
    
    Change-Id: I3d33f9fd087489aa9bf5a94f591ab04e208cbf13

diff --git a/loolwsd/ClientSession.cpp b/loolwsd/ClientSession.cpp
index 1fb1ec7..ad73943 100644
--- a/loolwsd/ClientSession.cpp
+++ b/loolwsd/ClientSession.cpp
@@ -74,11 +74,18 @@ bool ClientSession::_handleInput(const char *buffer, int length)
         if (std::get<0>(versionTuple) != ProtocolMajorVersionNumber ||
             std::get<1>(versionTuple) != ProtocolMinorVersionNumber)
         {
-            sendTextFrame("error: cmd=loolclient kind=badversion");
+            sendTextFrame("error: cmd=loolclient kind=badprotocolversion");
             return false;
         }
 
-        return sendTextFrame("loolserver " + GetProtocolVersion());
+        // Send LOOL version information
+        std::string version, hash;
+        Util::getVersionInfo(version, hash);
+        sendTextFrame("loolserver " + version + " " + hash + " " + GetProtocolVersion());
+        // Send LOKit version information
+        sendTextFrame("lokitversion " + LOOLWSD::LOKitVersion);
+
+        return true;
     }
 
     if (tokens[0] == "takeedit")
diff --git a/loolwsd/LOOLForKit.cpp b/loolwsd/LOOLForKit.cpp
index 9313adc..c29de0d 100644
--- a/loolwsd/LOOLForKit.cpp
+++ b/loolwsd/LOOLForKit.cpp
@@ -135,7 +135,8 @@ static void cleanupChildren()
 static int createLibreOfficeKit(const std::string& childRoot,
                                 const std::string& sysTemplate,
                                 const std::string& loTemplate,
-                                const std::string& loSubPath)
+                                const std::string& loSubPath,
+                                bool queryVersion = false)
 {
     Log::debug("Forking a loolkit process.");
 
@@ -157,7 +158,7 @@ static int createLibreOfficeKit(const std::string& childRoot,
             Thread::sleep(std::stoul(std::getenv("SLEEPKITFORDEBUGGER")) * 1000);
         }
 
-        lokit_main(childRoot, sysTemplate, loTemplate, loSubPath, NoCapsForKit);
+        lokit_main(childRoot, sysTemplate, loTemplate, loSubPath, NoCapsForKit, queryVersion);
     }
     else
     {
@@ -308,7 +309,8 @@ int main(int argc, char** argv)
     Log::info("Preinit stage OK.");
 
     // We must have at least one child, more are created dynamically.
-    if (createLibreOfficeKit(childRoot, sysTemplate, loTemplate, loSubPath) < 0)
+    // Ask this first child to send version information to master process
+    if (createLibreOfficeKit(childRoot, sysTemplate, loTemplate, loSubPath, true) < 0)
     {
         Log::error("Failed to create a kit process.");
         std::_Exit(Application::EXIT_SOFTWARE);
diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp
index f63f4cb..be7fb99 100644
--- a/loolwsd/LOOLKit.cpp
+++ b/loolwsd/LOOLKit.cpp
@@ -1000,7 +1000,8 @@ void lokit_main(const std::string& childRoot,
                 const std::string& sysTemplate,
                 const std::string& loTemplate,
                 const std::string& loSubPath,
-                bool noCapabilities)
+                bool noCapabilities,
+                bool queryVersion)
 {
     // Reinitialize logging when forked.
     Log::initialize("kit");
@@ -1156,7 +1157,17 @@ void lokit_main(const std::string& childRoot,
         // Open websocket connection between the child process and WSD.
         HTTPClientSession cs("127.0.0.1", MasterPortNumber);
         cs.setTimeout(0);
-        HTTPRequest request(HTTPRequest::HTTP_GET, std::string(NEW_CHILD_URI) + "pid=" + pid);
+
+        std::string requestUrl = std::string(NEW_CHILD_URI) + "pid=" + pid;
+        if (queryVersion)
+        {
+            char* versionInfo = loKit->getVersionInfo();
+            std::string encodedVersionStr;
+            URI::encode(std::string(versionInfo), "", encodedVersionStr);
+            requestUrl += "&version=" + encodedVersionStr;
+            free(versionInfo);
+        }
+        HTTPRequest request(HTTPRequest::HTTP_GET, requestUrl);
         HTTPResponse response;
         auto ws = std::make_shared<WebSocket>(cs, request, response);
         ws->setReceiveTimeout(0);
diff --git a/loolwsd/LOOLKit.hpp b/loolwsd/LOOLKit.hpp
index 2f43022..4206133 100644
--- a/loolwsd/LOOLKit.hpp
+++ b/loolwsd/LOOLKit.hpp
@@ -13,7 +13,8 @@ void lokit_main(const std::string& childRoot,
                 const std::string& sysTemplate,
                 const std::string& loTemplate,
                 const std::string& loSubPath,
-                bool noCapabilities);
+                bool noCapabilities,
+                bool queryVersionInfo);
 
 bool globalPreinit(const std::string &loTemplate);
 
diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp
index 59575d6..0947548 100644
--- a/loolwsd/LOOLWSD.cpp
+++ b/loolwsd/LOOLWSD.cpp
@@ -924,6 +924,10 @@ public:
                 {
                     pid = std::stoi(param.second);
                 }
+                else if (param.first == "version")
+                {
+                    LOOLWSD::LOKitVersion = param.second;
+                }
             }
 
             if (pid <= 0)
@@ -1168,6 +1172,7 @@ std::string LOOLWSD::LoSubPath = "lo";
 std::string LOOLWSD::ServerName;
 std::string LOOLWSD::FileServerRoot;
 std::string LOOLWSD::AdminCreds;
+std::string LOOLWSD::LOKitVersion;
 bool LOOLWSD::AllowLocalStorage = false;
 bool LOOLWSD::SSLEnabled =
 #if ENABLE_SSL
diff --git a/loolwsd/LOOLWSD.hpp b/loolwsd/LOOLWSD.hpp
index 1fcdac6..8de18e4 100644
--- a/loolwsd/LOOLWSD.hpp
+++ b/loolwsd/LOOLWSD.hpp
@@ -44,6 +44,7 @@ public:
     static std::string ServerName;
     static std::string FileServerRoot;
     static std::string AdminCreds;
+    static std::string LOKitVersion;
     static bool AllowLocalStorage;
     static bool SSLEnabled;
 
diff --git a/loolwsd/LibreOfficeKit.hpp b/loolwsd/LibreOfficeKit.hpp
index be23fab..91dea2d 100644
--- a/loolwsd/LibreOfficeKit.hpp
+++ b/loolwsd/LibreOfficeKit.hpp
@@ -607,6 +607,19 @@ public:
     {
         _pOffice->pClass->setDocumentPassword(_pOffice, pURL, pPassword);
     }
+
+    /**
+     * Get version information of the LOKit process
+     *
+     * @returns string containing version information in format:
+     * PRODUCT_NAME PRODUCT_VERSION PRODUCT_EXTENSION BUILD_ID
+     *
+     * Eg: LibreOffice 5.3 .0.0 alpha0 <commit hash>
+     */
+    inline char* getVersionInfo()
+    {
+        return _pOffice->pClass->getVersionInfo(_pOffice);
+    }
 #endif // defined LOK_USE_UNSTABLE_API || defined LIBO_INTERNAL_ONLY
 };
 
diff --git a/loolwsd/protocol.txt b/loolwsd/protocol.txt
index 32008bc..7bcbd58 100644
--- a/loolwsd/protocol.txt
+++ b/loolwsd/protocol.txt
@@ -175,7 +175,7 @@ pong
 server -> client
 ================
 
-loolserver <major.minor[-patch]>
+loolserver <loolwsd version> <loolwsd git hash> <major.minor[-patch]>
 
     Upon connection, the server must announce the version number it supports.
     Major: an integer that must always match between client and server,
@@ -185,6 +185,12 @@ loolserver <major.minor[-patch]>
            Security fixes that do not alter the API would bump the minor version number.
     Patch: an optional string that is informational.
 
+lokitversion <product_name> <product_version> <product_extension> <build_id>
+
+    Version information of underlying LOKit process.
+
+    Eg: LibreOfficeDev 5.3 .0.0.alpha0 <git hash>
+
 contextmenu: <json description of the context menu>
 
     When the user right-clicks in the document, the content of the context
commit e271995ed2a305942f394d35bda067dfb52d7022
Author: Pranav Kant <pranavk at collabora.com>
Date:   Mon Jun 20 15:21:35 2016 +0530

    loolwsd: Restructure version information functions
    
    ... so that version information can be sent to clients.
    
    Change-Id: Icc90f31fabb501f816ff1dca0c618a73660c88bc

diff --git a/loolwsd/LOOLForKit.cpp b/loolwsd/LOOLForKit.cpp
index 48ad394..9313adc 100644
--- a/loolwsd/LOOLForKit.cpp
+++ b/loolwsd/LOOLForKit.cpp
@@ -252,7 +252,9 @@ int main(int argc, char** argv)
         }
         else if (std::strstr(cmd, "--version") == cmd)
         {
-            Util::displayVersionInfo("loolforkit");
+            std::string version, hash;
+            Util::getVersionInfo(version, hash);
+            std::cout << "loolforkit " << version << " - " << hash << std::endl;
         }
 #if ENABLE_DEBUG
         // this process has various privileges - don't run arbitrary code.
diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp
index 052070e..59575d6 100644
--- a/loolwsd/LOOLWSD.cpp
+++ b/loolwsd/LOOLWSD.cpp
@@ -1498,7 +1498,11 @@ Process::PID LOOLWSD::createForKit()
 int LOOLWSD::main(const std::vector<std::string>& /*args*/)
 {
     if (DisplayVersion)
-        Util::displayVersionInfo("loolwsd");
+    {
+        std::string version, hash;
+        Util::getVersionInfo(version, hash);
+        std::cout << "loolwsd " << version << " - " << hash << std::endl;
+    }
 
 #if ENABLE_SSL
     initializeSSL();
diff --git a/loolwsd/Util.cpp b/loolwsd/Util.cpp
index 6224534..328957e 100644
--- a/loolwsd/Util.cpp
+++ b/loolwsd/Util.cpp
@@ -383,11 +383,11 @@ namespace Util
             Log::syserror("Cannot set thread name to " + s + ".");
     }
 
-    void displayVersionInfo(const char *app)
+    void getVersionInfo(std::string& version, std::string& hash)
     {
-        std::string hash(LOOLWSD_VERSION_HASH);
+        version = std::string(LOOLWSD_VERSION);
+        hash = std::string(LOOLWSD_VERSION_HASH);
         hash.resize(std::min(8, (int)hash.length()));
-        std::cout << app << " " << LOOLWSD_VERSION << " - " << hash << std::endl;
     }
 
     std::string UniqueId()
diff --git a/loolwsd/Util.hpp b/loolwsd/Util.hpp
index fd76c54..138d791 100644
--- a/loolwsd/Util.hpp
+++ b/loolwsd/Util.hpp
@@ -101,8 +101,8 @@ namespace Util
 
     void setThreadName(const std::string& s);
 
-    /// Display version information
-    void displayVersionInfo(const char *app);
+    /// Get version information
+    void getVersionInfo(std::string& version, std::string& hash);
 
     /// Return a string that is unique across processes and calls.
     std::string UniqueId();


More information about the Libreoffice-commits mailing list