[Libreoffice-commits] online.git: loolwsd/LOOLSession.cpp loolwsd/LOOLSession.hpp loolwsd/protocol.txt

Miklos Vajna vmiklos at collabora.co.uk
Tue Oct 20 05:03:58 PDT 2015


 loolwsd/LOOLSession.cpp |   21 +++++++++++++++++++++
 loolwsd/LOOLSession.hpp |    9 +++++++++
 loolwsd/protocol.txt    |    5 +++++
 3 files changed, 35 insertions(+)

New commits:
commit 4feb29d1dfaf05a3c1f15dd05bab443a08211f0f
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue Oct 20 14:03:31 2015 +0200

    LOOLSession: inform to-client session about completed save-as

diff --git a/loolwsd/LOOLSession.cpp b/loolwsd/LOOLSession.cpp
index 1f1a2da..4bee505 100644
--- a/loolwsd/LOOLSession.cpp
+++ b/loolwsd/LOOLSession.cpp
@@ -184,6 +184,20 @@ bool MasterProcessSession::handleInput(const char *buffer, int length)
             {
                 return true;
             }
+
+            if (tokens.count() == 2 && tokens[0] == "saveas:")
+            {
+                std::string url;
+                if (!getTokenString(tokens[1], "url", url))
+                    return true;
+
+                if (peer)
+                    // Save as completed, inform the other (Kind::ToClient)
+                    // MasterProcessSession about it.
+                    peer->_saveAsQueue.put(url);
+
+                return true;
+            }
         }
 
         if (_kind == Kind::ToPrisoner && peer && peer->_tileCache)
@@ -486,6 +500,11 @@ bool MasterProcessSession::getPartPageRectangles(const char *buffer, int length)
     return true;
 }
 
+std::string MasterProcessSession::getSaveAs()
+{
+    return _saveAsQueue.get();
+}
+
 void MasterProcessSession::sendTile(const char *buffer, int length, StringTokenizer& tokens)
 {
     int part, width, height, tilePosX, tilePosY, tileWidth, tileHeight;
@@ -1204,6 +1223,8 @@ bool ChildProcessSession::saveAs(const char* /*buffer*/, int /*length*/, StringT
             format.size() == 0 ? NULL :format.c_str(),
             filterOptions.size() == 0 ? NULL : filterOptions.c_str());
 
+    sendTextFrame("saveas: url=" + url);
+
     return true;
 }
 
diff --git a/loolwsd/LOOLSession.hpp b/loolwsd/LOOLSession.hpp
index 70210ae..85d9d5a 100644
--- a/loolwsd/LOOLSession.hpp
+++ b/loolwsd/LOOLSession.hpp
@@ -30,6 +30,7 @@
 #include <Poco/Types.h>
 
 #include "TileCache.hpp"
+#include "tsqueue.h"
 
 // We have three kinds of Websocket sessions
 // 1) Between the master loolwsd server to the end-user LOOL client
@@ -117,6 +118,12 @@ public:
 
     virtual bool getPartPageRectangles(const char *buffer, int length) override;
 
+    /**
+     * Return the URL of the saved-as document when it's ready. If called
+     * before it's ready, the call blocks till then.
+     */
+    std::string getSaveAs();
+
  protected:
     bool invalidateTiles(const char *buffer, int length, Poco::StringTokenizer& tokens);
 
@@ -151,6 +158,8 @@ private:
     static std::mutex _rngMutex;
     int _curPart;
     int _loadPart;
+    /// Kind::ToClient instances store URLs of completed 'save as' documents.
+    tsqueue<std::string> _saveAsQueue;
 };
 
 class ChildProcessSession final : public LOOLSession
diff --git a/loolwsd/protocol.txt b/loolwsd/protocol.txt
index bc7c453..ede153d 100644
--- a/loolwsd/protocol.txt
+++ b/loolwsd/protocol.txt
@@ -181,3 +181,8 @@ nextmessage: size=<upperlimit>
     messages that can be "large".) Once we depend on Poco 1.6.1, where
     one doesn't need to use a pre-allocated buffer when receiving
     WebSocket messages, this will go away.
+
+saveas: url=<url>
+
+    <url> is a URL of the destination, encoded. Sent from the child to the
+    parent after a saveAs() completed.


More information about the Libreoffice-commits mailing list