blob: 188fd25f33f33f0635832bcf842bd3775d34b5d7 [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 "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