1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_ucb.hxx" 26 27 /************************************************************************** 28 TODO 29 ************************************************************************** 30 31 *************************************************************************/ 32 #include <ucbhelper/contentidentifier.hxx> 33 #include "webdavprovider.hxx" 34 #include "webdavcontent.hxx" 35 #include "webdavuseragent.hxx" 36 37 #include <osl/mutex.hxx> 38 #include <rtl/ustrbuf.hxx> 39 #include <comphelper/processfactory.hxx> 40 #include <com/sun/star/beans/NamedValue.hpp> 41 #include <com/sun/star/container/XNameAccess.hpp> 42 43 using namespace com::sun::star; 44 using namespace http_dav_ucp; 45 46 47 rtl::OUString &WebDAVUserAgent::operator()() const 48 { 49 rtl::OUStringBuffer aBuffer; 50 aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "Apache " )); 51 aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "$ooName/$ooSetupVersion" )); 52 #if OSL_DEBUG_LEVEL > 0 53 #ifdef APR_VERSION 54 aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( " apr/" APR_VERSION )); 55 #endif 56 57 #ifdef APR_UTIL_VERSION 58 aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( " apr-util/" APR_UTIL_VERSION )); 59 #endif 60 61 #ifdef SERF_VERSION 62 aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( " serf/" SERF_VERSION )); 63 #endif 64 #endif 65 static rtl::OUString aUserAgent( aBuffer.makeStringAndClear() ); 66 return aUserAgent; 67 } 68 69 //========================================================================= 70 //========================================================================= 71 // 72 // ContentProvider Implementation. 73 // 74 //========================================================================= 75 //========================================================================= 76 77 ContentProvider::ContentProvider( 78 const uno::Reference< lang::XMultiServiceFactory >& rSMgr ) 79 : ::ucbhelper::ContentProviderImplHelper( rSMgr ), 80 m_xDAVSessionFactory( new DAVSessionFactory() ), 81 m_pProps( 0 ) 82 { 83 static bool bInit = false; 84 if ( bInit ) 85 return; 86 bInit = true; 87 try 88 { 89 uno::Reference< uno::XComponentContext > xContext( 90 ::comphelper::getProcessComponentContext() ); 91 uno::Reference< lang::XMultiServiceFactory > xConfigProvider( 92 xContext->getServiceManager()->createInstanceWithContext( 93 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 94 "com.sun.star.configuration.ConfigurationProvider")), xContext), 95 uno::UNO_QUERY_THROW ); 96 97 beans::NamedValue aNodePath; 98 aNodePath.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "nodepath" ) ); 99 aNodePath.Value <<= rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("/org.openoffice.Setup/Product")); 100 101 uno::Sequence< uno::Any > aArgs( 1 ); 102 aArgs[0] <<= aNodePath; 103 104 uno::Reference< container::XNameAccess > xConfigAccess( 105 xConfigProvider->createInstanceWithArguments( 106 rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 107 "com.sun.star.configuration.ConfigurationAccess")), aArgs), 108 uno::UNO_QUERY_THROW ); 109 110 rtl::OUString aVal; 111 xConfigAccess->getByName(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooName"))) >>= aVal; 112 113 rtl::OUString &aUserAgent = WebDAVUserAgent::get(); 114 sal_Int32 nIndex = aUserAgent.indexOfAsciiL( RTL_CONSTASCII_STRINGPARAM( "$ooName" ) ); 115 if ( !aVal.getLength() || nIndex == -1 ) 116 return; 117 aUserAgent = aUserAgent.replaceAt( nIndex, RTL_CONSTASCII_LENGTH( "$ooName" ), aVal ); 118 119 xConfigAccess->getByName(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ooSetupVersion"))) >>= aVal; 120 nIndex = aUserAgent.indexOfAsciiL( RTL_CONSTASCII_STRINGPARAM( "$ooSetupVersion" ) ); 121 if ( !aVal.getLength() || nIndex == -1 ) 122 return; 123 aUserAgent = aUserAgent.replaceAt( nIndex, RTL_CONSTASCII_LENGTH( "$ooSetupVersion" ), aVal ); 124 125 } 126 catch ( const uno::Exception &e ) 127 { 128 OSL_TRACE( "ContentProvider -caught exception! %s", 129 rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr() ); 130 (void) e; 131 } 132 } 133 134 //========================================================================= 135 // virtual 136 ContentProvider::~ContentProvider() 137 { 138 delete m_pProps; 139 } 140 141 //========================================================================= 142 // 143 // XInterface methods. 144 // 145 //========================================================================= 146 147 XINTERFACE_IMPL_3( ContentProvider, 148 lang::XTypeProvider, 149 lang::XServiceInfo, 150 ucb::XContentProvider ); 151 152 //========================================================================= 153 // 154 // XTypeProvider methods. 155 // 156 //========================================================================= 157 158 XTYPEPROVIDER_IMPL_3( ContentProvider, 159 lang::XTypeProvider, 160 lang::XServiceInfo, 161 ucb::XContentProvider ); 162 163 //========================================================================= 164 // 165 // XServiceInfo methods. 166 // 167 //========================================================================= 168 169 XSERVICEINFO_IMPL_1( ContentProvider, 170 rtl::OUString::createFromAscii( 171 "com.sun.star.comp.WebDAVContentProvider" ), 172 rtl::OUString::createFromAscii( 173 WEBDAV_CONTENT_PROVIDER_SERVICE_NAME ) ); 174 175 //========================================================================= 176 // 177 // Service factory implementation. 178 // 179 //========================================================================= 180 181 ONE_INSTANCE_SERVICE_FACTORY_IMPL( ContentProvider ); 182 183 //========================================================================= 184 // 185 // XContentProvider methods. 186 // 187 //========================================================================= 188 189 // virtual 190 uno::Reference< ucb::XContent > SAL_CALL 191 ContentProvider::queryContent( 192 const uno::Reference< 193 ucb::XContentIdentifier >& Identifier ) 194 throw( ucb::IllegalIdentifierException, 195 uno::RuntimeException ) 196 { 197 // Check URL scheme... 198 199 const rtl::OUString aScheme 200 = Identifier->getContentProviderScheme().toAsciiLowerCase(); 201 if ( !aScheme.equalsAsciiL( 202 RTL_CONSTASCII_STRINGPARAM( HTTP_URL_SCHEME ) ) && 203 !aScheme.equalsAsciiL( 204 RTL_CONSTASCII_STRINGPARAM( HTTPS_URL_SCHEME ) ) && 205 !aScheme.equalsAsciiL( 206 RTL_CONSTASCII_STRINGPARAM( WEBDAV_URL_SCHEME ) ) && 207 !aScheme.equalsAsciiL( 208 RTL_CONSTASCII_STRINGPARAM( DAV_URL_SCHEME ) ) && 209 !aScheme.equalsAsciiL( 210 RTL_CONSTASCII_STRINGPARAM( DAVS_URL_SCHEME ) ) ) 211 throw ucb::IllegalIdentifierException(); 212 213 // Normalize URL and create new Id, if nessacary. 214 rtl::OUString aURL = Identifier->getContentIdentifier(); 215 216 // At least: <scheme> + "://" 217 if ( aURL.getLength() < ( aScheme.getLength() + 3 ) ) 218 throw ucb::IllegalIdentifierException(); 219 220 if ( ( aURL.getStr()[ aScheme.getLength() ] != sal_Unicode( ':' ) ) || 221 ( aURL.getStr()[ aScheme.getLength() + 1 ] != sal_Unicode( '/' ) ) || 222 ( aURL.getStr()[ aScheme.getLength() + 2 ] != sal_Unicode( '/' ) ) ) 223 throw ucb::IllegalIdentifierException(); 224 225 uno::Reference< ucb::XContentIdentifier > xCanonicId; 226 227 bool bNewId = false; 228 if ( aScheme.equalsAsciiL( 229 RTL_CONSTASCII_STRINGPARAM( WEBDAV_URL_SCHEME ) ) ) 230 { 231 aURL = aURL.replaceAt( 0, 232 WEBDAV_URL_SCHEME_LENGTH, 233 rtl::OUString::createFromAscii( 234 HTTP_URL_SCHEME ) ); 235 bNewId = true; 236 } 237 else if ( aScheme.equalsAsciiL( 238 RTL_CONSTASCII_STRINGPARAM( DAV_URL_SCHEME ) ) ) 239 { 240 aURL = aURL.replaceAt( 0, 241 DAV_URL_SCHEME_LENGTH, 242 rtl::OUString::createFromAscii( 243 HTTP_URL_SCHEME ) ); 244 bNewId = true; 245 } 246 else if ( aScheme.equalsAsciiL( 247 RTL_CONSTASCII_STRINGPARAM( DAVS_URL_SCHEME ) ) ) 248 { 249 aURL = aURL.replaceAt( 0, 250 DAVS_URL_SCHEME_LENGTH, 251 rtl::OUString::createFromAscii( 252 HTTPS_URL_SCHEME ) ); 253 bNewId = true; 254 } 255 256 sal_Int32 nPos = aURL.lastIndexOf( '/' ); 257 if ( nPos != aURL.getLength() - 1 ) 258 { 259 // Find second slash in URL. 260 nPos = aURL.indexOf( '/', aURL.indexOf( '/' ) + 1 ); 261 if ( nPos == -1 ) 262 throw ucb::IllegalIdentifierException(); 263 264 nPos = aURL.indexOf( '/', nPos + 1 ); 265 if ( nPos == -1 ) 266 { 267 aURL += rtl::OUString::createFromAscii( "/" ); 268 bNewId = true; 269 } 270 } 271 272 if ( bNewId ) 273 xCanonicId = new ::ucbhelper::ContentIdentifier( m_xSMgr, aURL ); 274 else 275 xCanonicId = Identifier; 276 277 osl::MutexGuard aGuard( m_aMutex ); 278 279 // Check, if a content with given id already exists... 280 uno::Reference< ucb::XContent > xContent 281 = queryExistingContent( xCanonicId ).get(); 282 if ( xContent.is() ) 283 return xContent; 284 285 // Create a new content. 286 287 try 288 { 289 xContent = new ::http_dav_ucp::Content( 290 m_xSMgr, this, xCanonicId, m_xDAVSessionFactory ); 291 registerNewContent( xContent ); 292 } 293 catch ( ucb::ContentCreationException const & ) 294 { 295 throw ucb::IllegalIdentifierException(); 296 } 297 298 if ( !xContent->getIdentifier().is() ) 299 throw ucb::IllegalIdentifierException(); 300 301 return xContent; 302 } 303 304