blob: d1521dcb0f159caa283c5ff9b167e61d546caef0 [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.
*
*************************************************************/
#ifndef _WEBDAV_UCP_CONTENTPROPERTIES_HXX
#define _WEBDAV_UCP_CONTENTPROPERTIES_HXX
#include <memory>
#include <vector>
#include <hash_map>
#include <rtl/ustring.hxx>
#include <com/sun/star/uno/Any.hxx>
#include <com/sun/star/uno/Sequence.hxx>
namespace com { namespace sun { namespace star { namespace beans {
struct Property;
} } } }
namespace http_dav_ucp
{
struct DAVResource;
//=========================================================================
struct equalString
{
bool operator()( const rtl::OUString& s1, const rtl::OUString& s2 ) const
{
return !!( s1 == s2 );
}
};
struct hashString
{
size_t operator()( const rtl::OUString & rName ) const
{
return rName.hashCode();
}
};
//=========================================================================
//
// PropertyValueMap.
//
//=========================================================================
class PropertyValue
{
private:
::com::sun::star::uno::Any m_aValue;
bool m_bIsCaseSensitive;
public:
PropertyValue()
: m_bIsCaseSensitive( true ) {}
PropertyValue( const ::com::sun::star::uno::Any & rValue,
bool bIsCaseSensitive )
: m_aValue( rValue),
m_bIsCaseSensitive( bIsCaseSensitive ) {}
bool isCaseSensitive() const { return m_bIsCaseSensitive; }
const ::com::sun::star::uno::Any & value() const { return m_aValue; }
};
typedef std::hash_map
<
rtl::OUString,
PropertyValue,
hashString,
equalString
>
PropertyValueMap;
struct DAVResource;
class ContentProperties
{
public:
ContentProperties();
ContentProperties( const DAVResource& rResource );
// Mini props for transient contents.
ContentProperties( const rtl::OUString & rTitle, sal_Bool bFolder );
// Micro props for non-existing contents.
ContentProperties( const rtl::OUString & rTitle );
ContentProperties( const ContentProperties & rOther );
bool contains( const rtl::OUString & rName ) const;
const com::sun::star::uno::Any &
getValue( const rtl::OUString & rName ) const;
// Maps the UCB property names contained in rProps with their DAV property
// counterparts, if possible. All unmappable properties will be included
// unchanged in resulting vector unless bIncludeUnmatched is set to false.
// The vector filles by this method can directly be handed over to
// DAVResourceAccess::PROPFIND. The result from PROPFIND
// (vector< DAVResource >) can be used to create a ContentProperties
// instance which can map DAV properties back to UCB properties.
static void UCBNamesToDAVNames( const com::sun::star::uno::Sequence<
com::sun::star::beans::Property > &
rProps,
std::vector< rtl::OUString > & resources,
bool bIncludeUnmatched = true );
// Maps the UCB property names contained in rProps with their HTTP header
// counterparts, if possible. All unmappable properties will be included
// unchanged in resulting vector unless bIncludeUnmatched is set to false.
// The vector filles by this method can directly be handed over to
// DAVResourceAccess::HEAD. The result from HEAD (vector< DAVResource >)
// can be used to create a ContentProperties instance which can map header
// names back to UCB properties.
static void UCBNamesToHTTPNames( const com::sun::star::uno::Sequence<
com::sun::star::beans::Property > &
rProps,
std::vector< rtl::OUString > & resources,
bool bIncludeUnmatched = true );
// return true, if all properties contained in rProps are contained in
// this ContentProperties instance. Otherwiese, false will be returned.
// rNamesNotContained contain the missing names.
bool containsAllNames(
const com::sun::star::uno::Sequence<
com::sun::star::beans::Property >& rProps,
std::vector< rtl::OUString > & rNamesNotContained ) const;
// adds all properties described by rProps that are actually contained in
// rContentProps to this instance. In case of duplicates the value
// already contained in this will left unchanged.
void addProperties( const std::vector< rtl::OUString > & rProps,
const ContentProperties & rContentProps );
// overwrites probably existing entries.
void addProperties( const ContentProperties & rProps );
// overwrites probably existing entries.
void addProperties( const std::vector< DAVPropertyValue > & rProps );
// overwrites probably existing entry.
void addProperty( const rtl::OUString & rName,
const com::sun::star::uno::Any & rValue,
bool bIsCaseSensitive );
// overwrites probably existing entry.
void addProperty( const DAVPropertyValue & rProp );
bool isTrailingSlash() const { return m_bTrailingSlash; }
const rtl::OUString & getEscapedTitle() const { return m_aEscapedTitle; }
// Not good to expose implementation details, but this is actually an
// internal class.
const std::auto_ptr< PropertyValueMap > & getProperties() const
{ return m_xProps; }
private:
::rtl::OUString m_aEscapedTitle;
std::auto_ptr< PropertyValueMap > m_xProps;
bool m_bTrailingSlash;
static com::sun::star::uno::Any m_aEmptyAny;
ContentProperties & operator=( const ContentProperties & ); // n.i.
const PropertyValue * get( const rtl::OUString & rName ) const;
};
class CachableContentProperties
{
private:
ContentProperties m_aProps;
CachableContentProperties & operator=( const CachableContentProperties & ); // n.i.
CachableContentProperties( const CachableContentProperties & ); // n.i.
public:
CachableContentProperties( const ContentProperties & rProps );
void addProperties( const ContentProperties & rProps );
void addProperties( const std::vector< DAVPropertyValue > & rProps );
bool containsAllNames(
const com::sun::star::uno::Sequence<
com::sun::star::beans::Property >& rProps,
std::vector< rtl::OUString > & rNamesNotContained ) const
{ return m_aProps.containsAllNames( rProps, rNamesNotContained ); }
const com::sun::star::uno::Any &
getValue( const rtl::OUString & rName ) const
{ return m_aProps.getValue( rName ); }
operator const ContentProperties & () const { return m_aProps; }
};
} // namespace http_dav_ucp
#endif /* !_WEBDAV_UCP_CONTENTPROPERTIES_HXX */