xref: /aoo4110/main/sfx2/source/bastyp/fltfnc.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sfx2.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "fltfnc.hxx"
28*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Exception.hpp>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyValue.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/NamedValue.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameAccess.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XEnumeration.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/datatransfer/DataFlavor.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XTypeDetection.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XContainerQuery.hpp>
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski #include <comphelper/sequenceashashmap.hxx>
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski #ifndef _EXCHANGE_HXX //autogen
40*b1cdbd2cSJim Jagielski #include <sot/exchange.hxx>
41*b1cdbd2cSJim Jagielski #endif
42*b1cdbd2cSJim Jagielski #include <tools/config.hxx>
43*b1cdbd2cSJim Jagielski #include <basic/sbmeth.hxx>
44*b1cdbd2cSJim Jagielski #include <basic/basmgr.hxx>
45*b1cdbd2cSJim Jagielski #include <basic/sbstar.hxx>
46*b1cdbd2cSJim Jagielski #include <basic/sbxobj.hxx>
47*b1cdbd2cSJim Jagielski #include <basic/sbxmeth.hxx>
48*b1cdbd2cSJim Jagielski #include <basic/sbxcore.hxx>
49*b1cdbd2cSJim Jagielski #ifndef _MSGBOX_HXX //autogen
50*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx>
51*b1cdbd2cSJim Jagielski #endif
52*b1cdbd2cSJim Jagielski #ifndef _RTL_USTRING_HXX //autogen
53*b1cdbd2cSJim Jagielski #include <rtl/ustring.hxx>
54*b1cdbd2cSJim Jagielski #endif
55*b1cdbd2cSJim Jagielski #include <rtl/ustrbuf.hxx>
56*b1cdbd2cSJim Jagielski #include <svl/eitem.hxx>
57*b1cdbd2cSJim Jagielski #include <svl/intitem.hxx>
58*b1cdbd2cSJim Jagielski #include <svl/stritem.hxx>
59*b1cdbd2cSJim Jagielski #include <svl/lckbitem.hxx>
60*b1cdbd2cSJim Jagielski #include <svl/inettype.hxx>
61*b1cdbd2cSJim Jagielski #include <svl/rectitem.hxx>
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski #include <sot/storage.hxx>
64*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XDispatchProviderInterceptor.hpp>
65*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XDispatch.hpp>
66*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XDispatchProvider.hpp>
67*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XStatusListener.hpp>
68*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/FrameSearchFlag.hpp>
69*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XDispatchProviderInterception.hpp>
70*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/FeatureStateEvent.hpp>
71*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/DispatchDescriptor.hpp>
72*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XController.hpp>
73*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XFrameActionListener.hpp>
74*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XComponentLoader.hpp>
75*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XFrame.hpp>
76*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/FrameActionEvent.hpp>
77*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/FrameAction.hpp>
78*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XFrameLoader.hpp>
79*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XLoadEventListener.hpp>
80*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XFilterDetect.hpp>
81*b1cdbd2cSJim Jagielski #include <com/sun/star/loader/XImplementationLoader.hpp>
82*b1cdbd2cSJim Jagielski #include <com/sun/star/loader/CannotActivateFactoryException.hpp>
83*b1cdbd2cSJim Jagielski #ifndef _UNOTOOLS_PROCESSFACTORY_HXX
84*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
85*b1cdbd2cSJim Jagielski #endif
86*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyValue.hpp>
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski #include <sal/types.h>
89*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Reference.hxx>
90*b1cdbd2cSJim Jagielski #include <com/sun/star/ucb/XContent.hpp>
91*b1cdbd2cSJim Jagielski #include <rtl/ustring.hxx>
92*b1cdbd2cSJim Jagielski #include <vos/process.hxx>
93*b1cdbd2cSJim Jagielski #include <unotools/pathoptions.hxx>
94*b1cdbd2cSJim Jagielski #include <unotools/moduleoptions.hxx>
95*b1cdbd2cSJim Jagielski #include <comphelper/mediadescriptor.hxx>
96*b1cdbd2cSJim Jagielski #include <tools/urlobj.hxx>
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski #include <rtl/logfile.hxx>
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
101*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::ucb;
102*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::document;
103*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::beans;
104*b1cdbd2cSJim Jagielski using namespace ::vos;
105*b1cdbd2cSJim Jagielski #include <svl/ctypeitm.hxx>
106*b1cdbd2cSJim Jagielski #include <svtools/sfxecode.hxx>
107*b1cdbd2cSJim Jagielski #include <unotools/syslocale.hxx>
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski #include "sfx2/sfxhelp.hxx"
110*b1cdbd2cSJim Jagielski #include <sfx2/docfilt.hxx>
111*b1cdbd2cSJim Jagielski #include <sfx2/docfac.hxx>
112*b1cdbd2cSJim Jagielski #include "sfxtypes.hxx"
113*b1cdbd2cSJim Jagielski #include <sfx2/sfxuno.hxx>
114*b1cdbd2cSJim Jagielski #include <sfx2/docfile.hxx>
115*b1cdbd2cSJim Jagielski #include <sfx2/progress.hxx>
116*b1cdbd2cSJim Jagielski #include "openflag.hxx"
117*b1cdbd2cSJim Jagielski #include "bastyp.hrc"
118*b1cdbd2cSJim Jagielski #include "sfx2/sfxresid.hxx"
119*b1cdbd2cSJim Jagielski #include <sfx2/doctempl.hxx>
120*b1cdbd2cSJim Jagielski #include <sfx2/frame.hxx>
121*b1cdbd2cSJim Jagielski #include <sfx2/dispatch.hxx>
122*b1cdbd2cSJim Jagielski #include <sfx2/viewfrm.hxx>
123*b1cdbd2cSJim Jagielski #include "helper.hxx"
124*b1cdbd2cSJim Jagielski #include "fltlst.hxx"
125*b1cdbd2cSJim Jagielski #include <sfx2/request.hxx>
126*b1cdbd2cSJim Jagielski #include "arrdecl.hxx"
127*b1cdbd2cSJim Jagielski #include <sfx2/appuno.hxx>
128*b1cdbd2cSJim Jagielski #include <sfx2/viewfrm.hxx>
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski static SfxFilterList_Impl* pFilterArr = 0;
131*b1cdbd2cSJim Jagielski static sal_Bool bFirstRead = sal_True;
132*b1cdbd2cSJim Jagielski 
CreateFilterArr()133*b1cdbd2cSJim Jagielski static void CreateFilterArr()
134*b1cdbd2cSJim Jagielski {
135*b1cdbd2cSJim Jagielski 	pFilterArr = new SfxFilterList_Impl;
136*b1cdbd2cSJim Jagielski 	new SfxFilterListener();
137*b1cdbd2cSJim Jagielski }
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski //----------------------------------------------------------------
ToUpper_Impl(const String & rStr)140*b1cdbd2cSJim Jagielski inline String ToUpper_Impl( const String &rStr )
141*b1cdbd2cSJim Jagielski {
142*b1cdbd2cSJim Jagielski     return SvtSysLocale().GetCharClass().upper( rStr );
143*b1cdbd2cSJim Jagielski }
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski //----------------------------------------------------------------
146*b1cdbd2cSJim Jagielski class SfxFilterContainer_Impl
147*b1cdbd2cSJim Jagielski {
148*b1cdbd2cSJim Jagielski public:
149*b1cdbd2cSJim Jagielski     String 				aName;
150*b1cdbd2cSJim Jagielski     String 				aServiceName;
151*b1cdbd2cSJim Jagielski 
SfxFilterContainer_Impl(const String & rName)152*b1cdbd2cSJim Jagielski 						SfxFilterContainer_Impl( const String& rName )
153*b1cdbd2cSJim Jagielski 							: aName( rName )
154*b1cdbd2cSJim Jagielski 						{
155*b1cdbd2cSJim Jagielski 							aServiceName = SfxObjectShell::GetServiceNameFromFactory( rName );
156*b1cdbd2cSJim Jagielski 						}
157*b1cdbd2cSJim Jagielski };
158*b1cdbd2cSJim Jagielski 
159*b1cdbd2cSJim Jagielski #define IMPL_FORWARD_LOOP( aMethod, ArgType, aArg )         \
160*b1cdbd2cSJim Jagielski const SfxFilter* SfxFilterContainer::aMethod( ArgType aArg, SfxFilterFlags nMust, SfxFilterFlags nDont ) const \
161*b1cdbd2cSJim Jagielski {\
162*b1cdbd2cSJim Jagielski 	SfxFilterMatcher aMatch( pImpl->aName ); \
163*b1cdbd2cSJim Jagielski 	return aMatch.aMethod( aArg, nMust, nDont ); \
164*b1cdbd2cSJim Jagielski }
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski IMPL_FORWARD_LOOP( GetFilter4Mime, const String&, rMime );
167*b1cdbd2cSJim Jagielski IMPL_FORWARD_LOOP( GetFilter4ClipBoardId, sal_uInt32, nId );
168*b1cdbd2cSJim Jagielski IMPL_FORWARD_LOOP( GetFilter4EA, const String&, rEA );
169*b1cdbd2cSJim Jagielski IMPL_FORWARD_LOOP( GetFilter4Extension, const String&, rExt );
170*b1cdbd2cSJim Jagielski IMPL_FORWARD_LOOP( GetFilter4FilterName, const String&, rName );
171*b1cdbd2cSJim Jagielski IMPL_FORWARD_LOOP( GetFilter4UIName, const String&, rName );
172*b1cdbd2cSJim Jagielski 
GetAnyFilter(SfxFilterFlags nMust,SfxFilterFlags nDont) const173*b1cdbd2cSJim Jagielski const SfxFilter* SfxFilterContainer::GetAnyFilter( SfxFilterFlags nMust, SfxFilterFlags nDont ) const
174*b1cdbd2cSJim Jagielski {
175*b1cdbd2cSJim Jagielski 	SfxFilterMatcher aMatch( pImpl->aName );
176*b1cdbd2cSJim Jagielski 	return aMatch.GetAnyFilter( nMust, nDont );
177*b1cdbd2cSJim Jagielski }
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski //----------------------------------------------------------------
180*b1cdbd2cSJim Jagielski 
SfxFilterContainer(const String & rName)181*b1cdbd2cSJim Jagielski SfxFilterContainer::SfxFilterContainer( const String& rName )
182*b1cdbd2cSJim Jagielski {
183*b1cdbd2cSJim Jagielski 	pImpl = new SfxFilterContainer_Impl( rName );
184*b1cdbd2cSJim Jagielski }
185*b1cdbd2cSJim Jagielski 
186*b1cdbd2cSJim Jagielski //----------------------------------------------------------------
187*b1cdbd2cSJim Jagielski 
~SfxFilterContainer()188*b1cdbd2cSJim Jagielski SfxFilterContainer::~SfxFilterContainer()
189*b1cdbd2cSJim Jagielski {
190*b1cdbd2cSJim Jagielski 	delete pImpl;
191*b1cdbd2cSJim Jagielski }
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski //----------------------------------------------------------------
194*b1cdbd2cSJim Jagielski 
GetName() const195*b1cdbd2cSJim Jagielski const String SfxFilterContainer::GetName() const
196*b1cdbd2cSJim Jagielski {
197*b1cdbd2cSJim Jagielski     return pImpl->aName;
198*b1cdbd2cSJim Jagielski }
199*b1cdbd2cSJim Jagielski 
GetDefaultFilter_Impl(const String & rName)200*b1cdbd2cSJim Jagielski const SfxFilter* SfxFilterContainer::GetDefaultFilter_Impl( const String& rName )
201*b1cdbd2cSJim Jagielski {
202*b1cdbd2cSJim Jagielski 	// Try to find out the type of factory.
203*b1cdbd2cSJim Jagielski 	// Interpret given name as Service- and ShortName!
204*b1cdbd2cSJim Jagielski 	SvtModuleOptions aOpt;
205*b1cdbd2cSJim Jagielski     SvtModuleOptions::EFactory eFactory = aOpt.ClassifyFactoryByServiceName(rName);
206*b1cdbd2cSJim Jagielski     if (eFactory == SvtModuleOptions::E_UNKNOWN_FACTORY)
207*b1cdbd2cSJim Jagielski 		eFactory = aOpt.ClassifyFactoryByShortName(rName);
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski 	// could not classify factory by its service nor by its short name.
210*b1cdbd2cSJim Jagielski 	// Must be an unknown factory! => return NULL
211*b1cdbd2cSJim Jagielski 	if (eFactory == SvtModuleOptions::E_UNKNOWN_FACTORY)
212*b1cdbd2cSJim Jagielski 		return NULL;
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski 	// For the following code we need some additional informations.
215*b1cdbd2cSJim Jagielski 	String sServiceName   = aOpt.GetFactoryName(eFactory);
216*b1cdbd2cSJim Jagielski 	String sShortName     = aOpt.GetFactoryShortName(eFactory);
217*b1cdbd2cSJim Jagielski     String sDefaultFilter = aOpt.GetFactoryDefaultFilter(eFactory);
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski 	// Try to get the default filter. Dont fiorget to verify it.
220*b1cdbd2cSJim Jagielski 	// May the set default filter does not exists any longer or
221*b1cdbd2cSJim Jagielski 	// does not fit the given factory.
222*b1cdbd2cSJim Jagielski     const SfxFilterMatcher aMatcher;
223*b1cdbd2cSJim Jagielski     const SfxFilter* pFilter = aMatcher.GetFilter4FilterName(sDefaultFilter);
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski 	if (
226*b1cdbd2cSJim Jagielski 		(pFilter																			) &&
227*b1cdbd2cSJim Jagielski 		(pFilter->GetServiceName().CompareIgnoreCaseToAscii( sServiceName ) != COMPARE_EQUAL)
228*b1cdbd2cSJim Jagielski 	   )
229*b1cdbd2cSJim Jagielski 	{
230*b1cdbd2cSJim Jagielski 		pFilter = 0;
231*b1cdbd2cSJim Jagielski 	}
232*b1cdbd2cSJim Jagielski 
233*b1cdbd2cSJim Jagielski 	// If at least no default filter could be located - use any filter of this
234*b1cdbd2cSJim Jagielski 	// factory.
235*b1cdbd2cSJim Jagielski 	if (!pFilter)
236*b1cdbd2cSJim Jagielski     {
237*b1cdbd2cSJim Jagielski         if ( bFirstRead )
238*b1cdbd2cSJim Jagielski             ReadFilters_Impl();
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski         sal_uInt16 nCount = ( sal_uInt16 ) pFilterArr->Count();
241*b1cdbd2cSJim Jagielski         for( sal_uInt16 n = 0; n < nCount; n++ )
242*b1cdbd2cSJim Jagielski         {
243*b1cdbd2cSJim Jagielski             const SfxFilter* pCheckFilter = pFilterArr->GetObject( n );
244*b1cdbd2cSJim Jagielski             if ( pCheckFilter->GetServiceName().CompareIgnoreCaseToAscii( sServiceName ) == COMPARE_EQUAL )
245*b1cdbd2cSJim Jagielski             {
246*b1cdbd2cSJim Jagielski                 pFilter = pCheckFilter;
247*b1cdbd2cSJim Jagielski                 break;
248*b1cdbd2cSJim Jagielski             }
249*b1cdbd2cSJim Jagielski         }
250*b1cdbd2cSJim Jagielski     }
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski     return pFilter;
253*b1cdbd2cSJim Jagielski }
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski //----------------------------------------------------------------
257*b1cdbd2cSJim Jagielski 
258*b1cdbd2cSJim Jagielski class SfxFilterMatcherArr_Impl;
259*b1cdbd2cSJim Jagielski static SfxFilterMatcherArr_Impl* pImplArr = 0;
260*b1cdbd2cSJim Jagielski 
261*b1cdbd2cSJim Jagielski // Impl-Data is shared between all FilterMatchers of the same factory
262*b1cdbd2cSJim Jagielski class SfxFilterMatcher_Impl
263*b1cdbd2cSJim Jagielski {
264*b1cdbd2cSJim Jagielski public:
265*b1cdbd2cSJim Jagielski 	::rtl::OUString 	aName;
266*b1cdbd2cSJim Jagielski 	SfxFilterList_Impl* pList;		// is created on demand
267*b1cdbd2cSJim Jagielski 
268*b1cdbd2cSJim Jagielski 	void				InitForIterating() const;
269*b1cdbd2cSJim Jagielski 	void				Update();
SfxFilterMatcher_Impl()270*b1cdbd2cSJim Jagielski 						SfxFilterMatcher_Impl()
271*b1cdbd2cSJim Jagielski 							: pList(0)
272*b1cdbd2cSJim Jagielski 						{}
273*b1cdbd2cSJim Jagielski };
274*b1cdbd2cSJim Jagielski 
275*b1cdbd2cSJim Jagielski DECL_PTRARRAY( SfxFilterMatcherArr_Impl, SfxFilterMatcher_Impl*, 2, 2 )
276*b1cdbd2cSJim Jagielski 
SfxFilterMatcher(const String & rName)277*b1cdbd2cSJim Jagielski SfxFilterMatcher::SfxFilterMatcher( const String& rName )
278*b1cdbd2cSJim Jagielski 	: pImpl( 0 )
279*b1cdbd2cSJim Jagielski {
280*b1cdbd2cSJim Jagielski 	if ( !pImplArr )
281*b1cdbd2cSJim Jagielski 		// keep track of created filter matchers to recycle the FilterLists
282*b1cdbd2cSJim Jagielski 		pImplArr = new SfxFilterMatcherArr_Impl;
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski 	String aName = SfxObjectShell::GetServiceNameFromFactory( rName );
285*b1cdbd2cSJim Jagielski     DBG_ASSERT(aName.Len(), "Found boes type :-)");
286*b1cdbd2cSJim Jagielski 	for ( sal_uInt16 n=0; n<pImplArr->Count(); n++ )
287*b1cdbd2cSJim Jagielski 	{
288*b1cdbd2cSJim Jagielski 		// find the impl-Data of any comparable FilterMatcher that was created before
289*b1cdbd2cSJim Jagielski 		SfxFilterMatcher_Impl* pImp = pImplArr->GetObject(n);
290*b1cdbd2cSJim Jagielski 		if ( String(pImp->aName) == aName )
291*b1cdbd2cSJim Jagielski 			pImpl = pImp;
292*b1cdbd2cSJim Jagielski 	}
293*b1cdbd2cSJim Jagielski 
294*b1cdbd2cSJim Jagielski 	if ( !pImpl )
295*b1cdbd2cSJim Jagielski 	{
296*b1cdbd2cSJim Jagielski 		// first Matcher created for this factory
297*b1cdbd2cSJim Jagielski     	pImpl = new SfxFilterMatcher_Impl;
298*b1cdbd2cSJim Jagielski 		pImpl->aName = aName;
299*b1cdbd2cSJim Jagielski 		pImplArr->Insert( pImplArr->Count(), pImpl );
300*b1cdbd2cSJim Jagielski 	}
301*b1cdbd2cSJim Jagielski }
302*b1cdbd2cSJim Jagielski 
SfxFilterMatcher()303*b1cdbd2cSJim Jagielski SfxFilterMatcher::SfxFilterMatcher()
304*b1cdbd2cSJim Jagielski {
305*b1cdbd2cSJim Jagielski 	// global FilterMatcher always uses global filter array (also created on demand)
306*b1cdbd2cSJim Jagielski     pImpl = new SfxFilterMatcher_Impl;
307*b1cdbd2cSJim Jagielski }
308*b1cdbd2cSJim Jagielski 
~SfxFilterMatcher()309*b1cdbd2cSJim Jagielski SfxFilterMatcher::~SfxFilterMatcher()
310*b1cdbd2cSJim Jagielski {
311*b1cdbd2cSJim Jagielski 	if ( !pImpl->aName.getLength() )
312*b1cdbd2cSJim Jagielski 		// only the global Matcher owns his ImplData
313*b1cdbd2cSJim Jagielski 		delete pImpl;
314*b1cdbd2cSJim Jagielski }
315*b1cdbd2cSJim Jagielski 
Update()316*b1cdbd2cSJim Jagielski void SfxFilterMatcher_Impl::Update()
317*b1cdbd2cSJim Jagielski {
318*b1cdbd2cSJim Jagielski 	if ( pList )
319*b1cdbd2cSJim Jagielski 	{
320*b1cdbd2cSJim Jagielski 		// this List was already used
321*b1cdbd2cSJim Jagielski 		pList->Clear();
322*b1cdbd2cSJim Jagielski 		for ( sal_uInt16 n=0; n<pFilterArr->Count(); n++ )
323*b1cdbd2cSJim Jagielski 		{
324*b1cdbd2cSJim Jagielski 			SfxFilter* pFilter = pFilterArr->GetObject(n);
325*b1cdbd2cSJim Jagielski 			if ( pFilter->GetServiceName() == String(aName) )
326*b1cdbd2cSJim Jagielski 				pList->Insert( pFilter, LIST_APPEND );
327*b1cdbd2cSJim Jagielski 		}
328*b1cdbd2cSJim Jagielski 	}
329*b1cdbd2cSJim Jagielski }
330*b1cdbd2cSJim Jagielski 
InitForIterating() const331*b1cdbd2cSJim Jagielski void SfxFilterMatcher_Impl::InitForIterating() const
332*b1cdbd2cSJim Jagielski {
333*b1cdbd2cSJim Jagielski 	if ( pList )
334*b1cdbd2cSJim Jagielski 		return;
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski 	if ( bFirstRead )
337*b1cdbd2cSJim Jagielski 		// global filter array has not been created yet
338*b1cdbd2cSJim Jagielski 		SfxFilterContainer::ReadFilters_Impl();
339*b1cdbd2cSJim Jagielski 
340*b1cdbd2cSJim Jagielski 	if ( aName.getLength() )
341*b1cdbd2cSJim Jagielski 	{
342*b1cdbd2cSJim Jagielski 		// matcher of factory: use only filters of that document type
343*b1cdbd2cSJim Jagielski 		((SfxFilterMatcher_Impl*)this)->pList = new SfxFilterList_Impl;
344*b1cdbd2cSJim Jagielski 		((SfxFilterMatcher_Impl*)this)->Update();
345*b1cdbd2cSJim Jagielski 	}
346*b1cdbd2cSJim Jagielski 	else
347*b1cdbd2cSJim Jagielski 	{
348*b1cdbd2cSJim Jagielski 		// global matcher: use global filter array
349*b1cdbd2cSJim Jagielski 		((SfxFilterMatcher_Impl*)this)->pList = pFilterArr;
350*b1cdbd2cSJim Jagielski 	}
351*b1cdbd2cSJim Jagielski }
352*b1cdbd2cSJim Jagielski 
GetAnyFilter(SfxFilterFlags nMust,SfxFilterFlags nDont) const353*b1cdbd2cSJim Jagielski const SfxFilter* SfxFilterMatcher::GetAnyFilter( SfxFilterFlags nMust, SfxFilterFlags nDont ) const
354*b1cdbd2cSJim Jagielski {
355*b1cdbd2cSJim Jagielski 	pImpl->InitForIterating();
356*b1cdbd2cSJim Jagielski     sal_uInt16 nCount = ( sal_uInt16 ) pImpl->pList->Count();
357*b1cdbd2cSJim Jagielski     for( sal_uInt16 n = 0; n < nCount; n++ )
358*b1cdbd2cSJim Jagielski     {
359*b1cdbd2cSJim Jagielski         const SfxFilter* pFilter = pImpl->pList->GetObject( n );
360*b1cdbd2cSJim Jagielski         SfxFilterFlags nFlags = pFilter->GetFilterFlags();
361*b1cdbd2cSJim Jagielski         if ( (nFlags & nMust) == nMust && !(nFlags & nDont ) )
362*b1cdbd2cSJim Jagielski             return pFilter;
363*b1cdbd2cSJim Jagielski     }
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski     return NULL;
366*b1cdbd2cSJim Jagielski }
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski //----------------------------------------------------------------
369*b1cdbd2cSJim Jagielski 
GuessFilterIgnoringContent(SfxMedium & rMedium,const SfxFilter ** ppFilter,SfxFilterFlags,SfxFilterFlags) const370*b1cdbd2cSJim Jagielski sal_uInt32  SfxFilterMatcher::GuessFilterIgnoringContent(
371*b1cdbd2cSJim Jagielski     SfxMedium& rMedium,
372*b1cdbd2cSJim Jagielski     const SfxFilter**ppFilter,
373*b1cdbd2cSJim Jagielski     SfxFilterFlags /*nMust*/,
374*b1cdbd2cSJim Jagielski     SfxFilterFlags /*nDont*/ ) const
375*b1cdbd2cSJim Jagielski {
376*b1cdbd2cSJim Jagielski     Reference< XTypeDetection > xDetection( ::comphelper::getProcessServiceFactory()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.document.TypeDetection")), UNO_QUERY );
377*b1cdbd2cSJim Jagielski     ::rtl::OUString sTypeName;
378*b1cdbd2cSJim Jagielski     try
379*b1cdbd2cSJim Jagielski     {
380*b1cdbd2cSJim Jagielski 		//!MBA: nmust, ndont?
381*b1cdbd2cSJim Jagielski         sTypeName = xDetection->queryTypeByURL( rMedium.GetURLObject().GetMainURL( INetURLObject::NO_DECODE ) );
382*b1cdbd2cSJim Jagielski     }
383*b1cdbd2cSJim Jagielski     catch( Exception& )
384*b1cdbd2cSJim Jagielski     {
385*b1cdbd2cSJim Jagielski     }
386*b1cdbd2cSJim Jagielski 
387*b1cdbd2cSJim Jagielski 	*ppFilter = NULL;
388*b1cdbd2cSJim Jagielski 	if ( sTypeName.getLength() )
389*b1cdbd2cSJim Jagielski 		*ppFilter = GetFilter4EA( sTypeName );
390*b1cdbd2cSJim Jagielski 
391*b1cdbd2cSJim Jagielski 	return *ppFilter ? ERRCODE_NONE : ERRCODE_ABORT;
392*b1cdbd2cSJim Jagielski }
393*b1cdbd2cSJim Jagielski 
394*b1cdbd2cSJim Jagielski //----------------------------------------------------------------
395*b1cdbd2cSJim Jagielski 
396*b1cdbd2cSJim Jagielski #define CHECKERROR()											\
397*b1cdbd2cSJim Jagielski if( nErr == 1 || nErr == USHRT_MAX || nErr == ULONG_MAX )		\
398*b1cdbd2cSJim Jagielski {																\
399*b1cdbd2cSJim Jagielski 	ByteString aText = "Fehler in FilterDetection: Returnwert ";\
400*b1cdbd2cSJim Jagielski 	aText += ByteString::CreateFromInt32(nErr);					\
401*b1cdbd2cSJim Jagielski 	if( pFilter )												\
402*b1cdbd2cSJim Jagielski 	{															\
403*b1cdbd2cSJim Jagielski 		aText += ' ';											\
404*b1cdbd2cSJim Jagielski         aText += ByteString(U2S(pFilter->GetFilterName()));     \
405*b1cdbd2cSJim Jagielski 	}															\
406*b1cdbd2cSJim Jagielski 	DBG_ERROR( aText.GetBuffer() );								\
407*b1cdbd2cSJim Jagielski 	nErr = ERRCODE_ABORT;										\
408*b1cdbd2cSJim Jagielski }
409*b1cdbd2cSJim Jagielski 
410*b1cdbd2cSJim Jagielski //----------------------------------------------------------------
411*b1cdbd2cSJim Jagielski 
GuessFilter(SfxMedium & rMedium,const SfxFilter ** ppFilter,SfxFilterFlags nMust,SfxFilterFlags nDont) const412*b1cdbd2cSJim Jagielski sal_uInt32  SfxFilterMatcher::GuessFilter( SfxMedium& rMedium, const SfxFilter**ppFilter, SfxFilterFlags nMust, SfxFilterFlags nDont ) const
413*b1cdbd2cSJim Jagielski {
414*b1cdbd2cSJim Jagielski 	return GuessFilterControlDefaultUI( rMedium, ppFilter, nMust, nDont, sal_True );
415*b1cdbd2cSJim Jagielski }
416*b1cdbd2cSJim Jagielski 
417*b1cdbd2cSJim Jagielski //----------------------------------------------------------------
418*b1cdbd2cSJim Jagielski 
GuessFilterControlDefaultUI(SfxMedium & rMedium,const SfxFilter ** ppFilter,SfxFilterFlags nMust,SfxFilterFlags nDont,sal_Bool) const419*b1cdbd2cSJim Jagielski sal_uInt32  SfxFilterMatcher::GuessFilterControlDefaultUI( SfxMedium& rMedium, const SfxFilter** ppFilter, SfxFilterFlags nMust, SfxFilterFlags nDont, sal_Bool /*bDefUI*/ ) const
420*b1cdbd2cSJim Jagielski {
421*b1cdbd2cSJim Jagielski     const SfxFilter* pOldFilter = *ppFilter;
422*b1cdbd2cSJim Jagielski 
423*b1cdbd2cSJim Jagielski     // no detection service -> nothing to do !
424*b1cdbd2cSJim Jagielski     Reference< XTypeDetection > xDetection( ::comphelper::getProcessServiceFactory()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.document.TypeDetection")), UNO_QUERY );
425*b1cdbd2cSJim Jagielski     if (!xDetection.is())
426*b1cdbd2cSJim Jagielski         return ERRCODE_ABORT;
427*b1cdbd2cSJim Jagielski 
428*b1cdbd2cSJim Jagielski     ::rtl::OUString sTypeName;
429*b1cdbd2cSJim Jagielski     try
430*b1cdbd2cSJim Jagielski     {
431*b1cdbd2cSJim Jagielski         // open the stream one times only ...
432*b1cdbd2cSJim Jagielski         // Otherwhise it will be tried more then once and show the same interaction more then once ...
433*b1cdbd2cSJim Jagielski 
434*b1cdbd2cSJim Jagielski         ::rtl::OUString sURL( rMedium.GetURLObject().GetMainURL( INetURLObject::NO_DECODE ) );
435*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > xInStream = rMedium.GetInputStream();
436*b1cdbd2cSJim Jagielski 
437*b1cdbd2cSJim Jagielski         // stream exists => deep detection (with preselection ... if possible)
438*b1cdbd2cSJim Jagielski         if (xInStream.is())
439*b1cdbd2cSJim Jagielski         {
440*b1cdbd2cSJim Jagielski             ::comphelper::MediaDescriptor aDescriptor;
441*b1cdbd2cSJim Jagielski 
442*b1cdbd2cSJim Jagielski             aDescriptor[::comphelper::MediaDescriptor::PROP_URL()               ] <<= sURL;
443*b1cdbd2cSJim Jagielski             aDescriptor[::comphelper::MediaDescriptor::PROP_INPUTSTREAM()       ] <<= xInStream;
444*b1cdbd2cSJim Jagielski             aDescriptor[::comphelper::MediaDescriptor::PROP_INTERACTIONHANDLER()] <<= rMedium.GetInteractionHandler();
445*b1cdbd2cSJim Jagielski 
446*b1cdbd2cSJim Jagielski             if ( pImpl->aName.getLength() )
447*b1cdbd2cSJim Jagielski                 aDescriptor[::comphelper::MediaDescriptor::PROP_DOCUMENTSERVICE()] <<= pImpl->aName;
448*b1cdbd2cSJim Jagielski 
449*b1cdbd2cSJim Jagielski             if ( pOldFilter )
450*b1cdbd2cSJim Jagielski             {
451*b1cdbd2cSJim Jagielski                 aDescriptor[::comphelper::MediaDescriptor::PROP_TYPENAME()  ] <<= ::rtl::OUString( pOldFilter->GetTypeName()   );
452*b1cdbd2cSJim Jagielski                 aDescriptor[::comphelper::MediaDescriptor::PROP_FILTERNAME()] <<= ::rtl::OUString( pOldFilter->GetFilterName() );
453*b1cdbd2cSJim Jagielski             }
454*b1cdbd2cSJim Jagielski 
455*b1cdbd2cSJim Jagielski             ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > lDescriptor = aDescriptor.getAsConstPropertyValueList();
456*b1cdbd2cSJim Jagielski             sTypeName = xDetection->queryTypeByDescriptor(lDescriptor, sal_True); // lDescriptor is used as In/Out param ... dont use aDescriptor.getAsConstPropertyValueList() directly!
457*b1cdbd2cSJim Jagielski         }
458*b1cdbd2cSJim Jagielski         // no stream exists => try flat detection without preselection as fallback
459*b1cdbd2cSJim Jagielski         else
460*b1cdbd2cSJim Jagielski             sTypeName = xDetection->queryTypeByURL(sURL);
461*b1cdbd2cSJim Jagielski 
462*b1cdbd2cSJim Jagielski         if (sTypeName.getLength())
463*b1cdbd2cSJim Jagielski         {
464*b1cdbd2cSJim Jagielski             // detect filter by given type
465*b1cdbd2cSJim Jagielski             // In case of this matcher is bound to a particular document type:
466*b1cdbd2cSJim Jagielski             // If there is no acceptable type for this document at all, the type detection has possibly returned something else.
467*b1cdbd2cSJim Jagielski             // The DocumentService property is only a preselection, and all preselections are considered as optional!
468*b1cdbd2cSJim Jagielski             // This "wrong" type will be sorted out now because we match only allowed filters to the detected type
469*b1cdbd2cSJim Jagielski             ::com::sun::star::uno::Sequence< ::com::sun::star::beans::NamedValue > lQuery(1);
470*b1cdbd2cSJim Jagielski             lQuery[0].Name = ::rtl::OUString::createFromAscii("Name");
471*b1cdbd2cSJim Jagielski             lQuery[0].Value <<= sTypeName;
472*b1cdbd2cSJim Jagielski 
473*b1cdbd2cSJim Jagielski             const SfxFilter* pFilter = GetFilterForProps(lQuery, nMust, nDont);
474*b1cdbd2cSJim Jagielski             if (pFilter)
475*b1cdbd2cSJim Jagielski             {
476*b1cdbd2cSJim Jagielski                 *ppFilter = pFilter;
477*b1cdbd2cSJim Jagielski                 return ERRCODE_NONE;
478*b1cdbd2cSJim Jagielski             }
479*b1cdbd2cSJim Jagielski         }
480*b1cdbd2cSJim Jagielski     }
481*b1cdbd2cSJim Jagielski     catch(const Exception&)
482*b1cdbd2cSJim Jagielski     {}
483*b1cdbd2cSJim Jagielski 
484*b1cdbd2cSJim Jagielski     return ERRCODE_ABORT;
485*b1cdbd2cSJim Jagielski }
486*b1cdbd2cSJim Jagielski 
487*b1cdbd2cSJim Jagielski //----------------------------------------------------------------
IsFilterInstalled_Impl(const SfxFilter * pFilter)488*b1cdbd2cSJim Jagielski sal_Bool SfxFilterMatcher::IsFilterInstalled_Impl( const SfxFilter* pFilter )
489*b1cdbd2cSJim Jagielski {
490*b1cdbd2cSJim Jagielski 	if ( pFilter->GetFilterFlags() & SFX_FILTER_MUSTINSTALL )
491*b1cdbd2cSJim Jagielski 	{
492*b1cdbd2cSJim Jagielski 		// Hier k"onnte noch eine Nachinstallation angeboten werden
493*b1cdbd2cSJim Jagielski 		String aText( SfxResId( STR_FILTER_NOT_INSTALLED ) );
494*b1cdbd2cSJim Jagielski 		aText.SearchAndReplaceAscii( "$(FILTER)", pFilter->GetUIName() );
495*b1cdbd2cSJim Jagielski         QueryBox aQuery( NULL, WB_YES_NO | WB_DEF_YES, aText );
496*b1cdbd2cSJim Jagielski 		short nRet = aQuery.Execute();
497*b1cdbd2cSJim Jagielski 		if ( nRet == RET_YES )
498*b1cdbd2cSJim Jagielski 		{
499*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
500*b1cdbd2cSJim Jagielski 			// Setup starten
501*b1cdbd2cSJim Jagielski             InfoBox( NULL, DEFINE_CONST_UNICODE("Hier soll jetzt das Setup starten!") ).Execute();
502*b1cdbd2cSJim Jagielski #endif
503*b1cdbd2cSJim Jagielski 			// Installation mu\s hier noch mitteilen, ob es geklappt hat, dann kann das
504*b1cdbd2cSJim Jagielski 			// Filterflag gel"oscht werden
505*b1cdbd2cSJim Jagielski 		}
506*b1cdbd2cSJim Jagielski 
507*b1cdbd2cSJim Jagielski 		return ( !(pFilter->GetFilterFlags() & SFX_FILTER_MUSTINSTALL) );
508*b1cdbd2cSJim Jagielski 	}
509*b1cdbd2cSJim Jagielski 	else if ( pFilter->GetFilterFlags() & SFX_FILTER_CONSULTSERVICE )
510*b1cdbd2cSJim Jagielski 	{
511*b1cdbd2cSJim Jagielski 		String aText( SfxResId( STR_FILTER_CONSULT_SERVICE ) );
512*b1cdbd2cSJim Jagielski 		aText.SearchAndReplaceAscii( "$(FILTER)", pFilter->GetUIName() );
513*b1cdbd2cSJim Jagielski         InfoBox ( NULL, aText ).Execute();
514*b1cdbd2cSJim Jagielski 		return sal_False;
515*b1cdbd2cSJim Jagielski 	}
516*b1cdbd2cSJim Jagielski 	else
517*b1cdbd2cSJim Jagielski 		return sal_True;
518*b1cdbd2cSJim Jagielski }
519*b1cdbd2cSJim Jagielski 
520*b1cdbd2cSJim Jagielski 
DetectFilter(SfxMedium & rMedium,const SfxFilter ** ppFilter,sal_Bool,sal_Bool bAPI) const521*b1cdbd2cSJim Jagielski sal_uInt32 SfxFilterMatcher::DetectFilter( SfxMedium& rMedium, const SfxFilter**ppFilter, sal_Bool /*bPlugIn*/, sal_Bool bAPI ) const
522*b1cdbd2cSJim Jagielski /*  [Beschreibung]
523*b1cdbd2cSJim Jagielski 
524*b1cdbd2cSJim Jagielski     Hier wird noch die Filterauswahlbox hochgezogen. Sonst GuessFilter
525*b1cdbd2cSJim Jagielski  */
526*b1cdbd2cSJim Jagielski 
527*b1cdbd2cSJim Jagielski {
528*b1cdbd2cSJim Jagielski     const SfxFilter* pOldFilter = rMedium.GetFilter();
529*b1cdbd2cSJim Jagielski     if ( pOldFilter )
530*b1cdbd2cSJim Jagielski     {
531*b1cdbd2cSJim Jagielski         if( !IsFilterInstalled_Impl( pOldFilter ) )
532*b1cdbd2cSJim Jagielski             pOldFilter = 0;
533*b1cdbd2cSJim Jagielski         else
534*b1cdbd2cSJim Jagielski         {
535*b1cdbd2cSJim Jagielski             SFX_ITEMSET_ARG( rMedium.GetItemSet(), pSalvageItem, SfxStringItem, SID_DOC_SALVAGE, sal_False);
536*b1cdbd2cSJim Jagielski             if ( ( pOldFilter->GetFilterFlags() & SFX_FILTER_PACKED ) && pSalvageItem )
537*b1cdbd2cSJim Jagielski                 // Salvage is always done without packing
538*b1cdbd2cSJim Jagielski                 pOldFilter = 0;
539*b1cdbd2cSJim Jagielski         }
540*b1cdbd2cSJim Jagielski     }
541*b1cdbd2cSJim Jagielski 
542*b1cdbd2cSJim Jagielski     const SfxFilter* pFilter = pOldFilter;
543*b1cdbd2cSJim Jagielski 
544*b1cdbd2cSJim Jagielski     sal_Bool bPreview = rMedium.IsPreview_Impl();
545*b1cdbd2cSJim Jagielski 	SFX_ITEMSET_ARG(rMedium.GetItemSet(), pReferer, SfxStringItem, SID_REFERER, sal_False);
546*b1cdbd2cSJim Jagielski     if ( bPreview && rMedium.IsRemote() && ( !pReferer || pReferer->GetValue().CompareToAscii("private:searchfolder:",21 ) != COMPARE_EQUAL ) )
547*b1cdbd2cSJim Jagielski         return ERRCODE_ABORT;
548*b1cdbd2cSJim Jagielski 
549*b1cdbd2cSJim Jagielski 	ErrCode nErr = GuessFilter( rMedium, &pFilter );
550*b1cdbd2cSJim Jagielski 	if ( nErr == ERRCODE_ABORT )
551*b1cdbd2cSJim Jagielski 		return nErr;
552*b1cdbd2cSJim Jagielski 
553*b1cdbd2cSJim Jagielski 	if ( nErr == ERRCODE_IO_PENDING )
554*b1cdbd2cSJim Jagielski 	{
555*b1cdbd2cSJim Jagielski 		*ppFilter = pFilter;
556*b1cdbd2cSJim Jagielski 		return nErr;
557*b1cdbd2cSJim Jagielski 	}
558*b1cdbd2cSJim Jagielski 
559*b1cdbd2cSJim Jagielski 	if ( !pFilter )
560*b1cdbd2cSJim Jagielski 	{
561*b1cdbd2cSJim Jagielski     	const SfxFilter* pInstallFilter = NULL;
562*b1cdbd2cSJim Jagielski 
563*b1cdbd2cSJim Jagielski 		// Jetzt auch Filter testen, die nicht installiert sind ( ErrCode ist irrelevant )
564*b1cdbd2cSJim Jagielski 		GuessFilter( rMedium, &pInstallFilter, SFX_FILTER_IMPORT, SFX_FILTER_CONSULTSERVICE );
565*b1cdbd2cSJim Jagielski 		if ( pInstallFilter )
566*b1cdbd2cSJim Jagielski 		{
567*b1cdbd2cSJim Jagielski 			if ( IsFilterInstalled_Impl( pInstallFilter ) )
568*b1cdbd2cSJim Jagielski 				// Eventuell wurde der Filter nachinstalliert
569*b1cdbd2cSJim Jagielski 				pFilter = pInstallFilter;
570*b1cdbd2cSJim Jagielski 		}
571*b1cdbd2cSJim Jagielski 		else
572*b1cdbd2cSJim Jagielski 		{
573*b1cdbd2cSJim Jagielski 			// Jetzt auch Filter testen, die erst von Star bezogen werden m"ussen ( ErrCode ist irrelevant )
574*b1cdbd2cSJim Jagielski 			GuessFilter( rMedium, &pInstallFilter, SFX_FILTER_IMPORT, 0 );
575*b1cdbd2cSJim Jagielski 			if ( pInstallFilter )
576*b1cdbd2cSJim Jagielski 				IsFilterInstalled_Impl( pInstallFilter );
577*b1cdbd2cSJim Jagielski 		}
578*b1cdbd2cSJim Jagielski 	}
579*b1cdbd2cSJim Jagielski 
580*b1cdbd2cSJim Jagielski     sal_Bool bHidden = bPreview;
581*b1cdbd2cSJim Jagielski 	SFX_ITEMSET_ARG( rMedium.GetItemSet(), pFlags, SfxStringItem, SID_OPTIONS, sal_False);
582*b1cdbd2cSJim Jagielski     if ( !bHidden && pFlags )
583*b1cdbd2cSJim Jagielski     {
584*b1cdbd2cSJim Jagielski         String aFlags( pFlags->GetValue() );
585*b1cdbd2cSJim Jagielski         aFlags.ToUpperAscii();
586*b1cdbd2cSJim Jagielski         if( STRING_NOTFOUND != aFlags.Search( 'H' ) )
587*b1cdbd2cSJim Jagielski             bHidden = sal_True;
588*b1cdbd2cSJim Jagielski     }
589*b1cdbd2cSJim Jagielski     *ppFilter = pFilter;
590*b1cdbd2cSJim Jagielski 
591*b1cdbd2cSJim Jagielski     if ( bHidden || (bAPI && nErr == ERRCODE_SFX_CONSULTUSER) )
592*b1cdbd2cSJim Jagielski 		nErr = pFilter ? ERRCODE_NONE : ERRCODE_ABORT;
593*b1cdbd2cSJim Jagielski     return nErr;
594*b1cdbd2cSJim Jagielski }
595*b1cdbd2cSJim Jagielski 
GetFilterForProps(const com::sun::star::uno::Sequence<::com::sun::star::beans::NamedValue> & aSeq,SfxFilterFlags nMust,SfxFilterFlags nDont) const596*b1cdbd2cSJim Jagielski const SfxFilter* SfxFilterMatcher::GetFilterForProps( const com::sun::star::uno::Sequence < ::com::sun::star::beans::NamedValue >& aSeq, SfxFilterFlags nMust, SfxFilterFlags nDont ) const
597*b1cdbd2cSJim Jagielski {
598*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xServiceManager = ::comphelper::getProcessServiceFactory();
599*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Reference< ::com::sun::star::container::XContainerQuery > xTypeCFG;
600*b1cdbd2cSJim Jagielski     if( xServiceManager.is() == sal_True )
601*b1cdbd2cSJim Jagielski         xTypeCFG   = ::com::sun::star::uno::Reference < com::sun::star::container::XContainerQuery >( xServiceManager->createInstance( DEFINE_CONST_UNICODE( "com.sun.star.document.TypeDetection" ) ), ::com::sun::star::uno::UNO_QUERY );
602*b1cdbd2cSJim Jagielski     if ( xTypeCFG.is() )
603*b1cdbd2cSJim Jagielski     {
604*b1cdbd2cSJim Jagielski         // make query for all types matching the properties
605*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Reference < com::sun::star::container::XEnumeration > xEnum = xTypeCFG->createSubSetEnumerationByProperties( aSeq );
606*b1cdbd2cSJim Jagielski         while ( xEnum->hasMoreElements() )
607*b1cdbd2cSJim Jagielski         {
608*b1cdbd2cSJim Jagielski             ::comphelper::SequenceAsHashMap aProps( xEnum->nextElement() );
609*b1cdbd2cSJim Jagielski             ::rtl::OUString aValue;
610*b1cdbd2cSJim Jagielski 
611*b1cdbd2cSJim Jagielski             // try to get the preferred filter (works without loading all filters!)
612*b1cdbd2cSJim Jagielski             if ( (aProps[::rtl::OUString::createFromAscii("PreferredFilter")] >>= aValue) && aValue.getLength() )
613*b1cdbd2cSJim Jagielski             {
614*b1cdbd2cSJim Jagielski                 const SfxFilter* pFilter = SfxFilter::GetFilterByName( aValue );
615*b1cdbd2cSJim Jagielski                 if ( !pFilter || (pFilter->GetFilterFlags() & nMust) != nMust || (pFilter->GetFilterFlags() & nDont ) )
616*b1cdbd2cSJim Jagielski                     // check for filter flags
617*b1cdbd2cSJim Jagielski                     // pFilter == 0: if preferred filter is a Writer filter, but Writer module is not installed
618*b1cdbd2cSJim Jagielski 					continue;
619*b1cdbd2cSJim Jagielski 
620*b1cdbd2cSJim Jagielski                 if ( pImpl->aName.getLength() )
621*b1cdbd2cSJim Jagielski                 {
622*b1cdbd2cSJim Jagielski                     // if this is not the global FilterMatcher: check if filter matches the document type
623*b1cdbd2cSJim Jagielski                     ::rtl::OUString aService;
624*b1cdbd2cSJim Jagielski                     if ( pFilter->GetServiceName() != String(pImpl->aName) )
625*b1cdbd2cSJim Jagielski                     {
626*b1cdbd2cSJim Jagielski                         // preferred filter belongs to another document type; now we must search the filter
627*b1cdbd2cSJim Jagielski                         pImpl->InitForIterating();
628*b1cdbd2cSJim Jagielski                         aProps[::rtl::OUString::createFromAscii("Name")] >>= aValue;
629*b1cdbd2cSJim Jagielski                         pFilter = GetFilter4EA( aValue, nMust, nDont );
630*b1cdbd2cSJim Jagielski                         if ( pFilter )
631*b1cdbd2cSJim Jagielski                             return pFilter;
632*b1cdbd2cSJim Jagielski                     }
633*b1cdbd2cSJim Jagielski                     else
634*b1cdbd2cSJim Jagielski                         return pFilter;
635*b1cdbd2cSJim Jagielski                 }
636*b1cdbd2cSJim Jagielski                 else
637*b1cdbd2cSJim Jagielski                     return pFilter;
638*b1cdbd2cSJim Jagielski             }
639*b1cdbd2cSJim Jagielski         }
640*b1cdbd2cSJim Jagielski     }
641*b1cdbd2cSJim Jagielski 
642*b1cdbd2cSJim Jagielski     return 0;
643*b1cdbd2cSJim Jagielski }
644*b1cdbd2cSJim Jagielski 
GetFilter4Mime(const String & rMediaType,SfxFilterFlags nMust,SfxFilterFlags nDont) const645*b1cdbd2cSJim Jagielski const SfxFilter* SfxFilterMatcher::GetFilter4Mime( const String& rMediaType,SfxFilterFlags nMust, SfxFilterFlags nDont ) const
646*b1cdbd2cSJim Jagielski {
647*b1cdbd2cSJim Jagielski 	if ( pImpl->pList )
648*b1cdbd2cSJim Jagielski 	{
649*b1cdbd2cSJim Jagielski 	    sal_uInt16 nCount = ( sal_uInt16 ) pImpl->pList->Count();
650*b1cdbd2cSJim Jagielski 	    for( sal_uInt16 n = 0; n < nCount; n++ )
651*b1cdbd2cSJim Jagielski 	    {
652*b1cdbd2cSJim Jagielski 	        const SfxFilter* pFilter = pImpl->pList->GetObject( n );
653*b1cdbd2cSJim Jagielski 	        SfxFilterFlags nFlags = pFilter->GetFilterFlags();
654*b1cdbd2cSJim Jagielski 	        if ( (nFlags & nMust) == nMust && !(nFlags & nDont ) && pFilter->GetMimeType() == rMediaType )
655*b1cdbd2cSJim Jagielski 				return pFilter;
656*b1cdbd2cSJim Jagielski 		}
657*b1cdbd2cSJim Jagielski 
658*b1cdbd2cSJim Jagielski 		return 0;
659*b1cdbd2cSJim Jagielski 	}
660*b1cdbd2cSJim Jagielski 
661*b1cdbd2cSJim Jagielski 	com::sun::star::uno::Sequence < com::sun::star::beans::NamedValue > aSeq(1);
662*b1cdbd2cSJim Jagielski 	aSeq[0].Name = ::rtl::OUString::createFromAscii("MediaType");
663*b1cdbd2cSJim Jagielski 	aSeq[0].Value <<= ::rtl::OUString( rMediaType );
664*b1cdbd2cSJim Jagielski 	return GetFilterForProps( aSeq, nMust, nDont );
665*b1cdbd2cSJim Jagielski }
666*b1cdbd2cSJim Jagielski 
GetFilter4EA(const String & rType,SfxFilterFlags nMust,SfxFilterFlags nDont) const667*b1cdbd2cSJim Jagielski const SfxFilter* SfxFilterMatcher::GetFilter4EA( const String& rType,SfxFilterFlags nMust, SfxFilterFlags nDont ) const
668*b1cdbd2cSJim Jagielski {
669*b1cdbd2cSJim Jagielski 	if ( pImpl->pList )
670*b1cdbd2cSJim Jagielski 	{
671*b1cdbd2cSJim Jagielski 	    sal_uInt16 nCount = ( sal_uInt16 ) pImpl->pList->Count();
672*b1cdbd2cSJim Jagielski         const SfxFilter* pFirst = 0;
673*b1cdbd2cSJim Jagielski 	    for( sal_uInt16 n = 0; n < nCount; n++ )
674*b1cdbd2cSJim Jagielski 	    {
675*b1cdbd2cSJim Jagielski 	        const SfxFilter* pFilter = pImpl->pList->GetObject( n );
676*b1cdbd2cSJim Jagielski 	        SfxFilterFlags nFlags = pFilter->GetFilterFlags();
677*b1cdbd2cSJim Jagielski 	        if ( (nFlags & nMust) == nMust && !(nFlags & nDont ) && pFilter->GetTypeName() == rType )
678*b1cdbd2cSJim Jagielski             {
679*b1cdbd2cSJim Jagielski                 if (nFlags & SFX_FILTER_PREFERED)
680*b1cdbd2cSJim Jagielski                     return pFilter;
681*b1cdbd2cSJim Jagielski                 if (!pFirst)
682*b1cdbd2cSJim Jagielski                     pFirst = pFilter;
683*b1cdbd2cSJim Jagielski             }
684*b1cdbd2cSJim Jagielski 		}
685*b1cdbd2cSJim Jagielski         if (pFirst)
686*b1cdbd2cSJim Jagielski             return pFirst;
687*b1cdbd2cSJim Jagielski 
688*b1cdbd2cSJim Jagielski 		return 0;
689*b1cdbd2cSJim Jagielski 	}
690*b1cdbd2cSJim Jagielski 
691*b1cdbd2cSJim Jagielski 	com::sun::star::uno::Sequence < com::sun::star::beans::NamedValue > aSeq(1);
692*b1cdbd2cSJim Jagielski 	aSeq[0].Name = ::rtl::OUString::createFromAscii("Name");
693*b1cdbd2cSJim Jagielski 	aSeq[0].Value <<= ::rtl::OUString( rType );
694*b1cdbd2cSJim Jagielski 	return GetFilterForProps( aSeq, nMust, nDont );
695*b1cdbd2cSJim Jagielski }
696*b1cdbd2cSJim Jagielski 
GetFilter4Extension(const String & rExt,SfxFilterFlags nMust,SfxFilterFlags nDont) const697*b1cdbd2cSJim Jagielski const SfxFilter* SfxFilterMatcher::GetFilter4Extension( const String& rExt, SfxFilterFlags nMust, SfxFilterFlags nDont ) const
698*b1cdbd2cSJim Jagielski {
699*b1cdbd2cSJim Jagielski 	if ( pImpl->pList )
700*b1cdbd2cSJim Jagielski 	{
701*b1cdbd2cSJim Jagielski 	    sal_uInt16 nCount = ( sal_uInt16 ) pImpl->pList->Count();
702*b1cdbd2cSJim Jagielski 	    for( sal_uInt16 n = 0; n < nCount; n++ )
703*b1cdbd2cSJim Jagielski 	    {
704*b1cdbd2cSJim Jagielski 	        const SfxFilter* pFilter = pImpl->pList->GetObject( n );
705*b1cdbd2cSJim Jagielski 	        SfxFilterFlags nFlags = pFilter->GetFilterFlags();
706*b1cdbd2cSJim Jagielski 	        if ( (nFlags & nMust) == nMust && !(nFlags & nDont ) )
707*b1cdbd2cSJim Jagielski 			{
708*b1cdbd2cSJim Jagielski 				String sWildCard = ToUpper_Impl( pFilter->GetWildcard().GetWildCard() );
709*b1cdbd2cSJim Jagielski 				String sExt      = ToUpper_Impl( rExt );
710*b1cdbd2cSJim Jagielski 
711*b1cdbd2cSJim Jagielski 				if (!sExt.Len())
712*b1cdbd2cSJim Jagielski 					continue;
713*b1cdbd2cSJim Jagielski 
714*b1cdbd2cSJim Jagielski 				if (sExt.GetChar(0) != (sal_Unicode)'.')
715*b1cdbd2cSJim Jagielski 					sExt.Insert((sal_Unicode)'.', 0);
716*b1cdbd2cSJim Jagielski 
717*b1cdbd2cSJim Jagielski 				WildCard aCheck(sWildCard, ';');
718*b1cdbd2cSJim Jagielski 				if (aCheck.Matches(sExt))
719*b1cdbd2cSJim Jagielski 					return pFilter;
720*b1cdbd2cSJim Jagielski 			}
721*b1cdbd2cSJim Jagielski 		}
722*b1cdbd2cSJim Jagielski 
723*b1cdbd2cSJim Jagielski 		return 0;
724*b1cdbd2cSJim Jagielski 	}
725*b1cdbd2cSJim Jagielski 
726*b1cdbd2cSJim Jagielski     // Use extension without dot!
727*b1cdbd2cSJim Jagielski     String sExt( rExt );
728*b1cdbd2cSJim Jagielski     if ( sExt.Len() && ( sExt.GetChar(0) == (sal_Unicode)'.' ))
729*b1cdbd2cSJim Jagielski         sExt.Erase(0,1);
730*b1cdbd2cSJim Jagielski 
731*b1cdbd2cSJim Jagielski     com::sun::star::uno::Sequence < com::sun::star::beans::NamedValue > aSeq(1);
732*b1cdbd2cSJim Jagielski 	aSeq[0].Name = ::rtl::OUString::createFromAscii("Extensions");
733*b1cdbd2cSJim Jagielski 	::com::sun::star::uno::Sequence < ::rtl::OUString > aExts(1);
734*b1cdbd2cSJim Jagielski 	aExts[0] = sExt;
735*b1cdbd2cSJim Jagielski 	aSeq[0].Value <<= aExts;
736*b1cdbd2cSJim Jagielski 	return GetFilterForProps( aSeq, nMust, nDont );
737*b1cdbd2cSJim Jagielski }
738*b1cdbd2cSJim Jagielski 
GetFilter4ClipBoardId(sal_uInt32 nId,SfxFilterFlags nMust,SfxFilterFlags nDont) const739*b1cdbd2cSJim Jagielski const SfxFilter* SfxFilterMatcher::GetFilter4ClipBoardId( sal_uInt32 nId, SfxFilterFlags nMust, SfxFilterFlags nDont ) const
740*b1cdbd2cSJim Jagielski {
741*b1cdbd2cSJim Jagielski 	if (nId == 0)
742*b1cdbd2cSJim Jagielski 		return 0;
743*b1cdbd2cSJim Jagielski 
744*b1cdbd2cSJim Jagielski 	com::sun::star::uno::Sequence < com::sun::star::beans::NamedValue > aSeq(1);
745*b1cdbd2cSJim Jagielski 	::rtl::OUString aName = SotExchange::GetFormatName( nId );
746*b1cdbd2cSJim Jagielski 	aSeq[0].Name = ::rtl::OUString::createFromAscii("ClipboardFormat");
747*b1cdbd2cSJim Jagielski 	aSeq[0].Value <<= aName;
748*b1cdbd2cSJim Jagielski 	return GetFilterForProps( aSeq, nMust, nDont );
749*b1cdbd2cSJim Jagielski }
750*b1cdbd2cSJim Jagielski 
GetFilter4UIName(const String & rName,SfxFilterFlags nMust,SfxFilterFlags nDont) const751*b1cdbd2cSJim Jagielski const SfxFilter* SfxFilterMatcher::GetFilter4UIName( const String& rName, SfxFilterFlags nMust, SfxFilterFlags nDont ) const
752*b1cdbd2cSJim Jagielski {
753*b1cdbd2cSJim Jagielski 	pImpl->InitForIterating();
754*b1cdbd2cSJim Jagielski     const SfxFilter* pFirstFilter=0;
755*b1cdbd2cSJim Jagielski     sal_uInt16 nCount = ( sal_uInt16 ) pImpl->pList->Count();
756*b1cdbd2cSJim Jagielski     for( sal_uInt16 n = 0; n < nCount; n++ )
757*b1cdbd2cSJim Jagielski     {
758*b1cdbd2cSJim Jagielski         const SfxFilter* pFilter = pImpl->pList->GetObject( n );
759*b1cdbd2cSJim Jagielski         SfxFilterFlags nFlags = pFilter->GetFilterFlags();
760*b1cdbd2cSJim Jagielski         if ( (nFlags & nMust) == nMust &&
761*b1cdbd2cSJim Jagielski              !(nFlags & nDont ) && pFilter->GetUIName() == rName )
762*b1cdbd2cSJim Jagielski         {
763*b1cdbd2cSJim Jagielski             if ( pFilter->GetFilterFlags() & SFX_FILTER_PREFERED )
764*b1cdbd2cSJim Jagielski                 return pFilter;
765*b1cdbd2cSJim Jagielski             else if ( !pFirstFilter )
766*b1cdbd2cSJim Jagielski                 pFirstFilter = pFilter;
767*b1cdbd2cSJim Jagielski         }
768*b1cdbd2cSJim Jagielski     }
769*b1cdbd2cSJim Jagielski     return pFirstFilter;
770*b1cdbd2cSJim Jagielski }
771*b1cdbd2cSJim Jagielski 
GetFilter4FilterName(const String & rName,SfxFilterFlags nMust,SfxFilterFlags nDont) const772*b1cdbd2cSJim Jagielski const SfxFilter* SfxFilterMatcher::GetFilter4FilterName( const String& rName, SfxFilterFlags nMust, SfxFilterFlags nDont ) const
773*b1cdbd2cSJim Jagielski {
774*b1cdbd2cSJim Jagielski 	String aName( rName );
775*b1cdbd2cSJim Jagielski 	sal_uInt16 nIndex = aName.SearchAscii(": ");
776*b1cdbd2cSJim Jagielski 	if (  nIndex != STRING_NOTFOUND )
777*b1cdbd2cSJim Jagielski 	{
778*b1cdbd2cSJim Jagielski 		DBG_ERROR("Old filter name used!");
779*b1cdbd2cSJim Jagielski 		aName = rName.Copy( nIndex + 2 );
780*b1cdbd2cSJim Jagielski 	}
781*b1cdbd2cSJim Jagielski 
782*b1cdbd2cSJim Jagielski 	if ( bFirstRead )
783*b1cdbd2cSJim Jagielski 	{
784*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xServiceManager = ::comphelper::getProcessServiceFactory();
785*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >     xFilterCFG                                                ;
786*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >     xTypeCFG                                                  ;
787*b1cdbd2cSJim Jagielski         if( xServiceManager.is() == sal_True )
788*b1cdbd2cSJim Jagielski         {
789*b1cdbd2cSJim Jagielski             xFilterCFG = ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >( xServiceManager->createInstance( DEFINE_CONST_UNICODE( "com.sun.star.document.FilterFactory" ) ), ::com::sun::star::uno::UNO_QUERY );
790*b1cdbd2cSJim Jagielski             xTypeCFG   = ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >( xServiceManager->createInstance( DEFINE_CONST_UNICODE( "com.sun.star.document.TypeDetection" ) ), ::com::sun::star::uno::UNO_QUERY );
791*b1cdbd2cSJim Jagielski         }
792*b1cdbd2cSJim Jagielski 
793*b1cdbd2cSJim Jagielski 		if( xFilterCFG.is() && xTypeCFG.is() )
794*b1cdbd2cSJim Jagielski 		{
795*b1cdbd2cSJim Jagielski 			if ( !pFilterArr )
796*b1cdbd2cSJim Jagielski 				CreateFilterArr();
797*b1cdbd2cSJim Jagielski 			else
798*b1cdbd2cSJim Jagielski 			{
799*b1cdbd2cSJim Jagielski 			    for( sal_uInt16 n=0; n<pFilterArr->Count(); n++ )
800*b1cdbd2cSJim Jagielski 			    {
801*b1cdbd2cSJim Jagielski 	        		const SfxFilter* pFilter = pFilterArr->GetObject( n );
802*b1cdbd2cSJim Jagielski 			        SfxFilterFlags nFlags = pFilter->GetFilterFlags();
803*b1cdbd2cSJim Jagielski 			        if ( (nFlags & nMust) == nMust && !(nFlags & nDont ) && pFilter->GetFilterName().CompareIgnoreCaseToAscii( aName ) == COMPARE_EQUAL )
804*b1cdbd2cSJim Jagielski 			        	return pFilter;
805*b1cdbd2cSJim Jagielski 				}
806*b1cdbd2cSJim Jagielski 			}
807*b1cdbd2cSJim Jagielski 
808*b1cdbd2cSJim Jagielski 			SfxFilterContainer::ReadSingleFilter_Impl( rName, xTypeCFG, xFilterCFG, sal_False );
809*b1cdbd2cSJim Jagielski 		}
810*b1cdbd2cSJim Jagielski 	}
811*b1cdbd2cSJim Jagielski 
812*b1cdbd2cSJim Jagielski     SfxFilterList_Impl* pList = pImpl->pList;
813*b1cdbd2cSJim Jagielski 	if ( !pList )
814*b1cdbd2cSJim Jagielski 		pList = pFilterArr;
815*b1cdbd2cSJim Jagielski 
816*b1cdbd2cSJim Jagielski     sal_uInt16 nCount = ( sal_uInt16 ) pList->Count();
817*b1cdbd2cSJim Jagielski     for( sal_uInt16 n = 0; n < nCount; n++ )
818*b1cdbd2cSJim Jagielski     {
819*b1cdbd2cSJim Jagielski         const SfxFilter* pFilter = pList->GetObject( n );
820*b1cdbd2cSJim Jagielski         SfxFilterFlags nFlags = pFilter->GetFilterFlags();
821*b1cdbd2cSJim Jagielski         if ( (nFlags & nMust) == nMust && !(nFlags & nDont ) && pFilter->GetFilterName().CompareIgnoreCaseToAscii( aName ) == COMPARE_EQUAL )
822*b1cdbd2cSJim Jagielski         	return pFilter;
823*b1cdbd2cSJim Jagielski     }
824*b1cdbd2cSJim Jagielski 
825*b1cdbd2cSJim Jagielski     return NULL;
826*b1cdbd2cSJim Jagielski }
827*b1cdbd2cSJim Jagielski 
IMPL_STATIC_LINK(SfxFilterMatcher,MaybeFileHdl_Impl,String *,pString)828*b1cdbd2cSJim Jagielski IMPL_STATIC_LINK( SfxFilterMatcher, MaybeFileHdl_Impl, String*, pString )
829*b1cdbd2cSJim Jagielski {
830*b1cdbd2cSJim Jagielski 	const SfxFilter* pFilter = pThis->GetFilter4Extension( *pString, SFX_FILTER_IMPORT );
831*b1cdbd2cSJim Jagielski 	if( pFilter && !pFilter->GetWildcard().Matches( String() ) &&
832*b1cdbd2cSJim Jagielski 		pFilter->GetWildcard() != DEFINE_CONST_UNICODE("*.*") && pFilter->GetWildcard() != '*' )
833*b1cdbd2cSJim Jagielski 		return sal_True;
834*b1cdbd2cSJim Jagielski 	return sal_False;
835*b1cdbd2cSJim Jagielski }
836*b1cdbd2cSJim Jagielski 
837*b1cdbd2cSJim Jagielski //----------------------------------------------------------------
838*b1cdbd2cSJim Jagielski 
SfxFilterMatcherIter(const SfxFilterMatcher * pMatchP,SfxFilterFlags nOrMaskP,SfxFilterFlags nAndMaskP)839*b1cdbd2cSJim Jagielski SfxFilterMatcherIter::SfxFilterMatcherIter(
840*b1cdbd2cSJim Jagielski     const SfxFilterMatcher* pMatchP,
841*b1cdbd2cSJim Jagielski 	SfxFilterFlags nOrMaskP, SfxFilterFlags nAndMaskP )
842*b1cdbd2cSJim Jagielski     : nOrMask( nOrMaskP ), nAndMask( nAndMaskP ),
843*b1cdbd2cSJim Jagielski       nCurrent(0), pMatch( pMatchP->pImpl)
844*b1cdbd2cSJim Jagielski {
845*b1cdbd2cSJim Jagielski     if( nOrMask == 0xffff ) //Wg. Fehlbuild auf s
846*b1cdbd2cSJim Jagielski         nOrMask = 0;
847*b1cdbd2cSJim Jagielski 	pMatch->InitForIterating();
848*b1cdbd2cSJim Jagielski }
849*b1cdbd2cSJim Jagielski 
850*b1cdbd2cSJim Jagielski //----------------------------------------------------------------
851*b1cdbd2cSJim Jagielski 
Find_Impl()852*b1cdbd2cSJim Jagielski const SfxFilter* SfxFilterMatcherIter::Find_Impl()
853*b1cdbd2cSJim Jagielski {
854*b1cdbd2cSJim Jagielski     const SfxFilter* pFilter = 0;
855*b1cdbd2cSJim Jagielski     while( nCurrent < pMatch->pList->Count() )
856*b1cdbd2cSJim Jagielski     {
857*b1cdbd2cSJim Jagielski     	pFilter = pMatch->pList->GetObject(nCurrent++);
858*b1cdbd2cSJim Jagielski         SfxFilterFlags nFlags = pFilter->GetFilterFlags();
859*b1cdbd2cSJim Jagielski         if( ((nFlags & nOrMask) == nOrMask ) && !(nFlags & nAndMask ) )
860*b1cdbd2cSJim Jagielski             break;
861*b1cdbd2cSJim Jagielski 		pFilter = 0;
862*b1cdbd2cSJim Jagielski     }
863*b1cdbd2cSJim Jagielski 
864*b1cdbd2cSJim Jagielski     return pFilter;
865*b1cdbd2cSJim Jagielski }
866*b1cdbd2cSJim Jagielski 
First()867*b1cdbd2cSJim Jagielski const SfxFilter* SfxFilterMatcherIter::First()
868*b1cdbd2cSJim Jagielski {
869*b1cdbd2cSJim Jagielski 	nCurrent = 0;
870*b1cdbd2cSJim Jagielski 	return Find_Impl();
871*b1cdbd2cSJim Jagielski }
872*b1cdbd2cSJim Jagielski 
873*b1cdbd2cSJim Jagielski //----------------------------------------------------------------
874*b1cdbd2cSJim Jagielski 
Next()875*b1cdbd2cSJim Jagielski const SfxFilter* SfxFilterMatcherIter::Next()
876*b1cdbd2cSJim Jagielski {
877*b1cdbd2cSJim Jagielski 	return Find_Impl();
878*b1cdbd2cSJim Jagielski }
879*b1cdbd2cSJim Jagielski 
880*b1cdbd2cSJim Jagielski /*---------------------------------------------------------------
881*b1cdbd2cSJim Jagielski     helper to build own formated string from given stringlist by
882*b1cdbd2cSJim Jagielski     using given seperator
883*b1cdbd2cSJim Jagielski   ---------------------------------------------------------------*/
implc_convertStringlistToString(const::com::sun::star::uno::Sequence<::rtl::OUString> & lList,const sal_Unicode & cSeperator,const::rtl::OUString & sPrefix)884*b1cdbd2cSJim Jagielski ::rtl::OUString implc_convertStringlistToString( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& lList     ,
885*b1cdbd2cSJim Jagielski                                                  const sal_Unicode&                                        cSeperator,
886*b1cdbd2cSJim Jagielski                                                  const ::rtl::OUString&                                    sPrefix   )
887*b1cdbd2cSJim Jagielski {
888*b1cdbd2cSJim Jagielski     ::rtl::OUStringBuffer   sString ( 1000 )           ;
889*b1cdbd2cSJim Jagielski     sal_Int32               nCount  = lList.getLength();
890*b1cdbd2cSJim Jagielski     sal_Int32               nItem   = 0                ;
891*b1cdbd2cSJim Jagielski     for( nItem=0; nItem<nCount; ++nItem )
892*b1cdbd2cSJim Jagielski     {
893*b1cdbd2cSJim Jagielski         if( sPrefix.getLength() > 0 )
894*b1cdbd2cSJim Jagielski         {
895*b1cdbd2cSJim Jagielski             sString.append( sPrefix );
896*b1cdbd2cSJim Jagielski         }
897*b1cdbd2cSJim Jagielski         sString.append( lList[nItem] );
898*b1cdbd2cSJim Jagielski         if( nItem+1<nCount )
899*b1cdbd2cSJim Jagielski         {
900*b1cdbd2cSJim Jagielski             sString.append( cSeperator );
901*b1cdbd2cSJim Jagielski         }
902*b1cdbd2cSJim Jagielski     }
903*b1cdbd2cSJim Jagielski     return sString.makeStringAndClear();
904*b1cdbd2cSJim Jagielski }
905*b1cdbd2cSJim Jagielski 
906*b1cdbd2cSJim Jagielski 
ReadSingleFilter_Impl(const::rtl::OUString & rName,const::com::sun::star::uno::Reference<::com::sun::star::container::XNameAccess> & xTypeCFG,const::com::sun::star::uno::Reference<::com::sun::star::container::XNameAccess> & xFilterCFG,sal_Bool bUpdate)907*b1cdbd2cSJim Jagielski void SfxFilterContainer::ReadSingleFilter_Impl(
908*b1cdbd2cSJim Jagielski 	const ::rtl::OUString& rName,
909*b1cdbd2cSJim Jagielski     const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& xTypeCFG,
910*b1cdbd2cSJim Jagielski 	const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& xFilterCFG,
911*b1cdbd2cSJim Jagielski 	sal_Bool bUpdate
912*b1cdbd2cSJim Jagielski 	)
913*b1cdbd2cSJim Jagielski {
914*b1cdbd2cSJim Jagielski 	::rtl::OUString sFilterName( rName );
915*b1cdbd2cSJim Jagielski 	SfxFilterList_Impl& rList = *pFilterArr;
916*b1cdbd2cSJim Jagielski 	::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > lFilterProperties                           ;
917*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Any aResult;
918*b1cdbd2cSJim Jagielski     try
919*b1cdbd2cSJim Jagielski     {
920*b1cdbd2cSJim Jagielski         aResult = xFilterCFG->getByName( sFilterName );
921*b1cdbd2cSJim Jagielski     }
922*b1cdbd2cSJim Jagielski     catch( ::com::sun::star::container::NoSuchElementException& )
923*b1cdbd2cSJim Jagielski     {
924*b1cdbd2cSJim Jagielski         aResult = ::com::sun::star::uno::Any();
925*b1cdbd2cSJim Jagielski     }
926*b1cdbd2cSJim Jagielski 
927*b1cdbd2cSJim Jagielski     if( aResult >>= lFilterProperties )
928*b1cdbd2cSJim Jagielski     {
929*b1cdbd2cSJim Jagielski         // collect informations to add filter to container
930*b1cdbd2cSJim Jagielski         // (attention: some informations aren't available on filter directly ... you must search for corresponding type too!)
931*b1cdbd2cSJim Jagielski         sal_Int32       nFlags          = 0 ;
932*b1cdbd2cSJim Jagielski         sal_Int32       nClipboardId    = 0 ;
933*b1cdbd2cSJim Jagielski         sal_Int32       nDocumentIconId = 0 ;
934*b1cdbd2cSJim Jagielski         sal_Int32       nFormatVersion  = 0 ;
935*b1cdbd2cSJim Jagielski         ::rtl::OUString sMimeType           ;
936*b1cdbd2cSJim Jagielski         ::rtl::OUString sType               ;
937*b1cdbd2cSJim Jagielski         ::rtl::OUString sUIName             ;
938*b1cdbd2cSJim Jagielski         ::rtl::OUString sHumanName          ;
939*b1cdbd2cSJim Jagielski         ::rtl::OUString sDefaultTemplate    ;
940*b1cdbd2cSJim Jagielski         ::rtl::OUString sUserData           ;
941*b1cdbd2cSJim Jagielski         ::rtl::OUString sExtension          ;
942*b1cdbd2cSJim Jagielski         ::rtl::OUString sPattern            ;
943*b1cdbd2cSJim Jagielski         ::rtl::OUString sServiceName        ;
944*b1cdbd2cSJim Jagielski 
945*b1cdbd2cSJim Jagielski         // first get directly available properties
946*b1cdbd2cSJim Jagielski         sal_Int32 nFilterPropertyCount = lFilterProperties.getLength();
947*b1cdbd2cSJim Jagielski         sal_Int32 nFilterProperty      = 0                            ;
948*b1cdbd2cSJim Jagielski         for( nFilterProperty=0; nFilterProperty<nFilterPropertyCount; ++nFilterProperty )
949*b1cdbd2cSJim Jagielski         {
950*b1cdbd2cSJim Jagielski             if( lFilterProperties[nFilterProperty].Name.compareToAscii( "FileFormatVersion" ) == 0 )
951*b1cdbd2cSJim Jagielski             {
952*b1cdbd2cSJim Jagielski                 lFilterProperties[nFilterProperty].Value >>= nFormatVersion;
953*b1cdbd2cSJim Jagielski             }
954*b1cdbd2cSJim Jagielski             else if( lFilterProperties[nFilterProperty].Name.compareToAscii( "TemplateName" ) == 0 )
955*b1cdbd2cSJim Jagielski             {
956*b1cdbd2cSJim Jagielski                 lFilterProperties[nFilterProperty].Value >>= sDefaultTemplate;
957*b1cdbd2cSJim Jagielski             }
958*b1cdbd2cSJim Jagielski             else if( lFilterProperties[nFilterProperty].Name.compareToAscii( "Flags" ) == 0 )
959*b1cdbd2cSJim Jagielski             {
960*b1cdbd2cSJim Jagielski                 lFilterProperties[nFilterProperty].Value >>= nFlags;
961*b1cdbd2cSJim Jagielski             }
962*b1cdbd2cSJim Jagielski             else if( lFilterProperties[nFilterProperty].Name.compareToAscii( "UIName" ) == 0 )
963*b1cdbd2cSJim Jagielski             {
964*b1cdbd2cSJim Jagielski                 lFilterProperties[nFilterProperty].Value >>= sUIName;
965*b1cdbd2cSJim Jagielski             }
966*b1cdbd2cSJim Jagielski             else if( lFilterProperties[nFilterProperty].Name.compareToAscii( "UserData" ) == 0 )
967*b1cdbd2cSJim Jagielski             {
968*b1cdbd2cSJim Jagielski                 ::com::sun::star::uno::Sequence< ::rtl::OUString > lUserData;
969*b1cdbd2cSJim Jagielski                 lFilterProperties[nFilterProperty].Value >>= lUserData;
970*b1cdbd2cSJim Jagielski                 sUserData = implc_convertStringlistToString( lUserData, ',', ::rtl::OUString() );
971*b1cdbd2cSJim Jagielski             }
972*b1cdbd2cSJim Jagielski             else if( lFilterProperties[nFilterProperty].Name.compareToAscii( "DocumentService" ) == 0 )
973*b1cdbd2cSJim Jagielski             {
974*b1cdbd2cSJim Jagielski                 lFilterProperties[nFilterProperty].Value >>= sServiceName;
975*b1cdbd2cSJim Jagielski             }
976*b1cdbd2cSJim Jagielski             else if( lFilterProperties[nFilterProperty].Name.compareToAscii( "Type" ) == 0 )
977*b1cdbd2cSJim Jagielski             {
978*b1cdbd2cSJim Jagielski                 lFilterProperties[nFilterProperty].Value >>= sType;
979*b1cdbd2cSJim Jagielski                 // Try to get filter .. but look for any exceptions!
980*b1cdbd2cSJim Jagielski                 // May be filter was deleted by another thread ...
981*b1cdbd2cSJim Jagielski                 try
982*b1cdbd2cSJim Jagielski                 {
983*b1cdbd2cSJim Jagielski                     aResult = xTypeCFG->getByName( sType );
984*b1cdbd2cSJim Jagielski                 }
985*b1cdbd2cSJim Jagielski                 catch( ::com::sun::star::container::NoSuchElementException& )
986*b1cdbd2cSJim Jagielski                 {
987*b1cdbd2cSJim Jagielski                     aResult = ::com::sun::star::uno::Any();
988*b1cdbd2cSJim Jagielski                 }
989*b1cdbd2cSJim Jagielski 
990*b1cdbd2cSJim Jagielski                 ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > lTypeProperties;
991*b1cdbd2cSJim Jagielski                 if( aResult >>= lTypeProperties )
992*b1cdbd2cSJim Jagielski                 {
993*b1cdbd2cSJim Jagielski                     // get indirect available properties then (types)
994*b1cdbd2cSJim Jagielski                     sal_Int32 nTypePropertyCount = lTypeProperties.getLength();
995*b1cdbd2cSJim Jagielski                     sal_Int32 nTypeProperty      = 0                          ;
996*b1cdbd2cSJim Jagielski                     for( nTypeProperty=0; nTypeProperty<nTypePropertyCount; ++nTypeProperty )
997*b1cdbd2cSJim Jagielski                     {
998*b1cdbd2cSJim Jagielski                         if( lTypeProperties[nTypeProperty].Name.compareToAscii( "ClipboardFormat" ) == 0 )
999*b1cdbd2cSJim Jagielski                         {
1000*b1cdbd2cSJim Jagielski                             lTypeProperties[nTypeProperty].Value >>= sHumanName;
1001*b1cdbd2cSJim Jagielski                         }
1002*b1cdbd2cSJim Jagielski                         else if( lTypeProperties[nTypeProperty].Name.compareToAscii( "DocumentIconID" ) == 0 )
1003*b1cdbd2cSJim Jagielski                         {
1004*b1cdbd2cSJim Jagielski                             lTypeProperties[nTypeProperty].Value >>= nDocumentIconId;
1005*b1cdbd2cSJim Jagielski                         }
1006*b1cdbd2cSJim Jagielski                         else if( lTypeProperties[nTypeProperty].Name.compareToAscii( "MediaType" ) == 0 )
1007*b1cdbd2cSJim Jagielski                         {
1008*b1cdbd2cSJim Jagielski                             lTypeProperties[nTypeProperty].Value >>= sMimeType;
1009*b1cdbd2cSJim Jagielski                         }
1010*b1cdbd2cSJim Jagielski                         else if( lTypeProperties[nTypeProperty].Name.compareToAscii( "Extensions" ) == 0 )
1011*b1cdbd2cSJim Jagielski                         {
1012*b1cdbd2cSJim Jagielski                             ::com::sun::star::uno::Sequence< ::rtl::OUString > lExtensions;
1013*b1cdbd2cSJim Jagielski                             lTypeProperties[nTypeProperty].Value >>= lExtensions;
1014*b1cdbd2cSJim Jagielski                             sExtension = implc_convertStringlistToString( lExtensions, ';', DEFINE_CONST_UNICODE("*.") );
1015*b1cdbd2cSJim Jagielski                         }
1016*b1cdbd2cSJim Jagielski                         else if( lTypeProperties[nTypeProperty].Name.compareToAscii( "URLPattern" ) == 0 )
1017*b1cdbd2cSJim Jagielski                         {
1018*b1cdbd2cSJim Jagielski                                 ::com::sun::star::uno::Sequence< ::rtl::OUString > lPattern;
1019*b1cdbd2cSJim Jagielski                                 lTypeProperties[nTypeProperty].Value >>= lPattern;
1020*b1cdbd2cSJim Jagielski                                 sPattern = implc_convertStringlistToString( lPattern, ';', ::rtl::OUString() );
1021*b1cdbd2cSJim Jagielski                         }
1022*b1cdbd2cSJim Jagielski                     }
1023*b1cdbd2cSJim Jagielski                 }
1024*b1cdbd2cSJim Jagielski             }
1025*b1cdbd2cSJim Jagielski         }
1026*b1cdbd2cSJim Jagielski 
1027*b1cdbd2cSJim Jagielski 		if ( !sServiceName.getLength() )
1028*b1cdbd2cSJim Jagielski 			return;
1029*b1cdbd2cSJim Jagielski 
1030*b1cdbd2cSJim Jagielski         // old formats are found ... using HumanPresentableName!
1031*b1cdbd2cSJim Jagielski         if( sHumanName.getLength() )
1032*b1cdbd2cSJim Jagielski         {
1033*b1cdbd2cSJim Jagielski             nClipboardId = SotExchange::RegisterFormatName( sHumanName );
1034*b1cdbd2cSJim Jagielski 
1035*b1cdbd2cSJim Jagielski 			// #100570# For external filters ignore clipboard IDs
1036*b1cdbd2cSJim Jagielski 			if((nFlags & SFX_FILTER_STARONEFILTER) == SFX_FILTER_STARONEFILTER)
1037*b1cdbd2cSJim Jagielski 			{
1038*b1cdbd2cSJim Jagielski 				nClipboardId = 0;
1039*b1cdbd2cSJim Jagielski 			}
1040*b1cdbd2cSJim Jagielski         }
1041*b1cdbd2cSJim Jagielski         // register SfxFilter
1042*b1cdbd2cSJim Jagielski         // first erase module name from old filter names!
1043*b1cdbd2cSJim Jagielski         // e.g: "scalc: DIF" => "DIF"
1044*b1cdbd2cSJim Jagielski         sal_Int32 nStartRealName = sFilterName.indexOf( DEFINE_CONST_UNICODE(": "), 0 );
1045*b1cdbd2cSJim Jagielski         if( nStartRealName != -1 )
1046*b1cdbd2cSJim Jagielski         {
1047*b1cdbd2cSJim Jagielski             DBG_ERROR("Old format, not supported!");
1048*b1cdbd2cSJim Jagielski             sFilterName = sFilterName.copy( nStartRealName+2 );
1049*b1cdbd2cSJim Jagielski         }
1050*b1cdbd2cSJim Jagielski 
1051*b1cdbd2cSJim Jagielski 		SfxFilter* pFilter = bUpdate ? (SfxFilter*) SfxFilter::GetFilterByName( sFilterName ) : 0;
1052*b1cdbd2cSJim Jagielski         sal_Bool bNew = sal_False;
1053*b1cdbd2cSJim Jagielski         if (!pFilter)
1054*b1cdbd2cSJim Jagielski         {
1055*b1cdbd2cSJim Jagielski             bNew = sal_True;
1056*b1cdbd2cSJim Jagielski             pFilter = new SfxFilter( sFilterName             ,
1057*b1cdbd2cSJim Jagielski                                      sExtension              ,
1058*b1cdbd2cSJim Jagielski                                      nFlags                  ,
1059*b1cdbd2cSJim Jagielski                                      nClipboardId            ,
1060*b1cdbd2cSJim Jagielski                                      sType                   ,
1061*b1cdbd2cSJim Jagielski                                      (sal_uInt16)nDocumentIconId ,
1062*b1cdbd2cSJim Jagielski                                      sMimeType               ,
1063*b1cdbd2cSJim Jagielski                                      sUserData               ,
1064*b1cdbd2cSJim Jagielski 									 sServiceName );
1065*b1cdbd2cSJim Jagielski         }
1066*b1cdbd2cSJim Jagielski         else
1067*b1cdbd2cSJim Jagielski         {
1068*b1cdbd2cSJim Jagielski             pFilter->aFilterName  = sFilterName;
1069*b1cdbd2cSJim Jagielski             pFilter->aWildCard    = WildCard(sExtension, ';');
1070*b1cdbd2cSJim Jagielski             pFilter->nFormatType  = nFlags;
1071*b1cdbd2cSJim Jagielski             pFilter->lFormat      = nClipboardId;
1072*b1cdbd2cSJim Jagielski             pFilter->aTypeName    = sType;
1073*b1cdbd2cSJim Jagielski             pFilter->nDocIcon     = (sal_uInt16)nDocumentIconId;
1074*b1cdbd2cSJim Jagielski             pFilter->aMimeType    = sMimeType;
1075*b1cdbd2cSJim Jagielski             pFilter->aUserData    = sUserData;
1076*b1cdbd2cSJim Jagielski 			pFilter->aServiceName = sServiceName;
1077*b1cdbd2cSJim Jagielski         }
1078*b1cdbd2cSJim Jagielski 
1079*b1cdbd2cSJim Jagielski         // Don't forget to set right UIName!
1080*b1cdbd2cSJim Jagielski         // Otherwise internal name is used as fallback ...
1081*b1cdbd2cSJim Jagielski         pFilter->SetUIName( sUIName );
1082*b1cdbd2cSJim Jagielski         pFilter->SetDefaultTemplate( sDefaultTemplate );
1083*b1cdbd2cSJim Jagielski         if( nFormatVersion )
1084*b1cdbd2cSJim Jagielski         {
1085*b1cdbd2cSJim Jagielski             pFilter->SetVersion( nFormatVersion );
1086*b1cdbd2cSJim Jagielski         }
1087*b1cdbd2cSJim Jagielski         pFilter->SetURLPattern(sPattern);
1088*b1cdbd2cSJim Jagielski 
1089*b1cdbd2cSJim Jagielski         if (bNew)
1090*b1cdbd2cSJim Jagielski 			rList.Insert( pFilter, USHRT_MAX );
1091*b1cdbd2cSJim Jagielski     }
1092*b1cdbd2cSJim Jagielski }
1093*b1cdbd2cSJim Jagielski 
ReadFilters_Impl(sal_Bool bUpdate)1094*b1cdbd2cSJim Jagielski void SfxFilterContainer::ReadFilters_Impl( sal_Bool bUpdate )
1095*b1cdbd2cSJim Jagielski {
1096*b1cdbd2cSJim Jagielski     RTL_LOGFILE_CONTEXT( aMeasure, "sfx2 (as96863) ::SfxFilterContainer::ReadFilters" );
1097*b1cdbd2cSJim Jagielski 	if ( !pFilterArr )
1098*b1cdbd2cSJim Jagielski 		CreateFilterArr();
1099*b1cdbd2cSJim Jagielski 
1100*b1cdbd2cSJim Jagielski 	bFirstRead = sal_False;
1101*b1cdbd2cSJim Jagielski 	SfxFilterList_Impl& rList = *pFilterArr;
1102*b1cdbd2cSJim Jagielski 
1103*b1cdbd2cSJim Jagielski     try
1104*b1cdbd2cSJim Jagielski     {
1105*b1cdbd2cSJim Jagielski         // get the FilterFactory service to access the registered filters ... and types!
1106*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xServiceManager = ::comphelper::getProcessServiceFactory();
1107*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >     xFilterCFG                                                ;
1108*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >     xTypeCFG                                                  ;
1109*b1cdbd2cSJim Jagielski         if( xServiceManager.is() == sal_True )
1110*b1cdbd2cSJim Jagielski         {
1111*b1cdbd2cSJim Jagielski             xFilterCFG = ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >( xServiceManager->createInstance( DEFINE_CONST_UNICODE( "com.sun.star.document.FilterFactory" ) ), ::com::sun::star::uno::UNO_QUERY );
1112*b1cdbd2cSJim Jagielski             xTypeCFG   = ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >( xServiceManager->createInstance( DEFINE_CONST_UNICODE( "com.sun.star.document.TypeDetection" ) ), ::com::sun::star::uno::UNO_QUERY );
1113*b1cdbd2cSJim Jagielski         }
1114*b1cdbd2cSJim Jagielski 
1115*b1cdbd2cSJim Jagielski         if(
1116*b1cdbd2cSJim Jagielski             ( xFilterCFG.is() == sal_True ) &&
1117*b1cdbd2cSJim Jagielski             ( xTypeCFG.is()   == sal_True )
1118*b1cdbd2cSJim Jagielski           )
1119*b1cdbd2cSJim Jagielski         {
1120*b1cdbd2cSJim Jagielski             // select right query to get right set of filters for search modul
1121*b1cdbd2cSJim Jagielski             ::com::sun::star::uno::Sequence< ::rtl::OUString > lFilterNames = xFilterCFG->getElementNames();
1122*b1cdbd2cSJim Jagielski 			if ( lFilterNames.getLength() )
1123*b1cdbd2cSJim Jagielski             {
1124*b1cdbd2cSJim Jagielski                 // If list of filters already exist ...
1125*b1cdbd2cSJim Jagielski                 // ReadExternalFilters must work in update mode.
1126*b1cdbd2cSJim Jagielski                 // Best way seams to mark all filters NOT_INSTALLED
1127*b1cdbd2cSJim Jagielski                 // and change it back for all valid filters afterwards.
1128*b1cdbd2cSJim Jagielski                 if( rList.Count() > 0 )
1129*b1cdbd2cSJim Jagielski                 {
1130*b1cdbd2cSJim Jagielski                     bUpdate = sal_True;
1131*b1cdbd2cSJim Jagielski                     sal_uInt16 nCount = (sal_uInt16)rList.Count();
1132*b1cdbd2cSJim Jagielski                     SfxFilter* pFilter;
1133*b1cdbd2cSJim Jagielski                     for (sal_uInt16 f=0; f<nCount; ++f)
1134*b1cdbd2cSJim Jagielski                     {
1135*b1cdbd2cSJim Jagielski 						pFilter = NULL;
1136*b1cdbd2cSJim Jagielski                         pFilter = rList.GetObject(f);
1137*b1cdbd2cSJim Jagielski                         pFilter->nFormatType |= SFX_FILTER_NOTINSTALLED;
1138*b1cdbd2cSJim Jagielski                     }
1139*b1cdbd2cSJim Jagielski                 }
1140*b1cdbd2cSJim Jagielski 
1141*b1cdbd2cSJim Jagielski                 // get all properties of filters ... put it into the filter container
1142*b1cdbd2cSJim Jagielski                 sal_Int32 nFilterCount = lFilterNames.getLength();
1143*b1cdbd2cSJim Jagielski                 sal_Int32 nFilter=0;
1144*b1cdbd2cSJim Jagielski                 for( nFilter=0; nFilter<nFilterCount; ++nFilter )
1145*b1cdbd2cSJim Jagielski                 {
1146*b1cdbd2cSJim Jagielski                     // Try to get filter .. but look for any exceptions!
1147*b1cdbd2cSJim Jagielski                     // May be filter was deleted by another thread ...
1148*b1cdbd2cSJim Jagielski                     ::rtl::OUString sFilterName = lFilterNames[nFilter];
1149*b1cdbd2cSJim Jagielski 
1150*b1cdbd2cSJim Jagielski                     // This debug code can be used to break on inserting/updating
1151*b1cdbd2cSJim Jagielski                     // special debug filters at runtime.
1152*b1cdbd2cSJim Jagielski                     // Otherwise you have to check more then 300 filter names manually .-)
1153*b1cdbd2cSJim Jagielski                     // And conditional breakpoints on unicode values seams not to be supported .-(
1154*b1cdbd2cSJim Jagielski                     #ifdef DEBUG
1155*b1cdbd2cSJim Jagielski                     bool bDBGStop = sal_False;
1156*b1cdbd2cSJim Jagielski                     if (sFilterName.indexOf(::rtl::OUString::createFromAscii("DBG_"))>-1)
1157*b1cdbd2cSJim Jagielski                         bDBGStop = sal_True;
1158*b1cdbd2cSJim Jagielski                     #endif
1159*b1cdbd2cSJim Jagielski 
1160*b1cdbd2cSJim Jagielski 					ReadSingleFilter_Impl( sFilterName, xTypeCFG, xFilterCFG, bUpdate );
1161*b1cdbd2cSJim Jagielski                 }
1162*b1cdbd2cSJim Jagielski             }
1163*b1cdbd2cSJim Jagielski         }
1164*b1cdbd2cSJim Jagielski     }
1165*b1cdbd2cSJim Jagielski     catch( ::com::sun::star::uno::Exception& )
1166*b1cdbd2cSJim Jagielski     {
1167*b1cdbd2cSJim Jagielski         DBG_ASSERT( sal_False, "SfxFilterContainer::ReadFilter()\nException detected. Possible not all filters could be cached.\n" );
1168*b1cdbd2cSJim Jagielski     }
1169*b1cdbd2cSJim Jagielski 
1170*b1cdbd2cSJim Jagielski 	if ( pImplArr && bUpdate )
1171*b1cdbd2cSJim Jagielski 	{
1172*b1cdbd2cSJim Jagielski 		// global filter arry was modified, factory specific ones might need an update too
1173*b1cdbd2cSJim Jagielski 		for ( sal_uInt16 n=0; n<pImplArr->Count(); n++ )
1174*b1cdbd2cSJim Jagielski 			pImplArr->GetObject(n)->Update();
1175*b1cdbd2cSJim Jagielski 	}
1176*b1cdbd2cSJim Jagielski }
1177