[Libreoffice-commits] online.git: 3 commits - kit/ChildSession.cpp loleaflet/dist loleaflet/src wsd/ClientSession.cpp wsd/PrisonerSession.cpp wsd/protocol.txt

Henry Castro hcastro at collabora.com
Mon Nov 28 02:53:05 UTC 2016


 kit/ChildSession.cpp                          |   17 ++++++++--
 loleaflet/dist/images/loading.gif             |binary
 loleaflet/src/control/Control.CharacterMap.js |   41 ++++++++++++++++++--------
 loleaflet/src/core/Socket.js                  |    5 ++-
 loleaflet/src/layer/tile/TileLayer.js         |    1 
 wsd/ClientSession.cpp                         |    5 +--
 wsd/PrisonerSession.cpp                       |    7 ++--
 wsd/protocol.txt                              |    3 +
 8 files changed, 56 insertions(+), 23 deletions(-)

New commits:
commit 6947e914e1d71ed8ec228f2a524faff383c006c0
Author: Henry Castro <hcastro at collabora.com>
Date:   Sun Nov 27 22:47:36 2016 -0400

    loleaflet: re-work special character dialog to render all glyphs
    
    .. on server side

diff --git a/loleaflet/dist/images/loading.gif b/loleaflet/dist/images/loading.gif
new file mode 100755
index 0000000..f8f3dff
Binary files /dev/null and b/loleaflet/dist/images/loading.gif differ
diff --git a/loleaflet/src/control/Control.CharacterMap.js b/loleaflet/src/control/Control.CharacterMap.js
index 550fff6..c17c443 100644
--- a/loleaflet/src/control/Control.CharacterMap.js
+++ b/loleaflet/src/control/Control.CharacterMap.js
@@ -274,22 +274,34 @@ L.Control.CharacterMap = L.Control.extend({
 	],
 
 	cacheSubset: {},
+	cacheGlyph: {},
 
 	fillCharacters: function (index) {
 		var start = this.unicodeBlocks[index].start;
 		var end = this.unicodeBlocks[index].end;
+		var encodedFont = window.encodeURIComponent(this._fontNames.options[this._fontNames.selectedIndex].value);
 		var it = 0;
-		var tr, td;
+		var tr, td, img, encodedChar;
 		L.DomUtil.empty(this._tbody);
 		while (start <= end) {
 			if (it % 20 === 0) {
 				tr = L.DomUtil.create('tr', '', this._tbody);
 			}
 			td = L.DomUtil.create('td', '', tr);
-			td.innerHTML = '&#x' + start.toString(16);
-			td.data = start;
+			encodedChar = window.encodeURIComponent(String.fromCharCode(start));
+			if (this.cacheGlyph[encodedFont + encodedChar]) {
+				img = this.cacheGlyph[encodedFont + encodedChar];
+			} else {
+				img = document.createElement('img');
+				img.data = start;
+				img.src = L.Icon.Default.imagePath + '/loading.gif';
+				this.cacheGlyph[encodedFont + encodedChar] = img;
+				this._map._socket.sendMessage('renderfont font=' + encodedFont + ' char=' + encodedChar);
+				console.log('send=' + start.toString(16).toUpperCase() + ' encoded='  +encodedFont + encodedChar);
+			}
 			L.DomEvent.on(td, 'click', this._onSymbolClick, this);
 			L.DomEvent.on(td, 'dblclick', this._onSymbolDblClick, this);
+			td.appendChild(img);
 			start++;
 			it++;
 		}
@@ -363,15 +375,12 @@ L.Control.CharacterMap = L.Control.extend({
 		L.DomEvent.on(this._unicodeSubset, 'change', this._onUnicodeSubsetChange, this);
 		content.appendChild(document.createElement('br'));
 		content.appendChild(document.createElement('br'));
-		label = L.DomUtil.create('span', 'loleaflet-controls', content);
-		label.innerHTML = '<b>' + _('Special Characters rendered by the User Agent:') + '</b>';
-		content.appendChild(document.createElement('br'));
 		var table = L.DomUtil.create('table', 'loleaflet-character', content);
 		this._tbody = L.DomUtil.create('tbody', '', table);
 		content.appendChild(document.createElement('br'));
 		content.appendChild(document.createElement('br'));
 		label = L.DomUtil.create('span', 'loleaflet-controls', content);
-		label.innerHTML = '<b>' + _('Special Character rendered by Server Side:') + '</b>';
+		label.innerHTML = '<b>' + _('Selected Character:') + '</b>';
 		this._preview = L.DomUtil.create('img', '', content);
 		content.appendChild(document.createElement('br'));
 		content.appendChild(document.createElement('br'));
@@ -431,16 +440,24 @@ L.Control.CharacterMap = L.Control.extend({
 	},
 
 	_onRenderFontPreview: function (e) {
-		this._preview.src = e.img;
+		if (this.cacheGlyph[e.font + e.char]) {
+			this.cacheGlyph[e.font + e.char].src = e.img;
+		} else {
+			console.log('failed to get font image' + e.font + e.char);
+		}
 	},
 
 	_onSymbolClick: function (e) {
 		var target = e.target || e.srcElement;
+		var encodedFont = window.encodeURIComponent(this._fontNames.options[this._fontNames.selectedIndex].value);
+		var encodedChar = window.encodeURIComponent(String.fromCharCode(target.data));
 		this._hexa.data = target.data;
-		this._hexa.innerHTML = 'U+' + target.data.toString(16).toUpperCase();
-		this._map._socket.sendMessage('renderfont font=' +
-			window.encodeURIComponent(this._fontNames.options[this._fontNames.selectedIndex].value) +
-			' char=' + String.fromCharCode(this._hexa.data));
+		if (this.cacheGlyph[encodedFont + encodedChar]) {
+			this._preview.src = this.cacheGlyph[encodedFont + encodedChar].src;
+		} else {
+			this._preview.src = L.Icon.Default.imagePath + '/loading.gif';
+		}
+		this._hexa.innerHTML = 'U+' + this._hexa.data.toString(16).toUpperCase();
 	},
 
 	_onSymbolDblClick: function (e) {
diff --git a/loleaflet/src/core/Socket.js b/loleaflet/src/core/Socket.js
index 5c0d834..e3799b6 100644
--- a/loleaflet/src/core/Socket.js
+++ b/loleaflet/src/core/Socket.js
@@ -532,7 +532,10 @@ L.Socket = L.Class.extend({
 				command.port = tokens[i].substring(5);
 			}
 			else if (tokens[i].substring(0, 5) === 'font=') {
-				command.font = window.decodeURIComponent(tokens[i].substring(5));
+				command.font = tokens[i].substring(5);
+			}
+			else if (tokens[i].substring(0, 5) === 'char=') {
+				command.char = tokens[i].substring(5);
 			}
 			else if (tokens[i].substring(0, 7) === 'viewid=') {
 				command.viewid = tokens[i].substring(7);
diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index d47a6e5..ba5e5d7 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -876,6 +876,7 @@ L.TileLayer = L.GridLayer.extend({
 		var command = this._map._socket.parseServerCmd(textMsg);
 		this._map.fire('renderfont', {
 			font: command.font,
+			char: command.char,
 			img: img
 		});
 	},
commit 7234db931733a27b67622b8add85274ef6104b2a
Author: Henry Castro <hcastro at collabora.com>
Date:   Sun Nov 27 22:39:50 2016 -0400

    wsd: fix sending wrong UTF-8 string to the client
    
    Client side console error "ws stopped cannot read
    utf8 string", the cause it is sending special character '{',
    '}',

diff --git a/wsd/PrisonerSession.cpp b/wsd/PrisonerSession.cpp
index 9132cae..bbfd902 100644
--- a/wsd/PrisonerSession.cpp
+++ b/wsd/PrisonerSession.cpp
@@ -242,6 +242,8 @@ bool PrisonerSession::_handleInput(const char *buffer, int length)
             getTokenString(tokens[2], "char", text);
             assert(firstLine.size() < static_cast<std::string::size_type>(length));
             _docBroker->tileCache().saveRendering(font+text, "font", buffer + firstLine.size() + 1, length - firstLine.size() - 1);
+            forwardToPeer(_peer, buffer, length, true);
+            return true;
         }
     }
     else
commit 7760d6d6d5fbe89ccca9732302933e52eee3bad1
Author: Henry Castro <hcastro at collabora.com>
Date:   Sun Nov 27 19:49:17 2016 -0400

    wsd: fix URL encoded char parameter

diff --git a/kit/ChildSession.cpp b/kit/ChildSession.cpp
index 5e364ae..66e532b 100644
--- a/kit/ChildSession.cpp
+++ b/kit/ChildSession.cpp
@@ -358,7 +358,7 @@ bool ChildSession::loadDocument(const char * /*buffer*/, int /*length*/, StringT
 
 bool ChildSession::sendFontRendering(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens)
 {
-    std::string font, text, decodedFont;
+    std::string font, text, decodedFont, decodedChar;
 
     if (tokens.count() < 3 ||
         !getTokenString(tokens[1], "font", font))
@@ -369,7 +369,18 @@ bool ChildSession::sendFontRendering(const char* /*buffer*/, int /*length*/, Str
 
     getTokenString(tokens[2], "char", text);
 
-    URI::decode(font, decodedFont);
+    try
+    {
+        URI::decode(font, decodedFont);
+        URI::decode(text, decodedChar);
+    }
+    catch (Poco::SyntaxException& exc)
+    {
+        LOG_DBG(exc.message());
+        sendTextFrame("error: cmd=renderfont kind=syntax");
+        return false;
+    }
+
     std::string response = "renderfont: " + Poco::cat(std::string(" "), tokens.begin() + 1, tokens.end()) + "\n";
 
     std::vector<char> output;
@@ -385,7 +396,7 @@ bool ChildSession::sendFontRendering(const char* /*buffer*/, int /*length*/, Str
 
         getLOKitDocument()->setView(_viewId);
 
-        ptrFont = getLOKitDocument()->renderFont(decodedFont.c_str(), text.c_str(), &width, &height);
+        ptrFont = getLOKitDocument()->renderFont(decodedFont.c_str(), decodedChar.c_str(), &width, &height);
     }
 
     LOG_TRC("renderFont [" << font << "] rendered in " << (timestamp.elapsed()/1000.) << "ms");
diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp
index cedbc5e..0d86109 100644
--- a/wsd/ClientSession.cpp
+++ b/wsd/ClientSession.cpp
@@ -319,7 +319,7 @@ bool ClientSession::getPartPageRectangles(const char *buffer, int length,
 bool ClientSession::sendFontRendering(const char *buffer, int length, StringTokenizer& tokens,
                                       const std::shared_ptr<DocumentBroker>& docBroker)
 {
-    std::string font, text, encodedChar;
+    std::string font, text;
     if (tokens.count() < 2 ||
         !getTokenString(tokens[1], "font", font))
     {
@@ -327,14 +327,13 @@ bool ClientSession::sendFontRendering(const char *buffer, int length, StringToke
     }
 
     getTokenString(tokens[2], "char", text);
-    Poco::URI::encode(text, "", encodedChar);
     const std::string response = "renderfont: " + Poco::cat(std::string(" "), tokens.begin() + 1, tokens.end()) + "\n";
 
     std::vector<char> output;
     output.resize(response.size());
     std::memcpy(output.data(), response.data(), response.size());
 
-    std::unique_ptr<std::fstream> cachedRendering = docBroker->tileCache().lookupCachedFile(font+encodedChar, "font");
+    std::unique_ptr<std::fstream> cachedRendering = docBroker->tileCache().lookupCachedFile(font+text, "font");
     if (cachedRendering && cachedRendering->is_open())
     {
         cachedRendering->seekg(0, std::ios_base::end);
diff --git a/wsd/PrisonerSession.cpp b/wsd/PrisonerSession.cpp
index faf8232..9132cae 100644
--- a/wsd/PrisonerSession.cpp
+++ b/wsd/PrisonerSession.cpp
@@ -231,7 +231,7 @@ bool PrisonerSession::_handleInput(const char *buffer, int length)
         }
         else if (tokens[0] == "renderfont:")
         {
-            std::string font, text, encodedChar;
+            std::string font, text;
             if (tokens.count() < 3 ||
                 !getTokenString(tokens[1], "font", font))
             {
@@ -240,9 +240,8 @@ bool PrisonerSession::_handleInput(const char *buffer, int length)
             }
 
             getTokenString(tokens[2], "char", text);
-            Poco::URI::encode(text, "", encodedChar);
             assert(firstLine.size() < static_cast<std::string::size_type>(length));
-            _docBroker->tileCache().saveRendering(font+encodedChar, "font", buffer + firstLine.size() + 1, length - firstLine.size() - 1);
+            _docBroker->tileCache().saveRendering(font+text, "font", buffer + firstLine.size() + 1, length - firstLine.size() - 1);
         }
     }
     else
diff --git a/wsd/protocol.txt b/wsd/protocol.txt
index 5ac2e0e..85470a4 100644
--- a/wsd/protocol.txt
+++ b/wsd/protocol.txt
@@ -89,10 +89,11 @@ ping
 
     requests a 'pong' server message.
 
-renderfont font=<font>
+renderfont font=<font> char=<characters>
 
     requests the rendering of the given font.
     The font parameter is URL encoded
+    The char parameter is URL encoded
 
 requestloksession
 


More information about the Libreoffice-commits mailing list