xref: /AOO41X/main/svx/source/xml/xmlxtimp.cxx (revision f6e50924346d0b8c0b07c91832a97665dd718b0c)
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