1*2f86921cSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*2f86921cSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*2f86921cSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*2f86921cSAndrew Rist * distributed with this work for additional information 6*2f86921cSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*2f86921cSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*2f86921cSAndrew Rist * "License"); you may not use this file except in compliance 9*2f86921cSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*2f86921cSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*2f86921cSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*2f86921cSAndrew Rist * software distributed under the License is distributed on an 15*2f86921cSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*2f86921cSAndrew Rist * KIND, either express or implied. See the License for the 17*2f86921cSAndrew Rist * specific language governing permissions and limitations 18*2f86921cSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*2f86921cSAndrew Rist *************************************************************/ 21*2f86921cSAndrew Rist 22*2f86921cSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_ucb.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir /************************************************************************** 28cdf0e10cSrcweir TODO 29cdf0e10cSrcweir ************************************************************************** 30cdf0e10cSrcweir 31cdf0e10cSrcweir *************************************************************************/ 32cdf0e10cSrcweir #include <osl/diagnose.h> 33cdf0e10cSrcweir #include <com/sun/star/util/DateTime.hpp> 34cdf0e10cSrcweir #include "NeonUri.hxx" 35cdf0e10cSrcweir #include "DAVResource.hxx" 36cdf0e10cSrcweir #include "DAVProperties.hxx" 37cdf0e10cSrcweir #include "DateTimeHelper.hxx" 38cdf0e10cSrcweir #include "webdavprovider.hxx" 39cdf0e10cSrcweir #include "ContentProperties.hxx" 40cdf0e10cSrcweir 41cdf0e10cSrcweir using namespace com::sun::star; 42cdf0e10cSrcweir using namespace webdav_ucp; 43cdf0e10cSrcweir 44cdf0e10cSrcweir /* 45cdf0e10cSrcweir ============================================================================= 46cdf0e10cSrcweir 47cdf0e10cSrcweir Property Mapping 48cdf0e10cSrcweir 49cdf0e10cSrcweir ============================================================================= 50cdf0e10cSrcweir HTTP (entity header) WebDAV (property) UCB (property) 51cdf0e10cSrcweir ============================================================================= 52cdf0e10cSrcweir 53cdf0e10cSrcweir Allow 54cdf0e10cSrcweir Content-Encoding 55cdf0e10cSrcweir Content-Language getcontentlanguage 56cdf0e10cSrcweir Content-Length getcontentlength Size 57cdf0e10cSrcweir Content-Location 58cdf0e10cSrcweir Content-MD5 59cdf0e10cSrcweir Content-Range 60cdf0e10cSrcweir Content-Type getcontenttype MediaType 61cdf0e10cSrcweir Expires 62cdf0e10cSrcweir Last-Modified getlastmodified DateModified 63cdf0e10cSrcweir creationdate DateCreated 64cdf0e10cSrcweir resourcetype IsFolder,IsDocument,ContentType 65cdf0e10cSrcweir displayname 66cdf0e10cSrcweir ETag (actually getetag 67cdf0e10cSrcweir a response header ) 68cdf0e10cSrcweir lockdiscovery 69cdf0e10cSrcweir supportedlock 70cdf0e10cSrcweir source 71cdf0e10cSrcweir Title (always taken from URI) 72cdf0e10cSrcweir 73cdf0e10cSrcweir ============================================================================= 74cdf0e10cSrcweir 75cdf0e10cSrcweir Important: HTTP headers will not be mapped to DAV properties; only to UCB 76cdf0e10cSrcweir properties. (Content-Length,Content-Type,Last-Modified) 77cdf0e10cSrcweir */ 78cdf0e10cSrcweir 79cdf0e10cSrcweir //========================================================================= 80cdf0e10cSrcweir //========================================================================= 81cdf0e10cSrcweir // 82cdf0e10cSrcweir // ContentProperties Implementation. 83cdf0e10cSrcweir // 84cdf0e10cSrcweir //========================================================================= 85cdf0e10cSrcweir //========================================================================= 86cdf0e10cSrcweir 87cdf0e10cSrcweir // static member! 88cdf0e10cSrcweir uno::Any ContentProperties::m_aEmptyAny; 89cdf0e10cSrcweir 90cdf0e10cSrcweir ContentProperties::ContentProperties( const DAVResource& rResource ) 91cdf0e10cSrcweir : m_xProps( new PropertyValueMap ), 92cdf0e10cSrcweir m_bTrailingSlash( false ) 93cdf0e10cSrcweir { 94cdf0e10cSrcweir OSL_ENSURE( rResource.uri.getLength(), 95cdf0e10cSrcweir "ContentProperties ctor - Empty resource URI!" ); 96cdf0e10cSrcweir 97cdf0e10cSrcweir // Title 98cdf0e10cSrcweir try 99cdf0e10cSrcweir { 100cdf0e10cSrcweir NeonUri aURI( rResource.uri ); 101cdf0e10cSrcweir m_aEscapedTitle = aURI.GetPathBaseName(); 102cdf0e10cSrcweir 103cdf0e10cSrcweir (*m_xProps)[ rtl::OUString::createFromAscii( "Title" ) ] 104cdf0e10cSrcweir = PropertyValue( 105cdf0e10cSrcweir uno::makeAny( aURI.GetPathBaseNameUnescaped() ), true ); 106cdf0e10cSrcweir } 107cdf0e10cSrcweir catch ( DAVException const & ) 108cdf0e10cSrcweir { 109cdf0e10cSrcweir (*m_xProps)[ rtl::OUString::createFromAscii( "Title" ) ] 110cdf0e10cSrcweir = PropertyValue( 111cdf0e10cSrcweir uno::makeAny( 112cdf0e10cSrcweir rtl::OUString( 113cdf0e10cSrcweir RTL_CONSTASCII_USTRINGPARAM( "*** unknown ***" ) ) ), 114cdf0e10cSrcweir true ); 115cdf0e10cSrcweir } 116cdf0e10cSrcweir 117cdf0e10cSrcweir std::vector< DAVPropertyValue >::const_iterator it 118cdf0e10cSrcweir = rResource.properties.begin(); 119cdf0e10cSrcweir std::vector< DAVPropertyValue >::const_iterator end 120cdf0e10cSrcweir = rResource.properties.end(); 121cdf0e10cSrcweir 122cdf0e10cSrcweir while ( it != end ) 123cdf0e10cSrcweir { 124cdf0e10cSrcweir addProperty( (*it) ); 125cdf0e10cSrcweir ++it; 126cdf0e10cSrcweir } 127cdf0e10cSrcweir 128cdf0e10cSrcweir if ( rResource.uri.getStr()[ rResource.uri.getLength() - 1 ] 129cdf0e10cSrcweir == sal_Unicode( '/' ) ) 130cdf0e10cSrcweir m_bTrailingSlash = sal_True; 131cdf0e10cSrcweir } 132cdf0e10cSrcweir 133cdf0e10cSrcweir //========================================================================= 134cdf0e10cSrcweir ContentProperties::ContentProperties( 135cdf0e10cSrcweir const rtl::OUString & rTitle, sal_Bool bFolder ) 136cdf0e10cSrcweir : m_xProps( new PropertyValueMap ), 137cdf0e10cSrcweir m_bTrailingSlash( sal_False ) 138cdf0e10cSrcweir { 139cdf0e10cSrcweir (*m_xProps)[ rtl::OUString::createFromAscii( "Title" ) ] 140cdf0e10cSrcweir = PropertyValue( uno::makeAny( rTitle ), true ); 141cdf0e10cSrcweir (*m_xProps)[ rtl::OUString::createFromAscii( "IsFolder" ) ] 142cdf0e10cSrcweir = PropertyValue( uno::makeAny( bFolder ), true ); 143cdf0e10cSrcweir (*m_xProps)[ rtl::OUString::createFromAscii( "IsDocument" ) ] 144cdf0e10cSrcweir = PropertyValue( uno::makeAny( sal_Bool( !bFolder ) ), true ); 145cdf0e10cSrcweir } 146cdf0e10cSrcweir 147cdf0e10cSrcweir //========================================================================= 148cdf0e10cSrcweir ContentProperties::ContentProperties( const rtl::OUString & rTitle ) 149cdf0e10cSrcweir : m_xProps( new PropertyValueMap ), 150cdf0e10cSrcweir m_bTrailingSlash( sal_False ) 151cdf0e10cSrcweir { 152cdf0e10cSrcweir (*m_xProps)[ rtl::OUString::createFromAscii( "Title" ) ] 153cdf0e10cSrcweir = PropertyValue( uno::makeAny( rTitle ), true ); 154cdf0e10cSrcweir } 155cdf0e10cSrcweir 156cdf0e10cSrcweir //========================================================================= 157cdf0e10cSrcweir ContentProperties::ContentProperties() 158cdf0e10cSrcweir : m_xProps( new PropertyValueMap ), 159cdf0e10cSrcweir m_bTrailingSlash( sal_False ) 160cdf0e10cSrcweir { 161cdf0e10cSrcweir } 162cdf0e10cSrcweir 163cdf0e10cSrcweir //========================================================================= 164cdf0e10cSrcweir ContentProperties::ContentProperties( const ContentProperties & rOther ) 165cdf0e10cSrcweir : m_aEscapedTitle( rOther.m_aEscapedTitle ), 166cdf0e10cSrcweir m_xProps( rOther.m_xProps.get() 167cdf0e10cSrcweir ? new PropertyValueMap( *rOther.m_xProps ) 168cdf0e10cSrcweir : new PropertyValueMap ), 169cdf0e10cSrcweir m_bTrailingSlash( rOther.m_bTrailingSlash ) 170cdf0e10cSrcweir { 171cdf0e10cSrcweir } 172cdf0e10cSrcweir 173cdf0e10cSrcweir //========================================================================= 174cdf0e10cSrcweir bool ContentProperties::contains( const rtl::OUString & rName ) const 175cdf0e10cSrcweir { 176cdf0e10cSrcweir if ( get( rName ) ) 177cdf0e10cSrcweir return true; 178cdf0e10cSrcweir else 179cdf0e10cSrcweir return false; 180cdf0e10cSrcweir } 181cdf0e10cSrcweir 182cdf0e10cSrcweir //========================================================================= 183cdf0e10cSrcweir const uno::Any & ContentProperties::getValue( 184cdf0e10cSrcweir const rtl::OUString & rName ) const 185cdf0e10cSrcweir { 186cdf0e10cSrcweir const PropertyValue * pProp = get( rName ); 187cdf0e10cSrcweir if ( pProp ) 188cdf0e10cSrcweir return pProp->value(); 189cdf0e10cSrcweir else 190cdf0e10cSrcweir return m_aEmptyAny; 191cdf0e10cSrcweir } 192cdf0e10cSrcweir 193cdf0e10cSrcweir //========================================================================= 194cdf0e10cSrcweir const PropertyValue * ContentProperties::get( 195cdf0e10cSrcweir const rtl::OUString & rName ) const 196cdf0e10cSrcweir { 197cdf0e10cSrcweir PropertyValueMap::const_iterator it = m_xProps->find( rName ); 198cdf0e10cSrcweir const PropertyValueMap::const_iterator end = m_xProps->end(); 199cdf0e10cSrcweir 200cdf0e10cSrcweir if ( it == end ) 201cdf0e10cSrcweir { 202cdf0e10cSrcweir it = m_xProps->begin(); 203cdf0e10cSrcweir while ( it != end ) 204cdf0e10cSrcweir { 205cdf0e10cSrcweir if ( (*it).first.equalsIgnoreAsciiCase( rName ) ) 206cdf0e10cSrcweir return &(*it).second; 207cdf0e10cSrcweir 208cdf0e10cSrcweir ++it; 209cdf0e10cSrcweir } 210cdf0e10cSrcweir return 0; 211cdf0e10cSrcweir } 212cdf0e10cSrcweir else 213cdf0e10cSrcweir return &(*it).second; 214cdf0e10cSrcweir } 215cdf0e10cSrcweir 216cdf0e10cSrcweir //========================================================================= 217cdf0e10cSrcweir // static 218cdf0e10cSrcweir void ContentProperties::UCBNamesToDAVNames( 219cdf0e10cSrcweir const uno::Sequence< beans::Property > & rProps, 220cdf0e10cSrcweir std::vector< rtl::OUString > & propertyNames, 221cdf0e10cSrcweir bool bIncludeUnmatched /* = true */ ) 222cdf0e10cSrcweir { 223cdf0e10cSrcweir ////////////////////////////////////////////////////////////// 224cdf0e10cSrcweir // Assemble list of DAV properties to obtain from server. 225cdf0e10cSrcweir // Append DAV properties needed to obtain requested UCB props. 226cdf0e10cSrcweir ////////////////////////////////////////////////////////////// 227cdf0e10cSrcweir 228cdf0e10cSrcweir // DAV UCB 229cdf0e10cSrcweir // creationdate <- DateCreated 230cdf0e10cSrcweir // getlastmodified <- DateModified 231cdf0e10cSrcweir // getcontenttype <- MediaType 232cdf0e10cSrcweir // getcontentlength <- Size 233cdf0e10cSrcweir // resourcetype <- IsFolder, IsDocument, ContentType 234cdf0e10cSrcweir // (taken from URI) <- Title 235cdf0e10cSrcweir 236cdf0e10cSrcweir sal_Bool bCreationDate = sal_False; 237cdf0e10cSrcweir sal_Bool bLastModified = sal_False; 238cdf0e10cSrcweir sal_Bool bContentType = sal_False; 239cdf0e10cSrcweir sal_Bool bContentLength = sal_False; 240cdf0e10cSrcweir sal_Bool bResourceType = sal_False; 241cdf0e10cSrcweir 242cdf0e10cSrcweir sal_Int32 nCount = rProps.getLength(); 243cdf0e10cSrcweir for ( sal_Int32 n = 0; n < nCount; ++n ) 244cdf0e10cSrcweir { 245cdf0e10cSrcweir const beans::Property & rProp = rProps[ n ]; 246cdf0e10cSrcweir 247cdf0e10cSrcweir if ( rProp.Name.equalsAsciiL( 248cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "Title" ) ) ) 249cdf0e10cSrcweir { 250cdf0e10cSrcweir // Title is always obtained from resource's URI. 251cdf0e10cSrcweir continue; 252cdf0e10cSrcweir } 253cdf0e10cSrcweir else if ( rProp.Name.equalsAsciiL( 254cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "DateCreated" ) ) 255cdf0e10cSrcweir || 256cdf0e10cSrcweir ( rProp.Name == DAVProperties::CREATIONDATE ) ) 257cdf0e10cSrcweir { 258cdf0e10cSrcweir if ( !bCreationDate ) 259cdf0e10cSrcweir { 260cdf0e10cSrcweir propertyNames.push_back( DAVProperties::CREATIONDATE ); 261cdf0e10cSrcweir bCreationDate = sal_True; 262cdf0e10cSrcweir } 263cdf0e10cSrcweir } 264cdf0e10cSrcweir else if ( rProp.Name.equalsAsciiL( 265cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "DateModified" ) ) 266cdf0e10cSrcweir || 267cdf0e10cSrcweir ( rProp.Name == DAVProperties::GETLASTMODIFIED ) ) 268cdf0e10cSrcweir { 269cdf0e10cSrcweir if ( !bLastModified ) 270cdf0e10cSrcweir { 271cdf0e10cSrcweir propertyNames.push_back( 272cdf0e10cSrcweir DAVProperties::GETLASTMODIFIED ); 273cdf0e10cSrcweir bLastModified = sal_True; 274cdf0e10cSrcweir } 275cdf0e10cSrcweir } 276cdf0e10cSrcweir else if ( rProp.Name.equalsAsciiL( 277cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "MediaType" ) ) 278cdf0e10cSrcweir || 279cdf0e10cSrcweir ( rProp.Name == DAVProperties::GETCONTENTTYPE ) ) 280cdf0e10cSrcweir { 281cdf0e10cSrcweir if ( !bContentType ) 282cdf0e10cSrcweir { 283cdf0e10cSrcweir propertyNames.push_back( 284cdf0e10cSrcweir DAVProperties::GETCONTENTTYPE ); 285cdf0e10cSrcweir bContentType = sal_True; 286cdf0e10cSrcweir } 287cdf0e10cSrcweir } 288cdf0e10cSrcweir else if ( rProp.Name.equalsAsciiL( 289cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "Size" ) ) 290cdf0e10cSrcweir || 291cdf0e10cSrcweir ( rProp.Name == DAVProperties::GETCONTENTLENGTH ) ) 292cdf0e10cSrcweir { 293cdf0e10cSrcweir if ( !bContentLength ) 294cdf0e10cSrcweir { 295cdf0e10cSrcweir propertyNames.push_back( 296cdf0e10cSrcweir DAVProperties::GETCONTENTLENGTH ); 297cdf0e10cSrcweir bContentLength = sal_True; 298cdf0e10cSrcweir } 299cdf0e10cSrcweir } 300cdf0e10cSrcweir else if ( rProp.Name.equalsAsciiL( 301cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "ContentType" ) ) 302cdf0e10cSrcweir || 303cdf0e10cSrcweir rProp.Name.equalsAsciiL( 304cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "IsDocument" ) ) 305cdf0e10cSrcweir || 306cdf0e10cSrcweir rProp.Name.equalsAsciiL( 307cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "IsFolder" ) ) 308cdf0e10cSrcweir || 309cdf0e10cSrcweir ( rProp.Name == DAVProperties::RESOURCETYPE ) ) 310cdf0e10cSrcweir { 311cdf0e10cSrcweir if ( !bResourceType ) 312cdf0e10cSrcweir { 313cdf0e10cSrcweir propertyNames.push_back( DAVProperties::RESOURCETYPE ); 314cdf0e10cSrcweir bResourceType = sal_True; 315cdf0e10cSrcweir } 316cdf0e10cSrcweir } 317cdf0e10cSrcweir else 318cdf0e10cSrcweir { 319cdf0e10cSrcweir if ( bIncludeUnmatched ) 320cdf0e10cSrcweir propertyNames.push_back( rProp.Name ); 321cdf0e10cSrcweir } 322cdf0e10cSrcweir } 323cdf0e10cSrcweir } 324cdf0e10cSrcweir 325cdf0e10cSrcweir //========================================================================= 326cdf0e10cSrcweir // static 327cdf0e10cSrcweir void ContentProperties::UCBNamesToHTTPNames( 328cdf0e10cSrcweir const uno::Sequence< beans::Property > & rProps, 329cdf0e10cSrcweir std::vector< rtl::OUString > & propertyNames, 330cdf0e10cSrcweir bool bIncludeUnmatched /* = true */ ) 331cdf0e10cSrcweir { 332cdf0e10cSrcweir ////////////////////////////////////////////////////////////// 333cdf0e10cSrcweir // Assemble list of HTTP header names to obtain from server. 334cdf0e10cSrcweir // Append HTTP headers needed to obtain requested UCB props. 335cdf0e10cSrcweir ////////////////////////////////////////////////////////////// 336cdf0e10cSrcweir 337cdf0e10cSrcweir // HTTP UCB 338cdf0e10cSrcweir // Last-Modified <- DateModified 339cdf0e10cSrcweir // Content-Type <- MediaType 340cdf0e10cSrcweir // Content-Length <- Size 341cdf0e10cSrcweir 342cdf0e10cSrcweir sal_Int32 nCount = rProps.getLength(); 343cdf0e10cSrcweir for ( sal_Int32 n = 0; n < nCount; ++n ) 344cdf0e10cSrcweir { 345cdf0e10cSrcweir const beans::Property & rProp = rProps[ n ]; 346cdf0e10cSrcweir 347cdf0e10cSrcweir if ( rProp.Name.equalsAsciiL( 348cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "DateModified" ) ) ) 349cdf0e10cSrcweir { 350cdf0e10cSrcweir propertyNames.push_back( 351cdf0e10cSrcweir rtl::OUString::createFromAscii( "Last-Modified" ) ); 352cdf0e10cSrcweir } 353cdf0e10cSrcweir else if ( rProp.Name.equalsAsciiL( 354cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "MediaType" ) ) ) 355cdf0e10cSrcweir { 356cdf0e10cSrcweir propertyNames.push_back( 357cdf0e10cSrcweir rtl::OUString::createFromAscii( "Content-Type" ) ); 358cdf0e10cSrcweir } 359cdf0e10cSrcweir else if ( rProp.Name.equalsAsciiL( 360cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "Size" ) ) ) 361cdf0e10cSrcweir { 362cdf0e10cSrcweir propertyNames.push_back( 363cdf0e10cSrcweir rtl::OUString::createFromAscii( "Content-Length" ) ); 364cdf0e10cSrcweir } 365cdf0e10cSrcweir else 366cdf0e10cSrcweir { 367cdf0e10cSrcweir if ( bIncludeUnmatched ) 368cdf0e10cSrcweir propertyNames.push_back( rProp.Name ); 369cdf0e10cSrcweir } 370cdf0e10cSrcweir } 371cdf0e10cSrcweir } 372cdf0e10cSrcweir 373cdf0e10cSrcweir //========================================================================= 374cdf0e10cSrcweir bool ContentProperties::containsAllNames( 375cdf0e10cSrcweir const uno::Sequence< beans::Property >& rProps, 376cdf0e10cSrcweir std::vector< rtl::OUString > & rNamesNotContained ) const 377cdf0e10cSrcweir { 378cdf0e10cSrcweir rNamesNotContained.clear(); 379cdf0e10cSrcweir 380cdf0e10cSrcweir sal_Int32 nCount = rProps.getLength(); 381cdf0e10cSrcweir for ( sal_Int32 n = 0; n < nCount; ++n ) 382cdf0e10cSrcweir { 383cdf0e10cSrcweir const rtl::OUString & rName = rProps[ n ].Name; 384cdf0e10cSrcweir if ( !contains( rName ) ) 385cdf0e10cSrcweir { 386cdf0e10cSrcweir // Not found. 387cdf0e10cSrcweir rNamesNotContained.push_back( rName ); 388cdf0e10cSrcweir } 389cdf0e10cSrcweir } 390cdf0e10cSrcweir 391cdf0e10cSrcweir return ( rNamesNotContained.size() == 0 ); 392cdf0e10cSrcweir } 393cdf0e10cSrcweir 394cdf0e10cSrcweir //========================================================================= 395cdf0e10cSrcweir void ContentProperties::addProperties( 396cdf0e10cSrcweir const std::vector< rtl::OUString > & rProps, 397cdf0e10cSrcweir const ContentProperties & rContentProps ) 398cdf0e10cSrcweir { 399cdf0e10cSrcweir std::vector< rtl::OUString >::const_iterator it = rProps.begin(); 400cdf0e10cSrcweir std::vector< rtl::OUString >::const_iterator end = rProps.end(); 401cdf0e10cSrcweir 402cdf0e10cSrcweir while ( it != end ) 403cdf0e10cSrcweir { 404cdf0e10cSrcweir const rtl::OUString & rName = (*it); 405cdf0e10cSrcweir 406cdf0e10cSrcweir if ( !contains( rName ) ) // ignore duplicates 407cdf0e10cSrcweir { 408cdf0e10cSrcweir const PropertyValue * pProp = rContentProps.get( rName ); 409cdf0e10cSrcweir if ( pProp ) 410cdf0e10cSrcweir { 411cdf0e10cSrcweir // Add it. 412cdf0e10cSrcweir addProperty( rName, pProp->value(), pProp->isCaseSensitive() ); 413cdf0e10cSrcweir } 414cdf0e10cSrcweir else 415cdf0e10cSrcweir { 416cdf0e10cSrcweir addProperty( rName, uno::Any(), false ); 417cdf0e10cSrcweir } 418cdf0e10cSrcweir } 419cdf0e10cSrcweir ++it; 420cdf0e10cSrcweir } 421cdf0e10cSrcweir } 422cdf0e10cSrcweir 423cdf0e10cSrcweir //========================================================================= 424cdf0e10cSrcweir void ContentProperties::addProperties( const ContentProperties & rProps ) 425cdf0e10cSrcweir { 426cdf0e10cSrcweir PropertyValueMap::const_iterator it = rProps.m_xProps->begin(); 427cdf0e10cSrcweir const PropertyValueMap::const_iterator end = rProps.m_xProps->end(); 428cdf0e10cSrcweir 429cdf0e10cSrcweir while ( it != end ) 430cdf0e10cSrcweir { 431cdf0e10cSrcweir addProperty( 432cdf0e10cSrcweir (*it).first, (*it).second.value(), (*it).second.isCaseSensitive() ); 433cdf0e10cSrcweir ++it; 434cdf0e10cSrcweir } 435cdf0e10cSrcweir } 436cdf0e10cSrcweir 437cdf0e10cSrcweir //========================================================================= 438cdf0e10cSrcweir void ContentProperties::addProperties( 439cdf0e10cSrcweir const std::vector< DAVPropertyValue > & rProps ) 440cdf0e10cSrcweir { 441cdf0e10cSrcweir std::vector< DAVPropertyValue >::const_iterator it = rProps.begin(); 442cdf0e10cSrcweir const std::vector< DAVPropertyValue >::const_iterator end = rProps.end(); 443cdf0e10cSrcweir 444cdf0e10cSrcweir while ( it != end ) 445cdf0e10cSrcweir { 446cdf0e10cSrcweir addProperty( (*it) ); 447cdf0e10cSrcweir ++it; 448cdf0e10cSrcweir } 449cdf0e10cSrcweir } 450cdf0e10cSrcweir 451cdf0e10cSrcweir //========================================================================= 452cdf0e10cSrcweir void ContentProperties::addProperty( const DAVPropertyValue & rProp ) 453cdf0e10cSrcweir { 454cdf0e10cSrcweir addProperty( rProp.Name, rProp.Value, rProp.IsCaseSensitive ); 455cdf0e10cSrcweir } 456cdf0e10cSrcweir 457cdf0e10cSrcweir //========================================================================= 458cdf0e10cSrcweir void ContentProperties::addProperty( const rtl::OUString & rName, 459cdf0e10cSrcweir const com::sun::star::uno::Any & rValue, 460cdf0e10cSrcweir bool bIsCaseSensitive ) 461cdf0e10cSrcweir { 462cdf0e10cSrcweir if ( rName.equals( DAVProperties::CREATIONDATE ) ) 463cdf0e10cSrcweir { 464cdf0e10cSrcweir // Map DAV:creationdate to UCP:DateCreated 465cdf0e10cSrcweir rtl::OUString aValue; 466cdf0e10cSrcweir rValue >>= aValue; 467cdf0e10cSrcweir util::DateTime aDate; 468cdf0e10cSrcweir DateTimeHelper::convert( aValue, aDate ); 469cdf0e10cSrcweir 470cdf0e10cSrcweir (*m_xProps)[ rtl::OUString::createFromAscii( "DateCreated" ) ] 471cdf0e10cSrcweir = PropertyValue( uno::makeAny( aDate ), true ); 472cdf0e10cSrcweir } 473cdf0e10cSrcweir // else if ( rName.equals( DAVProperties::DISPLAYNAME ) ) 474cdf0e10cSrcweir // { 475cdf0e10cSrcweir // } 476cdf0e10cSrcweir // else if ( rName.equals( DAVProperties::GETCONTENTLANGUAGE ) ) 477cdf0e10cSrcweir // { 478cdf0e10cSrcweir // } 479cdf0e10cSrcweir else if ( rName.equals( DAVProperties::GETCONTENTLENGTH ) ) 480cdf0e10cSrcweir { 481cdf0e10cSrcweir // Map DAV:getcontentlength to UCP:Size 482cdf0e10cSrcweir rtl::OUString aValue; 483cdf0e10cSrcweir rValue >>= aValue; 484cdf0e10cSrcweir 485cdf0e10cSrcweir (*m_xProps)[ rtl::OUString::createFromAscii( "Size" ) ] 486cdf0e10cSrcweir = PropertyValue( uno::makeAny( aValue.toInt64() ), true ); 487cdf0e10cSrcweir } 488cdf0e10cSrcweir else if ( rName.equalsAsciiL( 489cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "Content-Length" ) ) ) 490cdf0e10cSrcweir { 491cdf0e10cSrcweir // Do NOT map Content-Lenght entity header to DAV:getcontentlength! 492cdf0e10cSrcweir // Only DAV resources have this property. 493cdf0e10cSrcweir 494cdf0e10cSrcweir // Map Content-Length entity header to UCP:Size 495cdf0e10cSrcweir rtl::OUString aValue; 496cdf0e10cSrcweir rValue >>= aValue; 497cdf0e10cSrcweir 498cdf0e10cSrcweir (*m_xProps)[ rtl::OUString::createFromAscii( "Size" ) ] 499cdf0e10cSrcweir = PropertyValue( uno::makeAny( aValue.toInt64() ), true ); 500cdf0e10cSrcweir } 501cdf0e10cSrcweir else if ( rName.equals( DAVProperties::GETCONTENTTYPE ) ) 502cdf0e10cSrcweir { 503cdf0e10cSrcweir // Map DAV:getcontenttype to UCP:MediaType (1:1) 504cdf0e10cSrcweir (*m_xProps)[ rtl::OUString::createFromAscii( "MediaType" ) ] 505cdf0e10cSrcweir = PropertyValue( rValue, true ); 506cdf0e10cSrcweir } 507cdf0e10cSrcweir else if ( rName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Content-Type" ) ) ) 508cdf0e10cSrcweir { 509cdf0e10cSrcweir // Do NOT map Content-Type entity header to DAV:getcontenttype! 510cdf0e10cSrcweir // Only DAV resources have this property. 511cdf0e10cSrcweir 512cdf0e10cSrcweir // Map DAV:getcontenttype to UCP:MediaType (1:1) 513cdf0e10cSrcweir (*m_xProps)[ rtl::OUString::createFromAscii( "MediaType" ) ] 514cdf0e10cSrcweir = PropertyValue( rValue, true ); 515cdf0e10cSrcweir } 516cdf0e10cSrcweir // else if ( rName.equals( DAVProperties::GETETAG ) ) 517cdf0e10cSrcweir // { 518cdf0e10cSrcweir // } 519cdf0e10cSrcweir else if ( rName.equals( DAVProperties::GETLASTMODIFIED ) ) 520cdf0e10cSrcweir { 521cdf0e10cSrcweir // Map the DAV:getlastmodified entity header to UCP:DateModified 522cdf0e10cSrcweir rtl::OUString aValue; 523cdf0e10cSrcweir rValue >>= aValue; 524cdf0e10cSrcweir util::DateTime aDate; 525cdf0e10cSrcweir DateTimeHelper::convert( aValue, aDate ); 526cdf0e10cSrcweir 527cdf0e10cSrcweir (*m_xProps)[ rtl::OUString::createFromAscii( "DateModified" ) ] 528cdf0e10cSrcweir = PropertyValue( uno::makeAny( aDate ), true ); 529cdf0e10cSrcweir } 530cdf0e10cSrcweir else if ( rName.equalsAsciiL( 531cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "Last-Modified" ) ) ) 532cdf0e10cSrcweir { 533cdf0e10cSrcweir // Do not map Last-Modified entity header to DAV:getlastmodified! 534cdf0e10cSrcweir // Only DAV resources have this property. 535cdf0e10cSrcweir 536cdf0e10cSrcweir // Map the Last-Modified entity header to UCP:DateModified 537cdf0e10cSrcweir rtl::OUString aValue; 538cdf0e10cSrcweir rValue >>= aValue; 539cdf0e10cSrcweir util::DateTime aDate; 540cdf0e10cSrcweir DateTimeHelper::convert( aValue, aDate ); 541cdf0e10cSrcweir 542cdf0e10cSrcweir (*m_xProps)[ rtl::OUString::createFromAscii( "DateModified" ) ] 543cdf0e10cSrcweir = PropertyValue( uno::makeAny( aDate ), true ); 544cdf0e10cSrcweir } 545cdf0e10cSrcweir // else if ( rName.equals( DAVProperties::LOCKDISCOVERY ) ) 546cdf0e10cSrcweir // { 547cdf0e10cSrcweir // } 548cdf0e10cSrcweir else if ( rName.equals( DAVProperties::RESOURCETYPE ) ) 549cdf0e10cSrcweir { 550cdf0e10cSrcweir rtl::OUString aValue; 551cdf0e10cSrcweir rValue >>= aValue; 552cdf0e10cSrcweir 553cdf0e10cSrcweir // Map DAV:resourceype to UCP:IsFolder, UCP:IsDocument, UCP:ContentType 554cdf0e10cSrcweir sal_Bool bFolder = 555cdf0e10cSrcweir aValue.equalsIgnoreAsciiCaseAsciiL( 556cdf0e10cSrcweir RTL_CONSTASCII_STRINGPARAM( "collection" ) ); 557cdf0e10cSrcweir 558cdf0e10cSrcweir (*m_xProps)[ rtl::OUString::createFromAscii( "IsFolder" ) ] 559cdf0e10cSrcweir = PropertyValue( uno::makeAny( bFolder ), true ); 560cdf0e10cSrcweir (*m_xProps)[ rtl::OUString::createFromAscii( "IsDocument" ) ] 561cdf0e10cSrcweir = PropertyValue( uno::makeAny( sal_Bool( !bFolder ) ), true ); 562cdf0e10cSrcweir (*m_xProps)[ rtl::OUString::createFromAscii( "ContentType" ) ] 563cdf0e10cSrcweir = PropertyValue( uno::makeAny( bFolder 564cdf0e10cSrcweir ? rtl::OUString::createFromAscii( WEBDAV_COLLECTION_TYPE ) 565cdf0e10cSrcweir : rtl::OUString::createFromAscii( WEBDAV_CONTENT_TYPE ) ), true ); 566cdf0e10cSrcweir } 567cdf0e10cSrcweir // else if ( rName.equals( DAVProperties::SOURCE ) ) 568cdf0e10cSrcweir // { 569cdf0e10cSrcweir // } 570cdf0e10cSrcweir // else if ( rName.equals( DAVProperties::SUPPORTEDLOCK ) ) 571cdf0e10cSrcweir // { 572cdf0e10cSrcweir // } 573cdf0e10cSrcweir 574cdf0e10cSrcweir // Save property. 575cdf0e10cSrcweir (*m_xProps)[ rName ] = PropertyValue( rValue, bIsCaseSensitive ); 576cdf0e10cSrcweir } 577cdf0e10cSrcweir 578cdf0e10cSrcweir //========================================================================= 579cdf0e10cSrcweir //========================================================================= 580cdf0e10cSrcweir // 581cdf0e10cSrcweir // CachableContentProperties Implementation. 582cdf0e10cSrcweir // 583cdf0e10cSrcweir //========================================================================= 584cdf0e10cSrcweir //========================================================================= 585cdf0e10cSrcweir 586cdf0e10cSrcweir namespace 587cdf0e10cSrcweir { 588cdf0e10cSrcweir bool isCachable( rtl::OUString const & rName, 589cdf0e10cSrcweir bool isCaseSensitive ) 590cdf0e10cSrcweir { 591cdf0e10cSrcweir static rtl::OUString aNonCachableProps [] = 592cdf0e10cSrcweir { 593cdf0e10cSrcweir DAVProperties::LOCKDISCOVERY, 594cdf0e10cSrcweir 595cdf0e10cSrcweir DAVProperties::GETETAG, 596cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ETag" ) ), 597cdf0e10cSrcweir 598cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DateModified" ) ), 599cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Last-Modified" ) ), 600cdf0e10cSrcweir DAVProperties::GETLASTMODIFIED, 601cdf0e10cSrcweir 602cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Size" ) ), 603cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Content-Length" ) ), 604cdf0e10cSrcweir DAVProperties::GETCONTENTLENGTH, 605cdf0e10cSrcweir 606cdf0e10cSrcweir rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Date" ) ) 607cdf0e10cSrcweir }; 608cdf0e10cSrcweir 609cdf0e10cSrcweir for ( sal_uInt32 n = 0; 610cdf0e10cSrcweir n < ( sizeof( aNonCachableProps ) 611cdf0e10cSrcweir / sizeof( aNonCachableProps[ 0 ] ) ); 612cdf0e10cSrcweir ++n ) 613cdf0e10cSrcweir { 614cdf0e10cSrcweir if ( isCaseSensitive ) 615cdf0e10cSrcweir { 616cdf0e10cSrcweir if ( rName.equals( aNonCachableProps[ n ] ) ) 617cdf0e10cSrcweir return false; 618cdf0e10cSrcweir } 619cdf0e10cSrcweir else 620cdf0e10cSrcweir if ( rName.equalsIgnoreAsciiCase( aNonCachableProps[ n ] ) ) 621cdf0e10cSrcweir return false; 622cdf0e10cSrcweir } 623cdf0e10cSrcweir return true; 624cdf0e10cSrcweir } 625cdf0e10cSrcweir 626cdf0e10cSrcweir } // namespace 627cdf0e10cSrcweir 628cdf0e10cSrcweir //========================================================================= 629cdf0e10cSrcweir CachableContentProperties::CachableContentProperties( 630cdf0e10cSrcweir const ContentProperties & rProps ) 631cdf0e10cSrcweir { 632cdf0e10cSrcweir addProperties( rProps ); 633cdf0e10cSrcweir } 634cdf0e10cSrcweir 635cdf0e10cSrcweir //========================================================================= 636cdf0e10cSrcweir void CachableContentProperties::addProperties( 637cdf0e10cSrcweir const ContentProperties & rProps ) 638cdf0e10cSrcweir { 639cdf0e10cSrcweir const std::auto_ptr< PropertyValueMap > & props = rProps.getProperties(); 640cdf0e10cSrcweir 641cdf0e10cSrcweir PropertyValueMap::const_iterator it = props->begin(); 642cdf0e10cSrcweir const PropertyValueMap::const_iterator end = props->end(); 643cdf0e10cSrcweir 644cdf0e10cSrcweir while ( it != end ) 645cdf0e10cSrcweir { 646cdf0e10cSrcweir if ( isCachable( (*it).first, (*it).second.isCaseSensitive() ) ) 647cdf0e10cSrcweir m_aProps.addProperty( (*it).first, 648cdf0e10cSrcweir (*it).second.value(), 649cdf0e10cSrcweir (*it).second.isCaseSensitive() ); 650cdf0e10cSrcweir 651cdf0e10cSrcweir ++it; 652cdf0e10cSrcweir } 653cdf0e10cSrcweir } 654cdf0e10cSrcweir 655cdf0e10cSrcweir //========================================================================= 656cdf0e10cSrcweir void CachableContentProperties::addProperties( 657cdf0e10cSrcweir const std::vector< DAVPropertyValue > & rProps ) 658cdf0e10cSrcweir { 659cdf0e10cSrcweir std::vector< DAVPropertyValue >::const_iterator it = rProps.begin(); 660cdf0e10cSrcweir const std::vector< DAVPropertyValue >::const_iterator end = rProps.end(); 661cdf0e10cSrcweir 662cdf0e10cSrcweir while ( it != end ) 663cdf0e10cSrcweir { 664cdf0e10cSrcweir if ( isCachable( (*it).Name, (*it).IsCaseSensitive ) ) 665cdf0e10cSrcweir m_aProps.addProperty( (*it) ); 666cdf0e10cSrcweir 667cdf0e10cSrcweir ++it; 668cdf0e10cSrcweir } 669cdf0e10cSrcweir } 670