24#include <com/sun/star/lang/XInitialization.hpp>
27#include <officecfg/Setup.hxx>
28#include <officecfg/TypeDetection/UISort.hxx>
58 static const css::uno::Sequence<OUString> sServiceNames {
"com.sun.star.document.FilterFactory" };
77 const css::uno::Sequence< css::uno::Any >& lArguments)
86 OUString sFilterService;
90 css::uno::Reference< css::uno::XInterface > xFilter;
91 if (!sFilterService.isEmpty())
92 xFilter =
m_xContext->getServiceManager()->createInstanceWithContext(sFilterService,
m_xContext);
95 css::uno::Reference< css::lang::XInitialization > xInit(xFilter, css::uno::UNO_QUERY);
102 css::uno::Sequence< css::beans::PropertyValue > lConfig;
106 stlArguments.insert(stlArguments.begin(), css::uno::Any(lConfig));
124 css::beans::NamedValue lEProps[] {
127 std::vector<OUString> lUNOFilters;
132 catch(
const css::uno::RuntimeException&)
134 catch(
const css::uno::Exception&)
135 { lUNOFilters.clear(); }
144 if (sQuery.startsWith(
"_filterquery_"))
145 throw css::uno::RuntimeException(
146 "Use of deprecated and now unsupported query!",
147 static_cast< css::container::XContainerQuery*
>(
this));
150 OUString sNewQuery(sQuery);
151 sal_Int32
pos = sNewQuery.indexOf(
"_query_");
154 OSL_FAIL(
"DEPRECATED!\nPlease use new query format: 'matchByDocumentService=...'");
155 OUString sPatchedQuery(OUString::Concat(
"matchByDocumentService=") + sNewQuery.subView(7));
156 sNewQuery = sPatchedQuery;
161 std::vector<OUString> lEnumSet;
172 impl_loadOnDemand(aLock);
177 OSL_FAIL(
"DEPRECATED!\nPlease use prop search at the TypeDetection container!");
189 return new ::comphelper::OEnumerationByName(
this, std::move(lEnumSet));
196 QueryTokenizer::const_iterator pIt;
199 sal_Int32 nIFlags = 0;
200 sal_Int32 nEFlags = 0;
203 if (pIt != lTokens.end())
210 OSL_FAIL(
"DEPRECATED!\nPlease use right document service for filter query!");
215 OSL_FAIL(
"DEPRECATED!\nPlease use right document service for filter query!");
220 OSL_FAIL(
"DEPRECATED!\nPlease use right document service for filter query!");
225 OSL_FAIL(
"DEPRECATED!\nPlease use right document service for filter query!");
230 OSL_FAIL(
"DEPRECATED!\nPlease use right document service for filter query!");
235 OSL_FAIL(
"DEPRECATED!\nPlease use right document service for filter query!");
240 OSL_FAIL(
"DEPRECATED!\nPlease use right document service for filter query!");
246 if (pIt != lTokens.end())
247 nIFlags = pIt->second.toInt32();
250 if (pIt != lTokens.end())
251 nEFlags = pIt->second.toInt32();
259 std::vector<OUString> lResult ;
261 for (
auto const& filterName : lFilterNames)
287 ((nCheckValue & nIFlags) != nIFlags)
299 ((nCheckValue & nEFlags) == nEFlags)
307 lResult.push_back(filterName);
309 catch(
const css::uno::RuntimeException&)
311 catch(
const css::uno::Exception&)
323class stlcomp_removeIfMatchFlags
331 stlcomp_removeIfMatchFlags(FilterCache* pCache ,
339 bool operator() (
const OUString& sFilter)
const
344 sal_Int32 nFlags = aFilter.getUnpackedValueOrDefault(
PROPNAME_FLAGS, (sal_Int32(0)));
356 catch(
const css::container::NoSuchElementException &)
368 QueryTokenizer::const_iterator pIt1;
371 sal_Int32 nIFlags = -1;
372 sal_Int32 nEFlags = -1;
375 if (pIt1 != lTokens.end())
376 sModule = pIt1->second;
378 if (pIt1 != lTokens.end())
379 nIFlags = pIt1->second.toInt32();
381 if (pIt1 != lTokens.end())
382 nEFlags = pIt1->second.toInt32();
385 std::vector<OUString> lFilterList;
386 if (!sModule.isEmpty())
393 for (
auto const&
module : lModules)
396 for (
auto const& filter4Module : lFilters4Module)
398 lFilterList.push_back(filter4Module);
409 css::uno::Reference< css::container::XNameAccess > xModuleConfig = officecfg::Setup::Office::Factories::get();
410 return xModuleConfig->getElementNames();
416 sal_Int32 nEFlags)
const
432 ::std::sort(lOtherFilters.begin(), lOtherFilters.end());
435 std::vector<OUString> lMergedFilters = lSortedFilters;
436 const auto itlSortedFiltersEnd = lSortedFilters.cend();
437 for (
auto const& otherFilter : lOtherFilters)
439 if (::std::find(lSortedFilters.cbegin(), lSortedFilters.cend(), otherFilter) == itlSortedFiltersEnd)
440 lMergedFilters.push_back(otherFilter);
446 auto pItToErase = ::std::remove_if(lMergedFilters.begin(), lMergedFilters.end(), stlcomp_removeIfMatchFlags(pCache, nIFlags,
true));
447 lMergedFilters.erase(pItToErase, lMergedFilters.end());
451 auto pItToErase = ::std::remove_if(lMergedFilters.begin(), lMergedFilters.end(), stlcomp_removeIfMatchFlags(pCache, nEFlags,
false));
452 lMergedFilters.erase(pItToErase, lMergedFilters.end());
458 return lMergedFilters;
466 css::uno::Reference< css::container::XNameAccess > xUISortConfig = officecfg::TypeDetection::UISort::ModuleDependendFilterOrder::get();
469 css::uno::Reference< css::container::XNameAccess > xModule;
470 xUISortConfig->getByName(sModule) >>= xModule;
476 std::vector<OUString> lSortedFilters(
478 return lSortedFilters;
481 catch(
const css::uno::RuntimeException&)
483 catch(
const css::uno::Exception&)
486 return std::vector<OUString>();
491extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
493 css::uno::XComponentContext* context, css::uno::Sequence<css::uno::Any>
const&)
Reference< XComponentContext > m_xContext
constexpr OUStringLiteral sDocumentService
TValueType getUnpackedValueOrDefault(const OUString &sKey, const TValueType &aDefault) const
void init(const OUString &sImplementationName, const css::uno::Sequence< OUString > &lServiceNames, FilterCache::EItemType eType)
initialize this generic instance with some specialized values from our derived object.
represent an item of a FilterCache instance.
implements a cache, which contains all elements of our filter and type detection configuration.
std::vector< OUString > getMatchingItemsByProps(EItemType eType, o3tl::span< const css::beans::NamedValue > lIProps, o3tl::span< const css::beans::NamedValue > lEProps={}) const
return a list of key names for items, which match the specified criteria.
std::vector< OUString > getItemNames(EItemType eType) const
return a list of all key names, which represent an item inside the specified sub container.
CacheItem getItem(EItemType eType, const OUString &sItem)
return an item, which match the specified type and name.
implements the service <type scope="com.sun.star.document">FilterFactory</type>.
virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createSubSetEnumerationByQuery(const OUString &sQuery) override
std::vector< OUString > impl_getSortedFilterList(const QueryTokenizer &lTokens) const
implement the container string query: "getSortedFilterList()[:module=<xxx>]:[iflags=<xxx>][:eflags=<x...
std::vector< OUString > impl_queryMatchByDocumentService(const QueryTokenizer &lTokens) const
implement the container string query: "matchByDocumentService=:iflags=:eflags=:......
virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstance(const OUString &sFilter) override
virtual css::uno::Reference< css::uno::XInterface > SAL_CALL createInstanceWithArguments(const OUString &sFilter, const css::uno::Sequence< css::uno::Any > &lArguments) override
virtual ~FilterFactory() override
standard dtor.
static css::uno::Sequence< OUString > impl_getListOfInstalledModules()
TODO document me.
css::uno::Reference< css::uno::XComponentContext > m_xContext
std::vector< OUString > impl_getSortedFilterListForModule(const OUString &sModule, sal_Int32 nIFlags, sal_Int32 nEFlags) const
TODO document me.
static std::vector< OUString > impl_readSortedFilterListFromConfig(const OUString &sModule)
read a specialized and sorted list of filter names from the configuration (matching the specified mod...
FilterFactory(const css::uno::Reference< css::uno::XComponentContext > &rxContext)
standard ctor to connect this interface wrapper to the global filter cache instance ....
virtual css::uno::Sequence< OUString > SAL_CALL getAvailableServiceNames() override
It can be used to split any query string (which can be used at the related interface <type scope="css...
bool valid() const
can be used to check if analyzing of given query was successful or not.
constexpr OUStringLiteral PROPNAME_SORTEDFILTERLIST
used to identify the list of sorted filters for a specific office module
constexpr OUStringLiteral PROPNAME_FLAGS
constexpr OUStringLiteral QUERY_IDENTIFIER_GET_SORTED_FILTERLIST
constexpr OUStringLiteral PROPNAME_FILTERSERVICE
constexpr OUStringLiteral QUERY_PARAM_IFLAGS
constexpr OUStringLiteral QUERY_PARAM_EFLAGS
constexpr OUStringLiteral PROPNAME_DOCUMENTSERVICE
constexpr OUStringLiteral QUERY_IDENTIFIER_MATCHBYDOCUMENTSERVICE
used for the queries of the FilterFactory service.
constexpr OUStringLiteral QUERY_IDENTIFIER_GETPREFERREDFILTERFORTYPE
constexpr OUStringLiteral QUERY_PARAM_MODULE
#define QUERY_CONSTVALUE_ALL
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * filter_FilterFactory_get_implementation(css::uno::XComponentContext *context, css::uno::Sequence< css::uno::Any > const &)
DstType sequenceToContainer(const css::uno::Sequence< SrcType > &i_Sequence)
css::uno::Sequence< DstElementType > containerToSequence(const SrcType &i_Container)
FilterCache & GetTheFilterCache()