From 99bdd887a6141883878978bad9beb35e7b326cd1 Mon Sep 17 00:00:00 2001 From: Kai Sommerfeld Date: Thu, 12 Nov 2009 15:22:00 +0100 Subject: #i106830# WebDAV locking support for UCB --- ucb/source/ucp/webdav/NeonSession.hxx | 462 +++++++++++++++++----------------- 1 file changed, 237 insertions(+), 225 deletions(-) (limited to 'ucb/source/ucp/webdav/NeonSession.hxx') diff --git a/ucb/source/ucp/webdav/NeonSession.hxx b/ucb/source/ucp/webdav/NeonSession.hxx index 263169ae452a..bb6bbbb8d3c3 100644 --- a/ucb/source/ucp/webdav/NeonSession.hxx +++ b/ucb/source/ucp/webdav/NeonSession.hxx @@ -35,10 +35,9 @@ #include #include "DAVSession.hxx" #include "NeonTypes.hxx" +#include "NeonLockStore.hxx" #include -using namespace com::sun::star; - namespace ucbhelper { class ProxyDecider; } namespace webdav_ucp @@ -51,236 +50,249 @@ namespace webdav_ucp class NeonSession : public DAVSession { - private: - osl::Mutex m_aMutex; - static osl::Mutex m_aGlobalMutex; - rtl::OUString m_aScheme; - rtl::OUString m_aHostName; - rtl::OUString m_aProxyName; - sal_Int32 m_nPort; - sal_Int32 m_nProxyPort; - HttpSession * m_pHttpSession; - void * m_pRequestData; - const ucbhelper::InternetProxyDecider & m_rProxyDecider; - - // @@@ This should really be per-request data. But Neon currently - // (0.23.5) has no interface for passing per-request user data. - // Theoretically, a NeonSession instance could handle multiple requests - // at a time --currently it doesn't. Thus this is not an issue at the - // moment. - DAVRequestEnvironment m_aEnv; - - // Note: Uncomment the following if locking support is required - // NeonLockSession * mNeonLockSession; - - static bool m_bGlobalsInited; - - protected: - virtual ~NeonSession(); - - public: - NeonSession( const rtl::Reference< DAVSessionFactory > & rSessionFactory, - const rtl::OUString& inUri, - const ucbhelper::InternetProxyDecider & rProxyDecider ) - throw ( DAVException ); - - // DAVSession methods - virtual sal_Bool CanUse( const ::rtl::OUString & inUri ); - - virtual sal_Bool UsesProxy(); - - const DAVRequestEnvironment & getRequestEnvironment() const - { return m_aEnv; } - - virtual void - OPTIONS( const ::rtl::OUString & inPath, - DAVCapabilities & outCapabilities, - const DAVRequestEnvironment & rEnv ) - throw ( DAVException ); - - // allprop & named - virtual void - PROPFIND( const ::rtl::OUString & inPath, - const Depth inDepth, - const std::vector< ::rtl::OUString > & inPropNames, - std::vector< DAVResource > & ioResources, - const DAVRequestEnvironment & rEnv ) - throw ( DAVException ); - - // propnames - virtual void - PROPFIND( const ::rtl::OUString & inPath, - const Depth inDepth, - std::vector< DAVResourceInfo >& ioResInfo, - const DAVRequestEnvironment & rEnv ) - throw ( DAVException ); - - virtual void - PROPPATCH( const ::rtl::OUString & inPath, - const std::vector< ProppatchValue > & inValues, - const DAVRequestEnvironment & rEnv ) - throw( DAVException ); - - virtual void - HEAD( const ::rtl::OUString & inPath, - const std::vector< ::rtl::OUString > & inHeaderNames, - DAVResource & ioResource, - const DAVRequestEnvironment & rEnv ) - throw( DAVException ); - - virtual com::sun::star::uno::Reference< - com::sun::star::io::XInputStream > - GET( const ::rtl::OUString & inPath, - const DAVRequestEnvironment & rEnv ) - throw ( DAVException ); - - virtual void - GET( const ::rtl::OUString & inPath, - com::sun::star::uno::Reference< - com::sun::star::io::XOutputStream > & ioOutputStream, - const DAVRequestEnvironment & rEnv ) - throw ( DAVException ); - - virtual com::sun::star::uno::Reference< - com::sun::star::io::XInputStream > - GET( const ::rtl::OUString & inPath, - const std::vector< ::rtl::OUString > & inHeaderNames, - DAVResource & ioResource, +private: + osl::Mutex m_aMutex; + rtl::OUString m_aScheme; + rtl::OUString m_aHostName; + rtl::OUString m_aProxyName; + sal_Int32 m_nPort; + sal_Int32 m_nProxyPort; + HttpSession * m_pHttpSession; + void * m_pRequestData; + const ucbhelper::InternetProxyDecider & m_rProxyDecider; + + // @@@ This should really be per-request data. But Neon currently + // (0.23.5) has no interface for passing per-request user data. + // Theoretically, a NeonSession instance could handle multiple requests + // at a time --currently it doesn't. Thus this is not an issue at the + // moment. + DAVRequestEnvironment m_aEnv; + + static bool m_bGlobalsInited; + static osl::Mutex m_aGlobalMutex; + static NeonLockStore m_aNeonLockStore; + +protected: + virtual ~NeonSession(); + +public: + NeonSession( const rtl::Reference< DAVSessionFactory > & rSessionFactory, + const rtl::OUString& inUri, + const ucbhelper::InternetProxyDecider & rProxyDecider ) + throw ( DAVException ); + + // DAVSession methods + virtual sal_Bool CanUse( const ::rtl::OUString & inUri ); + + virtual sal_Bool UsesProxy(); + + const DAVRequestEnvironment & getRequestEnvironment() const + { return m_aEnv; } + + virtual void + OPTIONS( const ::rtl::OUString & inPath, + DAVCapabilities & outCapabilities, const DAVRequestEnvironment & rEnv ) - throw ( DAVException ); - - virtual void - GET( const ::rtl::OUString & inPath, - com::sun::star::uno::Reference< - com::sun::star::io::XOutputStream > & ioOutputStream, - const std::vector< ::rtl::OUString > & inHeaderNames, - DAVResource & ioResource, - const DAVRequestEnvironment & rEnv ) - throw ( DAVException ); - - virtual void - PUT( const ::rtl::OUString & inPath, - const com::sun::star::uno::Reference< - com::sun::star::io::XInputStream > & inInputStream, - const DAVRequestEnvironment & rEnv ) - throw ( DAVException ); - - virtual com::sun::star::uno::Reference< - com::sun::star::io::XInputStream > - POST( const rtl::OUString & inPath, - const rtl::OUString & rContentType, - const rtl::OUString & rReferer, - const com::sun::star::uno::Reference< - com::sun::star::io::XInputStream > & inInputStream, + throw ( DAVException ); + + // allprop & named + virtual void + PROPFIND( const ::rtl::OUString & inPath, + const Depth inDepth, + const std::vector< ::rtl::OUString > & inPropNames, + std::vector< DAVResource > & ioResources, const DAVRequestEnvironment & rEnv ) - throw ( DAVException ); + throw ( DAVException ); - virtual void - POST( const rtl::OUString & inPath, - const rtl::OUString & rContentType, - const rtl::OUString & rReferer, - const com::sun::star::uno::Reference< - com::sun::star::io::XInputStream > & inInputStream, - com::sun::star::uno::Reference< - com::sun::star::io::XOutputStream > & oOutputStream, + // propnames + virtual void + PROPFIND( const ::rtl::OUString & inPath, + const Depth inDepth, + std::vector< DAVResourceInfo >& ioResInfo, const DAVRequestEnvironment & rEnv ) - throw ( DAVException ); + throw ( DAVException ); - virtual void - MKCOL( const ::rtl::OUString & inPath, + virtual void + PROPPATCH( const ::rtl::OUString & inPath, + const std::vector< ProppatchValue > & inValues, const DAVRequestEnvironment & rEnv ) - throw ( DAVException ); - - virtual void - COPY( const ::rtl::OUString & inSourceURL, - const ::rtl::OUString & inDestinationURL, - const DAVRequestEnvironment & rEnv, - sal_Bool inOverWrite ) - throw ( DAVException ); - - virtual void - MOVE( const ::rtl::OUString & inSourceURL, - const ::rtl::OUString & inDestinationURL, - const DAVRequestEnvironment & rEnv, - sal_Bool inOverWrite ) - throw ( DAVException ); - - virtual void DESTROY( const ::rtl::OUString & inPath, - const DAVRequestEnvironment & rEnv ) - throw ( DAVException ); - - virtual void ABORT() - throw ( DAVException ); - - // Note: Uncomment the following if locking support is required - /* - virtual void LOCK (const Lock & inLock, - const DAVRequestEnvironment & rEnv ) - throw ( DAVException ); - - virtual void UNLOCK (const Lock & inLock, - const DAVRequestEnvironment & rEnv ) - throw ( DAVException ); - */ - - // helpers - const rtl::OUString & getHostName() const { return m_aHostName; } - - const ::uno::Reference< ::lang::XMultiServiceFactory > getMSF() { return m_xFactory->getServiceFactory(); } - - const void * getRequestData() const { return m_pRequestData; } - - sal_Bool isDomainMatch( rtl::OUString certHostName ); - - private: - // Initialise "Neon sockets" - void Init( void ) - throw ( DAVException ); - - void HandleError( int nError ) - throw ( DAVException ); - - const ucbhelper::InternetProxyServer & getProxySettings() const; - - // Note: Uncomment the following if locking support is required - // void Lockit( const Lock & inLock, bool inLockit ) - // throw ( DAVException ); - - // low level GET implementation, used by public GET implementations - static int GET( ne_session * sess, - const char * uri, - ne_block_reader reader, - bool getheaders, - void * userdata ); - - // Buffer-based PUT implementation. Neon only has file descriptor- - // based API. - static int PUT( ne_session * sess, - const char * uri, - const char * buffer, - size_t size ); - - // Buffer-based POST implementation. Neon only has file descriptor- - // based API. - int POST( ne_session * sess, - const char * uri, - const char * buffer, - ne_block_reader reader, - void * userdata, - const rtl::OUString & rContentType, - const rtl::OUString & rReferer ); - - // Helper: XInputStream -> Sequence< sal_Int8 > - static bool getDataFromInputStream( - const com::sun::star::uno::Reference< - com::sun::star::io::XInputStream > & xStream, - com::sun::star::uno::Sequence< sal_Int8 > & rData, - bool bAppendTrailingZeroByte ); - - typedef std::map< ::rtl::OUString, ::rtl::OUString > Map; - static Map certMap; + throw ( DAVException ); + + virtual void + HEAD( const ::rtl::OUString & inPath, + const std::vector< ::rtl::OUString > & inHeaderNames, + DAVResource & ioResource, + const DAVRequestEnvironment & rEnv ) + throw ( DAVException ); + + virtual com::sun::star::uno::Reference< com::sun::star::io::XInputStream > + GET( const ::rtl::OUString & inPath, + const DAVRequestEnvironment & rEnv ) + throw ( DAVException ); + + virtual void + GET( const ::rtl::OUString & inPath, + com::sun::star::uno::Reference< + com::sun::star::io::XOutputStream > & ioOutputStream, + const DAVRequestEnvironment & rEnv ) + throw ( DAVException ); + + virtual com::sun::star::uno::Reference< com::sun::star::io::XInputStream > + GET( const ::rtl::OUString & inPath, + const std::vector< ::rtl::OUString > & inHeaderNames, + DAVResource & ioResource, + const DAVRequestEnvironment & rEnv ) + throw ( DAVException ); + + virtual void + GET( const ::rtl::OUString & inPath, + com::sun::star::uno::Reference< + com::sun::star::io::XOutputStream > & ioOutputStream, + const std::vector< ::rtl::OUString > & inHeaderNames, + DAVResource & ioResource, + const DAVRequestEnvironment & rEnv ) + throw ( DAVException ); + + virtual void + PUT( const ::rtl::OUString & inPath, + const com::sun::star::uno::Reference< + com::sun::star::io::XInputStream > & inInputStream, + const DAVRequestEnvironment & rEnv ) + throw ( DAVException ); + + virtual com::sun::star::uno::Reference< com::sun::star::io::XInputStream > + POST( const rtl::OUString & inPath, + const rtl::OUString & rContentType, + const rtl::OUString & rReferer, + const com::sun::star::uno::Reference< + com::sun::star::io::XInputStream > & inInputStream, + const DAVRequestEnvironment & rEnv ) + throw ( DAVException ); + + virtual void + POST( const rtl::OUString & inPath, + const rtl::OUString & rContentType, + const rtl::OUString & rReferer, + const com::sun::star::uno::Reference< + com::sun::star::io::XInputStream > & inInputStream, + com::sun::star::uno::Reference< + com::sun::star::io::XOutputStream > & oOutputStream, + const DAVRequestEnvironment & rEnv ) + throw ( DAVException ); + + virtual void + MKCOL( const ::rtl::OUString & inPath, + const DAVRequestEnvironment & rEnv ) + throw ( DAVException ); + + virtual void + COPY( const ::rtl::OUString & inSourceURL, + const ::rtl::OUString & inDestinationURL, + const DAVRequestEnvironment & rEnv, + sal_Bool inOverWrite ) + throw ( DAVException ); + + virtual void + MOVE( const ::rtl::OUString & inSourceURL, + const ::rtl::OUString & inDestinationURL, + const DAVRequestEnvironment & rEnv, + sal_Bool inOverWrite ) + throw ( DAVException ); + + virtual void DESTROY( const ::rtl::OUString & inPath, + const DAVRequestEnvironment & rEnv ) + throw ( DAVException ); + + // set new lock. + virtual void LOCK( const ::rtl::OUString & inURL, + com::sun::star::ucb::Lock & inLock, + const DAVRequestEnvironment & rEnv ) + throw ( DAVException ); + + // refresh existing lock. + virtual sal_Int64 LOCK( const ::rtl::OUString & inURL, + sal_Int64 nTimeout, + const DAVRequestEnvironment & rEnv ) + throw ( DAVException ); + + virtual void UNLOCK( const ::rtl::OUString & inURL, + const DAVRequestEnvironment & rEnv ) + throw ( DAVException ); + + // helpers + virtual void abort() + throw ( DAVException ); + + const rtl::OUString & getHostName() const { return m_aHostName; } + + const ::uno::Reference< ::lang::XMultiServiceFactory > getMSF() + { return m_xFactory->getServiceFactory(); } + + const void * getRequestData() const { return m_pRequestData; } + + sal_Bool isDomainMatch( rtl::OUString certHostName ); + +private: + friend class NeonLockStore; + + void Init( void ) + throw ( DAVException ); + + void Init( const DAVRequestEnvironment & rEnv ) + throw ( DAVException ); + + // ret: true => retry request. + void HandleError( int nError, + const rtl::OUString & inPath, + const DAVRequestEnvironment & rEnv ) + throw ( DAVException ); + + const ucbhelper::InternetProxyServer & getProxySettings() const; + + bool removeExpiredLocktoken( const rtl::OUString & inURL, + const DAVRequestEnvironment & rEnv ); + + // refresh lock, called by NeonLockStore::refreshLocks + bool LOCK( NeonLock * pLock, + sal_Int32 & rlastChanceToSendRefreshRequest ); + + // unlock, called by NeonLockStore::~NeonLockStore + bool UNLOCK( NeonLock * pLock ); + + // low level GET implementation, used by public GET implementations + static int GET( ne_session * sess, + const char * uri, + ne_block_reader reader, + bool getheaders, + void * userdata ); + + // Buffer-based PUT implementation. Neon only has file descriptor- + // based API. + static int PUT( ne_session * sess, + const char * uri, + const char * buffer, + size_t size ); + + // Buffer-based POST implementation. Neon only has file descriptor- + // based API. + int POST( ne_session * sess, + const char * uri, + const char * buffer, + ne_block_reader reader, + void * userdata, + const rtl::OUString & rContentType, + const rtl::OUString & rReferer ); + + // Helper: XInputStream -> Sequence< sal_Int8 > + static bool getDataFromInputStream( + const com::sun::star::uno::Reference< + com::sun::star::io::XInputStream > & xStream, + com::sun::star::uno::Sequence< sal_Int8 > & rData, + bool bAppendTrailingZeroByte ); + + rtl::OUString makeAbsoluteURL( rtl::OUString const & rURL ) const; }; -} // namespace_ucp +} // namespace webdav_ucp #endif // _NEONSESSION_HXX_ -- cgit v1.2.3