loleaflet/src/control/Parts.js | 1 + loleaflet/src/layer/tile/TileLayer.js | 1 + loolwsd/LOOLSession.cpp | 24 ++++++++++++++++++++++-- loolwsd/LOOLSession.hpp | 4 ++++ loolwsd/TileCache.cpp | 22 ++++++++++++++-------- loolwsd/TileCache.hpp | 2 +- 6 files changed, 43 insertions(+), 11 deletions(-)
New commits: commit 0492094b4eb3d21d8ff9b5e874ee806640a4b0f1 Author: Mihai Varga <mihai.va...@collabora.com> Date: Tue Jul 21 16:57:50 2015 +0300 loleaflet: notify the server about the current part We need this because we want to prefetch tiles from other parts too. In order to render a tile we need to call 'setPart' and then 'paintTile' so this might change the current part in the document. But when the user is editing/selecting we want to work on the part that he/she is viewing diff --git a/loleaflet/src/control/Parts.js b/loleaflet/src/control/Parts.js index 30eddd9..1041604 100644 --- a/loleaflet/src/control/Parts.js +++ b/loleaflet/src/control/Parts.js @@ -25,6 +25,7 @@ L.Map.include({ parts: docLayer._parts, docType: docLayer._docType }); + docLayer.sendMessage('setclientpart part=' + docLayer._currentPart); docLayer._update(); docLayer._pruneTiles(); docLayer._clearSelections(); diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js index b4d8024..99b4df1 100644 --- a/loleaflet/src/layer/tile/TileLayer.js +++ b/loleaflet/src/layer/tile/TileLayer.js @@ -323,6 +323,7 @@ L.TileLayer = L.GridLayer.extend({ this._documentInfo = textMsg; this._parts = command.parts; this._currentPart = command.currentPart; + this.sendMessage('setclientpart part=' + this._currentPart); var partNamesStr = bytes === undefined ? textMsg : String.fromCharCode.apply(null, bytes.subarray(index)); var partNames = partNamesStr.match(/[^\r\n]+/g); this._map.fire('updateparts', { commit b9884a470a89fbbcba5b500da62d3e2601299090 Author: Mihai Varga <mihai.va...@collabora.com> Date: Tue Jul 21 16:56:02 2015 +0300 loolwsd: be aware of the client's current part And set lok's part to match the client's when they start editing or selecting diff --git a/loolwsd/LOOLSession.cpp b/loolwsd/LOOLSession.cpp index 58e699e..3294806 100644 --- a/loolwsd/LOOLSession.cpp +++ b/loolwsd/LOOLSession.cpp @@ -277,6 +277,7 @@ bool MasterProcessSession::handleInput(const char *buffer, int length) tokens[0] != "saveas" && tokens[0] != "selectgraphic" && tokens[0] != "selecttext" && + tokens[0] != "setclientpart" && tokens[0] != "status" && tokens[0] != "tile" && tokens[0] != "uno") @@ -574,7 +575,8 @@ void MasterProcessSession::forwardToPeer(const char *buffer, int length) ChildProcessSession::ChildProcessSession(std::shared_ptr<WebSocket> ws, LibreOfficeKit *loKit) : LOOLSession(ws, Kind::ToMaster), _loKitDocument(NULL), - _loKit(loKit) + _loKit(loKit), + _clientPart(0) { std::cout << Util::logPrefix() << "ChildProcessSession ctor this=" << this << " ws=" << _ws.get() << std::endl; } @@ -608,6 +610,10 @@ bool ChildProcessSession::handleInput(const char *buffer, int length) sendTextFrame("error: cmd=" + tokens[0] + " kind=nodocloaded"); return false; } + else if (tokens[0] == "setclientpart") + { + return setClientPart(buffer, length, tokens); + } else if (tokens[0] == "status") { return getStatus(buffer, length); @@ -630,6 +636,10 @@ bool ChildProcessSession::handleInput(const char *buffer, int length) tokens[0] == "resetselection" || tokens[0] == "saveas"); + if (_loKitDocument->pClass->getPart(_loKitDocument) != _clientPart) + { + _loKitDocument->pClass->setPart(_loKitDocument, _clientPart); + } if (tokens[0] == "gettextselection") { return getTextSelection(buffer, length, tokens); @@ -1024,4 +1034,14 @@ bool ChildProcessSession::saveAs(const char *buffer, int length, StringTokenizer return true; } +bool ChildProcessSession::setClientPart(const char *buffer, int length, StringTokenizer& tokens) +{ + if (tokens.count() < 2 || + !getTokenInteger(tokens[1], "part", _clientPart)) + { + return false; + } + return true; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/loolwsd/LOOLSession.hpp b/loolwsd/LOOLSession.hpp index aa3ac25..361f6fb 100644 --- a/loolwsd/LOOLSession.hpp +++ b/loolwsd/LOOLSession.hpp @@ -175,10 +175,14 @@ public: bool selectGraphic(const char *buffer, int length, Poco::StringTokenizer& tokens); bool resetSelection(const char *buffer, int length, Poco::StringTokenizer& tokens); bool saveAs(const char *buffer, int length, Poco::StringTokenizer& tokens); + bool setClientPart(const char *buffer, int length, Poco::StringTokenizer& tokens); std::string _jail; std::string _loSubPath; LibreOfficeKit *_loKit; + + private: + int _clientPart; }; #endif commit c9fff5d8e3f56c98b052de11b4167ec2c8ace7c0 Author: Mihai Varga <mihai.va...@collabora.com> Date: Tue Jul 21 14:53:53 2015 +0300 loolwsd: updated tileCache::invalidateTiles diff --git a/loolwsd/LOOLSession.cpp b/loolwsd/LOOLSession.cpp index cddf845..58e699e 100644 --- a/loolwsd/LOOLSession.cpp +++ b/loolwsd/LOOLSession.cpp @@ -204,7 +204,7 @@ bool MasterProcessSession::handleInput(const char *buffer, int length) peer->_tileCache->setEditing(true); assert(firstLine.size() == static_cast<std::string::size_type>(length)); - peer->_tileCache->invalidateTiles(_curPart, firstLine); + peer->_tileCache->invalidateTiles(firstLine); } } diff --git a/loolwsd/TileCache.cpp b/loolwsd/TileCache.cpp index 36ea9e1..2ee9da7 100644 --- a/loolwsd/TileCache.cpp +++ b/loolwsd/TileCache.cpp @@ -28,6 +28,7 @@ #include <Poco/URI.h> #include "LOOLWSD.hpp" +#include "LOOLProtocol.hpp" #include "TileCache.hpp" using Poco::DigestEngine; @@ -39,6 +40,8 @@ using Poco::SyntaxException; using Poco::Timestamp; using Poco::URI; +using namespace LOOLProtocol; + TileCache::TileCache(const std::string& docURL) : _docURL(docURL), _isEditing(false), @@ -224,7 +227,7 @@ void TileCache::invalidateTiles(int part, int x, int y, int width, int height) } } -void TileCache::invalidateTiles(int part, const std::string& tiles) +void TileCache::invalidateTiles(const std::string& tiles) { StringTokenizer tokens(tiles, " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM); @@ -234,18 +237,21 @@ void TileCache::invalidateTiles(int part, const std::string& tiles) { invalidateTiles(-1, 0, 0, INT_MAX, INT_MAX); } - else if (tokens.count() != 5) + else if (tokens.count() != 6) { return; } else { - int x(std::stoi(tokens[1])); - int y(std::stoi(tokens[2])); - int width(std::stoi(tokens[3])); - int height(std::stoi(tokens[4])); - - invalidateTiles(part, x, y, width, height); + int part, x, y, width, height; + if (getTokenInteger(tokens[1], "part", part) && + getTokenInteger(tokens[2], "x", x) && + getTokenInteger(tokens[3], "y", y) && + getTokenInteger(tokens[4], "width", width) && + getTokenInteger(tokens[5], "height", height)) + { + invalidateTiles(part, x, y, width, height); + } } } diff --git a/loolwsd/TileCache.hpp b/loolwsd/TileCache.hpp index ff5f2b9..bcc6416 100644 --- a/loolwsd/TileCache.hpp +++ b/loolwsd/TileCache.hpp @@ -46,7 +46,7 @@ public: void saveStatus(const std::string& status); // The tiles parameter is an invalidatetiles: message as sent by the child process - void invalidateTiles(int part, const std::string& tiles); + void invalidateTiles(const std::string& tiles); void invalidateTiles(int part, int x, int y, int width, int height); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits