You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by pe...@apache.org on 2015/09/25 14:01:49 UTC

svn commit: r1705278 [2/3] - in /openoffice/branches/AOO410/main: ./ comphelper/inc/comphelper/ comphelper/source/misc/ framework/source/loadenv/ offapi/com/sun/star/ucb/ sfx2/inc/sfx2/ sfx2/source/dialog/ sfx2/source/doc/ sfx2/source/view/ ucb/source/...

Modified: openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfPropPatchReqProcImpl.hxx
URL: http://svn.apache.org/viewvc/openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfPropPatchReqProcImpl.hxx?rev=1705278&r1=1705277&r2=1705278&view=diff
==============================================================================
--- openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfPropPatchReqProcImpl.hxx (original)
+++ openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfPropPatchReqProcImpl.hxx Fri Sep 25 12:01:49 2015
@@ -35,7 +35,8 @@ class SerfPropPatchReqProcImpl : public
 public:
     SerfPropPatchReqProcImpl( const char* inPath,
                               const DAVRequestHeaders& inRequestHeaders,
-                              const std::vector< ProppatchValue > & inProperties );
+                              const std::vector< ProppatchValue > & inProperties,
+                              const char* inLockToken );
 
     virtual ~SerfPropPatchReqProcImpl();
 
@@ -51,6 +52,7 @@ protected:
 
 private:
     const std::vector< ProppatchValue > * mpProperties;
+    const  char *mpLockToken;
 };
 
 } // namespace http_dav_ucp

Modified: openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfPutReqProcImpl.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfPutReqProcImpl.cxx?rev=1705278&r1=1705277&r2=1705278&view=diff
==============================================================================
--- openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfPutReqProcImpl.cxx (original)
+++ openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfPutReqProcImpl.cxx Fri Sep 25 12:01:49 2015
@@ -34,9 +34,11 @@ namespace http_dav_ucp
 SerfPutReqProcImpl::SerfPutReqProcImpl( const char* inPath,
                                         const DAVRequestHeaders& inRequestHeaders,
                                         const char* inData,
+                                        const char* inLockToken,
                                         apr_size_t inDataLen )
     : SerfRequestProcessorImpl( inPath, inRequestHeaders )
     , mpData( inData )
+    , mpLockToken( inLockToken)
     , mnDataLen( inDataLen )
 {
 }
@@ -57,7 +59,7 @@ serf_bucket_t * SerfPutReqProcImpl::crea
     }
 
     // create serf request
-    serf_bucket_t *req_bkt = serf_request_bucket_request_create( inSerfRequest, 
+    serf_bucket_t *req_bkt = serf_request_bucket_request_create( inSerfRequest,
                                                                  "PUT",
                                                                  getPathStr(),
                                                                  body_bkt,
@@ -68,11 +70,16 @@ serf_bucket_t * SerfPutReqProcImpl::crea
     serf_bucket_t* hdrs_bkt = serf_bucket_request_get_headers( req_bkt );
     // general header fields provided by caller
     setRequestHeaders( hdrs_bkt );
+    if(mpLockToken)
+    {
+    // request specific header field
+        serf_bucket_headers_set( hdrs_bkt, "if", mpLockToken );
+    }
 
     return req_bkt;
 }
 
-void SerfPutReqProcImpl::processChunkOfResponseData( const char* /*data*/, 
+void SerfPutReqProcImpl::processChunkOfResponseData( const char* /*data*/,
                                                      apr_size_t /*len*/ )
 {
     // nothing to do;

Modified: openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfPutReqProcImpl.hxx
URL: http://svn.apache.org/viewvc/openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfPutReqProcImpl.hxx?rev=1705278&r1=1705277&r2=1705278&view=diff
==============================================================================
--- openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfPutReqProcImpl.hxx (original)
+++ openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfPutReqProcImpl.hxx Fri Sep 25 12:01:49 2015
@@ -33,6 +33,7 @@ public:
     SerfPutReqProcImpl( const char* inPath,
                         const DAVRequestHeaders& inRequestHeaders,
                         const char* inData,
+                        const char* inLockToken,
                         apr_size_t inDataLen );
     
 
@@ -50,6 +51,7 @@ protected:
 
 private:
     const char* mpData;
+    const char* mpLockToken;
     apr_size_t mnDataLen;
 
 };

Modified: openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfRequestProcessor.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfRequestProcessor.cxx?rev=1705278&r1=1705277&r2=1705278&view=diff
==============================================================================
--- openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfRequestProcessor.cxx (original)
+++ openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfRequestProcessor.cxx Fri Sep 25 12:01:49 2015
@@ -30,6 +30,9 @@
 
 #include <apr_strings.h>
 
+//to examine returned http code
+#include "DAVException.hxx"
+
 namespace http_dav_ucp
 {
 
@@ -111,11 +114,19 @@ bool SerfRequestProcessor::processPropFi
 
 // PROPPATCH
 bool SerfRequestProcessor::processPropPatch( const std::vector< ProppatchValue > & inProperties,
+                                             const com::sun::star::ucb::Lock  inLock,
                                              apr_status_t& outSerfStatus )
 {
+    char * inLockToken = static_cast<char*>(0);
+    if(inLock.LockTokens.getLength() > 0)
+    {
+        inLockToken = apr_psprintf( mrSerfSession.getAprPool(), "(<%s>)",
+                               rtl::OUStringToOString(inLock.LockTokens[0], RTL_TEXTENCODING_UTF8 ).getStr() );
+    }
     mpProcImpl = createPropPatchReqProcImpl( mPathStr,
                                              mrSerfSession.getRequestEnvironment().m_aRequestHeaders,
-                                             inProperties );
+                                             inProperties,
+                                             inLockToken );
     outSerfStatus = runProcessor();
 
     return outSerfStatus == APR_SUCCESS;
@@ -194,11 +205,19 @@ bool SerfRequestProcessor::processHead(
 // PUT
 bool SerfRequestProcessor::processPut( const char* inData,
                                        apr_size_t inDataLen,
+                                       const com::sun::star::ucb::Lock inLock,
                                        apr_status_t& outSerfStatus )
 {
+    char * inLockToken = static_cast<char*>(0);
+    if(inLock.LockTokens.getLength() > 0)
+    {
+        inLockToken = apr_psprintf( mrSerfSession.getAprPool(), "(<%s>)",
+                               rtl::OUStringToOString(inLock.LockTokens[0], RTL_TEXTENCODING_UTF8 ).getStr() );
+    }
     mpProcImpl = createPutReqProcImpl( mPathStr,
                                        mrSerfSession.getRequestEnvironment().m_aRequestHeaders,
                                        inData,
+                                       inLockToken,
                                        inDataLen );
     outSerfStatus = runProcessor();
 
@@ -210,6 +229,7 @@ bool SerfRequestProcessor::processPost(
                                         apr_size_t inDataLen,
                                         const rtl::OUString & inContentType,
                                         const rtl::OUString & inReferer,
+                                        const com::sun::star::ucb::Lock inLock,
                                         const com::sun::star::uno::Reference< SerfInputStream >& xioInStrm,
                                         apr_status_t& outSerfStatus )
 {
@@ -217,10 +237,17 @@ bool SerfRequestProcessor::processPost(
                                 rtl::OUStringToOString( inContentType, RTL_TEXTENCODING_UTF8 ).getStr() );
     mReferer = apr_pstrdup( mrSerfSession.getAprPool(), 
                                 rtl::OUStringToOString( inReferer, RTL_TEXTENCODING_UTF8 ).getStr() );
+    char * inLockToken = static_cast<char*>(0);
+    if(inLock.LockTokens.getLength() > 0)
+    {
+        inLockToken = apr_psprintf( mrSerfSession.getAprPool(), "(<%s>)",
+                               rtl::OUStringToOString(inLock.LockTokens[0], RTL_TEXTENCODING_UTF8 ).getStr() );
+    }
     mpProcImpl = createPostReqProcImpl( mPathStr,
                                         mrSerfSession.getRequestEnvironment().m_aRequestHeaders,
                                         inData,
                                         inDataLen,
+                                        inLockToken,
                                         mContentType,
                                         mReferer,
                                         xioInStrm );
@@ -234,6 +261,7 @@ bool SerfRequestProcessor::processPost(
                                         apr_size_t inDataLen,
                                         const rtl::OUString & inContentType,
                                         const rtl::OUString & inReferer,
+                                        const com::sun::star::ucb::Lock inLock,
                                         const com::sun::star::uno::Reference< com::sun::star::io::XOutputStream >& xioOutStrm,
                                         apr_status_t& outSerfStatus )
 {
@@ -241,10 +269,17 @@ bool SerfRequestProcessor::processPost(
                                 rtl::OUStringToOString( inContentType, RTL_TEXTENCODING_UTF8 ).getStr() );
     mReferer = apr_pstrdup( mrSerfSession.getAprPool(), 
                             rtl::OUStringToOString( inReferer, RTL_TEXTENCODING_UTF8 ).getStr() );
+    char * inLockToken = static_cast<char*>(0);
+    if(inLock.LockTokens.getLength() > 0)
+    {
+        inLockToken = apr_psprintf( mrSerfSession.getAprPool(), "(<%s>)",
+                               rtl::OUStringToOString(inLock.LockTokens[0], RTL_TEXTENCODING_UTF8 ).getStr() );
+    }
     mpProcImpl = createPostReqProcImpl( mPathStr,
                                         mrSerfSession.getRequestEnvironment().m_aRequestHeaders,
                                         inData,
                                         inDataLen,
+                                        inLockToken,
                                         mContentType,
                                         mReferer,
                                         xioOutStrm );
@@ -254,20 +289,36 @@ bool SerfRequestProcessor::processPost(
 }
 
 // DELETE
-bool SerfRequestProcessor::processDelete( apr_status_t& outSerfStatus )
+bool SerfRequestProcessor::processDelete( const com::sun::star::ucb::Lock inLock,
+                                          apr_status_t& outSerfStatus )
 {
+    char * inLockToken = static_cast<char*>(0);
+    if(inLock.LockTokens.getLength() > 0)
+    {
+        inLockToken = apr_psprintf( mrSerfSession.getAprPool(), "(<%s>)",
+                               rtl::OUStringToOString(inLock.LockTokens[0], RTL_TEXTENCODING_UTF8 ).getStr() );
+    }
     mpProcImpl = createDeleteReqProcImpl( mPathStr,
-                                          mrSerfSession.getRequestEnvironment().m_aRequestHeaders );
+                                          mrSerfSession.getRequestEnvironment().m_aRequestHeaders,
+                                          inLockToken );
     outSerfStatus = runProcessor();
 
     return outSerfStatus == APR_SUCCESS;
 }
 
 // MKCOL
-bool SerfRequestProcessor::processMkCol( apr_status_t& outSerfStatus )
+bool SerfRequestProcessor::processMkCol( const com::sun::star::ucb::Lock inLock,
+                                         apr_status_t& outSerfStatus )
 {
+    char * inLockToken = static_cast<char*>(0);
+    if(inLock.LockTokens.getLength() > 0)
+    {
+        inLockToken = apr_psprintf( mrSerfSession.getAprPool(), "(<%s>)",
+                               rtl::OUStringToOString(inLock.LockTokens[0], RTL_TEXTENCODING_UTF8 ).getStr() );
+    }
     mpProcImpl = createMkColReqProcImpl( mPathStr,
-                                         mrSerfSession.getRequestEnvironment().m_aRequestHeaders );
+                                         mrSerfSession.getRequestEnvironment().m_aRequestHeaders,
+                                         inLockToken );
     outSerfStatus = runProcessor();
 
     return outSerfStatus == APR_SUCCESS;
@@ -276,14 +327,22 @@ bool SerfRequestProcessor::processMkCol(
 // COPY
 bool SerfRequestProcessor::processCopy( const rtl::OUString & inDestinationPath,
                                         const bool inOverwrite,
+                                        const com::sun::star::ucb::Lock inLock,
                                         apr_status_t& outSerfStatus )
 {
     mDestPathStr = apr_pstrdup( mrSerfSession.getAprPool(), 
                                 rtl::OUStringToOString( inDestinationPath, RTL_TEXTENCODING_UTF8 ).getStr() );
+    char * inLockToken = static_cast<char*>(0);
+    if(inLock.LockTokens.getLength() > 0)
+    {
+        inLockToken = apr_psprintf( mrSerfSession.getAprPool(), "(<%s>)",
+                               rtl::OUStringToOString(inLock.LockTokens[0], RTL_TEXTENCODING_UTF8 ).getStr() );
+    }
     mpProcImpl = createCopyReqProcImpl( mPathStr,
                                         mrSerfSession.getRequestEnvironment().m_aRequestHeaders,
                                         mDestPathStr,
-                                        inOverwrite );
+                                        inOverwrite,
+                                        inLockToken );
     outSerfStatus = runProcessor();
 
     return outSerfStatus == APR_SUCCESS;
@@ -292,14 +351,95 @@ bool SerfRequestProcessor::processCopy(
 // MOVE
 bool SerfRequestProcessor::processMove( const rtl::OUString & inDestinationPath,
                                         const bool inOverwrite,
+                                        const com::sun::star::ucb::Lock  inLock,
                                         apr_status_t& outSerfStatus )
 {
     mDestPathStr = apr_pstrdup( mrSerfSession.getAprPool(), 
                                 rtl::OUStringToOString( inDestinationPath, RTL_TEXTENCODING_UTF8 ).getStr() );
+    char * inLockToken = static_cast<char*>(0);
+    if(inLock.LockTokens.getLength() > 0)
+    {
+        inLockToken = apr_psprintf( mrSerfSession.getAprPool(), "(<%s>)",
+                               rtl::OUStringToOString(inLock.LockTokens[0], RTL_TEXTENCODING_UTF8 ).getStr() );
+    }
     mpProcImpl = createMoveReqProcImpl( mPathStr,
                                         mrSerfSession.getRequestEnvironment().m_aRequestHeaders,
                                         mDestPathStr,
-                                        inOverwrite );
+                                        inOverwrite,
+                                        inLockToken );
+    outSerfStatus = runProcessor();
+
+    return outSerfStatus == APR_SUCCESS;
+}
+
+//LOCK creating a new lock
+bool SerfRequestProcessor::processLock( const rtl::OUString & inDestinationPath,
+                                        const com::sun::star::ucb::Lock& inLock,
+                                        DAVPropertyValue & outLock,
+                                        apr_status_t& outSerfStatus )
+{
+    mDestPathStr = apr_pstrdup( mrSerfSession.getAprPool(),
+                                rtl::OUStringToOString( inDestinationPath, RTL_TEXTENCODING_UTF8 ).getStr() );
+    char * Timeout;
+    if(inLock.Timeout == -1)
+        Timeout = apr_psprintf( mrSerfSession.getAprPool(), "Infinite" );
+    else
+        Timeout = apr_psprintf( mrSerfSession.getAprPool(), "Second-%ld", inLock.Timeout );
+
+    mpProcImpl = createLockReqProcImpl( mPathStr,
+                                        mrSerfSession.getRequestEnvironment().m_aRequestHeaders,
+                                        inLock,
+                                        Timeout,
+                                        outLock);
+    outSerfStatus = runProcessor();
+
+    return outSerfStatus == APR_SUCCESS;
+}
+
+//LOCK refresh an existing lock
+bool SerfRequestProcessor::processLockRefresh( const rtl::OUString & inDestinationPath,
+                                        const com::sun::star::ucb::Lock& inLock,
+                                        DAVPropertyValue & outLock,
+                                        apr_status_t& outSerfStatus )
+{
+    mDestPathStr = apr_pstrdup( mrSerfSession.getAprPool(),
+                                rtl::OUStringToOString( inDestinationPath, RTL_TEXTENCODING_UTF8 ).getStr() );
+    char * Timeout;
+    if(inLock.Timeout == -1)
+        Timeout = apr_psprintf( mrSerfSession.getAprPool(), "Infinite" );
+    else
+        Timeout = apr_psprintf( mrSerfSession.getAprPool(), "Second-%ld", inLock.Timeout );
+
+    char * inLockToken = apr_psprintf( mrSerfSession.getAprPool(), "(<%s>)",
+                                 rtl::OUStringToOString(inLock.LockTokens[0], RTL_TEXTENCODING_UTF8 ).getStr() );
+
+    mpProcImpl = createLockRefreshProcImpl( mPathStr,
+                                            mrSerfSession.getRequestEnvironment().m_aRequestHeaders,
+                                            inLock,
+                                            inLockToken,
+                                            Timeout,
+                                            outLock);
+    outSerfStatus = runProcessor();
+
+    return outSerfStatus == APR_SUCCESS;
+}
+
+//ULOCK unlock an existing lock
+bool SerfRequestProcessor::processUnlock( const rtl::OUString & inDestinationPath,
+                                        const com::sun::star::ucb::Lock& inLock,
+                                        apr_status_t& outSerfStatus )
+{
+    mDestPathStr = apr_pstrdup( mrSerfSession.getAprPool(),
+                                rtl::OUStringToOString( inDestinationPath, RTL_TEXTENCODING_UTF8 ).getStr() );
+
+    char * aToken = apr_psprintf( mrSerfSession.getAprPool(), "<%s>",
+                                 rtl::OUStringToOString(inLock.LockTokens[0], RTL_TEXTENCODING_UTF8 ).getStr() );
+
+    mpProcImpl = createUnlockProcImpl( mPathStr,
+                                       mrSerfSession.getRequestEnvironment().m_aRequestHeaders,
+                                       inLock,
+                                       aToken );
+
     outSerfStatus = runProcessor();
 
     return outSerfStatus == APR_SUCCESS;
@@ -316,7 +456,8 @@ apr_status_t SerfRequestProcessor::runPr
     }
 
     // create serf request
-    serf_connection_request_create( mrSerfSession.getSerfConnection(), 
+    OSL_ASSERT(mrSerfSession.getSerfConnection() != NULL);
+    serf_connection_request_create( mrSerfSession.getSerfConnection(),
                                     Serf_SetupRequest,
                                     this );
 
@@ -327,15 +468,19 @@ apr_status_t SerfRequestProcessor::runPr
     apr_pool_t* pAprPool = mrSerfSession.getAprPool();
     while ( true )
     {
-        status = serf_context_run( pSerfContext, 
-                                   SERF_DURATION_FOREVER, 
+        status = serf_context_run( pSerfContext,
+                                   SERF_DURATION_FOREVER,
                                    pAprPool );
         if ( APR_STATUS_IS_TIMEUP( status ) )
         {
             continue;
         }
-        if ( status != APR_SUCCESS ) 
+        if ( status != APR_SUCCESS )
         {
+#if OSL_DEBUG_LEVEL > 0
+            char buff[512];
+            OSL_TRACE("SerfRequestProcessor::runProcessor, status != APR_SUCCESS: %d (%s)",status, apr_strerror(status, buff, 512));
+#endif
             break;
         }
         if ( mbProcessingDone )
@@ -356,6 +501,7 @@ void SerfRequestProcessor::postprocessPr
         return;
     }
 
+    OSL_TRACE("SerfRequestProcessor::postprocessProcessor:%d",__LINE__);
     switch ( inStatus )
     {
     case APR_EGENERAL:
@@ -379,8 +525,8 @@ void SerfRequestProcessor::postprocessPr
                 }
                 else
                 {
-                    mpDAVException = new DAVException( DAVException::DAV_HTTP_ERROR, 
-                                                       mHTTPStatusCodeText, 
+                    mpDAVException = new DAVException( DAVException::DAV_HTTP_ERROR,
+                                                       mHTTPStatusCodeText,
                                                        mnHTTPStatusCode );
                 }
                 break;
@@ -388,12 +534,17 @@ void SerfRequestProcessor::postprocessPr
             case SC_MOVED_TEMPORARILY:
             case SC_SEE_OTHER:
             case SC_TEMPORARY_REDIRECT:
-                mpDAVException = new DAVException( DAVException::DAV_HTTP_REDIRECT, 
+                mpDAVException = new DAVException( DAVException::DAV_HTTP_REDIRECT,
                                                    mRedirectLocation );
                 break;
+            case SC_LOCKED:
+                mpDAVException = new DAVException( DAVException::DAV_LOCKED,
+                                                   mHTTPStatusCodeText,
+                                                   mnHTTPStatusCode );
+                break;
             default:
-                mpDAVException = new DAVException( DAVException::DAV_HTTP_ERROR, 
-                                                   mHTTPStatusCodeText, 
+                mpDAVException = new DAVException( DAVException::DAV_HTTP_ERROR,
+                                                   mHTTPStatusCodeText,
                                                    mnHTTPStatusCode );
                 break;
             }
@@ -404,13 +555,12 @@ void SerfRequestProcessor::postprocessPr
         mpDAVException = new DAVException( DAVException::DAV_HTTP_ERROR );
         break;
     }
-
 }
 
-apr_status_t SerfRequestProcessor::provideSerfCredentials( char ** outUsername, 
+apr_status_t SerfRequestProcessor::provideSerfCredentials( char ** outUsername,
                                                            char ** outPassword,
-                                                           serf_request_t * inRequest, 
-                                                           int inCode, 
+                                                           serf_request_t * inRequest,
+                                                           int inCode,
                                                            const char *inAuthProtocol,
                                                            const char *inRealm,
                                                            apr_pool_t *inAprPool )
@@ -486,7 +636,7 @@ apr_status_t SerfRequestProcessor::handl
 
     // some general response handling and error handling
     {
-        if ( !inSerfResponseBucket ) 
+        if ( !inSerfResponseBucket )
         {
             /* A NULL response can come back if the request failed completely */
             mbProcessingDone = true;
@@ -495,11 +645,29 @@ apr_status_t SerfRequestProcessor::handl
 
         serf_status_line sl;
         apr_status_t status = serf_bucket_response_status( inSerfResponseBucket, &sl );
-        if ( status ) 
+        if ( status )
         {
             mbProcessingDone = false; // allow another try in order to get a response
             return status;
         }
+        serf_bucket_t *headers = serf_bucket_response_get_headers( inSerfResponseBucket );
+
+        // check header according:
+        // http://tools.ietf.org/html/rfc7231#section-7.4.2
+        // need to do this so we can adjust the protocol accordingly
+        // serf_bucket_headers_get is case independent
+        const char* server = serf_bucket_headers_get( headers, "server" );
+        if( server )
+        {
+            //update the server type on session
+            mrSerfSession.setServerHeaderField( ::rtl::OUString::createFromAscii( server ) );
+        }
+        //the following extension is MS IIS specific,
+        //see https://msdn.microsoft.com/en-us/library/cc250064.aspx
+        //site last checked on 2015-03-02
+        //TODO i126305 need to be added when serf is updated to a version supporting Windows authentication
+        //const char* msDavExtErr = serf_bucket_headers_get( headers, "X-MSDAVEXT_ERROR" );
+
         // TODO - check, if response status code handling is correct
         mnHTTPStatusCode = ( sl.version != 0 && sl.code >= 0 )
                            ? static_cast< sal_uInt16 >( sl.code )
@@ -508,7 +676,7 @@ apr_status_t SerfRequestProcessor::handl
         {
             mHTTPStatusCodeText = ::rtl::OUString::createFromAscii( sl.reason );
         }
-        if ( ( sl.version == 0 || sl.code < 0 ) || 
+        if ( ( sl.version == 0 || sl.code < 0 ) ||
              mnHTTPStatusCode >= 300 )
         {
             if ( mnHTTPStatusCode == 301 ||
@@ -517,7 +685,6 @@ apr_status_t SerfRequestProcessor::handl
                  mnHTTPStatusCode == 307 )
             {
                 // new location for certain redirections
-                serf_bucket_t *headers = serf_bucket_response_get_headers( inSerfResponseBucket );
                 const char* location = serf_bucket_headers_get( headers, "Location" );
                 if ( location )
                 {

Modified: openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfRequestProcessor.hxx
URL: http://svn.apache.org/viewvc/openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfRequestProcessor.hxx?rev=1705278&r1=1705277&r2=1705278&view=diff
==============================================================================
--- openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfRequestProcessor.hxx (original)
+++ openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfRequestProcessor.hxx Fri Sep 25 12:01:49 2015
@@ -32,6 +32,7 @@
 #include "DAVResource.hxx"
 #include "DAVException.hxx"
 
+#include "SerfTypes.hxx"
 #include "SerfInputStream.hxx"
 #include <com/sun/star/io/XOutputStream.hpp>
 
@@ -62,6 +63,7 @@ public:
 
     // PROPPATCH
     bool processPropPatch( const std::vector< ProppatchValue > & inProperties,
+                           const com::sun::star::ucb::Lock  inLock,
                            apr_status_t& outSerfStatus );
 
     // GET
@@ -92,6 +94,7 @@ public:
     // PUT
     bool processPut( const char* inData,
                      apr_size_t inDataLen,
+                     const com::sun::star::ucb::Lock  inLock,
                      apr_status_t& outSerfStatus );
 
     // POST
@@ -99,6 +102,7 @@ public:
                       apr_size_t inDataLen,
                       const rtl::OUString & inContentType,
                       const rtl::OUString & inReferer,
+                      const com::sun::star::ucb::Lock  inLock,
                       const com::sun::star::uno::Reference< SerfInputStream >& xioInStrm,
                       apr_status_t& outSerfStatus );
 
@@ -107,25 +111,47 @@ public:
                       apr_size_t inDataLen,
                       const rtl::OUString & inContentType,
                       const rtl::OUString & inReferer,
+                      const com::sun::star::ucb::Lock  inLock,
                       const com::sun::star::uno::Reference< com::sun::star::io::XOutputStream >& xioOutStrm,
                       apr_status_t& outSerfStatus );
 
     // DELETE
-    bool processDelete( apr_status_t& outSerfStatus );
+    bool processDelete( const com::sun::star::ucb::Lock inLock,
+                        apr_status_t& outSerfStatus );
 
     // MKCOL
-    bool processMkCol( apr_status_t& outSerfStatus );
+    bool processMkCol( const com::sun::star::ucb::Lock inLock,
+                       apr_status_t& outSerfStatus );
 
     // COPY
     bool processCopy( const rtl::OUString & inDestinationPath,
                       const bool inOverwrite,
+                      const com::sun::star::ucb::Lock inLock,
                       apr_status_t& outSerfStatus );
 
     // MOVE
     bool processMove( const rtl::OUString & inDestinationPath,
                       const bool inOverwrite,
+                      const com::sun::star::ucb::Lock inLock,
                       apr_status_t& outSerfStatus );
 
+    // LOCK
+    bool processLock( const rtl::OUString & inDestinationPath,
+                      const com::sun::star::ucb::Lock& inLock,
+                      DAVPropertyValue & outLock,
+                      apr_status_t& outSerfStatus );
+
+    // LOCK refresh
+    bool processLockRefresh( const rtl::OUString & inDestinationPath,
+                      const com::sun::star::ucb::Lock& inLock,
+                      DAVPropertyValue & outLock,
+                      apr_status_t& outSerfStatus );
+
+    //UNLOCK
+    bool processUnlock( const rtl::OUString & inDestinationPath,
+                        const com::sun::star::ucb::Lock& inLock,
+                        apr_status_t& outSerfStatus );
+
     apr_status_t provideSerfCredentials( char ** outUsername, 
                                          char ** outPassword,
                                          serf_request_t * inRequest, 

Modified: openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfRequestProcessorImplFac.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfRequestProcessorImplFac.cxx?rev=1705278&r1=1705277&r2=1705278&view=diff
==============================================================================
--- openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfRequestProcessorImplFac.cxx (original)
+++ openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfRequestProcessorImplFac.cxx Fri Sep 25 12:01:49 2015
@@ -22,6 +22,7 @@
 // MARKER(update_precomp.py): autogen include statement, do not remove
 #include "precompiled_ucb.hxx"
 
+#include "SerfTypes.hxx"
 #include "SerfRequestProcessorImplFac.hxx"
 #include "SerfPropFindReqProcImpl.hxx"
 #include "SerfPropPatchReqProcImpl.hxx"
@@ -33,6 +34,9 @@
 #include "SerfMkColReqProcImpl.hxx"
 #include "SerfCopyReqProcImpl.hxx"
 #include "SerfMoveReqProcImpl.hxx"
+#include "SerfLockReqProcImpl.hxx"
+#include "SerfLockRefreshProcImpl.hxx"
+#include "SerfUnlockProcImpl.hxx"
 
 namespace http_dav_ucp
 {
@@ -64,11 +68,13 @@ namespace http_dav_ucp
 
     SerfRequestProcessorImpl* createPropPatchReqProcImpl( const char* inPath,
                                                           const DAVRequestHeaders& inRequestHeaders,
-                                                          const std::vector< ProppatchValue > & inProperties )
+                                                          const std::vector< ProppatchValue > & inProperties,
+                                                          const char* inLockToken )
     {
         SerfRequestProcessorImpl* pReqProcImpl = new SerfPropPatchReqProcImpl( inPath,
                                                                                inRequestHeaders, 
-                                                                               inProperties );
+                                                                               inProperties,
+                                                                               inLockToken );
         return pReqProcImpl;
     }
 
@@ -136,11 +142,13 @@ namespace http_dav_ucp
     SerfRequestProcessorImpl* createPutReqProcImpl( const char* inPath,
                                                     const DAVRequestHeaders& inRequestHeaders,
                                                     const char* inData,
+                                                    const char* inLockToken,
                                                     apr_size_t inDataLen )
     {
         SerfRequestProcessorImpl* pReqProcImpl = new SerfPutReqProcImpl( inPath,
                                                                          inRequestHeaders, 
                                                                          inData,
+                                                                         inLockToken,
                                                                          inDataLen );
         return pReqProcImpl;
     }
@@ -149,6 +157,7 @@ namespace http_dav_ucp
                                                      const DAVRequestHeaders& inRequestHeaders,
                                                      const char* inData,
                                                      apr_size_t inDataLen,
+                                                     const char* inLockToken,
                                                      const char* inContentType,
                                                      const char* inReferer,
                                                      const com::sun::star::uno::Reference< SerfInputStream >& xioInStrm )
@@ -157,6 +166,7 @@ namespace http_dav_ucp
                                                                           inRequestHeaders, 
                                                                           inData,
                                                                           inDataLen,
+                                                                          inLockToken,
                                                                           inContentType,
                                                                           inReferer,
                                                                           xioInStrm );
@@ -167,6 +177,7 @@ namespace http_dav_ucp
                                                      const DAVRequestHeaders& inRequestHeaders,
                                                      const char* inData,
                                                      apr_size_t inDataLen,
+                                                     const char* inLockToken,
                                                      const char* inContentType,
                                                      const char* inReferer,
                                                      const com::sun::star::uno::Reference< com::sun::star::io::XOutputStream >& xioOutStrm )
@@ -175,6 +186,7 @@ namespace http_dav_ucp
                                                                           inRequestHeaders, 
                                                                           inData,
                                                                           inDataLen,
+                                                                          inLockToken,
                                                                           inContentType,
                                                                           inReferer,
                                                                           xioOutStrm );
@@ -182,42 +194,92 @@ namespace http_dav_ucp
     }
 
     SerfRequestProcessorImpl* createDeleteReqProcImpl( const char* inPath,
-                                                       const DAVRequestHeaders& inRequestHeaders )
+                                                       const DAVRequestHeaders& inRequestHeaders,
+                                                       const char * inLockToken )
     {
         SerfRequestProcessorImpl* pReqProcImpl = new SerfDeleteReqProcImpl( inPath,
-                                                                            inRequestHeaders );
+                                                                            inRequestHeaders,
+                                                                            inLockToken );
         return pReqProcImpl;
     }
 
     SerfRequestProcessorImpl* createMkColReqProcImpl( const char* inPath,
-                                                      const DAVRequestHeaders& inRequestHeaders )
+                                                      const DAVRequestHeaders& inRequestHeaders,
+                                                      const char * inLockToken )
     {
         SerfRequestProcessorImpl* pReqProcImpl = new SerfMkColReqProcImpl( inPath,
-                                                                           inRequestHeaders );
+                                                                           inRequestHeaders,
+                                                                           inLockToken );
         return pReqProcImpl;
     }
 
     SerfRequestProcessorImpl* createCopyReqProcImpl( const char* inSourcePath,
                                                      const DAVRequestHeaders& inRequestHeaders,
                                                      const char* inDestinationPath,
-                                                     const bool inOverwrite )
+                                                     const bool inOverwrite,
+                                                     const char* inLockToken )
     {
         SerfRequestProcessorImpl* pReqProcImpl = new SerfCopyReqProcImpl( inSourcePath,
                                                                           inRequestHeaders,
                                                                           inDestinationPath,
-                                                                          inOverwrite );
+                                                                          inOverwrite,
+                                                                          inLockToken );
         return pReqProcImpl;
     }
 
     SerfRequestProcessorImpl* createMoveReqProcImpl( const char* inSourcePath,
                                                      const DAVRequestHeaders& inRequestHeaders,
                                                      const char* inDestinationPath,
-                                                     const bool inOverwrite )
+                                                     const bool inOverwrite,
+                                                     const char* inLockToken )
     {
         SerfRequestProcessorImpl* pReqProcImpl = new SerfMoveReqProcImpl( inSourcePath,
                                                                           inRequestHeaders,
                                                                           inDestinationPath,
-                                                                          inOverwrite );
+                                                                          inOverwrite,
+                                                                          inLockToken );
+        return pReqProcImpl;
+    }
+
+    SerfRequestProcessorImpl* createLockReqProcImpl( const char* inSourcePath,
+                                                     const DAVRequestHeaders& inRequestHeaders,
+                                                     const ucb::Lock& inLock,
+                                                     const char* inTimeout,
+                                                     DAVPropertyValue & outLock)
+    {
+        SerfRequestProcessorImpl* pReqProcImpl = new SerfLockReqProcImpl( inSourcePath,
+                                                                          inRequestHeaders,
+                                                                          inLock,
+                                                                          inTimeout,
+                                                                          outLock);
+        return pReqProcImpl;
+    }
+
+    SerfRequestProcessorImpl* createLockRefreshProcImpl( const char* inSourcePath,
+                                                         const DAVRequestHeaders& inRequestHeaders,
+                                                         const ucb::Lock& inLock,
+                                                         const char* inLockToken,
+                                                         const char* inTimeout,
+                                                         DAVPropertyValue & outLock)
+    {
+        SerfRequestProcessorImpl* pReqProcImpl = new SerfLockRefreshProcImpl( inSourcePath,
+                                                                              inRequestHeaders,
+                                                                              inLock,
+                                                                              inLockToken,
+                                                                              inTimeout,
+                                                                              outLock);
+        return pReqProcImpl;
+    }
+
+    SerfRequestProcessorImpl* createUnlockProcImpl( const char* inSourcePath,
+                                                         const DAVRequestHeaders& inRequestHeaders,
+                                                         const ucb::Lock& inLock,
+                                                         const char* inToken )
+    {
+        SerfRequestProcessorImpl* pReqProcImpl = new SerfUnlockProcImpl( inSourcePath,
+                                                                         inRequestHeaders,
+                                                                         inLock,
+                                                                         inToken );
         return pReqProcImpl;
     }
 

Modified: openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfRequestProcessorImplFac.hxx
URL: http://svn.apache.org/viewvc/openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfRequestProcessorImplFac.hxx?rev=1705278&r1=1705277&r2=1705278&view=diff
==============================================================================
--- openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfRequestProcessorImplFac.hxx (original)
+++ openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfRequestProcessorImplFac.hxx Fri Sep 25 12:01:49 2015
@@ -27,6 +27,7 @@
 #include "DAVTypes.hxx"
 #include "DAVResource.hxx"
 
+#include "SerfTypes.hxx"
 #include "SerfRequestProcessorImpl.hxx"
 #include "SerfInputStream.hxx"
 #include <com/sun/star/io/XOutputStream.hpp>
@@ -46,7 +47,8 @@ namespace http_dav_ucp
 
     SerfRequestProcessorImpl* createPropPatchReqProcImpl( const char* inPath,
                                                           const DAVRequestHeaders& inRequestHeaders,
-                                                          const std::vector< ProppatchValue > & inProperties );
+                                                          const std::vector< ProppatchValue > & inProperties,
+                                                          const char* inLockToken );
 
     SerfRequestProcessorImpl* createGetReqProcImpl( const char* inPath,
                                                     const DAVRequestHeaders& inRequestHeaders,
@@ -76,12 +78,14 @@ namespace http_dav_ucp
     SerfRequestProcessorImpl* createPutReqProcImpl( const char* inPath,
                                                     const DAVRequestHeaders& inRequestHeaders,
                                                     const char* inData,
+                                                    const char* inLockToken,
                                                     apr_size_t inDataLen );
 
     SerfRequestProcessorImpl* createPostReqProcImpl( const char* inPath,
                                                      const DAVRequestHeaders& inRequestHeaders,
                                                      const char* inData,
                                                      apr_size_t inDataLen,
+                                                     const char* inLockToken,
                                                      const char* inContentType,
                                                      const char* inReferer,
                                                      const com::sun::star::uno::Reference< SerfInputStream >& xioInStrm );
@@ -90,25 +94,48 @@ namespace http_dav_ucp
                                                      const DAVRequestHeaders& inRequestHeaders,
                                                      const char* inData,
                                                      apr_size_t inDataLen,
+                                                     const char* inLockToken,
                                                      const char* inContentType,
                                                      const char* inReferer,
                                                      const com::sun::star::uno::Reference< com::sun::star::io::XOutputStream >& xioOutStrm );
 
     SerfRequestProcessorImpl* createDeleteReqProcImpl( const char* inPath,
-                                                       const DAVRequestHeaders& inRequestHeaders );
+                                                       const DAVRequestHeaders& inRequestHeaders,
+                                                       const char * inLockToken );
 
     SerfRequestProcessorImpl* createMkColReqProcImpl( const char* inPath,
-                                                      const DAVRequestHeaders& inRequestHeaders );
+                                                      const DAVRequestHeaders& inRequestHeaders,
+                                                      const char * inLockToken );
 
     SerfRequestProcessorImpl* createCopyReqProcImpl( const char* inSourcePath,
                                                      const DAVRequestHeaders& inRequestHeaders,
                                                      const char* inDestinationPath,
-                                                     const bool inOverwrite );
+                                                     const bool inOverwrite,
+                                                     const char* inLockToken );
 
     SerfRequestProcessorImpl* createMoveReqProcImpl( const char* inSourcePath,
                                                      const DAVRequestHeaders& inRequestHeaders,
                                                      const char* inDestinationPath,
-                                                     const bool inOverwrite );
+                                                     const bool inOverwrite,
+                                                     const char* inLockToken );
+
+    SerfRequestProcessorImpl* createLockReqProcImpl( const char* inSourcePath,
+                                                     const DAVRequestHeaders& inRequestHeaders,
+                                                     const ucb::Lock& inLock,
+                                                     const char* inTimeout,
+                                                     DAVPropertyValue & outLock );
+
+    SerfRequestProcessorImpl* createLockRefreshProcImpl( const char* inSourcePath,
+                                                     const DAVRequestHeaders& inRequestHeaders,
+                                                     const ucb::Lock& inLock,
+                                                     const char* inToken,
+                                                     const char* inTimeout,
+                                                     DAVPropertyValue & outLock );
+
+    SerfRequestProcessorImpl* createUnlockProcImpl( const char* inSourcePath,
+                                                     const DAVRequestHeaders& inRequestHeaders,
+                                                     const ucb::Lock& inLock,
+                                                     const char* inToken );
 
 } // namespace http_dav_ucp
 

Modified: openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfSession.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfSession.cxx?rev=1705278&r1=1705277&r2=1705278&view=diff
==============================================================================
--- openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfSession.cxx (original)
+++ openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfSession.cxx Fri Sep 25 12:01:49 2015
@@ -26,6 +26,8 @@
 #include <vector>
 #include <string.h>
 #include <rtl/string.h>
+#include <rtl/ustrbuf.hxx>
+#include <osl/time.h>
 #include "comphelper/sequence.hxx"
 #include "ucbhelper/simplecertificatevalidationrequest.hxx"
 
@@ -57,10 +59,9 @@
 using namespace com::sun::star;
 using namespace http_dav_ucp;
 
-
 // -------------------------------------------------------------------
 // static members!
-//SerfLockStore SerfSession::m_aSerfLockStore;
+SerfLockStore SerfSession::m_aSerfLockStore;
 
 // -------------------------------------------------------------------
 // Constructor
@@ -75,6 +76,7 @@ SerfSession::SerfSession(
     , m_aUri( inUri )
     , m_aProxyName()
     , m_nProxyPort( 0 )
+    , m_aServerHeaderField()
     , m_pSerfConnection( 0 )
     , m_pSerfContext( 0 )
     , m_bIsHeadRequestInProgress( false )
@@ -97,6 +99,7 @@ SerfSession::~SerfSession( )
     {
         serf_connection_close( m_pSerfConnection );
         m_pSerfConnection = 0;
+        OSL_TRACE("SerfSession::~SerfSession: closed serf connection");
     }
 }
 
@@ -126,6 +129,7 @@ void SerfSession::Init()
 
         // Not yet initialized. Create new session.
         bCreateNewSession = true;
+        OSL_TRACE("SerfSession::Init: serf connection created");
     }
     else
     {
@@ -166,7 +170,7 @@ void SerfSession::Init()
         if ( m_aProxyName.getLength() )
         {
             apr_sockaddr_t *proxy_address = NULL;
-            status = apr_sockaddr_info_get( &proxy_address, 
+            status = apr_sockaddr_info_get( &proxy_address,
                                                                rtl::OUStringToOString( m_aProxyName, RTL_TEXTENCODING_UTF8 ).getStr(), 
                                                                APR_UNSPEC,
                                                                static_cast<apr_port_t>(m_nProxyPort), 
@@ -223,6 +227,55 @@ char* SerfSession::getHostinfo()
     return m_aUri.getAprUri()->hostinfo;
 }
 
+// -------------------------------------------------------------------
+// helper function
+// it composes the uri for lockstore registration
+rtl::OUString SerfSession::composeCurrentUri(const rtl::OUString & inPath)
+{
+    rtl::OUString aScheme( m_aUri.GetScheme() );
+    rtl::OUStringBuffer aBuf( aScheme );
+    aBuf.appendAscii( "://" );
+    if ( m_aUri.GetUserInfo().getLength() > 0 )
+    {
+        aBuf.append( m_aUri.GetUserInfo() );
+        aBuf.appendAscii( "@" );
+    }
+    // Is host a numeric IPv6 address?
+    if ( ( m_aUri.GetHost().indexOf( ':' ) != -1 ) &&
+         ( m_aUri.GetHost()[ 0 ] != sal_Unicode( '[' ) ) )
+    {
+        aBuf.appendAscii( "[" );
+        aBuf.append( m_aUri.GetHost() );
+        aBuf.appendAscii( "]" );
+    }
+    else
+    {
+        aBuf.append( m_aUri.GetHost() );
+    }
+
+    // append port, but only, if not default port.
+    bool bAppendPort = true;
+    sal_Int32 aPort = m_aUri.GetPort();
+    switch ( aPort )
+    {
+    case DEFAULT_HTTP_PORT:
+        bAppendPort = aScheme.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "http" ) );
+        break;
+
+    case DEFAULT_HTTPS_PORT:
+        bAppendPort = !aScheme.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "https" ) );
+        break;
+    }
+    if ( bAppendPort )
+    {
+        aBuf.appendAscii( ":" );
+        aBuf.append( rtl::OUString::valueOf( aPort ) );
+    }
+    aBuf.append( inPath );
+
+    rtl::OUString   aUri(aBuf.makeStringAndClear() );
+    return aUri;
+}
 
 // -------------------------------------------------------------------
 // virtual
@@ -259,11 +312,11 @@ apr_status_t SerfSession::setupSerfConne
                                                apr_pool_t* /*inAprPool*/ )
 {
     serf_bucket_t *tmpInputBkt;
-    tmpInputBkt = serf_context_bucket_socket_create( getSerfContext(), 
-                                                     inAprSocket, 
+    tmpInputBkt = serf_context_bucket_socket_create( getSerfContext(),
+                                                     inAprSocket,
                                                      getSerfBktAlloc() );
-    
-    if ( isSSLNeeded() ) 
+
+    if ( isSSLNeeded() )
     {
         tmpInputBkt = serf_bucket_ssl_decrypt_create( tmpInputBkt,
                                                       0,
@@ -276,7 +329,7 @@ apr_status_t SerfSession::setupSerfConne
             NULL,
             Serf_CertificateChainValidation,
             this);
-        serf_ssl_set_hostname( serf_bucket_ssl_decrypt_context_get( tmpInputBkt ), 
+        serf_ssl_set_hostname( serf_bucket_ssl_decrypt_context_get( tmpInputBkt ),
                                getHostinfo() );
 
         *outSerfOutputBucket = serf_bucket_ssl_encrypt_create( *outSerfOutputBucket, 
@@ -290,10 +343,10 @@ apr_status_t SerfSession::setupSerfConne
 }
 
 apr_status_t SerfSession::provideSerfCredentials( bool bGiveProvidedCredentialsASecondTry,
-                                                  char ** outUsername, 
+                                                  char ** outUsername,
                                                   char ** outPassword,
-                                                  serf_request_t * /*inRequest*/, 
-                                                  int /*inCode*/, 
+                                                  serf_request_t * /*inRequest*/,
+                                                  int /*inCode*/,
                                                   const char *inAuthProtocol,
                                                   const char *inRealm,
                                                   apr_pool_t *inAprPool )
@@ -600,7 +653,7 @@ serf_bucket_t* SerfSession::acceptSerfRe
                                                              SerfBktAlloc );
 
     // create response bucket
-    responseBkt = serf_bucket_response_create( responseBkt, 
+    responseBkt = serf_bucket_response_create( responseBkt,
                                                SerfBktAlloc );
 
     if ( isHeadRequestInProgress() )
@@ -693,7 +746,16 @@ void SerfSession::PROPPATCH( const rtl::
 
     apr_status_t status = APR_SUCCESS;
     boost::shared_ptr<SerfRequestProcessor> aReqProc( createReqProc( inPath ) );
+    //check whether a lock on this resource is already owned
+    rtl::OUString aUri( composeCurrentUri( inPath ) );
+    ucb::Lock inLock;
+    SerfLock * pLock = m_aSerfLockStore.findByUri( aUri );
+    if ( pLock )
+    {
+        inLock = pLock->getLock();
+    }
     aReqProc->processPropPatch( inValues,
+                                inLock,
                                 status );
 
     HandleError( aReqProc );
@@ -843,8 +905,18 @@ void SerfSession::PUT( const rtl::OUStri
     if ( !getDataFromInputStream( inInputStream, aDataToSend, false ) )
         throw DAVException( DAVException::DAV_INVALID_ARG );
     apr_status_t status = APR_SUCCESS;
+
+    //check whether a lock on this resource is already owned
+    rtl::OUString aUri( composeCurrentUri( inPath ) );
+    ucb::Lock inLock;
+    SerfLock * pLock = m_aSerfLockStore.findByUri( aUri );
+    if ( pLock )
+    {
+        inLock = pLock->getLock();
+    }
     aReqProc->processPut( reinterpret_cast< const char * >( aDataToSend.getConstArray() ),
                           aDataToSend.getLength(),
+                          inLock,
                           status );
 
     HandleError( aReqProc );
@@ -874,10 +946,19 @@ SerfSession::POST( const rtl::OUString &
     boost::shared_ptr<SerfRequestProcessor> aReqProc( createReqProc( inPath ) );
     uno::Reference< SerfInputStream > xInputStream( new SerfInputStream );
     apr_status_t status = APR_SUCCESS;
+    //check whether a lock on this resource is already owned
+    rtl::OUString aUri( composeCurrentUri( inPath ) );
+    ucb::Lock inLock;
+    SerfLock * pLock = m_aSerfLockStore.findByUri( aUri );
+    if ( pLock )
+    {
+        inLock = pLock->getLock();
+    }
     aReqProc->processPost( reinterpret_cast< const char * >( aDataToSend.getConstArray() ),
                            aDataToSend.getLength(),
                            rContentType,
                            rReferer,
+                           inLock,
                            xInputStream,
                            status );
 
@@ -908,10 +989,19 @@ void SerfSession::POST( const rtl::OUStr
 
     boost::shared_ptr<SerfRequestProcessor> aReqProc( createReqProc( inPath ) );
     apr_status_t status = APR_SUCCESS;
+    //check whether a lock on this resource is already owned
+    rtl::OUString aUri( composeCurrentUri( inPath ) );
+    ucb::Lock inLock;
+    SerfLock * pLock = m_aSerfLockStore.findByUri( aUri );
+    if ( pLock )
+    {
+        inLock = pLock->getLock();
+    }
     aReqProc->processPost( reinterpret_cast< const char * >( aDataToSend.getConstArray() ),
                            aDataToSend.getLength(),
                            rContentType,
                            rReferer,
+                           inLock,
                            oOutputStream,
                            status );
 
@@ -931,7 +1021,15 @@ void SerfSession::MKCOL( const rtl::OUSt
 
     boost::shared_ptr<SerfRequestProcessor> aReqProc( createReqProc( inPath ) );
     apr_status_t status = APR_SUCCESS;
-    aReqProc->processMkCol( status );
+    //check whether a lock on the destination resource is already owned
+    rtl::OUString aUri( composeCurrentUri( inPath ) );
+    ucb::Lock inLock;
+    SerfLock * pLock = m_aSerfLockStore.findByUri( aUri );
+    if ( pLock )
+    {
+        inLock = pLock->getLock();
+    }
+    aReqProc->processMkCol( inLock, status );
 
     HandleError( aReqProc );
 }
@@ -952,8 +1050,17 @@ void SerfSession::COPY( const rtl::OUStr
     SerfUri theSourceUri( inSourceURL );
     boost::shared_ptr<SerfRequestProcessor> aReqProc( createReqProc( theSourceUri.GetPath() ) );
     apr_status_t status = APR_SUCCESS;
+    //check whether a lock on the destination resource is already owned
+    rtl::OUString aUri( composeCurrentUri( inDestinationURL ) );
+    ucb::Lock inLock;
+    SerfLock * pLock = m_aSerfLockStore.findByUri( aUri );
+    if ( pLock )
+    {
+        inLock = pLock->getLock();
+    }
     aReqProc->processCopy( inDestinationURL,
                            (inOverWrite ? true : false),
+                           inLock,
                            status );
 
     HandleError( aReqProc );
@@ -975,8 +1082,17 @@ void SerfSession::MOVE( const rtl::OUStr
     SerfUri theSourceUri( inSourceURL );
     boost::shared_ptr<SerfRequestProcessor> aReqProc( createReqProc( theSourceUri.GetPath() ) );
     apr_status_t status = APR_SUCCESS;
+    //check whether a lock on the destination resource is already owned
+    rtl::OUString aUri( composeCurrentUri( inDestinationURL ) );
+    ucb::Lock inLock;
+    SerfLock * pLock = m_aSerfLockStore.findByUri( aUri );
+    if ( pLock )
+    {
+        inLock = pLock->getLock();
+    }
     aReqProc->processMove( inDestinationURL,
                            (inOverWrite ? true : false),
+                           inLock,
                            status );
 
     HandleError( aReqProc );
@@ -995,25 +1111,33 @@ void SerfSession::DESTROY( const rtl::OU
 
     boost::shared_ptr<SerfRequestProcessor> aReqProc( createReqProc( inPath ) );
     apr_status_t status = APR_SUCCESS;
-    aReqProc->processDelete( status );
+    //check whether a lock on this resource is already owned
+    rtl::OUString aUri( composeCurrentUri( inPath ) );
+    ucb::Lock inLock;
+    SerfLock * pLock = m_aSerfLockStore.findByUri( aUri );
+    if ( pLock )
+    {
+        inLock = pLock->getLock();
+    }
+    aReqProc->processDelete( inLock, status );
 
     HandleError( aReqProc );
 }
 
 // -------------------------------------------------------------------
-/*
+
 namespace
 {
     sal_Int32 lastChanceToSendRefreshRequest( TimeValue const & rStart,
-                                              int timeout )
+                                              sal_Int32 timeout )
     {
         TimeValue aEnd;
         osl_getSystemTime( &aEnd );
 
         // Try to estimate a safe absolute time for sending the
         // lock refresh request.
-        sal_Int32 lastChanceToSendRefreshRequest = -1;
-        if ( timeout != NE_TIMEOUT_INFINITE )
+        sal_Int32 lastChanceToSendRefreshRequest = DAVINFINITY;
+        if ( timeout != DAVINFINITY )
         {
             sal_Int32 calltime = aEnd.Seconds - rStart.Seconds;
             if ( calltime <= timeout )
@@ -1030,108 +1154,62 @@ namespace
     }
 
 } // namespace
-*/
+
 // -------------------------------------------------------------------
 // LOCK (set new lock)
 // -------------------------------------------------------------------
 void SerfSession::LOCK( const ::rtl::OUString & inPath,
-                        ucb::Lock & /*rLock*/,
+                        ucb::Lock & rLock,
                         const DAVRequestEnvironment & rEnv )
     throw ( DAVException )
 {
     osl::Guard< osl::Mutex > theGuard( m_aMutex );
 
+    //before locking, search in the lock store if we already own a lock for this resource
+    //if present, return with exception DAV_LOCKED_SELF
+    rtl::OUString   aUri( composeCurrentUri( inPath ) );
+    SerfLock * pLock = m_aSerfLockStore.findByUri( aUri );
+    if ( pLock )
+    {
+//already present, meaning already locked by the same AOO session and already in the lockstore
+//just return, nothing to do
+        return;
+    }
+
     Init( rEnv );
 
     boost::shared_ptr<SerfRequestProcessor> aReqProc( createReqProc( inPath ) );
-    HandleError( aReqProc );
-    /* Create a depth zero, exclusive write lock, with default timeout
-     * (allowing a server to pick a default).  token, owner and uri are
-     * unset. */
-    /*
-    SerfLock * theLock = ne_lock_create();
-
-    // Set the lock uri
-    ne_uri aUri;
-    ne_uri_parse( rtl::OUStringToOString( makeAbsoluteURL( inPath ),
-                                          RTL_TEXTENCODING_UTF8 ).getStr(),
-                  &aUri );
-    theLock->uri = aUri;
-
-    // Set the lock depth
-    switch( rLock.Depth )
-    {
-    case ucb::LockDepth_ZERO:
-        theLock->depth = NE_DEPTH_ZERO;
-        break;
-    case ucb::LockDepth_ONE:
-        theLock->depth = NE_DEPTH_ONE;
-        break;
-    case ucb::LockDepth_INFINITY:
-        theLock->depth = NE_DEPTH_INFINITE;
-        break;
-    default:
-        throw DAVException( DAVException::DAV_INVALID_ARG );
-    }
-
-    // Set the lock scope
-    switch ( rLock.Scope )
-    {
-    case ucb::LockScope_EXCLUSIVE:
-        theLock->scope = ne_lockscope_exclusive;
-        break;
-    case ucb::LockScope_SHARED:
-        theLock->scope = ne_lockscope_shared;
-        break;
-    default:
-        throw DAVException( DAVException::DAV_INVALID_ARG );
-    }
+    apr_status_t status = APR_SUCCESS;
 
-    // Set the lock timeout
-    theLock->timeout = (long)rLock.Timeout;
+    //the returned property, a sequence of locks
+    //only the first is used
+    DAVPropertyValue outLock;
 
-    // Set the lock owner
-    rtl::OUString aValue;
-    rLock.Owner >>= aValue;
-    theLock->owner =
-        ne_strdup( rtl::OUStringToOString( aValue,
-                                           RTL_TEXTENCODING_UTF8 ).getStr() );
     TimeValue startCall;
     osl_getSystemTime( &startCall );
+    aReqProc->processLock(inPath, rLock, outLock, status);
 
-    int theRetVal = ne_lock( m_pHttpSession, theLock );
+    //HandleError will handle the error and throw an exception, if needed
+    HandleError( aReqProc );
 
-    if ( theRetVal == NE_OK )
+    if(outLock.Name.compareToAscii(RTL_CONSTASCII_STRINGPARAM( "DAV:lockdiscovery" )) == 0 )
     {
-        m_aSerfLockStore.addLock( theLock,
-                                  this,
-                                  lastChanceToSendRefreshRequest(
-                                      startCall, theLock->timeout ) );
-
-        uno::Sequence< rtl::OUString > aTokens( 1 );
-        aTokens[ 0 ] = rtl::OUString::createFromAscii( theLock->token );
-        rLock.LockTokens = aTokens;
+        //got a lock, use only the first returned
+        uno::Sequence< ucb::Lock >      aLocks;
+        outLock.Value >>= aLocks;
+        ucb::Lock aLock = aLocks[0];
 
-        OSL_TRACE( "SerfSession::LOCK: created lock for %s. token: %s",
-                   rtl::OUStringToOString( makeAbsoluteURL( inPath ),
-                                           RTL_TEXTENCODING_UTF8 ).getStr(),
-                   theLock->token );
-    }
-    else
-    {
-        ne_lock_destroy( theLock );
-
-        OSL_TRACE( "SerfSession::LOCK: obtaining lock for %s failed!",
-                   rtl::OUStringToOString( makeAbsoluteURL( inPath ),
-                                           RTL_TEXTENCODING_UTF8 ).getStr() );
+        SerfLock* aNewLock = new SerfLock( aLock, aUri, inPath );
+        // add the store the new lock
+        m_aSerfLockStore.addLock(aNewLock,this,
+                                 lastChanceToSendRefreshRequest(
+                                     startCall, static_cast< sal_Int32 >(aLock.Timeout) ) );
     }
 
-    HandleError( theRetVal, inPath, rEnv );
-    */
 }
 
 // -------------------------------------------------------------------
-// LOCK (refresh existing lock)
+// LOCK (refresh existing lock from DAVResourceAccess)
 // -------------------------------------------------------------------
 sal_Int64 SerfSession::LOCK( const ::rtl::OUString & /*inPath*/,
                              sal_Int64 nTimeout,
@@ -1172,92 +1250,102 @@ sal_Int64 SerfSession::LOCK( const ::rtl
 }
 
 // -------------------------------------------------------------------
-// LOCK (refresh existing lock)
+// LOCK (refresh existing lock from SerfLockStore)
 // -------------------------------------------------------------------
-bool SerfSession::LOCK( SerfLock * /*pLock*/,
-                        sal_Int32 & /*rlastChanceToSendRefreshRequest*/ )
+bool SerfSession::LOCK( SerfLock * pLock,
+                        sal_Int32 & rlastChanceToSendRefreshRequest )
 {
     osl::Guard< osl::Mutex > theGuard( m_aMutex );
+    rtl::OUString inPath = pLock->getResourcePath();
 
-    return true;
-    /*
-    // refresh existing lock.
+    boost::shared_ptr<SerfRequestProcessor> aReqProc( createReqProc( inPath ) );
+    apr_status_t status = APR_SUCCESS;
+
+    //the returned property, a sequence of locks
+    //only the first is used
+    DAVPropertyValue outLock;
 
     TimeValue startCall;
     osl_getSystemTime( &startCall );
 
-    if ( ne_lock_refresh( m_pHttpSession, pLock ) == NE_OK )
-    {
-        rlastChanceToSendRefreshRequest
-            = lastChanceToSendRefreshRequest( startCall, pLock->timeout );
+    // refresh existing lock.
+    aReqProc->processLockRefresh( inPath, pLock->getLock(), outLock, status);
 
-        OSL_TRACE( "Lock successfully refreshed." );
-        return true;
-    }
-    else
-    {
-        OSL_TRACE( "Lock not refreshed!" );
-        return false;
-    }
-    */
+    // TODO: possible enhancement as the following:
+    // - use an interaction handler to alert the user if the lock was not refreshed,
+    //   offering to try again with a new session, asking the user for credential, if necessary.
+    //   This may happen if the WebDAV server goes off-line for whatever reason, or the connection is dropped for time-out
+    //   To implement this behavior, some redesigning of the current session implementation may be needed.
+    //
+
+    //HandleError will handle the error and throw an exception, if needed
+    HandleError( aReqProc );
+
+    uno::Sequence< ucb::Lock >      aLocks;
+    outLock.Value >>= aLocks;
+    ucb::Lock aLock = aLocks[0];
+
+    //if ok, udate the lastchance refresh time in lock
+    rlastChanceToSendRefreshRequest
+        = lastChanceToSendRefreshRequest( startCall, static_cast< sal_Int32 >(aLock.Timeout) );
+
+    return true;
 }
 
 // -------------------------------------------------------------------
-// UNLOCK
+// UNLOCK called from external (DAVResourceAccess)
 // -------------------------------------------------------------------
-void SerfSession::UNLOCK( const ::rtl::OUString & /*inPath*/,
-                          const DAVRequestEnvironment & /*rEnv*/ )
+void SerfSession::UNLOCK( const ::rtl::OUString & inPath,
+                          const DAVRequestEnvironment & rEnv )
     throw ( DAVException )
 {
     osl::Guard< osl::Mutex > theGuard( m_aMutex );
 
-    /*
-    // get the neon lock from lock store
-    SerfLock * theLock
-        = m_aSerfLockStore.findByUri( makeAbsoluteURL( inPath ) );
-    if ( !theLock )
+    rtl::OUString aUri( composeCurrentUri( inPath ) );
+    SerfLock * pLock = m_aSerfLockStore.findByUri( aUri );
+    if ( !pLock )
+    {
         throw DAVException( DAVException::DAV_NOT_LOCKED );
+    }
 
     Init( rEnv );
 
-    int theRetVal = ne_unlock( m_pHttpSession, theLock );
+    boost::shared_ptr<SerfRequestProcessor> aReqProc( createReqProc( inPath ) );
+    apr_status_t status = APR_SUCCESS;
 
-    if ( theRetVal == NE_OK )
-    {
-        m_aSerfLockStore.removeLock( theLock );
-        ne_lock_destroy( theLock );
-    }
-    else
-    {
-        OSL_TRACE( "SerfSession::UNLOCK: unlocking of %s failed.",
-                   rtl::OUStringToOString( makeAbsoluteURL( inPath ),
-                                           RTL_TEXTENCODING_UTF8 ).getStr() );
-    }
+    ucb::Lock inLock = pLock->getLock();
+    //remove lock from lockstore
+    // so, if something goes wrong, we don't refresh it anymore
+    m_aSerfLockStore.removeLock(pLock);
+    delete pLock;
 
-    HandleError( theRetVal, inPath, rEnv );
-    */
+    // remove existing lock
+    aReqProc->processUnlock( inPath, inLock, status);
+
+    //HandleError will handle the error and throw an exception, if needed
+    HandleError( aReqProc );
 }
 
 // -------------------------------------------------------------------
-// UNLOCK
+// UNLOCK (called from SerfLockStore)
 // -------------------------------------------------------------------
-bool SerfSession::UNLOCK( SerfLock * /*pLock*/ )
+bool SerfSession::UNLOCK( SerfLock * pLock )
 {
     osl::Guard< osl::Mutex > theGuard( m_aMutex );
+    rtl::OUString inPath = pLock->getResourcePath();
+
+    boost::shared_ptr<SerfRequestProcessor> aReqProc( createReqProc( inPath ) );
+    apr_status_t status = APR_SUCCESS;
+
+    rtl::OUString   aToken;
+    aToken = pLock->getLock().LockTokens[0];
+
+    aReqProc->processUnlock( inPath, pLock->getLock(), status);
+
+    //HandleError will handle the error and throw an exception, if needed
+    HandleError( aReqProc );
 
     return true;
-    /*
-    if ( ne_unlock( m_pHttpSession, pLock ) == NE_OK )
-    {
-        OSL_TRACE( "UNLOCK succeeded." );
-        return true;
-    }
-    else
-    {
-        OSL_TRACE( "UNLOCK failed!" );
-        return false;
-    }
-    */
 }
 
 // -------------------------------------------------------------------
@@ -1315,6 +1403,10 @@ bool containsLocktoken( const uno::Seque
 */
 
 // -------------------------------------------------------------------
+// This method doesn't seem to be used.
+// In any case the default behavior is to ask a lock whith a life of 3 minutes
+// it will then be refreshed automatically (see SerfLockStore class)
+// In case of AOO crash the lock will expire by itself
 bool SerfSession::removeExpiredLocktoken( const rtl::OUString & /*inURL*/,
                                           const DAVRequestEnvironment & /*rEnv*/ )
 {
@@ -1612,37 +1704,3 @@ SerfSession::isDomainMatch( rtl::OUStrin
     }
     return sal_False;
 }
-
-/*
-// ---------------------------------------------------------------------
-rtl::OUString SerfSession::makeAbsoluteURL( rtl::OUString const & rURL ) const
-{
-    try
-    {
-        // Is URL relative or already absolute?
-        if ( rURL[ 0 ] != sal_Unicode( '/' ) )
-        {
-            // absolute.
-            return rtl::OUString( rURL );
-        }
-        else
-        {
-            ne_uri aUri;
-            memset( &aUri, 0, sizeof( aUri ) );
-
-            ne_fill_server_uri( m_pHttpSession, &aUri );
-            aUri.path
-                = ne_strdup( rtl::OUStringToOString(
-                    rURL, RTL_TEXTENCODING_UTF8 ).getStr() );
-            SerfUri aSerfUri( &aUri );
-            ne_uri_free( &aUri );
-            return aSerfUri.GetURI();
-        }
-    }
-    catch ( DAVException const & )
-    {
-    }
-    // error.
-    return rtl::OUString();
-}
-*/

Modified: openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfSession.hxx
URL: http://svn.apache.org/viewvc/openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfSession.hxx?rev=1705278&r1=1705277&r2=1705278&view=diff
==============================================================================
--- openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfSession.hxx (original)
+++ openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfSession.hxx Fri Sep 25 12:01:49 2015
@@ -27,9 +27,10 @@
 #include <vector>
 #include <boost/shared_ptr.hpp>
 #include <osl/mutex.hxx>
+#include "DAVResource.hxx"
 #include "DAVSession.hxx"
 #include "SerfTypes.hxx"
-//#include "SerfLockStore.hxx"
+#include "SerfLockStore.hxx"
 #include "SerfUri.hxx"
 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
 
@@ -54,6 +55,9 @@ private:
     
     rtl::OUString           m_aProxyName;
     sal_Int32               m_nProxyPort;
+    // The server, according RFC7231
+    // http://tools.ietf.org/html/rfc7231#section-7.4.2
+    rtl::OUString           m_aServerHeaderField;
     
     SerfConnection*         m_pSerfConnection;
     serf_context_t*         m_pSerfContext;
@@ -66,12 +70,14 @@ private:
 
     DAVRequestEnvironment m_aEnv;
 
-//    static SerfLockStore m_aSerfLockStore;
+    static SerfLockStore m_aSerfLockStore;
 
     char* getHostinfo();
     bool isSSLNeeded();
 
-    SerfRequestProcessor* createReqProc( const rtl::OUString & inPath );
+    SerfRequestProcessor*   createReqProc( const rtl::OUString & inPath );
+
+    rtl::OUString           composeCurrentUri( const rtl::OUString & inPath );
 
 protected:
     virtual ~SerfSession();
@@ -258,6 +264,10 @@ public:
 
     sal_Bool isDomainMatch( rtl::OUString certHostName );
 
+    const rtl::OUString & getServerHeaderField() { return m_aServerHeaderField; };
+
+    void setServerHeaderField( rtl::OUString aServerHeaderField ) { m_aServerHeaderField = aServerHeaderField; };
+
 private:
     friend class SerfLockStore;
 

Modified: openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfTypes.hxx
URL: http://svn.apache.org/viewvc/openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfTypes.hxx?rev=1705278&r1=1705277&r2=1705278&view=diff
==============================================================================
--- openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfTypes.hxx (original)
+++ openoffice/branches/AOO410/main/ucb/source/ucp/webdav/SerfTypes.hxx Fri Sep 25 12:01:49 2015
@@ -25,13 +25,42 @@
 #define INCLUDED_SERFTYPES_HXX
 
 #include <serf.h>
+#include <com/sun/star/ucb/Lock.hpp>
+#include "DAVTypes.hxx"
+#include "DAVRequestEnvironment.hxx"
+
+using namespace com::sun::star;
+
+namespace http_dav_ucp
+{
 
 typedef serf_connection_t SerfConnection;
 
-// TODO, figure out type of <SerfLock>
-typedef int SerfLock;
+class SerfLock
+{
+private:
+    ucb::Lock               mLock;
+    const rtl::OUString     mResourceUri;
+    const rtl::OUString     mPathStr;
+    // const DAVRequestEnvironment& mrRequestEnvironment;
+public:
+
+    SerfLock(const ucb::Lock inLock, rtl::OUString inUri, rtl::OUString inPath)
+        : mLock( inLock )
+        , mResourceUri( inUri )
+        , mPathStr( inPath )
+        // , mrRequestEnvironment( rEnv )
+        {};
+
+    void setLock(const ucb::Lock inLock)  { mLock = inLock; };
+    const ucb::Lock                 getLock() { return mLock; };
+    const rtl::OUString             getResourceUri() { return mResourceUri; };
+    const rtl::OUString             getResourcePath() { return mPathStr; };
+    // const DAVRequestEnvironment&    getRequestEnvironment() { return mrRequestEnvironment; };
+};
 
 // TODO, check if we need it later on
 typedef struct { const char *nspace, *name; } SerfPropName;
 
+};
 #endif // INCLUDED_SERFTYPES_HXX

Modified: openoffice/branches/AOO410/main/ucb/source/ucp/webdav/makefile.mk
URL: http://svn.apache.org/viewvc/openoffice/branches/AOO410/main/ucb/source/ucp/webdav/makefile.mk?rev=1705278&r1=1705277&r2=1705278&view=diff
==============================================================================
--- openoffice/branches/AOO410/main/ucb/source/ucp/webdav/makefile.mk (original)
+++ openoffice/branches/AOO410/main/ucb/source/ucp/webdav/makefile.mk Fri Sep 25 12:01:49 2015
@@ -131,6 +131,10 @@ SLOFILES=\
     $(SLO)$/SerfMkColReqProcImpl.obj \
     $(SLO)$/SerfCopyReqProcImpl.obj \
     $(SLO)$/SerfMoveReqProcImpl.obj \
+    $(SLO)$/SerfLockReqProcImpl.obj \
+    $(SLO)$/SerfLockRefreshProcImpl.obj \
+    $(SLO)$/SerfUnlockProcImpl.obj \
+    $(SLO)$/SerfLockStore.obj \
     $(SLO)$/SerfSession.obj \
     $(SLO)$/SerfCallbacks.obj \
     $(SLO)$/SerfInputStream.obj \
@@ -148,6 +152,7 @@ SHL1IMPLIB=i$(TARGET)
 SHL1VERSIONMAP=$(SOLARENV)/src/component.map
 
 SHL1STDLIBS+=\
+        $(TOOLSLIB) \
         $(CPPUHELPERLIB) \
         $(CPPULIB)       \
         $(SALLIB)        \