summaryrefslogtreecommitdiff
path: root/filter/source/config/cache/filterfactory.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'filter/source/config/cache/filterfactory.cxx')
-rw-r--r--filter/source/config/cache/filterfactory.cxx724
1 files changed, 724 insertions, 0 deletions
diff --git a/filter/source/config/cache/filterfactory.cxx b/filter/source/config/cache/filterfactory.cxx
new file mode 100644
index 000000000000..dc7869be27ca
--- /dev/null
+++ b/filter/source/config/cache/filterfactory.cxx
@@ -0,0 +1,724 @@
+/*************************************************************************
+ *
+ * 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 "filterfactory.hxx"
+#include "macros.hxx"
+#include "constant.hxx"
+#include "versions.hxx"
+
+//_______________________________________________
+// includes
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <comphelper/enumhelper.hxx>
+#include <comphelper/configurationhelper.hxx>
+#include <rtl/ustrbuf.hxx>
+
+//_______________________________________________
+// namespace
+
+namespace filter{
+ namespace config{
+
+namespace css = ::com::sun::star;
+
+//_______________________________________________
+// definitions
+
+/** @short can be used to query for filters related to its application module.
+ */
+#define BASE_QUERY_ALL "_query_all"
+#define BASE_QUERY_WRITER "_query_Writer"
+#define BASE_QUERY_WEB "_query_web"
+#define BASE_QUERY_GLOBAL "_query_global"
+#define BASE_QUERY_CHART "_query_chart"
+#define BASE_QUERY_CALC "_query_calc"
+#define BASE_QUERY_IMPRESS "_query_impress"
+#define BASE_QUERY_DRAW "_query_draw"
+#define BASE_QUERY_MATH "_query_math"
+
+//_______________________________________________
+
+/** @short define all possible parts of a filter query.
+
+ @descr syntax: "<query>[:<param>[=<value>]]"
+ e.g.: "_query_writer:default_first:use_order:sort_prop=uiname"
+
+ argument description default
+ -----------------------------------------------------------------------------------------------
+ iflags=<mask> include filters by given mask 0
+ eflags=<mask> exclude filters by given mask 0
+ sort_prop=<[name,uiname]> sort by internal name or uiname name
+ descending sort descending false
+ use_order use order flag of filters for sorting false
+ default_first set default filter on top of return list false
+ case_sensitive compare "sort_prop" case sensitive false
+ */
+#define SEPERATOR_QUERYPARAM ((sal_Unicode)':')
+#define SEPERATOR_QUERYPARAMVALUE ((sal_Unicode)'=')
+
+#define QUERYPARAM_IFLAGS ::rtl::OUString::createFromAscii("iflags")
+#define QUERYPARAM_EFLAGS ::rtl::OUString::createFromAscii("eflags")
+#define QUERYPARAM_SORT_PROP ::rtl::OUString::createFromAscii("sort_prop")
+
+#define QUERYPARAM_DESCENDING ::rtl::OUString::createFromAscii("descending")
+#define QUERYPARAM_USE_ORDER ::rtl::OUString::createFromAscii("use_order")
+#define QUERYPARAM_DEFAULT_FIRST ::rtl::OUString::createFromAscii("default_first")
+#define QUERYPARAM_CASE_SENSITIVE ::rtl::OUString::createFromAscii("case_sensitive")
+
+#define QUERYPARAMVALUE_SORT_PROP_NAME ::rtl::OUString::createFromAscii("name")
+#define QUERYPARAMVALUE_SORT_PROP_UINAME ::rtl::OUString::createFromAscii("uiname")
+
+/*-----------------------------------------------
+ 09.07.2003 07:43
+-----------------------------------------------*/
+FilterFactory::FilterFactory(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR)
+{
+ BaseContainer::init(xSMGR ,
+ FilterFactory::impl_getImplementationName() ,
+ FilterFactory::impl_getSupportedServiceNames(),
+ FilterCache::E_FILTER );
+}
+
+/*-----------------------------------------------
+ 09.07.2003 07:43
+-----------------------------------------------*/
+FilterFactory::~FilterFactory()
+{
+}
+
+/*-----------------------------------------------
+ 16.07.2003 13:43
+-----------------------------------------------*/
+css::uno::Reference< css::uno::XInterface > SAL_CALL FilterFactory::createInstance(const ::rtl::OUString& sFilter)
+ throw(css::uno::Exception ,
+ css::uno::RuntimeException)
+{
+ return createInstanceWithArguments(sFilter, css::uno::Sequence< css::uno::Any >());
+}
+
+/*-----------------------------------------------
+ 17.07.2003 08:56
+-----------------------------------------------*/
+css::uno::Reference< css::uno::XInterface > SAL_CALL FilterFactory::createInstanceWithArguments(const ::rtl::OUString& sFilter ,
+ const css::uno::Sequence< css::uno::Any >& lArguments)
+ throw(css::uno::Exception ,
+ css::uno::RuntimeException)
+{
+ // SAFE ->
+ ::osl::ResettableMutexGuard aLock(m_aLock);
+
+ ::rtl::OUString sRealFilter = sFilter;
+
+ #ifdef _FILTER_CONFIG_MIGRATION_Q_
+
+ /* -> TODO - HACK
+ check if the given filter name realy exist ...
+ Because our old implementation worked with an internal
+ type name instead of a filter name. For a small migration time
+ we must simulate this old feature :-( */
+
+ if (!m_rCache->hasItem(FilterCache::E_FILTER, sFilter) && m_rCache->hasItem(FilterCache::E_TYPE, sFilter))
+ {
+ OSL_ENSURE(sal_False, "Who use this deprecated functionality?");
+ _FILTER_CONFIG_LOG_("FilterFactory::createInstanceWithArguments() ... simulate old type search functionality!\n");
+
+ css::uno::Sequence< css::beans::NamedValue > lQuery(1);
+ lQuery[0].Name = PROPNAME_TYPE;
+ lQuery[0].Value <<= sFilter;
+
+ css::uno::Reference< css::container::XEnumeration > xSet = createSubSetEnumerationByProperties(lQuery);
+ while(xSet->hasMoreElements())
+ {
+ ::comphelper::SequenceAsHashMap lHandlerProps(xSet->nextElement());
+ if (!(lHandlerProps[PROPNAME_NAME] >>= sRealFilter))
+ continue;
+ }
+
+ // prevent outside code against NoSuchElementException!
+ // But dont implement such defensive strategy for our new create handling :-)
+ if (!m_rCache->hasItem(FilterCache::E_FILTER, sRealFilter))
+ return css::uno::Reference< css::uno::XInterface>();
+ }
+
+ /* <- HACK */
+
+ #endif // _FILTER_CONFIG_MIGRATION_Q_
+
+ // search filter on cache
+ CacheItem aFilter = m_rCache->getItem(FilterCache::E_FILTER, sRealFilter);
+ ::rtl::OUString sFilterService;
+ aFilter[PROPNAME_FILTERSERVICE] >>= sFilterService;
+
+ // create service instance
+ css::uno::Reference< css::uno::XInterface > xFilter;
+ if (sFilterService.getLength())
+ xFilter = m_xSMGR->createInstance(sFilterService);
+
+ // initialize filter
+ css::uno::Reference< css::lang::XInitialization > xInit(xFilter, css::uno::UNO_QUERY);
+ if (xInit.is())
+ {
+ // format: lInitData[0] = seq<PropertyValue>, which contains all configuration properties of this filter
+ // lInitData[1] = lArguments[0]
+ // ...
+ // lInitData[n] = lArguments[n-1]
+ css::uno::Sequence< css::beans::PropertyValue > lConfig;
+ aFilter >> lConfig;
+
+ ::comphelper::SequenceAsVector< css::uno::Any > stlArguments(lArguments);
+ stlArguments.insert(stlArguments.begin(), css::uno::makeAny(lConfig));
+
+ css::uno::Sequence< css::uno::Any > lInitData;
+ stlArguments >> lInitData;
+
+ xInit->initialize(lInitData);
+ }
+
+ return xFilter;
+ // <- SAFE
+}
+
+/*-----------------------------------------------
+ 18.02.2004 14:21
+-----------------------------------------------*/
+css::uno::Sequence< ::rtl::OUString > SAL_CALL FilterFactory::getAvailableServiceNames()
+ throw(css::uno::RuntimeException)
+{
+ /* Attention: Instead of getElementNames() this method have to return only filter names,
+ which can be created as UNO Services realy. Thats why we search for filters,
+ which dont have a valid value for the property "FilterService".
+ Of course we cant check for corrupted service names here. We can check
+ for empty strings only ...
+ */
+ CacheItem lIProps;
+ CacheItem lEProps;
+ lEProps[PROPNAME_FILTERSERVICE] <<= ::rtl::OUString();
+
+ OUStringList lUNOFilters;
+ try
+ {
+ lUNOFilters = m_rCache->getMatchingItemsByProps(FilterCache::E_FILTER, lIProps, lEProps);
+ }
+ catch(const css::uno::RuntimeException&)
+ { throw; }
+ catch(const css::uno::Exception&)
+ { lUNOFilters.clear(); }
+
+ return lUNOFilters.getAsConstList();
+}
+
+/*-----------------------------------------------
+ 11.03.2004 08:37
+-----------------------------------------------*/
+css::uno::Reference< css::container::XEnumeration > SAL_CALL FilterFactory::createSubSetEnumerationByQuery(const ::rtl::OUString& sQuery)
+ throw (css::uno::RuntimeException)
+{
+ // reject old deprecated queries ...
+ if (sQuery.matchAsciiL("_filterquery_",13,0))
+ throw css::uno::RuntimeException(
+ _FILTER_CONFIG_FROM_ASCII_("Use of deprecated and now unsupported query!"),
+ static_cast< css::container::XContainerQuery* >(this));
+
+ // convert "_query_xxx:..." to "getByDocService=xxx:..."
+ ::rtl::OUString sNewQuery(sQuery);
+ sal_Int32 pos = sNewQuery.indexOf(::rtl::OUString::createFromAscii("_query_"),0);
+ if (pos != -1)
+ {
+ OSL_ENSURE(sal_False, "DEPRECATED!\nPlease use new query format: 'matchByDocumentService=...'");
+ ::rtl::OUStringBuffer sPatchedQuery(256);
+ sPatchedQuery.appendAscii("matchByDocumentService=");
+ sPatchedQuery.append (sNewQuery.copy(7) );
+ sNewQuery = sPatchedQuery.makeStringAndClear();
+ }
+
+ // analyze query and split it into its tokens
+ QueryTokenizer lTokens(sNewQuery);
+ QueryTokenizer::const_iterator pIt;
+ OUStringList lEnumSet;
+
+ // start query
+ // (see attention comment below!)
+ if (lTokens.valid())
+ {
+ // SAFE -> ----------------------
+ ::osl::ResettableMutexGuard aLock(m_aLock);
+ // May be not all filters was loaded ...
+ // But we need it now!
+ impl_loadOnDemand();
+ aLock.clear();
+ // <- SAFE ----------------------
+
+ if (lTokens.find(QUERY_IDENTIFIER_GETPREFERREDFILTERFORTYPE) != lTokens.end())
+ OSL_ENSURE(sal_False, "DEPRECATED!\nPlease use prop search at the TypeDetection container!");
+// lEnumSet = impl_queryGetPreferredFilterForType(lTokens);
+ else
+ if (lTokens.find(QUERY_IDENTIFIER_MATCHBYDOCUMENTSERVICE) != lTokens.end())
+ lEnumSet = impl_queryMatchByDocumentService(lTokens);
+ else
+ if (lTokens.find(QUERY_IDENTIFIER_GET_SORTED_FILTERLIST) != lTokens.end())
+ lEnumSet = impl_getSortedFilterList(lTokens);
+ }
+
+ // pack list of item names as an enum list
+ // Attention: Do not return empty reference for empty list!
+ // The outside check "hasMoreElements()" should be enough, to detect this state :-)
+// size_t c = lEnumSet.size();
+ css::uno::Sequence< ::rtl::OUString > lSet = lEnumSet.getAsConstList();
+ ::comphelper::OEnumerationByName* pEnum = new ::comphelper::OEnumerationByName(this, lSet);
+ return css::uno::Reference< css::container::XEnumeration >(static_cast< css::container::XEnumeration* >(pEnum), css::uno::UNO_QUERY);
+}
+/*
+ if (lEnumSet.empty())
+ {
+ //-------------------------------------------
+ // 1) getDefaultFilterForType=<internal_typename>
+
+ pIt = lTokens.find(::rtl::OUString::createFromAscii("getDefaultFilterForType"));
+ if (pIt != lTokens.end())
+ {
+ // SAFE ->
+ ::osl::ResettableMutexGuard aLock(m_aLock);
+
+ // might not all types was loaded till now!
+ impl_loadOnDemand();
+
+ ::rtl::OUString sType = pIt->second;
+ FilterCache* pCache = impl_getWorkingCache();
+ if (pCache->hasItem(FilterCache::E_TYPE, sType))
+ {
+ CacheItem aType = pCache->getItem(FilterCache::E_TYPE, sType);
+ ::rtl::OUString sPreferredFilter;
+ aType[PROPNAME_PREFERREDFILTER] >>= sPreferredFilter;
+
+ if (
+ (sPreferredFilter.getLength() ) &&
+ (pCache->hasItem(FilterCache::E_FILTER, sPreferredFilter))
+ )
+ {
+ lEnumSet.push_back(sPreferredFilter);
+ }
+ }
+
+ aLock.clear();
+ // <- SAFE
+ }
+ }
+*/
+
+/*-----------------------------------------------
+ 11.03.2004 08:33
+-----------------------------------------------*/
+OUStringList FilterFactory::impl_queryMatchByDocumentService(const QueryTokenizer& lTokens) const
+{
+ // analyze query
+ QueryTokenizer::const_iterator pIt;
+
+ ::rtl::OUString sDocumentService;
+ sal_Int32 nIFlags = 0;
+ sal_Int32 nEFlags = 0;
+
+ pIt = lTokens.find(QUERY_IDENTIFIER_MATCHBYDOCUMENTSERVICE);
+ if (pIt != lTokens.end())
+ sDocumentService = pIt->second;
+
+#define COMP_HACK
+#ifdef COMP_HACK
+ if (sDocumentService.equalsAscii("writer"))
+ {
+ OSL_ENSURE(sal_False, "DEPRECATED!\nPlease use right document service for filter query!");
+ sDocumentService = ::rtl::OUString::createFromAscii("com.sun.star.text.TextDocument");
+ }
+ else
+ if (sDocumentService.equalsAscii("web"))
+ {
+ OSL_ENSURE(sal_False, "DEPRECATED!\nPlease use right document service for filter query!");
+ sDocumentService = ::rtl::OUString::createFromAscii("com.sun.star.text.WebDocument");
+ }
+ else
+ if (sDocumentService.equalsAscii("global"))
+ {
+ OSL_ENSURE(sal_False, "DEPRECATED!\nPlease use right document service for filter query!");
+ sDocumentService = ::rtl::OUString::createFromAscii("com.sun.star.text.GlobalDocument");
+ }
+ else
+ if (sDocumentService.equalsAscii("calc"))
+ {
+ OSL_ENSURE(sal_False, "DEPRECATED!\nPlease use right document service for filter query!");
+ sDocumentService = ::rtl::OUString::createFromAscii("com.sun.star.sheet.SpreadsheetDocument");
+ }
+ else
+ if (sDocumentService.equalsAscii("draw"))
+ {
+ OSL_ENSURE(sal_False, "DEPRECATED!\nPlease use right document service for filter query!");
+ sDocumentService = ::rtl::OUString::createFromAscii("com.sun.star.drawing.DrawingDocument");
+ }
+ else
+ if (sDocumentService.equalsAscii("impress"))
+ {
+ OSL_ENSURE(sal_False, "DEPRECATED!\nPlease use right document service for filter query!");
+ sDocumentService = ::rtl::OUString::createFromAscii("com.sun.star.presentation.PresentationDocument");
+ }
+ else
+ if (sDocumentService.equalsAscii("math"))
+ {
+ OSL_ENSURE(sal_False, "DEPRECATED!\nPlease use right document service for filter query!");
+ sDocumentService = ::rtl::OUString::createFromAscii("com.sun.star.formula.FormulaProperties");
+ }
+#endif
+
+ pIt = lTokens.find(QUERY_PARAM_IFLAGS);
+ if (pIt != lTokens.end())
+ nIFlags = ::rtl::OUString(pIt->second).toInt32();
+
+ pIt = lTokens.find(QUERY_PARAM_EFLAGS);
+ if (pIt != lTokens.end())
+ nEFlags = ::rtl::OUString(pIt->second).toInt32();
+
+ // SAFE -> ----------------------
+ ::osl::ResettableMutexGuard aLock(m_aLock);
+
+ // search suitable filters
+ FilterCache* pCache = impl_getWorkingCache();
+ OUStringList lFilterNames = pCache->getItemNames(FilterCache::E_FILTER);
+ OUStringList lResult ;
+
+ for (OUStringList::const_iterator pName = lFilterNames.begin();
+ pName != lFilterNames.end() ;
+ ++pName )
+ {
+ try
+ {
+ const ::rtl::OUString& sName = *pName;
+ const CacheItem aFilter = pCache->getItem(FilterCache::E_FILTER, sName);
+ CacheItem::const_iterator pProp ;
+
+ // "matchByDocumentService=" => any filter will be adressed here
+ // "matchByDocumentService=all" => any filter will be adressed here
+ // "matchByDocumentService=com.sun.star..." => only filter matching this document service will be adressed
+ ::rtl::OUString sCheckValue = aFilter.getUnpackedValueOrDefault(PROPNAME_DOCUMENTSERVICE, ::rtl::OUString());
+ if (
+ ( sDocumentService.getLength() ) &&
+ (!sDocumentService.equals(QUERY_CONSTVALUE_ALL)) &&
+ (!sCheckValue.equals(sDocumentService) )
+ )
+ {
+ continue; // ignore filter -> try next one!
+ }
+
+ // "iflags=" => not allowed
+ // "iflags=-1" => not allowed
+ // "iflags=0" => not usefull
+ // "iflags=283648" => only filter, which has set these flag field will be adressed
+ sal_Int32 nCheckValue = aFilter.getUnpackedValueOrDefault(PROPNAME_FLAGS, (sal_Int32)0);
+ if (
+ (nIFlags > 0 ) &&
+ ((nCheckValue & nIFlags) != nIFlags)
+ )
+ {
+ continue; // ignore filter -> try next one!
+ }
+
+ // "eflags=" => not allowed
+ // "eflags=-1" => not allowed
+ // "eflags=0" => not usefull
+ // "eflags=283648" => only filter, which has not set these flag field will be adressed
+ if (
+ (nEFlags > 0 ) &&
+ ((nCheckValue & nEFlags) == nEFlags)
+ )
+ {
+ continue; // ignore filter -> try next one!
+ }
+
+ // OK - this filter passed all checks.
+ // It match the query ...
+ lResult.push_back(sName);
+ }
+ catch(const css::uno::RuntimeException& exRun)
+ { throw exRun; }
+ catch(const css::uno::Exception&)
+ { continue; }
+ }
+
+ aLock.clear();
+ // <- SAFE ----------------------
+
+ return lResult;
+}
+
+/*-----------------------------------------------
+ 21.01.2005 13:39
+-----------------------------------------------*/
+class stlcomp_removeIfMatchFlags
+{
+ private:
+ FilterCache* m_pCache ;
+ sal_Int32 m_nFlags ;
+ sal_Bool m_bIFlags;
+
+ public:
+ stlcomp_removeIfMatchFlags(FilterCache* pCache ,
+ sal_Int32 nFlags ,
+ sal_Bool bIFlags)
+ : m_pCache (pCache )
+ , m_nFlags (nFlags )
+ , m_bIFlags(bIFlags)
+ {}
+
+ bool operator() (const ::rtl::OUString& sFilter) const
+ {
+ try
+ {
+ const CacheItem aFilter = m_pCache->getItem(FilterCache::E_FILTER, sFilter);
+ sal_Int32 nFlags = aFilter.getUnpackedValueOrDefault(PROPNAME_FLAGS, ((sal_Int32)0));
+
+ bool bMatch = false;
+ if (m_bIFlags)
+ // IFlags are interpeted as ALL_FLAGS_MUST_MATCH !
+ bMatch = ((nFlags & m_nFlags) == m_nFlags);
+ else
+ // EFlags are interpreted as ATE_LEAST_ONE_FLAG_MUST_MATCH !
+ bMatch = !(nFlags & m_nFlags);
+ // We are asked for bRemove ! And bMatch = !bRemove => so bRemove = !bMatch .-)
+ return !bMatch;
+ }
+ catch(css::container::NoSuchElementException)
+ {
+ return true;
+ }
+ }
+};
+
+/*-----------------------------------------------
+ 21.01.2005 13:39
+-----------------------------------------------*/
+OUStringList FilterFactory::impl_getSortedFilterList(const QueryTokenizer& lTokens) const
+{
+ // analyze the given query parameter
+ QueryTokenizer::const_iterator pIt1;
+
+ ::rtl::OUString sModule;
+ sal_Int32 nIFlags = -1;
+ sal_Int32 nEFlags = -1;
+
+ pIt1 = lTokens.find(QUERY_PARAM_MODULE);
+ if (pIt1 != lTokens.end())
+ sModule = pIt1->second;
+ pIt1 = lTokens.find(QUERY_PARAM_IFLAGS);
+ if (pIt1 != lTokens.end())
+ nIFlags = ::rtl::OUString(pIt1->second).toInt32();
+ pIt1 = lTokens.find(QUERY_PARAM_EFLAGS);
+ if (pIt1 != lTokens.end())
+ nEFlags = ::rtl::OUString(pIt1->second).toInt32();
+
+ // simple search for filters of one specific module.
+ OUStringList lFilterList;
+ if (sModule.getLength())
+ lFilterList = impl_getSortedFilterListForModule(sModule, nIFlags, nEFlags);
+ else
+ {
+ // more complex search for all filters
+ // We check first, which office modules are installed ...
+ OUStringList lModules = impl_getListOfInstalledModules();
+ OUStringList::const_iterator pIt2;
+ for ( pIt2 = lModules.begin();
+ pIt2 != lModules.end() ;
+ ++pIt2 )
+ {
+ sModule = *pIt2;
+ OUStringList lFilters4Module = impl_getSortedFilterListForModule(sModule, nIFlags, nEFlags);
+ OUStringList::const_iterator pIt3;
+ for ( pIt3 = lFilters4Module.begin();
+ pIt3 != lFilters4Module.end() ;
+ ++pIt3 )
+ {
+ const ::rtl::OUString& sFilter = *pIt3;
+ lFilterList.push_back(sFilter);
+ }
+ }
+ }
+
+ return lFilterList;
+}
+
+/*-----------------------------------------------
+ 21.01.2005 10:19
+-----------------------------------------------*/
+OUStringList FilterFactory::impl_getListOfInstalledModules() const
+{
+ // SAFE -> ----------------------
+ ::osl::ResettableMutexGuard aLock(m_aLock);
+ css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = m_xSMGR;
+ aLock.clear();
+ // <- SAFE ----------------------
+
+ try
+ {
+ css::uno::Reference< css::container::XNameAccess > xModuleConfig(
+ ::comphelper::ConfigurationHelper::openConfig(xSMGR,
+ CFGPACKAGE_OOO_MODULES,
+ ::comphelper::ConfigurationHelper::E_READONLY),
+ css::uno::UNO_QUERY_THROW);
+ OUStringList lModules(xModuleConfig->getElementNames());
+ return lModules;
+ }
+ catch(const css::uno::RuntimeException& exRun)
+ { throw exRun; }
+ catch(const css::uno::Exception&)
+ {}
+
+ return OUStringList();
+}
+
+/*-----------------------------------------------
+ 21.01.2005 10:19
+-----------------------------------------------*/
+OUStringList FilterFactory::impl_getSortedFilterListForModule(const ::rtl::OUString& sModule,
+ sal_Int32 nIFlags,
+ sal_Int32 nEFlags) const
+{
+ OUStringList lSortedFilters = impl_readSortedFilterListFromConfig(sModule);
+
+ // get all filters for the requested module
+ CacheItem lIProps;
+ lIProps[PROPNAME_DOCUMENTSERVICE] <<= sModule;
+
+ // SAFE -> ----------------------
+ ::osl::ResettableMutexGuard aLock(m_aLock);
+ FilterCache* pCache = impl_getWorkingCache();
+ OUStringList lOtherFilters = pCache->getMatchingItemsByProps(FilterCache::E_FILTER, lIProps);
+ aLock.clear();
+ // <- SAFE ----------------------
+
+ // bring "other" filters in an alphabeticly order
+ // It's needed below.
+ ::std::sort(lOtherFilters.begin(), lOtherFilters.end());
+
+ // merge both lists together
+ OUStringList lMergedFilters = lSortedFilters;
+ OUStringList::iterator pIt2;
+ OUStringList::iterator pIt3;
+ for ( pIt2 = lOtherFilters.begin();
+ pIt2 != lOtherFilters.end() ;
+ ++pIt2 )
+ {
+ const ::rtl::OUString& rFilter = *pIt2;
+ pIt3 = ::std::find(lSortedFilters.begin(), lSortedFilters.end(), rFilter);
+ if (pIt3 == lSortedFilters.end())
+ lMergedFilters.push_back(rFilter);
+ }
+
+ // remove all filters from this merged list, which does not fit the flag specification
+ if (nIFlags != -1)
+ {
+ pIt2 = ::std::remove_if(lMergedFilters.begin(), lMergedFilters.end(), stlcomp_removeIfMatchFlags(pCache, nIFlags, sal_True));
+ lMergedFilters.erase(pIt2, lMergedFilters.end());
+ }
+ if (nEFlags != -1)
+ {
+ pIt2 = ::std::remove_if(lMergedFilters.begin(), lMergedFilters.end(), stlcomp_removeIfMatchFlags(pCache, nEFlags, sal_False));
+ lMergedFilters.erase(pIt2, lMergedFilters.end());
+ }
+
+ // sort the default filter to the front of this list
+ // TODO
+
+ return lMergedFilters;
+}
+
+/*-----------------------------------------------
+ 21.01.2005 10:19
+-----------------------------------------------*/
+OUStringList FilterFactory::impl_readSortedFilterListFromConfig(const ::rtl::OUString& sModule) const
+{
+ // SAFE -> ----------------------
+ ::osl::ResettableMutexGuard aLock(m_aLock);
+ css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = m_xSMGR;
+ aLock.clear();
+ // <- SAFE ----------------------
+
+ try
+ {
+ css::uno::Reference< css::container::XNameAccess > xUISortConfig(
+ ::comphelper::ConfigurationHelper::openConfig(xSMGR,
+ CFGPACKAGE_TD_UISORT,
+ ::comphelper::ConfigurationHelper::E_READONLY),
+ css::uno::UNO_QUERY_THROW);
+
+ // dont ccheck the module name here. If it does not exists, an exception is thrown and catched below.
+ // We return an empty list as result then.
+ css::uno::Reference< css::container::XNameAccess > xModule;
+ xUISortConfig->getByName(sModule) >>= xModule;
+ if (xModule.is()) // only to be on the safe side of life if the exception was not thrown .-)
+ {
+ // Note: convertion of the returned Any to OUStringList throws
+ // an IllegalArgumentException if the type does not match ...
+ // but it resets the OUStringList to a length of 0 if the Any is empty!
+ OUStringList lSortedFilters(xModule->getByName(PROPNAME_SORTEDFILTERLIST));
+ return lSortedFilters;
+ }
+ }
+ catch(const css::uno::RuntimeException& exRun)
+ { throw exRun; }
+ catch(const css::uno::Exception&)
+ {}
+
+ return OUStringList();
+}
+
+/*-----------------------------------------------
+ 09.07.2003 07:43
+-----------------------------------------------*/
+::rtl::OUString FilterFactory::impl_getImplementationName()
+{
+ return ::rtl::OUString::createFromAscii("com.sun.star.comp.filter.config.FilterFactory");
+}
+
+/*-----------------------------------------------
+ 09.07.2003 07:43
+-----------------------------------------------*/
+css::uno::Sequence< ::rtl::OUString > FilterFactory::impl_getSupportedServiceNames()
+{
+ css::uno::Sequence< ::rtl::OUString > lServiceNames(1);
+ lServiceNames[0] = ::rtl::OUString::createFromAscii("com.sun.star.document.FilterFactory");
+ return lServiceNames;
+}
+
+/*-----------------------------------------------
+ 09.07.2003 07:43
+-----------------------------------------------*/
+css::uno::Reference< css::uno::XInterface > SAL_CALL FilterFactory::impl_createInstance(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR)
+{
+ FilterFactory* pNew = new FilterFactory(xSMGR);
+ return css::uno::Reference< css::uno::XInterface >(static_cast< css::lang::XMultiServiceFactory* >(pNew), css::uno::UNO_QUERY);
+}
+
+ } // namespace config
+} // namespace filter