summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ucb/source/ucp/webdav-neon/webdavcontent.cxx142
-rw-r--r--ucb/source/ucp/webdav-neon/webdavcontent.hxx7
2 files changed, 80 insertions, 69 deletions
diff --git a/ucb/source/ucp/webdav-neon/webdavcontent.cxx b/ucb/source/ucp/webdav-neon/webdavcontent.cxx
index 5c2aa05d593d..2901b843b44e 100644
--- a/ucb/source/ucp/webdav-neon/webdavcontent.cxx
+++ b/ucb/source/ucp/webdav-neon/webdavcontent.cxx
@@ -782,8 +782,8 @@ void SAL_CALL Content::addProperty( const rtl::OUString& Name,
{
try
{
- const ResourceType & rType = getResourceType( xEnv );
- switch ( rType )
+ ResourceType eType = getResourceType( xEnv );
+ switch ( eType )
{
case UNKNOWN:
case DAV:
@@ -877,8 +877,8 @@ void SAL_CALL Content::removeProperty( const rtl::OUString& Name )
{
try
{
- const ResourceType & rType = getResourceType( xEnv );
- switch ( rType )
+ ResourceType eType = getResourceType( xEnv );
+ switch ( eType )
{
case UNKNOWN:
case DAV:
@@ -1175,11 +1175,11 @@ uno::Reference< sdbc::XRow > Content::getPropertyValues(
/////////////////////////////////////////////////////////////////////
// First, identify whether resource is DAV or not
- const ResourceType & rType = getResourceType( xEnv, xResAccess );
-
bool bNetworkAccessAllowed = true;
+ ResourceType eType = getResourceType(
+ xEnv, xResAccess, &bNetworkAccessAllowed );
- if ( DAV == rType )
+ if ( eType == DAV )
{
// cache lookup... getResourceType may fill the props cache via
// PROPFIND!
@@ -1269,8 +1269,8 @@ uno::Reference< sdbc::XRow > Content::getPropertyValues(
}
catch ( DAVException const & e )
{
- bNetworkAccessAllowed
- = shouldAccessNetworkAfterException( e );
+ bNetworkAccessAllowed = bNetworkAccessAllowed
+ && shouldAccessNetworkAfterException( e );
if ( !bNetworkAccessAllowed )
{
@@ -1341,7 +1341,7 @@ uno::Reference< sdbc::XRow > Content::getPropertyValues(
NeonUri aUri( xResAccess->getURL() );
aUnescapedTitle = aUri.GetPathBaseNameUnescaped();
- if ( rType == UNKNOWN )
+ if ( eType == UNKNOWN )
{
xProps.reset( new ContentProperties( aUnescapedTitle ) );
}
@@ -1349,7 +1349,7 @@ uno::Reference< sdbc::XRow > Content::getPropertyValues(
// For DAV resources we only know the Title, for non-DAV
// resources we additionally know that it is a document.
- if ( rType == DAV )
+ if ( eType == DAV )
{
//xProps.reset(
// new ContentProperties( aUnescapedTitle ) );
@@ -3070,83 +3070,93 @@ Content::getBaseURI( const std::auto_ptr< DAVResourceAccess > & rResAccess )
}
//=========================================================================
-const Content::ResourceType & Content::getResourceType(
+Content::ResourceType Content::getResourceType(
const uno::Reference< ucb::XCommandEnvironment >& xEnv,
- const std::auto_ptr< DAVResourceAccess > & rResAccess )
+ const std::auto_ptr< DAVResourceAccess > & rResAccess,
+ bool * networkAccessAllowed)
throw ( uno::Exception )
{
- if ( m_eResourceType == UNKNOWN )
{
- osl::Guard< osl::Mutex > aGuard( m_aMutex );
+ osl::MutexGuard g(m_aMutex);
+ if (m_eResourceType != UNKNOWN) {
+ return m_eResourceType;
+ }
+ }
- ResourceType eResourceType;
- eResourceType = m_eResourceType;
+ ResourceType eResourceType;
- const rtl::OUString & rURL = rResAccess->getURL();
- const rtl::OUString aScheme(
- rURL.copy( 0, rURL.indexOf( ':' ) ).toAsciiLowerCase() );
+ const rtl::OUString & rURL = rResAccess->getURL();
+ const rtl::OUString aScheme(
+ rURL.copy( 0, rURL.indexOf( ':' ) ).toAsciiLowerCase() );
- if ( aScheme == FTP_URL_SCHEME )
+ if ( aScheme == FTP_URL_SCHEME )
+ {
+ eResourceType = FTP;
+ }
+ else
+ {
+ try
{
- eResourceType = FTP;
+ // Try to fetch some frequently used property value, e.g. those
+ // used when loading documents... along with identifying whether
+ // this is a DAV resource.
+ std::vector< DAVResource > resources;
+ std::vector< rtl::OUString > aPropNames;
+ uno::Sequence< beans::Property > aProperties( 5 );
+ aProperties[ 0 ].Name = rtl::OUString("IsFolder");
+ aProperties[ 1 ].Name = rtl::OUString("IsDocument");
+ aProperties[ 2 ].Name = rtl::OUString("IsReadOnly");
+ aProperties[ 3 ].Name = rtl::OUString("MediaType");
+ aProperties[ 4 ].Name = DAVProperties::SUPPORTEDLOCK;
+
+ ContentProperties::UCBNamesToDAVNames( aProperties, aPropNames );
+
+ rResAccess->PROPFIND( DAVZERO, aPropNames, resources, xEnv );
+
+ if ( resources.size() == 1 )
+ {
+ osl::MutexGuard g(m_aMutex);
+ m_xCachedProps.reset(
+ new CachableContentProperties( resources[ 0 ] ) );
+ m_xCachedProps->containsAllNames(
+ aProperties, m_aFailedPropNames );
+ }
+
+ eResourceType = DAV;
}
- else
+ catch ( DAVException const & e )
{
- try
- {
- // Try to fetch some frequently used property value, e.g. those
- // used when loading documents... along with identifying whether
- // this is a DAV resource.
- std::vector< DAVResource > resources;
- std::vector< rtl::OUString > aPropNames;
- uno::Sequence< beans::Property > aProperties( 5 );
- aProperties[ 0 ].Name
- = rtl::OUString("IsFolder");
- aProperties[ 1 ].Name
- = rtl::OUString("IsDocument");
- aProperties[ 2 ].Name
- = rtl::OUString("IsReadOnly");
- aProperties[ 3 ].Name
- = rtl::OUString("MediaType");
- aProperties[ 4 ].Name
- = DAVProperties::SUPPORTEDLOCK;
-
- ContentProperties::UCBNamesToDAVNames(
- aProperties, aPropNames );
-
- rResAccess->PROPFIND(
- DAVZERO, aPropNames, resources, xEnv );
-
- if ( resources.size() == 1 )
- {
- m_xCachedProps.reset(
- new CachableContentProperties( resources[ 0 ] ) );
- m_xCachedProps->containsAllNames(
- aProperties, m_aFailedPropNames );
- }
+ rResAccess->resetUri();
- eResourceType = DAV;
+ if ( e.getStatus() == SC_METHOD_NOT_ALLOWED )
+ {
+ // Status SC_METHOD_NOT_ALLOWED is a safe indicator that the
+ // resource is NON_DAV
+ eResourceType = NON_DAV;
}
- catch ( DAVException const & e )
+ else if (networkAccessAllowed != 0)
{
- rResAccess->resetUri();
-
- if ( e.getStatus() == SC_METHOD_NOT_ALLOWED )
- {
- // Status SC_METHOD_NOT_ALLOWED is a safe indicator that the
- // resource is NON_DAV
- eResourceType = NON_DAV;
- }
+ *networkAccessAllowed = *networkAccessAllowed
+ && shouldAccessNetworkAfterException(e);
}
}
+ }
+
+ osl::MutexGuard g(m_aMutex);
+ if (m_eResourceType == UNKNOWN) {
m_eResourceType = eResourceType;
+ } else {
+ SAL_WARN_IF(
+ eResourceType != m_eResourceType, "ucb.ucp.webdav",
+ "different resource types for <" << rURL << ">: "
+ << +eResourceType << " vs. " << +m_eResourceType);
}
return m_eResourceType;
}
SAL_WNODEPRECATED_DECLARATIONS_POP
//=========================================================================
-const Content::ResourceType & Content::getResourceType(
+Content::ResourceType Content::getResourceType(
const uno::Reference< ucb::XCommandEnvironment >& xEnv )
throw ( uno::Exception )
{
diff --git a/ucb/source/ucp/webdav-neon/webdavcontent.hxx b/ucb/source/ucp/webdav-neon/webdavcontent.hxx
index 637ab7f22df5..83afb3f8f5c2 100644
--- a/ucb/source/ucp/webdav-neon/webdavcontent.hxx
+++ b/ucb/source/ucp/webdav-neon/webdavcontent.hxx
@@ -133,16 +133,17 @@ private:
getBaseURI( const std::auto_ptr< DAVResourceAccess > & rResAccess );
SAL_WNODEPRECATED_DECLARATIONS_POP
- const ResourceType &
+ ResourceType
getResourceType( const ::com::sun::star::uno::Reference<
::com::sun::star::ucb::XCommandEnvironment >& xEnv )
throw ( ::com::sun::star::uno::Exception );
SAL_WNODEPRECATED_DECLARATIONS_PUSH
- const ResourceType &
+ ResourceType
getResourceType( const ::com::sun::star::uno::Reference<
::com::sun::star::ucb::XCommandEnvironment >& xEnv,
- const std::auto_ptr< DAVResourceAccess > & rResAccess )
+ const std::auto_ptr< DAVResourceAccess > & rResAccess,
+ bool * networkAccessAllowed = 0)
throw ( ::com::sun::star::uno::Exception );
SAL_WNODEPRECATED_DECLARATIONS_POP