common/Unit.hpp | 6 ++++++ test/UnitWOPI.cpp | 16 ++++++++++++++++ wsd/DocumentBroker.cpp | 5 +++-- wsd/DocumentBroker.hpp | 2 +- wsd/Storage.cpp | 1 + wsd/Storage.hpp | 9 ++++++++- wsd/reference.txt | 8 ++++++++ 7 files changed, 43 insertions(+), 4 deletions(-)
New commits: commit 7f49b1eba6402d3d06738e89f98110670e2b0743 Author: Jan Holesovsky <ke...@collabora.com> Date: Tue Oct 3 11:59:39 2017 +0200 PutFile ext: X-LOOL-WOPI-IsAutosave header to indicate autosave + unit test. Change-Id: I65ed711dae5100467fe6ed9902bd7bad8c7f8d68 Reviewed-on: https://gerrit.libreoffice.org/43074 Reviewed-by: Jan Holesovsky <ke...@collabora.com> Tested-by: Jan Holesovsky <ke...@collabora.com> diff --git a/common/Unit.hpp b/common/Unit.hpp index f43b4d32..9885d073 100644 --- a/common/Unit.hpp +++ b/common/Unit.hpp @@ -214,6 +214,12 @@ public: return false; } + /// To force the save operation being handled as auto-save from a unit test. + virtual bool isAutosave() + { + return false; + } + // ---------------- WSD events ---------------- virtual void onChildConnected(const int /* pid */, const std::string& /* sessionId */) {} /// When admin notify message is sent diff --git a/test/UnitWOPI.cpp b/test/UnitWOPI.cpp index 59f6282e..a8808d20 100644 --- a/test/UnitWOPI.cpp +++ b/test/UnitWOPI.cpp @@ -44,6 +44,12 @@ public: { } + bool isAutosave() override + { + // we fake autosave when saving the modified document + return _savingPhase == SavingPhase::Modified; + } + void assertCheckFileInfoRequest(const Poco::Net::HTTPRequest& /*request*/) override { // nothing to assert in CheckFileInfo @@ -58,12 +64,22 @@ public: { if (_savingPhase == SavingPhase::Unmodified) { + // the document is not modified CPPUNIT_ASSERT_EQUAL(std::string("false"), request.get("X-LOOL-WOPI-IsModifiedByUser")); + + // but the save action is an explicit user's request + CPPUNIT_ASSERT_EQUAL(std::string("false"), request.get("X-LOOL-WOPI-IsAutosave")); + _finishedSaveUnmodified = true; } else if (_savingPhase == SavingPhase::Modified) { + // the document is modified CPPUNIT_ASSERT_EQUAL(std::string("true"), request.get("X-LOOL-WOPI-IsModifiedByUser")); + + // and this test fakes that it's an autosave + CPPUNIT_ASSERT_EQUAL(std::string("true"), request.get("X-LOOL-WOPI-IsAutosave")); + _finishedSaveModified = true; } diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp index ed76b2a6..6eff18bb 100644 --- a/wsd/DocumentBroker.cpp +++ b/wsd/DocumentBroker.cpp @@ -806,14 +806,14 @@ bool DocumentBroker::autoSave(const bool force) timeSinceLastSaveMs >= autoSaveDurationMs) { LOG_TRC("Sending timed save command for [" << _docKey << "]."); - sent = sendUnoSave(savingSessionId); + sent = sendUnoSave(savingSessionId, /*dontTerminateEdit=*/ true, /*dontSaveIfUnmodified=*/ true, /*isAutosave=*/ true); } } return sent; } -bool DocumentBroker::sendUnoSave(const std::string& sessionId, bool dontTerminateEdit, bool dontSaveIfUnmodified) +bool DocumentBroker::sendUnoSave(const std::string& sessionId, bool dontTerminateEdit, bool dontSaveIfUnmodified, bool isAutosave) { assertCorrectThread(); @@ -856,6 +856,7 @@ bool DocumentBroker::sendUnoSave(const std::string& sessionId, bool dontTerminat assert(_storage); _storage->setUserModified(_isModified); + _storage->setIsAutosave(isAutosave || UnitWSD::get().isAutosave()); const auto saveArgs = oss.str(); LOG_TRC(".uno:Save arguments: " << saveArgs); diff --git a/wsd/DocumentBroker.hpp b/wsd/DocumentBroker.hpp index ecaaa30a..8756e0b5 100644 --- a/wsd/DocumentBroker.hpp +++ b/wsd/DocumentBroker.hpp @@ -337,7 +337,7 @@ public: } /// Sends the .uno:Save command to LoKit. - bool sendUnoSave(const std::string& sessionId, bool dontTerminateEdit = true, bool dontSaveIfUnmodified = true); + bool sendUnoSave(const std::string& sessionId, bool dontTerminateEdit = true, bool dontSaveIfUnmodified = true, bool isAutosave = false); /// Create copy of the file with a different name void saveFileAs(const std::string& sessionId, const std::string& newFileName, const std::string& path); diff --git a/wsd/Storage.cpp b/wsd/Storage.cpp index 9003c75c..6a02649a 100644 --- a/wsd/Storage.cpp +++ b/wsd/Storage.cpp @@ -765,6 +765,7 @@ StorageBase::SaveResult WopiStorage::saveLocalFileToStorage(const Authorization& Poco::DateTimeFormat::ISO8601_FRAC_FORMAT)); } request.set("X-LOOL-WOPI-IsModifiedByUser", _isUserModified? "true": "false"); + request.set("X-LOOL-WOPI-IsAutosave", _isAutosave? "true": "false"); request.setContentType("application/octet-stream"); request.setContentLength(size); diff --git a/wsd/Storage.hpp b/wsd/Storage.hpp index 31ab6c2f..6b3ce9af 100644 --- a/wsd/Storage.hpp +++ b/wsd/Storage.hpp @@ -79,7 +79,8 @@ public: _fileInfo("", "lool", Poco::Timestamp::fromEpochTime(0), 0), _isLoaded(false), _forceSave(false), - _isUserModified(false) + _isUserModified(false), + _isAutosave(false) { LOG_DBG("Storage ctor: " << uri.toString()); } @@ -100,6 +101,9 @@ public: /// To be able to set the WOPI extension header appropriately. void setUserModified(bool isUserModified) { _isUserModified = isUserModified; } + /// To be able to set the WOPI 'is autosave?' header appropriately. + void setIsAutosave(bool isAutosave) { _isAutosave = isAutosave; } + /// Returns the basic information about the file. const FileInfo& getFileInfo() const { return _fileInfo; } @@ -138,6 +142,9 @@ protected: /// The document has been modified by the user. bool _isUserModified; + /// This save operation is an autosave. + bool _isAutosave; + static bool FilesystemEnabled; static bool WopiEnabled; /// Allowed/denied WOPI hosts, if any and if WOPI is enabled. diff --git a/wsd/reference.txt b/wsd/reference.txt index 90eedfc3..6c07d991 100644 --- a/wsd/reference.txt +++ b/wsd/reference.txt @@ -103,3 +103,11 @@ modification. The following header: X-LOOL-WOPI-IsModifiedByUser will have the value 'true' or 'false' accordingly. + +To distinguish autosave vs. explicit user requests to save, the following +header: + + X-LOOL-WOPI-IsAutosave + +will have the value 'true' when the PutFile is triggered by autosave, and +'false' when triggered by explicit user operation (Save button or menu entry). _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits