blob: 236d7e9f65a681862f7029ca7ac2c8dc9f41a1ef [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_filter.hxx"
#include "cacheitem.hxx"
#include "macros.hxx"
#include "constant.hxx"
//_______________________________________________
// includes
#include <com/sun/star/uno/Sequence.h>
#ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_Hpp_
#include <com/sun/star/beans/PropertyValue.hpp>
#endif
//_______________________________________________
// namespace
namespace filter{
namespace config{
namespace css = ::com::sun::star;
//_______________________________________________
// definitions
/*-----------------------------------------------
04.11.2003 09:27
-----------------------------------------------*/
CacheItem::CacheItem()
: SequenceAsHashMap()
{
}
/*-----------------------------------------------
26.06.2003 11:37
-----------------------------------------------*/
void CacheItem::update(const CacheItem& rUpdateItem)
{
for(const_iterator pItUpdate = rUpdateItem.begin();
pItUpdate != rUpdateItem.end() ;
++pItUpdate )
{
iterator pItThis = this->find(pItUpdate->first);
if (pItThis == this->end())
(*this)[pItUpdate->first] = pItUpdate->second; // add new prop
else
pItThis->second = pItUpdate->second; // change value of existing prop
}
}
/*-----------------------------------------------
26.11.2003 13:27
-----------------------------------------------*/
void CacheItem::validateUINames(const ::rtl::OUString& sActLocale)
{
if (!sActLocale.getLength())
return;
// 1) check UINames first
const_iterator pUINames = find(PROPNAME_UINAMES);
const_iterator pUIName = find(PROPNAME_UINAME );
::comphelper::SequenceAsHashMap lUINames;
if (pUINames != end())
lUINames << pUINames->second;
::rtl::OUString sUIName;
if (pUIName != end())
pUIName->second >>= sUIName;
if (sUIName.getLength())
{
// 1a) set UIName inside list of UINames for current locale
lUINames[sActLocale] <<= sUIName;
}
else if (lUINames.size()>0)
{
// 1b) or get it from this list, if it not exist!
lUINames[sActLocale] >>= sUIName;
}
(*this)[PROPNAME_UINAMES] <<= lUINames.getAsConstPropertyValueList();
(*this)[PROPNAME_UINAME ] <<= sUIName;
}
/*-----------------------------------------------
12.01.2004 13:32
-----------------------------------------------*/
css::uno::Sequence< css::beans::PropertyValue > CacheItem::getAsPackedPropertyValueList()
{
sal_Int32 c = (sal_Int32)size();
sal_Int32 i = 0;
css::uno::Sequence< css::beans::PropertyValue > lList(c);
css::beans::PropertyValue* pList = lList.getArray();
for (const_iterator pProp = begin();
pProp != end() ;
++pProp )
{
const ::rtl::OUString& rName = pProp->first;
const css::uno::Any& rValue = pProp->second;
if (!rValue.hasValue())
continue;
pList[i].Name = rName ;
pList[i].Value = rValue;
++i;
}
lList.realloc(i);
return lList;
}
/*-----------------------------------------------
17.07.2003 08:27
-----------------------------------------------*/
sal_Bool isSubSet(const css::uno::Any& aSubSet,
const css::uno::Any& aSet )
{
css::uno::Type aT1 = aSubSet.getValueType();
css::uno::Type aT2 = aSet.getValueType();
if (!aT1.equals(aT2))
{
_FILTER_CONFIG_LOG_("isSubSet() ... types of any values are different => return FALSE\n")
return sal_False;
}
css::uno::TypeClass aTypeClass = aT1.getTypeClass();
switch(aTypeClass)
{
//---------------------------------------
case css::uno::TypeClass_BOOLEAN :
case css::uno::TypeClass_BYTE :
case css::uno::TypeClass_SHORT :
case css::uno::TypeClass_UNSIGNED_SHORT :
case css::uno::TypeClass_LONG :
case css::uno::TypeClass_UNSIGNED_LONG :
case css::uno::TypeClass_HYPER :
case css::uno::TypeClass_UNSIGNED_HYPER :
case css::uno::TypeClass_FLOAT :
case css::uno::TypeClass_DOUBLE :
{
sal_Bool bIs = (aSubSet == aSet);
_FILTER_CONFIG_LOG_1_("isSubSet() ... check for atomic types => return %s\n", bIs ? "TRUE" : "FALSE")
return bIs;
}
//---------------------------------------
case css::uno::TypeClass_STRING :
{
::rtl::OUString v1;
::rtl::OUString v2;
if (
(aSubSet >>= v1) &&
(aSet >>= v2)
)
{
sal_Bool bIs = (v1.equals(v2));
_FILTER_CONFIG_LOG_1_("isSubSet() ... check for string types => return %s\n", bIs ? "TRUE" : "FALSE")
return bIs;
}
}
break;
//---------------------------------------
case css::uno::TypeClass_ANY :
{
css::uno::Any v1;
css::uno::Any v2;
if (
(aSubSet >>= v1) &&
(aSet >>= v2)
)
{
sal_Bool bIs = (isSubSet(v1, v2));
_FILTER_CONFIG_LOG_1_("isSubSet() ... check for packed any types => return %s\n", bIs ? "TRUE" : "FALSE")
return bIs;
}
}
break;
//---------------------------------------
case css::uno::TypeClass_STRUCT :
{
css::beans::PropertyValue p1;
css::beans::PropertyValue p2;
if (
(aSubSet >>= p1) &&
(aSet >>= p2)
)
{
sal_Bool bIs = (
(p1.Name.equals(p2.Name) ) &&
(isSubSet(p1.Value, p2.Value))
);
_FILTER_CONFIG_LOG_1_("isSubSet() ... check for structured types [PropertyValue] => return %s\n", bIs ? "TRUE" : "FALSE")
return bIs;
}
css::beans::NamedValue n1;
css::beans::NamedValue n2;
if (
(aSubSet >>= n1) &&
(aSet >>= n2)
)
{
sal_Bool bIs = (
(n1.Name.equals(n2.Name) ) &&
(isSubSet(n1.Value, n2.Value))
);
_FILTER_CONFIG_LOG_1_("isSubSet() ... check for structured types [NamedValue] => return %s\n", bIs ? "TRUE" : "FALSE")
return bIs;
}
}
break;
//---------------------------------------
case css::uno::TypeClass_SEQUENCE :
{
css::uno::Sequence< ::rtl::OUString > uno_s1;
css::uno::Sequence< ::rtl::OUString > uno_s2;
if (
(aSubSet >>= uno_s1) &&
(aSet >>= uno_s2)
)
{
OUStringList stl_s1(uno_s1);
OUStringList stl_s2(uno_s2);
for (OUStringList::const_iterator it1 = stl_s1.begin();
it1 != stl_s1.end() ;
++it1 )
{
if (::std::find(stl_s2.begin(), stl_s2.end(), *it1) == stl_s2.end())
{
_FILTER_CONFIG_LOG_1_("isSubSet() ... check for list types [OUString] ... dont found \"%s\" => return FALSE\n", _FILTER_CONFIG_TO_ASCII_(*it1))
return sal_False;
}
_FILTER_CONFIG_LOG_1_("isSubSet() ... check for list types [OUString] ... found \"%s\" => continue loop\n", _FILTER_CONFIG_TO_ASCII_(*it1))
}
_FILTER_CONFIG_LOG_("isSubSet() ... check for list types [OUString] => return TRUE\n")
return sal_True;
}
css::uno::Sequence< css::beans::PropertyValue > uno_p1;
css::uno::Sequence< css::beans::PropertyValue > uno_p2;
if (
(aSubSet >>= uno_p1) &&
(aSet >>= uno_p2)
)
{
::comphelper::SequenceAsHashMap stl_p1(uno_p1);
::comphelper::SequenceAsHashMap stl_p2(uno_p2);
for (::comphelper::SequenceAsHashMap::const_iterator it1 = stl_p1.begin();
it1 != stl_p1.end() ;
++it1 )
{
::comphelper::SequenceAsHashMap::const_iterator it2 = stl_p2.find(it1->first);
if (it2 == stl_p2.end())
{
_FILTER_CONFIG_LOG_1_("isSubSet() ... check for list types [PropertyValue] ... dont found \"%s\" => return FALSE\n", _FILTER_CONFIG_TO_ASCII_(it1->first))
return sal_False;
}
if (!isSubSet(it1->second, it2->second))
{
_FILTER_CONFIG_LOG_1_("isSubSet() ... check for list types [PropertyValue] ... found \"%s\" but has different value => return FALSE\n", _FILTER_CONFIG_TO_ASCII_(it1->first))
return sal_False;
}
_FILTER_CONFIG_LOG_1_("isSubSet() ... check for list types [PropertyValue] ... found \"%s\" with right value => continue loop\n", _FILTER_CONFIG_TO_ASCII_(it1->first))
}
_FILTER_CONFIG_LOG_("isSubSet() ... check for list types [PropertyValue] => return TRUE\n")
return sal_True;
}
css::uno::Sequence< css::beans::NamedValue > uno_n1;
css::uno::Sequence< css::beans::NamedValue > uno_n2;
if (
(aSubSet >>= uno_n1) &&
(aSet >>= uno_n2)
)
{
::comphelper::SequenceAsHashMap stl_n1(uno_n1);
::comphelper::SequenceAsHashMap stl_n2(uno_n2);
for (::comphelper::SequenceAsHashMap::const_iterator it1 = stl_n1.begin();
it1 != stl_n1.end() ;
++it1 )
{
::comphelper::SequenceAsHashMap::const_iterator it2 = stl_n2.find(it1->first);
if (it2 == stl_n2.end())
{
_FILTER_CONFIG_LOG_1_("isSubSet() ... check for list types [NamedValue] ... dont found \"%s\" => return FALSE\n", _FILTER_CONFIG_TO_ASCII_(it1->first))
return sal_False;
}
if (!isSubSet(it1->second, it2->second))
{
_FILTER_CONFIG_LOG_1_("isSubSet() ... check for list types [NamedValue] ... found \"%s\" but has different value => return FALSE\n", _FILTER_CONFIG_TO_ASCII_(it1->first))
return sal_False;
}
_FILTER_CONFIG_LOG_1_("isSubSet() ... check for list types [NamedValue] ... found \"%s\" with right value => continue loop\n", _FILTER_CONFIG_TO_ASCII_(it1->first))
}
_FILTER_CONFIG_LOG_("isSubSet() ... check for list types [NamedValue] => return TRUE\n")
return sal_True;
}
}
break;
/*
case css::uno::TypeClass_CHAR :
case css::uno::TypeClass_VOID :
case css::uno::TypeClass_TYPE :
case css::uno::TypeClass_ENUM :
case css::uno::TypeClass_TYPEDEF :
case css::uno::TypeClass_UNION :
case css::uno::TypeClass_EXCEPTION :
case css::uno::TypeClass_ARRAY :
case css::uno::TypeClass_INTERFACE :
case css::uno::TypeClass_SERVICE :
case css::uno::TypeClass_MODULE :
case css::uno::TypeClass_INTERFACE_METHOD :
case css::uno::TypeClass_INTERFACE_ATTRIBUTE :
case css::uno::TypeClass_UNKNOWN :
case css::uno::TypeClass_PROPERTY :
case css::uno::TypeClass_CONSTANT :
case css::uno::TypeClass_CONSTANTS :
case css::uno::TypeClass_SINGLETON :
*/
default: break;
}
OSL_ENSURE(sal_False, "isSubSet() ... this point should not be reached!");
return sal_False;
}
/*-----------------------------------------------
14.07.2003 10:24
-----------------------------------------------*/
sal_Bool CacheItem::haveProps(const CacheItem& lProps) const
{
for (const_iterator pIt = lProps.begin();
pIt != lProps.end() ;
++pIt )
{
// i) one required property does not exist at this item => return false
const_iterator pItThis = this->find(pIt->first);
if (pItThis == this->end())
{
_FILTER_CONFIG_LOG_1_("CacheItem::haveProps() ... dont found \"%s\" => return FALSE\n", _FILTER_CONFIG_TO_ASCII_(pIt->first))
return sal_False;
}
// ii) one item does not have the right value => return false
if (!isSubSet(pIt->second, pItThis->second))
{
_FILTER_CONFIG_LOG_1_("CacheItem::haveProps() ... item \"%s\" has different value => return FALSE\n", _FILTER_CONFIG_TO_ASCII_(pIt->first))
return sal_False;
}
}
// this method was not breaked before =>
// the given property set seems to match with our
// own properties in its minimum => return TRUE
_FILTER_CONFIG_LOG_("CacheItem::haveProps() ... => return TRUE\n")
return sal_True;
}
/*-----------------------------------------------
14.07.2003 10:43
-----------------------------------------------*/
sal_Bool CacheItem::dontHaveProps(const CacheItem& lProps) const
{
for (const_iterator pIt = lProps.begin();
pIt != lProps.end() ;
++pIt )
{
// i) one item does not exists in general
// => continue with next one, because
// "excluding" means ... "dont have it".
// And "not exists" match to "dont have it".
const_iterator pItThis = this->find(pIt->first);
if (pItThis == this->end())
{
_FILTER_CONFIG_LOG_1_("CacheItem::dontHaveProps() ... not found \"%s\" => continue loop!\n", _FILTER_CONFIG_TO_ASCII_(pIt->first))
continue;
}
// ii) one item have the right value => return false
// because this item has the requested property ...
// But we checked for "dont have it" here.
if (isSubSet(pIt->second, pItThis->second))
{
_FILTER_CONFIG_LOG_1_("CacheItem::dontHaveProps() ... item \"%s\" has same value => return FALSE!\n", _FILTER_CONFIG_TO_ASCII_(pIt->first))
return sal_False;
}
}
// this method was not breaked before =>
// That means: this item has no matching property
// of the given set. It "dont have" it ... => return true.
_FILTER_CONFIG_LOG_("CacheItem::dontHaveProps() ... => return TRUE\n")
return sal_True;
}
} // namespace config
} // namespace filter