xref: /aoo4110/main/svx/source/xml/xmlxtimp.cxx (revision b1cdbd2c)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svx.hxx"
26 #include <tools/debug.hxx>
27 #include <com/sun/star/document/XGraphicObjectResolver.hpp>
28 #include <com/sun/star/embed/ElementModes.hpp>
29 #include <com/sun/star/io/XActiveDataControl.hpp>
30 #include <com/sun/star/io/XActiveDataSource.hpp>
31 #include <com/sun/star/xml/sax/XParser.hpp>
32 #include <com/sun/star/container/XNameContainer.hpp>
33 #include <com/sun/star/xml/sax/XDocumentHandler.hpp>
34 #include <com/sun/star/uno/Sequence.hxx>
35 #include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp>
36 #include <com/sun/star/drawing/LineDash.hpp>
37 #include <com/sun/star/awt/Gradient.hpp>
38 #include <com/sun/star/drawing/Hatch.hpp>
39 #include <com/sun/star/io/XOutputStream.hpp>
40 #ifndef _COM_SUN_STAR_IO_XSEEKABLE_HDL_
41 #include <com/sun/star/io/XSeekable.hdl>
42 #endif
43 #include <comphelper/processfactory.hxx>
44 #include <unotools/streamwrap.hxx>
45 #include <rtl/ustrbuf.hxx>
46 #include <sfx2/docfile.hxx>
47 #include <xmloff/xmluconv.hxx>
48 #include "xmloff/xmlnmspe.hxx"
49 #include "xmloff/nmspmap.hxx"
50 
51 #include "xmloff/xmltoken.hxx"
52 #include "xmloff/xmlmetae.hxx"
53 #include "xmloff/DashStyle.hxx"
54 #include "xmloff/GradientStyle.hxx"
55 #include "xmloff/HatchStyle.hxx"
56 #include "xmloff/ImageStyle.hxx"
57 #include "xmloff/MarkerStyle.hxx"
58 #include <xmloff/xmlictxt.hxx>
59 #include "svx/xmlgrhlp.hxx"
60 #include "xmloff/attrlist.hxx"
61 
62 #include "xmlxtimp.hxx"
63 
64 using namespace com::sun::star;
65 using namespace com::sun::star::container;
66 using namespace com::sun::star::document;
67 using namespace com::sun::star::uno;
68 using namespace com::sun::star::awt;
69 using namespace com::sun::star::lang;
70 using namespace com::sun::star::xml::sax;
71 using namespace ::rtl;
72 using namespace ::xmloff::token;
73 using namespace cppu;
74 
75 sal_Char __READONLY_DATA sXML_np__office[] = "__office";
76 sal_Char __READONLY_DATA sXML_np__office_ooo[] = "___office";
77 sal_Char __READONLY_DATA sXML_np__draw[] = "__draw";
78 sal_Char __READONLY_DATA sXML_np__draw_ooo[] = "___draw";
79 sal_Char __READONLY_DATA sXML_np__ooo[] = "__ooo";
80 sal_Char __READONLY_DATA sXML_np__xlink[] = "__xlink";
81 
82 ///////////////////////////////////////////////////////////////////////
83 
84 enum SvxXMLTableImportContextEnum { stice_unknown, stice_color, stice_marker, stice_dash, stice_hatch, stice_gradient, stice_bitmap };
85 
86 ///////////////////////////////////////////////////////////////////////
87 
88 class SvxXMLTableImportContext : public SvXMLImportContext
89 {
90 public:
91 	SvxXMLTableImportContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName, const uno::Reference< XAttributeList >& xAttrList, SvxXMLTableImportContextEnum eContext, const uno::Reference< XNameContainer >& xTable,
92 		sal_Bool bOOoFormat );
93 	virtual ~SvxXMLTableImportContext();
94 
95 	virtual SvXMLImportContext *CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const uno::Reference< XAttributeList >& xAttrList );
96 
getImport() const97 	SvxXMLXTableImport& getImport() const { return *(SvxXMLXTableImport*)&GetImport(); }
98 
99 protected:
100 	void importColor( sal_uInt16 nPrfx, const OUString& rLocalName, const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName );
101 	void importMarker( sal_uInt16 nPrfx, const OUString& rLocalName, const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName );
102 	void importDash( sal_uInt16 nPrfx, const OUString& rLocalName, const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName );
103 	void importHatch( sal_uInt16 nPrfx, const OUString& rLocalName, const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName );
104 	void importGradient( sal_uInt16 nPrfx, const OUString& rLocalName, const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName );
105 	void importBitmap( sal_uInt16 nPrfx, const OUString& rLocalName, const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName );
106 
107 private:
108 	uno::Reference< XNameContainer > mxTable;
109 	SvxXMLTableImportContextEnum meContext;
110 	sal_Bool mbOOoFormat;
111 };
112 
113 ///////////////////////////////////////////////////////////////////////
114 
SvxXMLTableImportContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLName,const uno::Reference<XAttributeList> &,SvxXMLTableImportContextEnum eContext,const uno::Reference<XNameContainer> & xTable,sal_Bool bOOoFormat)115 SvxXMLTableImportContext::SvxXMLTableImportContext( SvXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName, const uno::Reference< XAttributeList >&, SvxXMLTableImportContextEnum eContext, const uno::Reference< XNameContainer >& xTable, sal_Bool bOOoFormat )
116 : SvXMLImportContext( rImport, nPrfx, rLName ), mxTable( xTable ), meContext( eContext ),
117 	mbOOoFormat( bOOoFormat )
118 {
119 }
120 
~SvxXMLTableImportContext()121 SvxXMLTableImportContext::~SvxXMLTableImportContext()
122 {
123 }
124 
CreateChildContext(sal_uInt16 nPrefix,const OUString & rLocalName,const uno::Reference<XAttributeList> & rAttrList)125 SvXMLImportContext *SvxXMLTableImportContext::CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const uno::Reference< XAttributeList >& rAttrList )
126 {
127 	if( XML_NAMESPACE_DRAW == nPrefix )
128 	{
129 		uno::Reference< XAttributeList > xAttrList( rAttrList );
130 		if( mbOOoFormat &&
131 		 	(stice_dash == meContext || stice_hatch == meContext ||
132 			 stice_bitmap == meContext) )
133 		{
134 			SvXMLAttributeList *pAttrList = new SvXMLAttributeList( rAttrList );
135 			xAttrList = pAttrList;
136 			sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
137 			for( sal_Int16 i=0; i < nAttrCount; i++ )
138 			{
139 				const OUString& rAttrName = xAttrList->getNameByIndex( i );
140 				OUString aLocalName;
141 				sal_uInt16 nPrefix_ =
142 					GetImport().GetNamespaceMap().GetKeyByAttrName( rAttrName,
143 																&aLocalName );
144 				if( XML_NAMESPACE_XLINK == nPrefix_ &&
145 					stice_bitmap == meContext &&
146 					IsXMLToken( aLocalName, XML_HREF ) )
147 				{
148 					const OUString rValue = xAttrList->getValueByIndex( i );
149 					if( rValue.getLength() && '#' == rValue[0] )
150 						pAttrList->SetValueByIndex( i, rValue.copy( 1 ) );
151 				}
152 				else if( XML_NAMESPACE_DRAW == nPrefix_ &&
153 						  ( ( stice_dash == meContext &&
154 						      (IsXMLToken( aLocalName, XML_DOTS1_LENGTH ) ||
155 						       IsXMLToken( aLocalName, XML_DOTS2_LENGTH ) ||
156 						       IsXMLToken( aLocalName, XML_DISTANCE )) ) ||
157 							( stice_hatch == meContext &&
158 						      IsXMLToken( aLocalName, XML_HATCH_DISTANCE ) ) ) )
159 				{
160 					const OUString rValue = xAttrList->getValueByIndex( i );
161 					sal_Int32 nPos = rValue.getLength();
162 					while( nPos && rValue[nPos-1] <= ' ' )
163 						--nPos;
164 					if( nPos > 2 &&
165 						('c'==rValue[nPos-2] || 'C'==rValue[nPos-2]) &&
166 						('h'==rValue[nPos-1] || 'H'==rValue[nPos-1]) )
167 					{
168 						pAttrList->SetValueByIndex( i, rValue.copy( 0, nPos-2 ) );
169 					}
170 				}
171 			}
172 		}
173 		try
174 		{
175 			Any aAny;
176 			OUString aName;
177 
178 			switch( meContext )
179 			{
180 			case stice_color:
181 				importColor( nPrefix, rLocalName, xAttrList, aAny, aName );
182 				break;
183 			case stice_marker:
184 				importMarker( nPrefix, rLocalName, xAttrList, aAny, aName  );
185 				break;
186 			case stice_dash:
187 				importDash( nPrefix, rLocalName, xAttrList, aAny, aName  );
188 				break;
189 			case stice_hatch:
190 				importHatch( nPrefix, rLocalName, xAttrList, aAny, aName  );
191 				break;
192 			case stice_gradient:
193 				importGradient( nPrefix, rLocalName, xAttrList, aAny, aName  );
194 				break;
195 			case stice_bitmap:
196 				importBitmap( nPrefix, rLocalName, xAttrList, aAny, aName  );
197 				break;
198 			case stice_unknown:
199 				break;
200 			}
201 
202 			if( aName.getLength() && aAny.hasValue() )
203 			{
204 				if( mxTable->hasByName( aName ) )
205 				{
206 					mxTable->replaceByName( aName, aAny );
207 				}
208 				else
209 				{
210 					mxTable->insertByName( aName, aAny );
211 				}
212 			}
213 		}
214 		catch( uno::Exception& )
215 		{
216 		}
217 	}
218 
219 	return new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
220 }
221 
importColor(sal_uInt16 nPrfx,const OUString & rLocalName,const uno::Reference<XAttributeList> & xAttrList,Any & rAny,OUString & rName)222 void SvxXMLTableImportContext::importColor( sal_uInt16 nPrfx, const OUString& rLocalName, const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName )
223 {
224 	(void)nPrfx;
225 	(void)rLocalName;
226 
227 	const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
228 	for( sal_Int16 i=0; i < nAttrCount; i++ )
229 	{
230 		const OUString& rFullAttrName = xAttrList->getNameByIndex( i );
231 		OUString aLocalName;
232 		sal_uInt16 nPrefix = GetImport().GetNamespaceMap().GetKeyByAttrName( rFullAttrName, &aLocalName );
233 
234 
235 		if( XML_NAMESPACE_DRAW == nPrefix )
236 		{
237 			if( aLocalName == GetXMLToken(XML_NAME) )
238 			{
239 				rName = xAttrList->getValueByIndex( i );
240 			}
241 			else if( aLocalName == GetXMLToken(XML_COLOR) )
242 			{
243 				Color aColor;
244 				SvXMLUnitConverter::convertColor(aColor, xAttrList->getValueByIndex( i ));
245 				rAny <<= (sal_Int32)aColor.GetColor();
246 			}
247 		}
248 	}
249 }
250 
importMarker(sal_uInt16 nPrfx,const OUString & rLocalName,const uno::Reference<XAttributeList> & xAttrList,Any & rAny,OUString & rName)251 void SvxXMLTableImportContext::importMarker( sal_uInt16 nPrfx, const OUString& rLocalName, const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName )
252 {
253 	(void)nPrfx;
254 	(void)rLocalName;
255 
256     try
257     {
258 	    XMLMarkerStyleImport aMarkerStyle( GetImport() );
259 	    aMarkerStyle.importXML( xAttrList, rAny, rName );
260     }
261     catch( Exception& )
262     {
263         DBG_ERROR("SvxXMLTableImportContext::importMarker(), exception caught!");
264     }
265 }
266 
importDash(sal_uInt16 nPrfx,const OUString & rLocalName,const uno::Reference<XAttributeList> & xAttrList,Any & rAny,OUString & rName)267 void SvxXMLTableImportContext::importDash( sal_uInt16 nPrfx, const OUString& rLocalName, const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName )
268 {
269 	(void)nPrfx;
270 	(void)rLocalName;
271 
272     try
273     {
274     	XMLDashStyleImport aDashStyle( GetImport() );
275 	    aDashStyle.importXML( xAttrList, rAny, rName );
276     }
277     catch( Exception& )
278     {
279         DBG_ERROR("SvxXMLTableImportContext::importDash(), exception caught!");
280     }
281 }
282 
importHatch(sal_uInt16 nPrfx,const OUString & rLocalName,const uno::Reference<XAttributeList> & xAttrList,Any & rAny,OUString & rName)283 void SvxXMLTableImportContext::importHatch( sal_uInt16 nPrfx, const OUString& rLocalName, const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName )
284 {
285 	(void)nPrfx;
286 	(void)rLocalName;
287 
288     try
289     {
290     	XMLHatchStyleImport aHatchStyle( GetImport() );
291 	    aHatchStyle.importXML( xAttrList, rAny, rName );
292     }
293     catch( Exception& )
294     {
295         DBG_ERROR("SvxXMLTableImportContext::importHatch(), exception caught!");
296     }
297 }
298 
importGradient(sal_uInt16 nPrfx,const OUString & rLocalName,const uno::Reference<XAttributeList> & xAttrList,Any & rAny,OUString & rName)299 void SvxXMLTableImportContext::importGradient( sal_uInt16 nPrfx, const OUString& rLocalName, const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName )
300 {
301 	(void)nPrfx;
302 	(void)rLocalName;
303 
304     try
305     {
306     	XMLGradientStyleImport aGradientStyle( GetImport() );
307 	    aGradientStyle.importXML( xAttrList, rAny, rName );
308     }
309     catch( Exception& )
310     {
311         DBG_ERROR("SvxXMLTableImportContext::importGradient(), exception caught!");
312     }
313 }
314 
importBitmap(sal_uInt16 nPrfx,const OUString & rLocalName,const uno::Reference<XAttributeList> & xAttrList,Any & rAny,OUString & rName)315 void SvxXMLTableImportContext::importBitmap( sal_uInt16 nPrfx, const OUString& rLocalName, const uno::Reference< XAttributeList >& xAttrList, Any& rAny, OUString& rName )
316 {
317 	(void)nPrfx;
318 	(void)rLocalName;
319 
320 	try
321     {
322         XMLImageStyle aImageStyle;
323 	    aImageStyle.importXML( xAttrList, rAny, rName, GetImport() );
324     }
325     catch( Exception& )
326     {
327         DBG_ERROR("SvxXMLTableImportContext::importBitmap(), exception caught!");
328     }
329 }
330 
331 ///////////////////////////////////////////////////////////////////////
332 
333 // #110680#
SvxXMLXTableImport(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> xServiceFactory,const uno::Reference<XNameContainer> & rTable,uno::Reference<XGraphicObjectResolver> & xGrfResolver)334 SvxXMLXTableImport::SvxXMLXTableImport(
335 	const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xServiceFactory,
336 	const uno::Reference< XNameContainer > & rTable,
337 	uno::Reference< XGraphicObjectResolver >& xGrfResolver )
338 :	SvXMLImport(xServiceFactory, 0),
339 	mrTable( rTable )
340 {
341 	SetGraphicResolver( xGrfResolver );
342 
343 	GetNamespaceMap().Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__ooo ) ), GetXMLToken(XML_N_OOO), XML_NAMESPACE_OOO );
344 	GetNamespaceMap().Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__office ) ), GetXMLToken(XML_N_OFFICE), XML_NAMESPACE_OFFICE );
345 	GetNamespaceMap().Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__draw ) ), GetXMLToken(XML_N_DRAW), XML_NAMESPACE_DRAW );
346 	GetNamespaceMap().Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__xlink ) ), GetXMLToken(XML_N_XLINK), XML_NAMESPACE_XLINK );
347 
348 	// OOo namespaces for reading OOo 1.1 files
349 	GetNamespaceMap().Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__office_ooo ) ),
350 						GetXMLToken(XML_N_OFFICE_OOO),
351                         XML_NAMESPACE_OFFICE );
352 	GetNamespaceMap().Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__draw_ooo ) ),
353 						GetXMLToken(XML_N_DRAW_OOO),
354                         XML_NAMESPACE_DRAW );
355 }
356 
~SvxXMLXTableImport()357 SvxXMLXTableImport::~SvxXMLXTableImport() throw ()
358 {
359 }
360 
load(const OUString & rUrl,const uno::Reference<XNameContainer> & xTable)361 sal_Bool SvxXMLXTableImport::load( const OUString& rUrl, const uno::Reference< XNameContainer >& xTable ) throw()
362 {
363 	sal_Bool bRet = sal_True;
364 
365 	uno::Reference< XGraphicObjectResolver >	xGrfResolver;
366 	SvXMLGraphicHelper*	pGraphicHelper = 0;
367 
368 	try
369 	{
370 		do
371 		{
372 			SfxMedium aMedium( rUrl, STREAM_READ | STREAM_NOCREATE, sal_True );
373 
374 			uno::Reference<lang::XMultiServiceFactory> xServiceFactory( ::comphelper::getProcessServiceFactory() );
375 			if( !xServiceFactory.is() )
376 			{
377 				DBG_ERROR( "SvxXMLXTableImport::load: got no service manager" );
378 				break;
379 			}
380 
381 			uno::Reference< xml::sax::XParser > xParser( xServiceFactory->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.sax.Parser" ) ) ), uno::UNO_QUERY_THROW );
382             uno::Reference < io::XStream > xIStm;
383 			uno::Reference< io::XActiveDataSource > xSource;
384 
385             xml::sax::InputSource aParserInput;
386 			aParserInput.sSystemId = aMedium.GetName();
387 
388             if( aMedium.IsStorage() )
389 			{
390 				uno::Reference < embed::XStorage > xStorage( aMedium.GetStorage( sal_False ), uno::UNO_QUERY_THROW );
391 
392 				const String aContentStmName( RTL_CONSTASCII_USTRINGPARAM( "Content.xml" ) );
393                 xIStm.set( xStorage->openStreamElement( aContentStmName, embed::ElementModes::READ ), uno::UNO_QUERY_THROW );
394                 if( !xIStm.is() )
395 				{
396 					DBG_ERROR( "could not open Content stream" );
397 					break;
398 				}
399 
400                 aParserInput.aInputStream = xIStm->getInputStream();
401                 pGraphicHelper = SvXMLGraphicHelper::Create( xStorage, GRAPHICHELPER_MODE_READ );
402 				xGrfResolver = pGraphicHelper;
403 			}
404 			else
405 			{
406                 aParserInput.aInputStream = aMedium.GetInputStream();
407 				uno::Reference< io::XSeekable > xSeek( aParserInput.aInputStream, uno::UNO_QUERY_THROW );
408 				xSeek->seek( 0 );
409 			}
410 
411 			if( xSource.is() )
412 			{
413 				uno::Reference< io::XActiveDataControl > xSourceControl( xSource, UNO_QUERY_THROW );
414 				xSourceControl->start();
415 			}
416 
417 			// #110680#
418 			// uno::Reference< XDocumentHandler > xHandler( new SvxXMLXTableImport( xTable, xGrfResolver ) );
419 			uno::Reference< XDocumentHandler > xHandler( new SvxXMLXTableImport( xServiceFactory, xTable, xGrfResolver ) );
420 
421 			xParser->setDocumentHandler( xHandler );
422 			xParser->parseStream( aParserInput );
423 		}
424 		while(0);
425 
426 		if( pGraphicHelper )
427 			SvXMLGraphicHelper::Destroy( pGraphicHelper );
428 	}
429 	catch( uno::Exception& )
430 	{
431 //		CL: I disabled this assertion since its an error, but it happens
432 //		    each time you load a document with property tables that are not
433 //			on the current machine. Maybe a better fix would be to place
434 //		    a file exists check before importing...
435 //		DBG_ERROR("svx::SvxXMLXTableImport::load(), exception caught!");
436 		bRet = sal_False;
437 	}
438 
439 	return bRet;
440 }
441 
CreateContext(sal_uInt16 nPrefix,const OUString & rLocalName,const uno::Reference<XAttributeList> & xAttrList)442 SvXMLImportContext *SvxXMLXTableImport::CreateContext( sal_uInt16 nPrefix, const OUString& rLocalName, const uno::Reference< XAttributeList >& xAttrList )
443 {
444 	if( XML_NAMESPACE_OOO == nPrefix ||
445 		XML_NAMESPACE_OFFICE == nPrefix )
446 	{
447 		sal_Bool bOOoFormat = (XML_NAMESPACE_OFFICE == nPrefix);
448 		Type aType = mrTable->getElementType();
449 
450 		if( rLocalName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "color-table" ) ) )
451 		{
452 			if( aType == ::getCppuType((const sal_Int32*)0) )
453 				return new SvxXMLTableImportContext( *this, nPrefix, rLocalName, xAttrList, stice_color, mrTable, bOOoFormat );
454 		}
455 		else if( rLocalName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "marker-table" ) ) )
456 		{
457 			if( aType == ::getCppuType((const drawing::PolyPolygonBezierCoords*)0) )
458 				return new SvxXMLTableImportContext( *this, nPrefix, rLocalName, xAttrList, stice_marker, mrTable, bOOoFormat );
459 		}
460 		else if( rLocalName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "dash-table" ) ) )
461 		{
462 			if( aType == ::getCppuType((const drawing::LineDash*)0) )
463 				return new SvxXMLTableImportContext( *this, nPrefix, rLocalName, xAttrList, stice_dash, mrTable, bOOoFormat );
464 		}
465 		else if( rLocalName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "hatch-table" ) ) )
466 		{
467 			if( aType == ::getCppuType((const drawing::Hatch*)0) )
468 				return new SvxXMLTableImportContext( *this, nPrefix, rLocalName, xAttrList, stice_hatch, mrTable, bOOoFormat );
469 		}
470 		else if( rLocalName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "gradient-table" ) ) )
471 		{
472 			if( aType == ::getCppuType((const awt::Gradient*)0))
473 				return new SvxXMLTableImportContext( *this, nPrefix, rLocalName, xAttrList, stice_gradient, mrTable, bOOoFormat );
474 		}
475 		else if( rLocalName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "bitmap-table" ) ) )
476 		{
477 			if( aType == ::getCppuType((const OUString*)0))
478 				return new SvxXMLTableImportContext( *this, nPrefix, rLocalName, xAttrList, stice_bitmap, mrTable, bOOoFormat );
479 		}
480 	}
481 
482 	return new SvXMLImportContext( *this, nPrefix, rLocalName );
483 }
484 
485