diff options
author | Michael Meeks <michael.meeks@collabora.com> | 2014-06-28 09:36:20 +0100 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2014-06-28 14:37:23 +0100 |
commit | e820df579d9be4c1f9bb1ad8f02a8072c69b52da (patch) | |
tree | 208798b19089d113ff56715b9db3c0942c2183dd /filter | |
parent | f55ddffd7e81cc8f3314047a6aa62991e2d293b1 (diff) |
filters: Batch fetch filter config properties.
Also re-use a single set of OUString property names in
a sequence rather than re-allocating them constantly.
Change-Id: I7f0afc52363e57ea0c63f46f1e1f63cb752bb302
Diffstat (limited to 'filter')
-rw-r--r-- | filter/source/config/cache/filtercache.cxx | 136 | ||||
-rw-r--r-- | filter/source/config/cache/filtercache.hxx | 5 |
2 files changed, 91 insertions, 50 deletions
diff --git a/filter/source/config/cache/filtercache.cxx b/filter/source/config/cache/filtercache.cxx index def3991ad389..ba84e5cf02b1 100644 --- a/filter/source/config/cache/filtercache.cxx +++ b/filter/source/config/cache/filtercache.cxx @@ -33,6 +33,8 @@ #include <com/sun/star/lang/XSingleServiceFactory.hpp> #include <com/sun/star/beans/NamedValue.hpp> #include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/beans/XPropertyAccess.hpp> +#include <com/sun/star/beans/XMultiPropertySet.hpp> #include <com/sun/star/beans/XProperty.hpp> #include <com/sun/star/beans/PropertyValue.hpp> #include <com/sun/star/beans/Property.hpp> @@ -58,10 +60,53 @@ FilterCache::FilterCache() : BaseLock ( ) , m_eFillState(E_CONTAINS_NOTHING ) { + int i = 0; + OUString sStandardProps[9]; + + sStandardProps[i++] = PROPNAME_USERDATA; + sStandardProps[i++] = PROPNAME_TEMPLATENAME; + // E_READ_UPDATE only above + sStandardProps[i++] = PROPNAME_TYPE; + sStandardProps[i++] = PROPNAME_FILEFORMATVERSION; + sStandardProps[i++] = PROPNAME_UICOMPONENT; + sStandardProps[i++] = PROPNAME_FILTERSERVICE; + sStandardProps[i++] = PROPNAME_DOCUMENTSERVICE; + sStandardProps[i++] = PROPNAME_EXPORTEXTENSION; + sStandardProps[i++] = PROPNAME_FLAGS; // must be last. + assert(i == SAL_N_ELEMENTS(sStandardProps)); + + // E_READ_NOTHING -> creative nothingness. + m_aStandardProps[E_READ_STANDARD] = + css::uno::Sequence< OUString >(sStandardProps + 2, 7); + m_aStandardProps[E_READ_UPDATE] = + css::uno::Sequence< OUString >(sStandardProps, 2); + m_aStandardProps[E_READ_ALL] = + css::uno::Sequence< OUString >(sStandardProps, + SAL_N_ELEMENTS(sStandardProps)); + + i = 0; + OUString sTypeProps[7]; + sTypeProps[i++] = PROPNAME_MEDIATYPE; + // E_READ_UPDATE only above + sTypeProps[i++] = PROPNAME_PREFERREDFILTER; + sTypeProps[i++] = PROPNAME_DETECTSERVICE; + sTypeProps[i++] = PROPNAME_URLPATTERN; + sTypeProps[i++] = PROPNAME_EXTENSIONS; + sTypeProps[i++] = PROPNAME_PREFERRED; + sTypeProps[i++] = PROPNAME_CLIPBOARDFORMAT; + assert(i == SAL_N_ELEMENTS(sTypeProps)); + + // E_READ_NOTHING -> more creative nothingness. + m_aTypeProps[E_READ_STANDARD] = + css::uno::Sequence< OUString >(sTypeProps + 1, 6); + m_aTypeProps[E_READ_UPDATE] = + css::uno::Sequence< OUString >(sTypeProps, 1); + m_aTypeProps[E_READ_ALL] = + css::uno::Sequence< OUString >(sTypeProps, + SAL_N_ELEMENTS(sTypeProps)); } - FilterCache::~FilterCache() { if (m_xTypesChglisteners.is()) @@ -1615,79 +1660,71 @@ CacheItem FilterCache::impl_loadItem(const css::uno::Reference< css::container:: { case E_TYPE : { - // read standard properties of a type - if ( - (eOption == E_READ_STANDARD) || - (eOption == E_READ_ALL ) - ) + assert(eOption >= 0 && eOption <= E_READ_ALL); + css::uno::Sequence< OUString > &rNames = m_aTypeProps[eOption]; + + // read standard properties of a filter + if (rNames.getLength() > 0) { - aItem[PROPNAME_PREFERREDFILTER] = xItem->getByName(PROPNAME_PREFERREDFILTER); - aItem[PROPNAME_DETECTSERVICE ] = xItem->getByName(PROPNAME_DETECTSERVICE ); - aItem[PROPNAME_URLPATTERN ] = xItem->getByName(PROPNAME_URLPATTERN ); - aItem[PROPNAME_EXTENSIONS ] = xItem->getByName(PROPNAME_EXTENSIONS ); - aItem[PROPNAME_PREFERRED ] = xItem->getByName(PROPNAME_PREFERRED ); - aItem[PROPNAME_CLIPBOARDFORMAT] = xItem->getByName(PROPNAME_CLIPBOARDFORMAT); + css::uno::Reference< css::beans::XMultiPropertySet > + xPropSet( xItem, css::uno::UNO_QUERY_THROW); + css::uno::Sequence< css::uno::Any > aValues; + aValues = xPropSet->getPropertyValues(rNames); + + for (sal_Int32 i = 0; i < aValues.getLength(); i++) + aItem[rNames[i]] = aValues[i]; } + // read optional properties of a type // no else here! Is an additional switch ... - if ( - (eOption == E_READ_UPDATE) || - (eOption == E_READ_ALL ) - ) - { - aItem[PROPNAME_MEDIATYPE ] = xItem->getByName(PROPNAME_MEDIATYPE ); + if (eOption == E_READ_UPDATE || eOption == E_READ_ALL) impl_readPatchUINames(xItem, aItem); - } } break; case E_FILTER : { + assert(eOption >= 0 && eOption <= E_READ_ALL); + css::uno::Sequence< OUString > &rNames = m_aStandardProps[eOption]; + // read standard properties of a filter - if ( - (eOption == E_READ_STANDARD) || - (eOption == E_READ_ALL ) - ) + if (rNames.getLength() > 0) { - aItem[PROPNAME_TYPE ] = xItem->getByName(PROPNAME_TYPE ); - aItem[PROPNAME_FILEFORMATVERSION] = xItem->getByName(PROPNAME_FILEFORMATVERSION); - aItem[PROPNAME_UICOMPONENT ] = xItem->getByName(PROPNAME_UICOMPONENT ); - aItem[PROPNAME_FILTERSERVICE ] = xItem->getByName(PROPNAME_FILTERSERVICE ); - aItem[PROPNAME_DOCUMENTSERVICE ] = xItem->getByName(PROPNAME_DOCUMENTSERVICE ); - aItem[PROPNAME_EXPORTEXTENSION ] = xItem->getByName(PROPNAME_EXPORTEXTENSION ); - - // special handling for flags! Convert it from a list of names to its - // int representation ... - css::uno::Sequence< OUString > lFlagNames; - if (xItem->getByName(PROPNAME_FLAGS) >>= lFlagNames) - aItem[PROPNAME_FLAGS] <<= FilterCache::impl_convertFlagNames2FlagField(lFlagNames); + css::uno::Reference< css::beans::XMultiPropertySet > + xPropSet( xItem, css::uno::UNO_QUERY_THROW); + css::uno::Sequence< css::uno::Any > aValues; + aValues = xPropSet->getPropertyValues(rNames); + + for (sal_Int32 i = 0; i < rNames.getLength(); i++) + { + OUString &rPropName = rNames[i]; + if (i != rNames.getLength() - 1 || rPropName != PROPNAME_FLAGS) + aItem[rPropName] = aValues[i]; + else + { + assert(rPropName == PROPNAME_FLAGS); + // special handling for flags! Convert it from a list of names to its + // int representation ... + css::uno::Sequence< OUString > lFlagNames; + if (aValues[i] >>= lFlagNames) + aItem[rPropName] <<= FilterCache::impl_convertFlagNames2FlagField(lFlagNames); + } + } } - // read optional properties of a filter - // no else here! Is an additional switch ... - if ( - (eOption == E_READ_UPDATE) || - (eOption == E_READ_ALL ) - ) - { - aItem[PROPNAME_USERDATA ] = xItem->getByName(PROPNAME_USERDATA ); - aItem[PROPNAME_TEMPLATENAME] = xItem->getByName(PROPNAME_TEMPLATENAME); //TODO remove it if moving of filter uinames to type uinames // will be finished really #ifdef AS_ENABLE_FILTER_UINAMES + if (eOption == E_READ_UPDATE || eOption == E_READ_ALL) impl_readPatchUINames(xItem, aItem); #endif // AS_ENABLE_FILTER_UINAMES - } } break; - case E_FRAMELOADER : case E_CONTENTHANDLER : - { aItem[PROPNAME_TYPES] = xItem->getByName(PROPNAME_TYPES); - } - break; + break; default: break; } @@ -2275,7 +2312,6 @@ OUString FilterCache::impl_searchContentHandlerForType(const OUString& sType) co const OUString& sItem = pIt->first; ::comphelper::SequenceAsHashMap lProps(pIt->second); OUStringList lTypes(lProps[PROPNAME_TYPES]); - if (::std::find(lTypes.begin(), lTypes.end(), sType) != lTypes.end()) return sItem; } diff --git a/filter/source/config/cache/filtercache.hxx b/filter/source/config/cache/filtercache.hxx index d4051619b9dd..9a3a96d6614c 100644 --- a/filter/source/config/cache/filtercache.hxx +++ b/filter/source/config/cache/filtercache.hxx @@ -235,6 +235,11 @@ class FilterCache : public BaseLock OUStringList m_lChangedFrameLoaders; OUStringList m_lChangedContentHandlers; + /// standard property names for filter config keyed by EReadOption + css::uno::Sequence< OUString > m_aStandardProps[4]; + + /// type property names for filter config keyed by EReadOption + css::uno::Sequence< OUString > m_aTypeProps[4]; /// readonly acccess to the module configuration of OOo css::uno::Reference< css::container::XNameAccess > m_xModuleCfg; |