[Libreoffice-commits] online.git: Branch 'distro/collabora/milestone-7' - loleaflet/src loolwsd/LOOLSession.cpp loolwsd/LOOLWSD.cpp loolwsd/protocol.txt loolwsd/test

Miklos Vajna vmiklos at collabora.co.uk
Fri Jan 15 06:34:35 PST 2016


 loleaflet/src/layer/tile/TileLayer.js |    2 +-
 loolwsd/LOOLSession.cpp               |   11 ++++++-----
 loolwsd/LOOLWSD.cpp                   |   12 ++++++++----
 loolwsd/protocol.txt                  |    3 ++-
 loolwsd/test/httpwstest.cpp           |    2 +-
 5 files changed, 18 insertions(+), 12 deletions(-)

New commits:
commit fde59b7c4c3ab7193c12334930709b00a670d62f
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Fri Jan 15 14:42:02 2016 +0100

    paste: handle data containing newlines
    
    By changing the protocol, so that instead of "paste ... data=<data>",
    the client is now expected to send "paste ...\n<data>".
    
    (cherry picked from commit 1977f07d5c406b5bcecc9a0f8e9a2da7af4e2c09)
    
    Conflicts:
    	loolwsd/ChildProcessSession.cpp
    	loolwsd/LOOLKit.cpp
    	loolwsd/LOOLWSD.cpp

diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index c868b8e..e08754f 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -934,7 +934,7 @@ L.TileLayer = L.GridLayer.extend({
 	_onPaste: function (e) {
 		e = e.originalEvent;
 		e.preventDefault();
-		this._map._socket.sendMessage('paste mimetype=text/plain;charset=utf-8 data=' + e.clipboardData.getData('text/plain'));
+		this._map._socket.sendMessage('paste mimetype=text/plain;charset=utf-8\n' + e.clipboardData.getData('text/plain'));
 	},
 
 	_onDragOver: function (e) {
diff --git a/loolwsd/LOOLSession.cpp b/loolwsd/LOOLSession.cpp
index e920adb..5e11e1d 100644
--- a/loolwsd/LOOLSession.cpp
+++ b/loolwsd/LOOLSession.cpp
@@ -1461,20 +1461,21 @@ bool ChildProcessSession::getTextSelection(const char* /*buffer*/, int /*length*
     return true;
 }
 
-bool ChildProcessSession::paste(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
+bool ChildProcessSession::paste(const char* buffer, int length, StringTokenizer& tokens)
 {
     std::string mimeType;
-    std::string data;
 
-    if (tokens.count() < 3 || !getTokenString(tokens[1], "mimetype", mimeType) || !getTokenString(tokens[2], "data", data))
+    if (tokens.count() < 2 || !getTokenString(tokens[1], "mimetype", mimeType))
     {
         sendTextFrame("error: cmd=paste kind=syntax");
         return false;
     }
 
-    data = Poco::cat(std::string(" "), tokens.begin() + 2, tokens.end()).substr(strlen("data="));
+    const std::string firstLine = getFirstLine(buffer, length);
+    const char* data = buffer + firstLine.size() + 1;
+    size_t size = length - firstLine.size() - 1;
 
-    _loKitDocument->pClass->paste(_loKitDocument, mimeType.c_str(), data.c_str(), std::strlen(data.c_str()));
+    _loKitDocument->pClass->paste(_loKitDocument, mimeType.c_str(), data, size);
 
     return true;
 }
diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp
index c1434e1..375874c 100644
--- a/loolwsd/LOOLWSD.cpp
+++ b/loolwsd/LOOLWSD.cpp
@@ -1071,10 +1071,14 @@ void LOOLWSD::componentMain()
                 std::string firstLine = getFirstLine(buffer, n);
                 StringTokenizer tokens(firstLine, " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
 
-                // The only kind of messages a child process receives are the single-line ones (?)
-                assert(firstLine.size() == static_cast<std::string::size_type>(n));
-
-                queue.put(firstLine);
+                if (firstLine.find("paste") != 0)
+                {
+                    // Everything else is expected to be a single line.
+                    assert(firstLine.size() == static_cast<std::string::size_type>(n));
+                    queue.put(firstLine);
+                }
+                else
+                    queue.put(std::string(buffer, n));
             }
         }
         while (n > 0 && (flags & WebSocket::FRAME_OP_BITMASK) != WebSocket::FRAME_OP_CLOSE);
diff --git a/loolwsd/protocol.txt b/loolwsd/protocol.txt
index e9cce86..1d8890d 100644
--- a/loolwsd/protocol.txt
+++ b/loolwsd/protocol.txt
@@ -31,7 +31,8 @@ gettextselection mimetype=<mimeType>
 
     Request selection's content
 
-paste mimetype=<mimeType> data=<data>
+paste mimetype=<mimeType>
+<binaryPasteData>
 
     Paste content at the current cursor position.
 
diff --git a/loolwsd/test/httpwstest.cpp b/loolwsd/test/httpwstest.cpp
index 1caf632..3846151 100644
--- a/loolwsd/test/httpwstest.cpp
+++ b/loolwsd/test/httpwstest.cpp
@@ -56,7 +56,7 @@ void HTTPWSTest::testPaste()
     sendTextFrame(_socket, "uno .uno:Delete");
 
     // Paste some text into it.
-    sendTextFrame(_socket, "paste mimetype=text/plain;charset=utf-8 data=aaa bbb ccc");
+    sendTextFrame(_socket, "paste mimetype=text/plain;charset=utf-8\naaa bbb ccc");
 
     // Check if the document contains the pasted text.
     sendTextFrame(_socket, "uno .uno:SelectAll");


More information about the Libreoffice-commits mailing list