wsd/ClientSession.cpp  |    6 ++++++
 wsd/DocumentBroker.cpp |    7 +++++++
 wsd/DocumentBroker.hpp |    5 +++++
 3 files changed, 18 insertions(+)

New commits:
commit 8c602e179e8afe44f2a1fe513bdc7640cd57ed2a
Author:     Samuel Mehrbrodt <samuel.mehrbr...@cib.de>
AuthorDate: Mon Aug 17 11:00:38 2020 +0200
Commit:     Samuel Mehrbrodt <samuel.mehrbr...@cib.de>
CommitDate: Mon Aug 24 14:34:10 2020 +0200

    Revert "Revert "Don't update modified status after saving to storage fails""
    
    This reverts commit e83e36bd9b96fe38ac1f53f56d9754e26bd131e0.
    
    Unit test failure was fixed
    
    Change-Id: I2176368278725c1711df3b23eef95de6526c68d5
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/100859
    Tested-by: Jenkins
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Samuel Mehrbrodt <samuel.mehrbr...@cib.de>

diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp
index 7c4ac6fdb..60733a0c5 100644
--- a/wsd/ClientSession.cpp
+++ b/wsd/ClientSession.cpp
@@ -1317,6 +1317,12 @@ bool ClientSession::handleKitToClientMessage(const char* 
buffer, const int lengt
         StringVector stateTokens(Util::tokenize(tokens[1], '='));
         if (stateTokens.size() == 2 && stateTokens.equals(0, 
".uno:ModifiedStatus"))
         {
+            // When the document is saved internally, but saving to storage 
failed,
+            // don't update the client's modified status
+            // (otherwise client thinks document is unmodified b/c saving was 
successful)
+            if (!docBroker->isLastStorageSaveSuccessful())
+                return false;
+
             docBroker->setModified(stateTokens.equals(1, "true"));
         }
         else
diff --git a/wsd/DocumentBroker.cpp b/wsd/DocumentBroker.cpp
index a5e62fcc4..4218b9fb4 100644
--- a/wsd/DocumentBroker.cpp
+++ b/wsd/DocumentBroker.cpp
@@ -176,6 +176,7 @@ DocumentBroker::DocumentBroker(ChildType type,
     _docKey(docKey),
     _docId(Util::encodeId(DocBrokerId++, 3)),
     _documentChangedInStorage(false),
+    _lastStorageSaveSuccessful(true),
     _lastSaveTime(std::chrono::steady_clock::now()),
     _lastSaveRequestTime(std::chrono::steady_clock::now() - 
std::chrono::milliseconds(COMMAND_TIMEOUT_MS)),
     _markToDestroy(false),
@@ -1049,6 +1050,11 @@ bool DocumentBroker::saveToStorageInternal(const 
std::string& sessionId, bool su
     assert(_storage && _tileCache);
     const StorageBase::SaveResult storageSaveResult = 
_storage->saveLocalFileToStorage(
         auth, it->second->getCookies(), *_lockCtx, saveAsPath, saveAsFilename, 
isRename);
+    // Storage save is considered successful when either storage returns OK or 
the document on the storage
+    // was changed and it was used to overwrite local changes
+    _lastStorageSaveSuccessful
+        = storageSaveResult.getResult() == StorageBase::SaveResult::OK ||
+        storageSaveResult.getResult() == StorageBase::SaveResult::DOC_CHANGED;
     if (storageSaveResult.getResult() == StorageBase::SaveResult::OK)
     {
 #if !MOBILEAPP
@@ -2474,6 +2480,7 @@ void DocumentBroker::dumpState(std::ostream& os)
     os << "\n  last saved: " << Util::getSteadyClockAsString(_lastSaveTime);
     os << "\n  last save request: " << 
Util::getSteadyClockAsString(_lastSaveRequestTime);
     os << "\n  last save response: " << 
Util::getSteadyClockAsString(_lastSaveResponseTime);
+    os << "\n  last storage save was successful: " << 
isLastStorageSaveSuccessful();
     os << "\n  last modified: " << 
Util::getHttpTime(_documentLastModifiedTime);
     os << "\n  file last modified: " << 
Util::getHttpTime(_lastFileModifiedTime);
     if (_limitLifeSeconds)
diff --git a/wsd/DocumentBroker.hpp b/wsd/DocumentBroker.hpp
index b8e176b3c..e59a2d6b4 100644
--- a/wsd/DocumentBroker.hpp
+++ b/wsd/DocumentBroker.hpp
@@ -175,6 +175,8 @@ public:
 
     bool isDocumentChangedInStorage() { return _documentChangedInStorage; }
 
+    bool isLastStorageSaveSuccessful() { return _lastStorageSaveSuccessful; }
+
     /// Save the document to Storage if it needs persisting.
     bool saveToStorage(const std::string& sesionId, bool success, const 
std::string& result = "", bool force = false);
 
@@ -404,6 +406,9 @@ private:
     /// for user's command to act.
     bool _documentChangedInStorage;
 
+    /// Indicates whether the last saveToStorage operation was successful.
+    bool _lastStorageSaveSuccessful;
+
     /// The last time we tried saving, regardless of whether the
     /// document was modified and saved or not.
     std::chrono::steady_clock::time_point _lastSaveTime;
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to