blob: aa01c5ce70ef18b9f76532902899bb6c2bad4baf [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_ucb.hxx"
#include <string.h>
#include "DAVProperties.hxx"
#include <rtl/ustrbuf.hxx>
using namespace http_dav_ucp;
const ::rtl::OUString DAVProperties::CREATIONDATE =
::rtl::OUString::createFromAscii( "DAV:creationdate" );
const ::rtl::OUString DAVProperties::DISPLAYNAME =
::rtl::OUString::createFromAscii( "DAV:displayname" );
const ::rtl::OUString DAVProperties::GETCONTENTLANGUAGE =
::rtl::OUString::createFromAscii( "DAV:getcontentlanguage" );
const ::rtl::OUString DAVProperties::GETCONTENTLENGTH =
::rtl::OUString::createFromAscii( "DAV:getcontentlength" );
const ::rtl::OUString DAVProperties::GETCONTENTTYPE =
::rtl::OUString::createFromAscii( "DAV:getcontenttype" );
const ::rtl::OUString DAVProperties::GETETAG =
::rtl::OUString::createFromAscii( "DAV:getetag" );
const ::rtl::OUString DAVProperties::GETLASTMODIFIED =
::rtl::OUString::createFromAscii( "DAV:getlastmodified" );
const ::rtl::OUString DAVProperties::LOCKDISCOVERY =
::rtl::OUString::createFromAscii( "DAV:lockdiscovery" );
const ::rtl::OUString DAVProperties::RESOURCETYPE =
::rtl::OUString::createFromAscii( "DAV:resourcetype" );
const ::rtl::OUString DAVProperties::SUPPORTEDLOCK =
::rtl::OUString::createFromAscii( "DAV:supportedlock" );
const ::rtl::OUString DAVProperties::EXECUTABLE =
::rtl::OUString::createFromAscii(
"http://apache.org/dav/props/executable" );
// -------------------------------------------------------------------
// static
void DAVProperties::createSerfPropName( const rtl::OUString & rFullName,
SerfPropName & rName )
{
if ( rFullName.compareToAscii( RTL_CONSTASCII_STRINGPARAM( "DAV:" ) ) == 0 )
{
rName.nspace = "DAV:";
rName.name
= strdup( rtl::OUStringToOString(
rFullName.copy( RTL_CONSTASCII_LENGTH( "DAV:" ) ),
RTL_TEXTENCODING_UTF8 ).getStr() );
}
else if ( rFullName.compareToAscii( RTL_CONSTASCII_STRINGPARAM(
"http://apache.org/dav/props/" ) ) == 0 )
{
rName.nspace = "http://apache.org/dav/props/";
rName.name
= strdup( rtl::OUStringToOString(
rFullName.copy(
RTL_CONSTASCII_LENGTH(
"http://apache.org/dav/props/" ) ),
RTL_TEXTENCODING_UTF8 ).getStr() );
}
else if ( rFullName.compareToAscii( RTL_CONSTASCII_STRINGPARAM(
"http://ucb.openoffice.org/dav/props/" ) ) == 0 )
{
rName.nspace = "http://ucb.openoffice.org/dav/props/";
rName.name
= strdup( rtl::OUStringToOString(
rFullName.copy(
RTL_CONSTASCII_LENGTH(
"http://ucb.openoffice.org/dav/props/" ) ),
RTL_TEXTENCODING_UTF8 ).getStr() );
}
else if ( rFullName.compareToAscii( RTL_CONSTASCII_STRINGPARAM(
"<prop:" ) ) == 0 )
{
// Support for 3rd party namespaces/props
rtl::OString aFullName
= rtl::OUStringToOString( rFullName, RTL_TEXTENCODING_UTF8 );
// Format: <prop:the_propname xmlns:prop="the_namespace">
sal_Int32 nStart = RTL_CONSTASCII_LENGTH( "<prop:" );
sal_Int32 nLen = aFullName.indexOf( ' ' ) - nStart;
rName.name = strdup( aFullName.copy( nStart, nLen ).getStr() );
nStart = aFullName.indexOf( '=', nStart + nLen ) + 2; // after ="
nLen = aFullName.getLength() - RTL_CONSTASCII_LENGTH( "\">" ) - nStart;
rName.nspace = strdup( aFullName.copy( nStart, nLen ).getStr() );
}
else
{
// Add our namespace to our own properties.
rName.nspace = "http://ucb.openoffice.org/dav/props/";
rName.name
= strdup( rtl::OUStringToOString( rFullName,
RTL_TEXTENCODING_UTF8 ).getStr() );
}
}
// -------------------------------------------------------------------
// static
void DAVProperties::createUCBPropName( const char * nspace,
const char * name,
rtl::OUString & rFullName )
{
rtl::OUString aNameSpace
= rtl::OStringToOUString( nspace, RTL_TEXTENCODING_UTF8 );
rtl::OUString aName
= rtl::OStringToOUString( name, RTL_TEXTENCODING_UTF8 );
if ( !aNameSpace.getLength() )
{
// Some servers send XML without proper namespaces. Assume "DAV:"
// in this case, if name is a well-known dav property name.
// Although this is not 100% correct, it solves many problems.
if ( DAVProperties::RESOURCETYPE.matchIgnoreAsciiCase( aName, 4 ) ||
DAVProperties::SUPPORTEDLOCK.matchIgnoreAsciiCase( aName, 4 ) ||
DAVProperties::LOCKDISCOVERY.matchIgnoreAsciiCase( aName, 4 ) ||
DAVProperties::CREATIONDATE.matchIgnoreAsciiCase( aName, 4 ) ||
DAVProperties::DISPLAYNAME.matchIgnoreAsciiCase( aName, 4 ) ||
DAVProperties::GETCONTENTLANGUAGE.matchIgnoreAsciiCase( aName, 4 ) ||
DAVProperties::GETCONTENTLENGTH.matchIgnoreAsciiCase( aName, 4 ) ||
DAVProperties::GETCONTENTTYPE.matchIgnoreAsciiCase( aName, 4 ) ||
DAVProperties::GETETAG.matchIgnoreAsciiCase( aName, 4 ) ||
DAVProperties::GETLASTMODIFIED.matchIgnoreAsciiCase( aName, 4 ) )
{
aNameSpace = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DAV:" ) );
}
}
// Note: Concatenating strings BEFORE comparing against known namespaces
// is important. See RFC 2815 ( 23.4.2 Meaning of Qualified Names ).
rFullName = aNameSpace;
rFullName += aName;
if ( rFullName.compareToAscii( RTL_CONSTASCII_STRINGPARAM(
"DAV:" ) ) == 0 )
{
// Okay, Just concat strings.
}
else if ( rFullName.compareToAscii( RTL_CONSTASCII_STRINGPARAM(
"http://apache.org/dav/props/" ) ) == 0 )
{
// Okay, Just concat strings.
}
else if ( rFullName.compareToAscii( RTL_CONSTASCII_STRINGPARAM(
"http://ucb.openoffice.org/dav/props/" ) ) == 0 )
{
// Remove namespace from our own properties.
rFullName = rFullName.copy(
RTL_CONSTASCII_LENGTH(
"http://ucb.openoffice.org/dav/props/" ) );
}
else
{
// Create property name that encodes, namespace and name ( XML ).
rFullName = rtl::OUString::createFromAscii( "<prop:" );
rFullName += aName;
rFullName += rtl::OUString::createFromAscii( " xmlns:prop=\"" );
rFullName += aNameSpace;
rFullName += rtl::OUString::createFromAscii( "\">" );
}
}
// -------------------------------------------------------------------
// static
bool DAVProperties::isUCBDeadProperty( const SerfPropName & rName )
{
return ( rName.nspace &&
( rtl_str_compareIgnoreAsciiCase(
rName.nspace, "http://ucb.openoffice.org/dav/props/" )
== 0 ) );
}
bool DAVProperties::isUCBSpecialProperty(const rtl::OUString& rFullName, rtl::OUString& rParsedName)
{
sal_Int32 nLen = rFullName.getLength();
if ( nLen <= 0 ||
!rFullName.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( "<prop:" ) ) ||
!rFullName.endsWithAsciiL( RTL_CONSTASCII_STRINGPARAM( "\">" ) ) )
return false;
sal_Int32 nStart = RTL_CONSTASCII_LENGTH( "<prop:" );
sal_Int32 nEnd = rFullName.indexOf( sal_Unicode( ' ' ), nStart );
if ( nEnd == -1 )
return false;
rtl::OUString sPropName = rFullName.copy( nStart, nEnd - nStart );
if ( !sPropName.getLength() )
return false;
// TODO skip whitespaces?
if ( !rFullName.matchAsciiL( RTL_CONSTASCII_STRINGPARAM( "xmlns:prop=\"" ), ++nEnd ) )
return false;
nStart = nEnd + RTL_CONSTASCII_LENGTH( "xmlns:prop=\"" );
nEnd = rFullName.indexOf( sal_Unicode( '"' ), nStart );
if ( nEnd != nLen - RTL_CONSTASCII_LENGTH( "\">" ) )
return false;
rtl::OUString sNamesp = rFullName.copy( nStart, nEnd - nStart );
if ( !( nLen = sNamesp.getLength() ) )
return false;
rtl::OUStringBuffer aBuff( sNamesp );
if ( sNamesp[nLen - 1] != '/' )
aBuff.append( sal_Unicode( '/' ) );
aBuff.append( sPropName );
rParsedName = aBuff.makeStringAndClear();
return rParsedName.getLength();
}