ucb/source/ucp/webdav-curl/webdavcontent.cxx     |   29 +++++++++++++++++++++++
 ucb/source/ucp/webdav-curl/webdavcontent.hxx     |    1 
 ucb/source/ucp/webdav-curl/webdavcontentcaps.cxx |    6 ++++
 3 files changed, 36 insertions(+)

New commits:
commit 1cb59f9187f6dfd255bb0d47bdb5ca8be09ea47e
Author:     Giuseppe Castagno <[email protected]>
AuthorDate: Wed Aug 3 18:12:58 2016 +0200
Commit:     Michael Stahl <[email protected]>
CommitDate: Mon Nov 1 18:45:44 2021 +0100

    ucb: webdav-curl: Related: tdf#82677, remove cached element when appropriate
    
    [ port of commit 90ded4cbf1ffbde2ef7926fb225759896ef075bf ]
    
    Change-Id: I7ffe75dc7a85088086f33b22eb1338ea22c1f363
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123483
    Tested-by: Michael Stahl <[email protected]>
    Reviewed-by: Michael Stahl <[email protected]>

diff --git a/ucb/source/ucp/webdav-curl/webdavcontent.cxx 
b/ucb/source/ucp/webdav-curl/webdavcontent.cxx
index e69633f0d207..237c51851af0 100644
--- a/ucb/source/ucp/webdav-curl/webdavcontent.cxx
+++ b/ucb/source/ucp/webdav-curl/webdavcontent.cxx
@@ -583,6 +583,8 @@ uno::Any SAL_CALL Content::execute(
                 xResAccess.reset( new DAVResourceAccess( *m_xResAccess ) );
             }
             aStaticDAVOptionsCache.removeDAVOptions( xResAccess->getURL() );
+            // clean cached value of PROPFIND property names
+            removeCachedPropertyNames( xResAccess->getURL() );
             xResAccess->DESTROY( Environment );
             {
                 osl::Guard< osl::Mutex > aGuard( m_aMutex );
@@ -862,6 +864,9 @@ void Content::addProperty( const 
css::ucb::PropertyCommandArgument &aCmdArg,
             xResAccess.reset( new DAVResourceAccess( *m_xResAccess ) );
         }
         aStaticDAVOptionsCache.removeDAVOptions( xResAccess->getURL() );
+        // clean cached value of PROPFIND property names
+        // PROPPATCH can change them
+        removeCachedPropertyNames( xResAccess->getURL() );
         xResAccess->PROPPATCH( aProppatchValues, xEnv );
         {
             osl::Guard< osl::Mutex > aGuard( m_aMutex );
@@ -969,6 +974,9 @@ void Content::removeProperty( const OUString& Name,
             xResAccess.reset( new DAVResourceAccess( *m_xResAccess ) );
         }
         aStaticDAVOptionsCache.removeDAVOptions( xResAccess->getURL() );
+        // clean cached value of PROPFIND property names
+        // PROPPATCH can change them
+        removeCachedPropertyNames( xResAccess->getURL() );
         xResAccess->PROPPATCH( aProppatchValues, xEnv );
         {
             osl::Guard< osl::Mutex > aGuard( m_aMutex );
@@ -1450,6 +1458,9 @@ uno::Reference< sdbc::XRow > Content::getPropertyValues(
                     try
                     {
                         DAVResource resource;
+                        // clean cached value of PROPFIND property names
+                        // PROPPATCH can change them
+                        removeCachedPropertyNames( xResAccess->getURL() );
                         xResAccess->HEAD( aHeaderNames, resource, xEnv );
                         m_bDidGetOrHead = true;
 
@@ -1886,6 +1897,9 @@ uno::Sequence< uno::Any > Content::setPropertyValues(
     {
         try
         {
+            // clean cached value of PROPFIND property names
+            // PROPPATCH can change them
+            removeCachedPropertyNames( xResAccess->getURL() );
             // Set property values at server.
             aStaticDAVOptionsCache.removeDAVOptions( xResAccess->getURL() );
             xResAccess->PROPPATCH( aProppatchValues, xEnv );
@@ -1947,6 +1961,9 @@ uno::Sequence< uno::Any > Content::setPropertyValues(
 
             targetURI.SetScheme( sourceURI.GetScheme() );
 
+            // clean cached value of PROPFIND property names
+            removeCachedPropertyNames( sourceURI.GetURI() );
+            removeCachedPropertyNames( targetURI.GetURI() );
             aStaticDAVOptionsCache.removeDAVOptions( sourceURI.GetURI() );
             aStaticDAVOptionsCache.removeDAVOptions( targetURI.GetURI() );
             xResAccess->MOVE(
@@ -2093,6 +2110,7 @@ uno::Any Content::open(
                 DAVResource aResource;
                 std::vector< OUString > aHeaders;
 
+                removeCachedPropertyNames( xResAccess->getURL() );
                 xResAccess->GET( xOut, aHeaders, aResource, xEnv );
                 m_bDidGetOrHead = true;
 
@@ -2139,6 +2157,7 @@ uno::Any Content::open(
                     DAVResource aResource;
                     std::vector< OUString > aHeaders;
 
+                    removeCachedPropertyNames( xResAccess->getURL() );
                     // check if the resource was present on the server
                     if( aStaticDAVOptionsCache.isResourceFound( aTargetURL ) )
                     {
@@ -2243,6 +2262,7 @@ void Content::post(
                     new DAVResourceAccess( *m_xResAccess ) );
             }
 
+            removeCachedPropertyNames( xResAccess->getURL() );
             uno::Reference< io::XInputStream > xResult
                 = xResAccess->POST( rArg.MediaType,
                                     rArg.Referer,
@@ -2277,6 +2297,7 @@ void Content::post(
                         new DAVResourceAccess( *m_xResAccess ) );
                 }
 
+                removeCachedPropertyNames( xResAccess->getURL() );
                 xResAccess->POST( rArg.MediaType,
                                   rArg.Referer,
                                   rArg.Source,
@@ -2490,6 +2511,7 @@ void Content::insert(
             if ( bCollection )
             {
                 aStaticDAVOptionsCache.removeDAVOptions( xResAccess->getURL() 
);
+                removeCachedPropertyNames( xResAccess->getURL() );
                 xResAccess->MKCOL( Environment );
             }
             else
@@ -2497,7 +2519,9 @@ void Content::insert(
                 // remove options from cache, PUT may change it
                 // it will be refreshed when needed
                 aStaticDAVOptionsCache.removeDAVOptions( xResAccess->getURL() 
);
+                removeCachedPropertyNames( xResAccess->getURL() );
                 xResAccess->PUT( xInputStream, Environment );
+                // clean cached value of PROPFIND properties names
             }
             // no error , set the resourcetype to unknown type
             // the resource may have transitioned from NOT FOUND or UNKNOWN to 
something else
@@ -2521,6 +2545,7 @@ void Content::insert(
                         // Destroy old resource.
                         try
                         {
+                            removeCachedPropertyNames( xResAccess->getURL() );
                             xResAccess->DESTROY( Environment );
                         }
                         catch ( DAVException const & e )
@@ -2600,6 +2625,7 @@ void Content::insert(
         OUString    aTargetUrl = xResAccess->getURL();
         try
         {
+            removeCachedPropertyNames( xResAccess->getURL() );
             // remove options from cache, PUT may change it
             // it will be refreshed when needed
             aStaticDAVOptionsCache.removeDAVOptions( aTargetUrl );
@@ -3128,6 +3154,7 @@ void Content::lock(
 
         // OPTIONS may change as a consequence of the lock operation
         aStaticDAVOptionsCache.removeDAVOptions( xResAccess->getURL() );
+        removeCachedPropertyNames( xResAccess->getURL() );
         xResAccess->LOCK( aLock, Environment );
 
         {
@@ -3255,6 +3282,8 @@ void Content::unlock(
             // remove options from cache, unlock may change it
             // it will be refreshed when needed
             aStaticDAVOptionsCache.removeDAVOptions( xResAccess->getURL() );
+            // clean cached value of PROPFIND properties names
+            removeCachedPropertyNames( xResAccess->getURL() );
             xResAccess->UNLOCK( Environment );
         }
 
diff --git a/ucb/source/ucp/webdav-curl/webdavcontent.hxx 
b/ucb/source/ucp/webdav-curl/webdavcontent.hxx
index 7c1f45661822..f00b82634299 100644
--- a/ucb/source/ucp/webdav-curl/webdavcontent.hxx
+++ b/ucb/source/ucp/webdav-curl/webdavcontent.hxx
@@ -296,6 +296,7 @@ public:
     void getResourceOptions( const css::uno::Reference< 
css::ucb::XCommandEnvironment >& xEnv,
                              DAVOptions& rDAVOptions );
 
+    static void removeCachedPropertyNames( const OUString & rURL );
 };
 
 }
diff --git a/ucb/source/ucp/webdav-curl/webdavcontentcaps.cxx 
b/ucb/source/ucp/webdav-curl/webdavcontentcaps.cxx
index e44e08812b73..e3ece1b3d8fc 100644
--- a/ucb/source/ucp/webdav-curl/webdavcontentcaps.cxx
+++ b/ucb/source/ucp/webdav-curl/webdavcontentcaps.cxx
@@ -259,6 +259,12 @@ bool ContentProvider::getProperty(
 
 static PropertyNamesCache aStaticPropertyNamesCache;
 
+// static
+void Content::removeCachedPropertyNames( const OUString & rURL )
+{
+    aStaticPropertyNamesCache.removeCachedPropertyNames( rURL );
+}
+
 // Content implementation.
 
 

Reply via email to