loleaflet/src/control/Control.DocumentRepair.js | 8 +++- loolwsd/ChildSession.cpp | 44 +++++++++++++++++++++--- loolwsd/ChildSession.hpp | 3 + loolwsd/LOOLKit.cpp | 31 ++++++++++------ 4 files changed, 69 insertions(+), 17 deletions(-)
New commits: commit 3090981c8a306c47e1c1f031bafe77fdd3dd7bde Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Fri Sep 30 14:21:14 2016 +0200 Document repair: expose user names, not only view IDs Also in leaflet replace the current user with "You" to be consistent with the statusbar. Change-Id: If2d76f078eeae3038f8ae17506ae7679f7b23023 diff --git a/loleaflet/src/control/Control.DocumentRepair.js b/loleaflet/src/control/Control.DocumentRepair.js index 365d21d..5176ea2 100644 --- a/loleaflet/src/control/Control.DocumentRepair.js +++ b/loleaflet/src/control/Control.DocumentRepair.js @@ -43,7 +43,7 @@ L.Control.DocumentRepair = L.Control.extend({ th = L.DomUtil.create('th', '', tr); th.appendChild(document.createTextNode(_('Comment'))); th = L.DomUtil.create('th', '', tr); - th.appendChild(document.createTextNode(_('View ID'))); + th.appendChild(document.createTextNode(_('User name'))); th = L.DomUtil.create('th', '', tr); th.appendChild(document.createTextNode(_('Timestamp'))); @@ -74,7 +74,11 @@ L.Control.DocumentRepair = L.Control.extend({ fillAction: function (actions, type) { for (var iterator = 0; iterator < actions.length; ++iterator) { - this.createAction(type, actions[iterator].index, actions[iterator].comment, actions[iterator].viewId, actions[iterator].dateTime); + var userName = actions[iterator].userName; + if (parseInt(actions[iterator].viewId) === this._map._docLayer._viewId) { + userName = _('You'); + } + this.createAction(type, actions[iterator].index, actions[iterator].comment, userName, actions[iterator].dateTime); } }, diff --git a/loolwsd/ChildSession.cpp b/loolwsd/ChildSession.cpp index 7ae8b7e..355a5d4 100644 --- a/loolwsd/ChildSession.cpp +++ b/loolwsd/ChildSession.cpp @@ -397,6 +397,38 @@ bool ChildSession::getStatus(const char* /*buffer*/, int /*length*/) return sendTextFrame("status: " + status); } +namespace +{ + +/// Given a view ID <-> user name map and a .uno:DocumentRepair result, annotate with user names. +void insertUserNames(const std::map<int, std::string>& viewInfo, std::string& json) +{ + Poco::JSON::Parser parser; + auto root = parser.parse(json).extract<Poco::JSON::Object::Ptr>(); + std::vector<std::string> directions { "Undo", "Redo" }; + for (auto& directionName : directions) + { + auto direction = root->get(directionName).extract<Poco::JSON::Object::Ptr>(); + if (direction->get("actions").type() == typeid(Poco::JSON::Array::Ptr)) + { + auto actions = direction->get("actions").extract<Poco::JSON::Array::Ptr>(); + for (auto& actionVar : *actions) + { + auto action = actionVar.extract<Poco::JSON::Object::Ptr>(); + int viewId = action->getValue<int>("viewId"); + auto it = viewInfo.find(viewId); + if (it != viewInfo.end()) + action->set("userName", Poco::Dynamic::Var(it->second)); + } + } + } + std::stringstream ss; + root->stringify(ss); + json = ss.str(); +} + +} + bool ChildSession::getCommandValues(const char* /*buffer*/, int /*length*/, StringTokenizer& tokens) { bool success; @@ -415,12 +447,16 @@ bool ChildSession::getCommandValues(const char* /*buffer*/, int /*length*/, Stri if (command == ".uno:DocumentRepair") { char* pUndo; - const std::string json("{\"commandName\":\".uno:DocumentRepair\",\"Redo\":%s,\"Undo\":%s}"); + const std::string jsonTemplate("{\"commandName\":\".uno:DocumentRepair\",\"Redo\":%s,\"Undo\":%s}"); pValues = _loKitDocument->getCommandValues(".uno:Redo"); pUndo = _loKitDocument->getCommandValues(".uno:Undo"); - success = sendTextFrame("commandvalues: " + Poco::format(json, - std::string(pValues == nullptr ? "" : pValues), - std::string(pUndo == nullptr ? "" : pUndo))); + std::string json = Poco::format(jsonTemplate, + std::string(pValues == nullptr ? "" : pValues), + std::string(pUndo == nullptr ? "" : pUndo)); + // json only contains view IDs, insert matching user names. + std::map<int, std::string> viewInfo =_docManager.getViewInfo(); + insertUserNames(viewInfo, json); + success = sendTextFrame("commandvalues: " + json); std::free(pValues); std::free(pUndo); } diff --git a/loolwsd/ChildSession.hpp b/loolwsd/ChildSession.hpp index 87a754f..dfc5bf2 100644 --- a/loolwsd/ChildSession.hpp +++ b/loolwsd/ChildSession.hpp @@ -43,6 +43,9 @@ public: /// Send updated view info to all active sessions virtual void notifyViewInfo() = 0; + /// Get a view ID <-> user name map. + virtual + std::map<int, std::string> getViewInfo() = 0; }; /// Represents a session to the WSD process, in a Kit process. Note that this is not a singleton. diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp index c37f2c6..d34fe47 100644 --- a/loolwsd/LOOLKit.cpp +++ b/loolwsd/LOOLKit.cpp @@ -996,6 +996,24 @@ private: notifyViewInfo(); } + std::map<int, std::string> getViewInfo() override + { + std::unique_lock<std::mutex> lock(_mutex); + std::map<int, std::string> viewInfo; + + for (auto& connection : _connections) + { + if (connection.second->isRunning()) + { + const auto session = connection.second->getSession(); + const auto viewId = session->getViewId(); + viewInfo[viewId] = session->getViewUserName(); + } + } + + return viewInfo; + }; + /// Notify all views of viewId and their associated usernames void notifyViewInfo() override { @@ -1007,18 +1025,9 @@ private: _loKitDocument->getViewIds(viewIds.data(), viewCount); lockLokDoc.unlock(); - std::unique_lock<std::mutex> lock(_mutex); // Store the list of viewid, username mapping in a map - std::map<int, std::string> viewInfoMap; - for (auto& connectionIt : _connections) - { - if (connectionIt.second->isRunning()) - { - const auto session = connectionIt.second->getSession(); - const auto viewId = session->getViewId(); - viewInfoMap[viewId] = session->getViewUserName(); - } - } + std::map<int, std::string> viewInfoMap = getViewInfo(); + std::unique_lock<std::mutex> lock(_mutex); // Double check if list of viewids from core and our list matches, // and create an array of JSON objects containing id and username _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits