diff options
Diffstat (limited to 'filter/source/config/cache/cacheitem.cxx')
-rw-r--r-- | filter/source/config/cache/cacheitem.cxx | 443 |
1 files changed, 443 insertions, 0 deletions
diff --git a/filter/source/config/cache/cacheitem.cxx b/filter/source/config/cache/cacheitem.cxx new file mode 100644 index 000000000000..c752516df10f --- /dev/null +++ b/filter/source/config/cache/cacheitem.cxx @@ -0,0 +1,443 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 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 |