xref: /AOO41X/main/xmloff/source/core/xmlimp.cxx (revision 7cba280fda82c99b23d255b837716f458a00160f)
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_xmloff.hxx"
26 #include <com/sun/star/beans/XPropertySetInfo.hpp>
27 #include <tools/debug.hxx>
28 #include <tools/urlobj.hxx>
29 #include <osl/mutex.hxx>
30 #include <rtl/uuid.h>
31 #include <rtl/memory.h>
32 #include <svl/svarray.hxx>
33 #include "unointerfacetouniqueidentifiermapper.hxx"
34 #include <xmloff/nmspmap.hxx>
35 #include <xmloff/xmluconv.hxx>
36 #include "xmloff/xmlnmspe.hxx"
37 #include <xmloff/xmltoken.hxx>
38 #include <xmloff/XMLFontStylesContext.hxx>
39 #include <xmloff/xmlictxt.hxx>
40 #include <xmloff/xmlimp.hxx>
41 #include <xmloff/xmlnumfi.hxx>
42 #include "XMLEventImportHelper.hxx"
43 #include "XMLStarBasicContextFactory.hxx"
44 #include "XMLScriptContextFactory.hxx"
45 #include "StyleMap.hxx"
46 #include <xmloff/ProgressBarHelper.hxx>
47 #include <xmloff/xmltoken.hxx>
48 #include "xmloff/xmlerror.hxx"
49 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
50 #include <com/sun/star/lang/ServiceNotRegisteredException.hpp>
51 #include <com/sun/star/io/XOutputStream.hpp>
52 #include <com/sun/star/document/XBinaryStreamResolver.hpp>
53 #include <com/sun/star/document/XStorageBasedDocument.hpp>
54 #include <com/sun/star/xml/sax/XLocator.hpp>
55 #include <com/sun/star/packages/zip/ZipIOException.hpp>
56 #include <comphelper/namecontainer.hxx>
57 #include <rtl/logfile.hxx>
58 #include <tools/string.hxx> // used in StartElement for logging
59 #include <cppuhelper/implbase1.hxx>
60 #include <comphelper/extract.hxx>
61 #include <comphelper/processfactory.hxx>
62 #include <comphelper/documentconstants.hxx>
63 #include <comphelper/storagehelper.hxx>
64 #include <unotools/fontcvt.hxx>
65 
66 #include <com/sun/star/rdf/XMetadatable.hpp>
67 #include <com/sun/star/rdf/XRepositorySupplier.hpp>
68 #include "RDFaImportHelper.hxx"
69 
70 #define LOGFILE_AUTHOR "unknown"
71 
72 using ::com::sun::star::beans::XPropertySetInfo;
73 
74 using ::rtl::OUString;
75 using ::rtl::OUStringBuffer;
76 
77 using namespace ::osl;
78 using namespace ::com::sun::star;
79 using namespace ::com::sun::star::frame;
80 using namespace ::com::sun::star::uno;
81 using namespace ::com::sun::star::util;
82 using namespace ::com::sun::star::io;
83 using namespace ::com::sun::star::container;
84 using namespace ::com::sun::star::document;
85 using namespace ::xmloff::token;
86 
87 sal_Char __READONLY_DATA sXML_np__office[] = "_office";
88 sal_Char __READONLY_DATA sXML_np__office_ext[] = "_office_ooo";
89 sal_Char __READONLY_DATA sXML_np__ooo[] = "_ooo";
90 sal_Char __READONLY_DATA sXML_np__ooow[] = "_ooow";
91 sal_Char __READONLY_DATA sXML_np__oooc[] = "_oooc";
92 sal_Char __READONLY_DATA sXML_np__of[] = "_of";
93 sal_Char __READONLY_DATA sXML_np__style[] = "_style";
94 sal_Char __READONLY_DATA sXML_np__text[] = "_text";
95 sal_Char __READONLY_DATA sXML_np__text_ext[] = "_text_ooo";
96 sal_Char __READONLY_DATA sXML_np__table[] = "_table";
97 sal_Char __READONLY_DATA sXML_np__table_ext[] = "_table_ooo";
98 sal_Char __READONLY_DATA sXML_np__draw[] = "_draw";
99 sal_Char __READONLY_DATA sXML_np__draw_ext[] = "_draw_ooo";
100 sal_Char __READONLY_DATA sXML_np__dr3d[] = "_dr3d";
101 sal_Char __READONLY_DATA sXML_np__fo[] = "_fo";
102 sal_Char __READONLY_DATA sXML_np__xlink[] = "_xlink";
103 sal_Char __READONLY_DATA sXML_np__dc[] = "_dc";
104 sal_Char __READONLY_DATA sXML_np__dom[] = "_dom";
105 sal_Char __READONLY_DATA sXML_np__meta[] = "_meta";
106 sal_Char __READONLY_DATA sXML_np__number[] = "_number";
107 sal_Char __READONLY_DATA sXML_np__svg[] = "_svg";
108 sal_Char __READONLY_DATA sXML_np__chart[] = "_chart";
109 sal_Char __READONLY_DATA sXML_np__math[] = "_math";
110 sal_Char __READONLY_DATA sXML_np__form[] = "_form";
111 sal_Char __READONLY_DATA sXML_np__script[] = "_script";
112 sal_Char __READONLY_DATA sXML_np__config[] = "_config";
113 sal_Char __READONLY_DATA sXML_np__db[] = "_db";
114 sal_Char __READONLY_DATA sXML_np__xforms[] = "_xforms";
115 sal_Char __READONLY_DATA sXML_np__xsd[] = "_xsd";
116 sal_Char __READONLY_DATA sXML_np__xsi[] = "_xsi";
117 sal_Char __READONLY_DATA sXML_np__field[] = "_field";
118 sal_Char __READONLY_DATA sXML_np__xhtml[] = "_xhtml";
119 
120 sal_Char __READONLY_DATA sXML_np__fo_old[] = "__fo";
121 sal_Char __READONLY_DATA sXML_np__xlink_old[] = "__xlink";
122 sal_Char __READONLY_DATA sXML_np__office_old[] = "__office";
123 sal_Char __READONLY_DATA sXML_np__style_old[] = "__style";
124 sal_Char __READONLY_DATA sXML_np__text_old[] = "__text";
125 sal_Char __READONLY_DATA sXML_np__table_old[] = "__table";
126 sal_Char __READONLY_DATA sXML_np__meta_old[] = "__meta";
127 
128 
129 
130 class SvXMLImportEventListener : public cppu::WeakImplHelper1<
131                             com::sun::star::lang::XEventListener >
132 {
133 private:
134     SvXMLImport*    pImport;
135 
136 public:
137                             SvXMLImportEventListener(SvXMLImport* pImport);
138     virtual                 ~SvXMLImportEventListener();
139 
140                             // XEventListener
141     virtual void SAL_CALL disposing(const lang::EventObject& rEventObject) throw(::com::sun::star::uno::RuntimeException);
142 };
143 
SvXMLImportEventListener(SvXMLImport * pTempImport)144 SvXMLImportEventListener::SvXMLImportEventListener(SvXMLImport* pTempImport)
145     : pImport(pTempImport)
146 {
147 }
148 
~SvXMLImportEventListener()149 SvXMLImportEventListener::~SvXMLImportEventListener()
150 {
151 }
152 
153 // XEventListener
disposing(const lang::EventObject &)154 void SAL_CALL SvXMLImportEventListener::disposing( const lang::EventObject& )
155     throw(uno::RuntimeException)
156 {
157     if (pImport)
158     {
159         pImport->DisposingModel();
160         pImport = NULL;
161     }
162 }
163 
164 //==============================================================================
165 // --> ORW
166 namespace
167 {
168     class DocumentInfo
169     {
170         private:
171             sal_uInt16 mnGeneratorVersion;
172 
173         public:
DocumentInfo(const SvXMLImport & rImport)174             DocumentInfo( const SvXMLImport& rImport )
175                 : mnGeneratorVersion( SvXMLImport::ProductVersionUnknown )
176             {
177                 sal_Int32 nUPD, nBuild;
178                 if ( rImport.getBuildIds( nUPD, nBuild ) )
179                 {
180                     if ( nUPD >= 640 && nUPD <= 645 )
181                     {
182                         mnGeneratorVersion = SvXMLImport::OOo_1x;
183                     }
184                     else if ( nUPD == 680 )
185                     {
186                         mnGeneratorVersion = SvXMLImport::OOo_2x;
187                     }
188                     else if ( nUPD == 300 && nBuild <= 9379 )
189                     {
190                         mnGeneratorVersion = SvXMLImport::OOo_30x;
191                     }
192                     else if ( nUPD == 310 )
193                     {
194                         mnGeneratorVersion = SvXMLImport::OOo_31x;
195                     }
196                     else if ( nUPD == 320 )
197                     {
198                         mnGeneratorVersion = SvXMLImport::OOo_32x;
199                     }
200                     else if ( nUPD == 330 )
201                     {
202                         mnGeneratorVersion = SvXMLImport::OOo_33x;
203                     }
204                     else if ( nUPD == 340 )
205                     {
206                         mnGeneratorVersion = SvXMLImport::OOo_34x;
207                     }
208                 }
209             }
210 
~DocumentInfo()211             ~DocumentInfo()
212             {}
213 
getGeneratorVersion() const214             sal_uInt16 getGeneratorVersion() const
215             {
216                 return mnGeneratorVersion;
217             }
218     };
219 }
220 // <--
221 
222 class SvXMLImport_Impl
223 {
224 public:
225     FontToSubsFontConverter hBatsFontConv;
226     FontToSubsFontConverter hMathFontConv;
227 
228     bool mbOwnGraphicResolver;
229     bool mbOwnEmbeddedResolver;
230     INetURLObject aBaseURL;
231     INetURLObject aDocBase;
232 
233     /// name of stream in package, e.g., "content.xml"
234     ::rtl::OUString mStreamName;
235 
236     ::rtl::OUString aODFVersion;
237 
238     // --> OD 2004-08-10 #i28749# - boolean, indicating that position attributes
239     // of shapes are given in horizontal left-to-right layout. This is the case
240     // for the OpenOffice.org file format.
241     sal_Bool mbShapePositionInHoriL2R;
242     // <--
243     // --> OD 2007-12-19 #152540#
244     sal_Bool mbTextDocInOOoFileFormat;
245     // <--
246 
247     const uno::Reference< uno::XComponentContext > mxComponentContext;
248 
249     std::auto_ptr< xmloff::RDFaImportHelper > mpRDFaHelper;
250 
251     // --> ORW
252     std::auto_ptr< DocumentInfo > mpDocumentInfo;
253     // <--
254 
SvXMLImport_Impl()255     SvXMLImport_Impl()
256         : hBatsFontConv( 0 )
257         , hMathFontConv( 0 )
258         , mbOwnGraphicResolver( false )
259         , mbOwnEmbeddedResolver( false )
260         , mStreamName()
261         , mbShapePositionInHoriL2R( sal_False )
262         , mbTextDocInOOoFileFormat( sal_False )
263         , mxComponentContext( ::comphelper::getProcessComponentContext() )
264         , mpRDFaHelper() // lazy
265         // --> ORW
266         , mpDocumentInfo() // lazy
267         // <--
268     {
269         OSL_ENSURE(mxComponentContext.is(), "SvXMLImport: no ComponentContext");
270         if (!mxComponentContext.is()) throw uno::RuntimeException();
271     }
272 
~SvXMLImport_Impl()273     ~SvXMLImport_Impl()
274     {
275         if( hBatsFontConv )
276             DestroyFontToSubsFontConverter( hBatsFontConv );
277         if( hMathFontConv )
278             DestroyFontToSubsFontConverter( hMathFontConv );
279     }
280 
281     // --> ORW
getGeneratorVersion(const SvXMLImport & rImport)282     sal_uInt16 getGeneratorVersion( const SvXMLImport& rImport )
283     {
284         if ( !mpDocumentInfo.get() )
285         {
286             mpDocumentInfo.reset( new DocumentInfo( rImport ) );
287         }
288 
289         return mpDocumentInfo->getGeneratorVersion();
290     }
291     // <--
292 
293     ::comphelper::UnoInterfaceToUniqueIdentifierMapper  maInterfaceToIdentifierMapper;
294 };
295 
296 typedef SvXMLImportContext *SvXMLImportContextPtr;
297 SV_DECL_PTRARR( SvXMLImportContexts_Impl, SvXMLImportContextPtr, 20, 5 )
SV_IMPL_PTRARR(SvXMLImportContexts_Impl,SvXMLImportContextPtr)298 SV_IMPL_PTRARR( SvXMLImportContexts_Impl, SvXMLImportContextPtr )
299 
300 SvXMLImportContext *SvXMLImport::CreateContext( sal_uInt16 nPrefix,
301                                          const OUString& rLocalName,
302                                          const uno::Reference< xml::sax::XAttributeList >& )
303 {
304     return new SvXMLImportContext( *this, nPrefix, rLocalName );
305 }
306 
_InitCtor()307 void SvXMLImport::_InitCtor()
308 {
309     if( mnImportFlags != 0 )
310     {
311         // implicit "xml" namespace prefix
312         mpNamespaceMap->Add( GetXMLToken(XML_XML), GetXMLToken(XML_N_XML), XML_NAMESPACE_XML );
313         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__office ) ),
314                             GetXMLToken(XML_N_OFFICE),
315                             XML_NAMESPACE_OFFICE );
316         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__office_ext ) ),
317                             GetXMLToken(XML_N_OFFICE_EXT),
318                             XML_NAMESPACE_OFFICE_EXT );
319         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__ooo ) ), GetXMLToken(XML_N_OOO), XML_NAMESPACE_OOO );
320         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__style) ),
321                             GetXMLToken(XML_N_STYLE),
322                             XML_NAMESPACE_STYLE );
323         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__text) ),
324                             GetXMLToken(XML_N_TEXT),
325                             XML_NAMESPACE_TEXT );
326         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__text_ext ) ),
327             GetXMLToken(XML_N_TEXT_EXT),
328             XML_NAMESPACE_TEXT_EXT );
329         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__table ) ),
330                             GetXMLToken(XML_N_TABLE),
331                             XML_NAMESPACE_TABLE );
332         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__table_ext ) ),
333                             GetXMLToken(XML_N_TABLE_EXT),
334                             XML_NAMESPACE_TABLE_EXT );
335         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__draw ) ),
336                             GetXMLToken(XML_N_DRAW),
337                             XML_NAMESPACE_DRAW );
338         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__draw_ext ) ),
339                             GetXMLToken(XML_N_DRAW_EXT),
340                             XML_NAMESPACE_DRAW_EXT );
341         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM (sXML_np__dr3d ) ),
342                             GetXMLToken(XML_N_DR3D),
343                             XML_NAMESPACE_DR3D );
344         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__fo) ),
345                             GetXMLToken(XML_N_FO_COMPAT),
346                             XML_NAMESPACE_FO );
347         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__xlink) ),
348                             GetXMLToken(XML_N_XLINK),
349                             XML_NAMESPACE_XLINK );
350         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__dc) ),
351                             GetXMLToken(XML_N_DC),
352                             XML_NAMESPACE_DC );
353         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__dom ) ),
354                             GetXMLToken(XML_N_DOM),
355                             XML_NAMESPACE_DOM );
356         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__meta) ),
357                             GetXMLToken(XML_N_META),
358                             XML_NAMESPACE_META );
359         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__number) ),
360                             GetXMLToken(XML_N_NUMBER),
361                             XML_NAMESPACE_NUMBER );
362         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__svg) ),
363                             GetXMLToken(XML_N_SVG_COMPAT),
364                             XML_NAMESPACE_SVG );
365         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__chart) ),
366                             GetXMLToken(XML_N_CHART),
367                             XML_NAMESPACE_CHART );
368         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__math) ),
369                             GetXMLToken(XML_N_MATH),
370                             XML_NAMESPACE_MATH );
371         mpNamespaceMap->Add(OUString(RTL_CONSTASCII_USTRINGPARAM( sXML_np__form )),
372                             GetXMLToken(XML_N_FORM),
373                             XML_NAMESPACE_FORM );
374         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__script) ),
375                             GetXMLToken(XML_N_SCRIPT),
376                             XML_NAMESPACE_SCRIPT );
377         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__config) ),
378                             GetXMLToken(XML_N_CONFIG),
379                             XML_NAMESPACE_CONFIG );
380         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__xforms) ),
381                             GetXMLToken(XML_N_XFORMS_1_0),
382                             XML_NAMESPACE_XFORMS );
383         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__xsd) ),
384                             GetXMLToken(XML_N_XSD),
385                             XML_NAMESPACE_XSD );
386         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__xsi) ),
387                             GetXMLToken(XML_N_XSI),
388                             XML_NAMESPACE_XFORMS );
389         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__ooow ) ), GetXMLToken(XML_N_OOOW), XML_NAMESPACE_OOOW );
390         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__oooc ) ), GetXMLToken(XML_N_OOOC), XML_NAMESPACE_OOOC );
391         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__field ) ), GetXMLToken(XML_N_FIELD), XML_NAMESPACE_FIELD );
392         mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__of ) ),
393                             GetXMLToken(XML_N_OF), XML_NAMESPACE_OF );
394         mpNamespaceMap->Add(
395             OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__xhtml ) ),
396             GetXMLToken(XML_N_XHTML), XML_NAMESPACE_XHTML );
397     }
398 
399     msPackageProtocol = OUString( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.Package:" ) );
400 
401     if (mxNumberFormatsSupplier.is())
402         mpNumImport = new SvXMLNumFmtHelper(mxNumberFormatsSupplier, getServiceFactory());
403 
404     if (mxModel.is() && !mxEventListener.is())
405     {
406         mxEventListener.set(new SvXMLImportEventListener(this));
407         mxModel->addEventListener(mxEventListener);
408     }
409 
410     ::comphelper::UnoInterfaceToUniqueIdentifierMapper  maInterfaceToIdentifierMapper;
411 
412 }
413 
414 // #110680#
SvXMLImport(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & xServiceFactory,sal_uInt16 nImportFlags)415 SvXMLImport::SvXMLImport(
416     const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceFactory,
417     sal_uInt16 nImportFlags ) throw ()
418 :   mpImpl( new SvXMLImport_Impl() ),
419     mpNamespaceMap( new SvXMLNamespaceMap ),
420 
421     // #110680#
422     // pUnitConv( new SvXMLUnitConverter( MAP_100TH_MM, MAP_100TH_MM ) ),
423     mpUnitConv( new SvXMLUnitConverter( MAP_100TH_MM, MAP_100TH_MM, xServiceFactory ) ),
424 
425     mpContexts( new SvXMLImportContexts_Impl ),
426     mpNumImport( NULL ),
427     mpProgressBarHelper( NULL ),
428     mpEventImportHelper( NULL ),
429     mpXMLErrors( NULL ),
430     mpStyleMap(0),
431     mnImportFlags( nImportFlags ),
432     mnErrorFlags(0),
433     // #110680#
434     mxServiceFactory(xServiceFactory),
435     mbIsFormsSupported( sal_True ),
436     mbIsTableShapeSupported( false ),
437     mbIsGraphicLoadOnDemandSupported( true )
438 {
439     DBG_ASSERT( mxServiceFactory.is(), "got no service manager" );
440     _InitCtor();
441 }
442 
443 // #110680#
SvXMLImport(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & xServiceFactory,const Reference<XModel> & rModel)444 SvXMLImport::SvXMLImport(
445     const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceFactory,
446     const Reference< XModel > & rModel ) throw ()
447 :   mxModel( rModel ),
448     mxNumberFormatsSupplier (rModel, uno::UNO_QUERY),
449     mpImpl( new SvXMLImport_Impl() ),
450     mpNamespaceMap( new SvXMLNamespaceMap ),
451     // #110680#
452     // pUnitConv( new SvXMLUnitConverter( MAP_100TH_MM, MAP_100TH_MM ) ),
453     mpUnitConv( new SvXMLUnitConverter( MAP_100TH_MM, MAP_100TH_MM, xServiceFactory ) ),
454     mpContexts( new SvXMLImportContexts_Impl ),
455     mpNumImport( NULL ),
456     mpProgressBarHelper( NULL ),
457     mpEventImportHelper( NULL ),
458     mpXMLErrors( NULL ),
459     mpStyleMap(0),
460     mnImportFlags( IMPORT_ALL ),
461     mnErrorFlags(0),
462     // #110680#
463     mxServiceFactory(xServiceFactory),
464     mbIsFormsSupported( sal_True ),
465     mbIsTableShapeSupported( false ),
466     mbIsGraphicLoadOnDemandSupported( true )
467 {
468     DBG_ASSERT( mxServiceFactory.is(), "got no service manager" );
469     _InitCtor();
470 }
471 
472 // #110680#
SvXMLImport(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & xServiceFactory,const Reference<XModel> & rModel,const::com::sun::star::uno::Reference<::com::sun::star::document::XGraphicObjectResolver> & rGraphicObjects)473 SvXMLImport::SvXMLImport(
474     const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceFactory,
475     const Reference< XModel > & rModel,
476     const ::com::sun::star::uno::Reference< ::com::sun::star::document::XGraphicObjectResolver > & rGraphicObjects ) throw ()
477 :   mxModel( rModel ),
478     mxNumberFormatsSupplier (rModel, uno::UNO_QUERY),
479     mxGraphicResolver( rGraphicObjects ),
480     mpImpl( new SvXMLImport_Impl() ),
481     mpNamespaceMap( new SvXMLNamespaceMap ),
482     // #110680#
483     // pUnitConv( new SvXMLUnitConverter( MAP_100TH_MM, MAP_100TH_MM ) ),
484     mpUnitConv( new SvXMLUnitConverter( MAP_100TH_MM, MAP_100TH_MM, xServiceFactory ) ),
485     mpContexts( new SvXMLImportContexts_Impl ),
486     mpNumImport( NULL ),
487     mpProgressBarHelper( NULL ),
488     mpEventImportHelper( NULL ),
489     mpXMLErrors( NULL ),
490     mpStyleMap(0),
491     mnImportFlags( IMPORT_ALL ),
492     mnErrorFlags(0),
493     // #110680#
494     mxServiceFactory(xServiceFactory),
495     mbIsFormsSupported( sal_True ),
496     mbIsGraphicLoadOnDemandSupported( true )
497 {
498     DBG_ASSERT( mxServiceFactory.is(), "got no service manager" );
499     _InitCtor();
500 }
501 
~SvXMLImport()502 SvXMLImport::~SvXMLImport() throw ()
503 {
504     delete mpXMLErrors;
505     delete mpNamespaceMap;
506     delete mpUnitConv;
507     delete mpEventImportHelper;
508     if( mpContexts )
509     {
510         while( mpContexts->Count() )
511         {
512             sal_uInt16 n = mpContexts->Count() - 1;
513             SvXMLImportContext *pContext = (*mpContexts)[n];
514             mpContexts->Remove( n, 1 );
515             if( pContext )
516                 pContext->ReleaseRef();
517         }
518         delete mpContexts;
519     }
520 
521     //  delete pImageMapImportHelper;
522 
523     //  #i9518# the import component might not be deleted until after the document has been closed,
524     //  so the stuff that accesses the document has been moved to endDocument.
525 
526     //  pNumImport is allocated in the ctor, so it must also be deleted here in case the component
527     //  is created and deleted without actually importing.
528     delete mpNumImport;
529     delete mpProgressBarHelper;
530 
531     xmloff::token::ResetTokens();
532 
533     if( mpImpl )
534         delete mpImpl;
535 
536     if (mxEventListener.is() && mxModel.is())
537         mxModel->removeEventListener(mxEventListener);
538 }
539 
540 // XUnoTunnel & co
getUnoTunnelId()541 const uno::Sequence< sal_Int8 > & SvXMLImport::getUnoTunnelId() throw()
542 {
543     static uno::Sequence< sal_Int8 > * pSeq = 0;
544     if( !pSeq )
545     {
546         Guard< Mutex > aGuard( Mutex::getGlobalMutex() );
547         if( !pSeq )
548         {
549             static uno::Sequence< sal_Int8 > aSeq( 16 );
550             rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
551             pSeq = &aSeq;
552         }
553     }
554     return *pSeq;
555 }
556 
getImplementation(uno::Reference<uno::XInterface> xInt)557 SvXMLImport* SvXMLImport::getImplementation( uno::Reference< uno::XInterface > xInt ) throw()
558 {
559     uno::Reference< lang::XUnoTunnel > xUT( xInt, uno::UNO_QUERY );
560     if( xUT.is() )
561     {
562         return
563             reinterpret_cast<SvXMLImport*>(
564                 sal::static_int_cast<sal_IntPtr>(
565                     xUT->getSomething( SvXMLImport::getUnoTunnelId())));
566     }
567     else
568         return NULL;
569 }
570 
571 // XUnoTunnel
getSomething(const uno::Sequence<sal_Int8> & rId)572 sal_Int64 SAL_CALL SvXMLImport::getSomething( const uno::Sequence< sal_Int8 >& rId )
573     throw( uno::RuntimeException )
574 {
575     if( rId.getLength() == 16 && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
576                                                          rId.getConstArray(), 16 ) )
577     {
578         return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_uIntPtr>(this));
579     }
580     return 0;
581 }
582 
startDocument(void)583 void SAL_CALL SvXMLImport::startDocument( void )
584     throw( xml::sax::SAXException, uno::RuntimeException )
585 {
586     RTL_LOGFILE_TRACE_AUTHOR( "xmloff", LOGFILE_AUTHOR, "{ SvXMLImport::startDocument" );
587 
588     if( !mxGraphicResolver.is() || !mxEmbeddedResolver.is() )
589     {
590         Reference< lang::XMultiServiceFactory > xFactory( mxModel,  UNO_QUERY );
591         if( xFactory.is() )
592         {
593             try
594             {
595                 if( !mxGraphicResolver.is() )
596                 {
597                     mxGraphicResolver = Reference< XGraphicObjectResolver >::query(
598                         xFactory->createInstance(
599                             OUString(RTL_CONSTASCII_USTRINGPARAM(
600                                 // #99870# Import... instead of Export...
601                                 "com.sun.star.document.ImportGraphicObjectResolver"))));
602                     mpImpl->mbOwnGraphicResolver = mxGraphicResolver.is();
603                 }
604 
605                 if( !mxEmbeddedResolver.is() )
606                 {
607                     mxEmbeddedResolver = Reference< XEmbeddedObjectResolver >::query(
608                         xFactory->createInstance(
609                             OUString(RTL_CONSTASCII_USTRINGPARAM(
610                                 // #99870# Import... instead of Export...
611                                 "com.sun.star.document.ImportEmbeddedObjectResolver"))));
612                     mpImpl->mbOwnEmbeddedResolver = mxEmbeddedResolver.is();
613                 }
614             }
615             catch( com::sun::star::uno::Exception& )
616             {
617             }
618         }
619     }
620 }
621 
endDocument(void)622 void SAL_CALL SvXMLImport::endDocument( void )
623     throw( xml::sax::SAXException, uno::RuntimeException)
624 {
625     RTL_LOGFILE_TRACE_AUTHOR( "xmloff", LOGFILE_AUTHOR, "} SvXMLImport::startDocument" );
626 
627     //  #i9518# All the stuff that accesses the document has to be done here, not in the dtor,
628     //  because the SvXMLImport dtor might not be called until after the document has been closed.
629 
630     if (mpImpl->mpRDFaHelper.get())
631     {
632         const uno::Reference<rdf::XRepositorySupplier> xRS(mxModel,
633             uno::UNO_QUERY);
634         if (xRS.is())
635         {
636             mpImpl->mpRDFaHelper->InsertRDFa( xRS );
637         }
638     }
639 
640     if (mpNumImport)
641     {
642         delete mpNumImport;
643         mpNumImport = NULL;
644     }
645     if (mxImportInfo.is())
646     {
647         uno::Reference< beans::XPropertySetInfo > xPropertySetInfo = mxImportInfo->getPropertySetInfo();
648         if (xPropertySetInfo.is())
649         {
650             if (mpProgressBarHelper)
651             {
652                 OUString sProgressMax(RTL_CONSTASCII_USTRINGPARAM(XML_PROGRESSMAX));
653                 OUString sProgressCurrent(RTL_CONSTASCII_USTRINGPARAM(XML_PROGRESSCURRENT));
654                 OUString sRepeat(RTL_CONSTASCII_USTRINGPARAM(XML_PROGRESSREPEAT));
655                 if (xPropertySetInfo->hasPropertyByName(sProgressMax) &&
656                     xPropertySetInfo->hasPropertyByName(sProgressCurrent))
657                 {
658                     sal_Int32 nProgressMax(mpProgressBarHelper->GetReference());
659                     sal_Int32 nProgressCurrent(mpProgressBarHelper->GetValue());
660                     uno::Any aAny;
661                     aAny <<= nProgressMax;
662                     mxImportInfo->setPropertyValue(sProgressMax, aAny);
663                     aAny <<= nProgressCurrent;
664                     mxImportInfo->setPropertyValue(sProgressCurrent, aAny);
665                 }
666                 if (xPropertySetInfo->hasPropertyByName(sRepeat))
667                     mxImportInfo->setPropertyValue(sRepeat, cppu::bool2any(mpProgressBarHelper->GetRepeat()));
668                 // pProgressBarHelper is deleted in dtor
669             }
670             OUString sNumberStyles(RTL_CONSTASCII_USTRINGPARAM(XML_NUMBERSTYLES));
671             if (mxNumberStyles.is() && xPropertySetInfo->hasPropertyByName(sNumberStyles))
672             {
673                 uno::Any aAny;
674                 aAny <<= mxNumberStyles;
675                 mxImportInfo->setPropertyValue(sNumberStyles, aAny);
676             }
677         }
678     }
679 
680     if( mxFontDecls.Is() )
681         ((SvXMLStylesContext *)&mxFontDecls)->Clear();
682     if( mxStyles.Is() )
683         ((SvXMLStylesContext *)&mxStyles)->Clear();
684     if( mxAutoStyles.Is() )
685         ((SvXMLStylesContext *)&mxAutoStyles)->Clear();
686     if( mxMasterStyles.Is() )
687         ((SvXMLStylesContext *)&mxMasterStyles)->Clear();
688 
689     // possible form-layer related knittings which can only be done when
690     // the whole document exists
691     if ( mxFormImport.is() )
692         mxFormImport->documentDone();
693 
694     //  The shape import helper does the z-order sorting in the dtor,
695     //  so it must be deleted here, too.
696     mxShapeImport = NULL;
697 
698     if( mpImpl->mbOwnGraphicResolver )
699     {
700         Reference< lang::XComponent > xComp( mxGraphicResolver, UNO_QUERY );
701         xComp->dispose();
702     }
703 
704     if( mpImpl->mbOwnEmbeddedResolver )
705     {
706         Reference< lang::XComponent > xComp( mxEmbeddedResolver, UNO_QUERY );
707         xComp->dispose();
708     }
709     if( mpStyleMap )
710     {
711         mpStyleMap->release();
712         mpStyleMap = 0;
713     }
714 
715     if ( mpXMLErrors != NULL )
716     {
717         mpXMLErrors->ThrowErrorAsSAXException( XMLERROR_FLAG_SEVERE );
718     }
719 }
720 
startElement(const OUString & rName,const uno::Reference<xml::sax::XAttributeList> & xAttrList)721 void SAL_CALL SvXMLImport::startElement( const OUString& rName,
722                                          const uno::Reference< xml::sax::XAttributeList >& xAttrList )
723     throw(xml::sax::SAXException, uno::RuntimeException)
724 {
725     SvXMLNamespaceMap *pRewindMap = 0;
726 
727     // Process namespace attributes. This must happen before creating the
728     // context, because namespace decaration apply to the element name itself.
729     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
730     for( sal_Int16 i=0; i < nAttrCount; i++ )
731     {
732         const OUString& rAttrName = xAttrList->getNameByIndex( i );
733         if ( rAttrName.equalsAscii("office:version") )
734         {
735             mpImpl->aODFVersion = xAttrList->getValueByIndex( i );
736 
737             // the ODF version in content.xml and manifest.xml must be the same starting from ODF1.2
738             if ( mpImpl->mStreamName.equals( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "content.xml" ) ) )
739               && !IsODFVersionConsistent( mpImpl->aODFVersion ) )
740             {
741                 throw xml::sax::SAXException(
742                         ::rtl::OUString(
743                             RTL_CONSTASCII_USTRINGPARAM( "Inconsistent ODF versions in content.xml and manifest.xml!" ) ),
744                         uno::Reference< uno::XInterface >(),
745                         uno::makeAny(
746                             packages::zip::ZipIOException(
747                                 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
748                                     "Inconsistent ODF versions in content.xml and manifest.xml!" ) ),
749                                 Reference< XInterface >() ) ) );
750             }
751         }
752         else if( ( rAttrName.getLength() >= 5 ) &&
753             ( rAttrName.compareTo( GetXMLToken(XML_XMLNS), 5 ) == 0 ) &&
754             ( rAttrName.getLength() == 5 || ':' == rAttrName[5] ) )
755         {
756             if( !pRewindMap )
757             {
758                 pRewindMap = mpNamespaceMap;
759                 mpNamespaceMap = new SvXMLNamespaceMap( *mpNamespaceMap );
760             }
761             const OUString& rAttrValue = xAttrList->getValueByIndex( i );
762 
763             OUString aPrefix( ( rAttrName.getLength() == 5 )
764                                  ? OUString()
765                                  : rAttrName.copy( 6 ) );
766             // Add namespace, but only if it is known.
767             sal_uInt16 nKey = mpNamespaceMap->AddIfKnown( aPrefix, rAttrValue );
768             // If namespace is unknwon, try to match a name with similar
769             // TC Id an version
770             if( XML_NAMESPACE_UNKNOWN == nKey  )
771             {
772                 OUString aTestName( rAttrValue );
773                 if( SvXMLNamespaceMap::NormalizeURI( aTestName ) )
774                     nKey = mpNamespaceMap->AddIfKnown( aPrefix, aTestName );
775             }
776             // If that namespace is not known, too, add it as unknown
777             if( XML_NAMESPACE_UNKNOWN == nKey  )
778                 mpNamespaceMap->Add( aPrefix, rAttrValue );
779 
780         }
781     }
782 
783     // Get element's namespace and local name.
784     OUString aLocalName;
785     sal_uInt16 nPrefix =
786         mpNamespaceMap->GetKeyByAttrName( rName, &aLocalName );
787 
788     // If there are contexts already, call a CreateChildContext at the topmost
789     // context. Otherwise, create a default context.
790     SvXMLImportContext *pContext;
791     sal_uInt16 nCount = mpContexts->Count();
792     if( nCount > 0 )
793     {
794         pContext = (*mpContexts)[nCount - 1]->CreateChildContext( nPrefix,
795                                                                  aLocalName,
796                                                                  xAttrList );
797         DBG_ASSERT( pContext && pContext->GetPrefix() == nPrefix,
798                 "SvXMLImport::startElement: created context has wrong prefix" );
799     }
800     else
801     {
802 #ifdef TIMELOG
803         // If we do profiling, we want a trace message for the first element
804         // in order to identify the stream.
805         ByteString aString( (String)rName, RTL_TEXTENCODING_ASCII_US );
806         RTL_LOGFILE_TRACE_AUTHOR1( "xmloff", LOGFILE_AUTHOR,
807                                    "SvXMLImport::StartElement( \"%s\", ... )",
808                                    aString.GetBuffer() );
809 #endif
810 
811         pContext = CreateContext( nPrefix, aLocalName, xAttrList );
812         if( (nPrefix & XML_NAMESPACE_UNKNOWN_FLAG) != 0 &&
813             IS_TYPE( SvXMLImportContext, pContext ) )
814         {
815             OUString aMsg( RTL_CONSTASCII_USTRINGPARAM( "Root element unknown" ) );
816             Reference<xml::sax::XLocator> xDummyLocator;
817             Sequence < OUString > aParams(1);
818             aParams.getArray()[0] = rName;
819 
820             SetError( XMLERROR_FLAG_SEVERE|XMLERROR_UNKNWON_ROOT,
821                       aParams, aMsg, xDummyLocator );
822         }
823     }
824 
825     DBG_ASSERT( pContext, "SvXMLImport::startElement: missing context" );
826     if( !pContext )
827         pContext = new SvXMLImportContext( *this, nPrefix, aLocalName );
828 
829     pContext->AddRef();
830 
831     // Remeber old namespace map.
832     if( pRewindMap )
833         pContext->SetRewindMap( pRewindMap );
834 
835     // Call a startElement at the new context.
836     pContext->StartElement( xAttrList );
837 
838     // Push context on stack.
839     mpContexts->Insert( pContext, nCount );
840 }
841 
endElement(const OUString & rName)842 void SAL_CALL SvXMLImport::endElement( const OUString&
843 #ifdef DBG_UTIL
844 rName
845 #endif
846 )
847     throw(xml::sax::SAXException, uno::RuntimeException)
848 {
849     sal_uInt16 nCount = mpContexts->Count();
850     DBG_ASSERT( nCount, "SvXMLImport::endElement: no context left" );
851     if( nCount > 0 )
852     {
853         // Get topmost context and remove it from the stack.
854         SvXMLImportContext *pContext = (*mpContexts)[nCount-1];
855         mpContexts->Remove( nCount-1, 1 );
856 
857 #ifdef DBG_UTIL
858         // Non product only: check if endElement call matches startELement call.
859         OUString aLocalName;
860         sal_uInt16 nPrefix =
861             mpNamespaceMap->GetKeyByAttrName( rName, &aLocalName );
862         DBG_ASSERT( pContext->GetPrefix() == nPrefix,
863                 "SvXMLImport::endElement: popped context has wrong prefix" );
864         DBG_ASSERT( pContext->GetLocalName() == aLocalName,
865                 "SvXMLImport::endElement: popped context has wrong lname" );
866 #endif
867 
868         // Call a EndElement at the current context.
869         pContext->EndElement();
870 
871         // Get a namespace map to rewind.
872         SvXMLNamespaceMap *pRewindMap = pContext->GetRewindMap();
873 
874         // Delete the current context.
875         pContext->ReleaseRef();
876         pContext = 0;
877 
878         // Rewind a namespace map.
879         if( pRewindMap )
880         {
881             delete mpNamespaceMap;
882             mpNamespaceMap = pRewindMap;
883         }
884     }
885 }
886 
characters(const OUString & rChars)887 void SAL_CALL SvXMLImport::characters( const OUString& rChars )
888     throw(xml::sax::SAXException, uno::RuntimeException)
889 {
890     sal_uInt16 nCount = mpContexts->Count();
891     if( nCount > 0 )
892     {
893         (*mpContexts)[nCount - 1]->Characters( rChars );
894     }
895 }
896 
ignorableWhitespace(const OUString &)897 void SAL_CALL SvXMLImport::ignorableWhitespace( const OUString& )
898     throw(xml::sax::SAXException, uno::RuntimeException)
899 {
900 }
901 
processingInstruction(const OUString &,const OUString &)902 void SAL_CALL SvXMLImport::processingInstruction( const OUString&,
903                                        const OUString& )
904     throw(xml::sax::SAXException, uno::RuntimeException)
905 {
906 }
907 
setDocumentLocator(const uno::Reference<xml::sax::XLocator> & rLocator)908 void SAL_CALL SvXMLImport::setDocumentLocator( const uno::Reference< xml::sax::XLocator >& rLocator )
909     throw(xml::sax::SAXException, uno::RuntimeException)
910 {
911     mxLocator = rLocator;
912 }
913 
914 // XExtendedDocumentHandler
startCDATA(void)915 void SAL_CALL SvXMLImport::startCDATA( void ) throw(xml::sax::SAXException, uno::RuntimeException)
916 {
917 }
918 
endCDATA(void)919 void SAL_CALL SvXMLImport::endCDATA( void ) throw(uno::RuntimeException)
920 {
921 }
922 
comment(const OUString &)923 void SAL_CALL SvXMLImport::comment( const OUString& )
924     throw(xml::sax::SAXException, uno::RuntimeException)
925 {
926 }
927 
allowLineBreak(void)928 void SAL_CALL SvXMLImport::allowLineBreak( void )
929     throw(xml::sax::SAXException, uno::RuntimeException)
930 {
931 }
932 
unknown(const OUString &)933 void SAL_CALL SvXMLImport::unknown( const OUString& )
934     throw(xml::sax::SAXException, uno::RuntimeException)
935 {
936 }
937 
SetStatistics(const uno::Sequence<beans::NamedValue> &)938 void SvXMLImport::SetStatistics(const uno::Sequence< beans::NamedValue> &)
939 {
940     GetProgressBarHelper()->SetRepeat(sal_False);
941     GetProgressBarHelper()->SetReference(0);
942 }
943 
944 ///////////////////////////////////////////////////////////////////////
945 
946 // XImporter
setTargetDocument(const uno::Reference<lang::XComponent> & xDoc)947 void SAL_CALL SvXMLImport::setTargetDocument( const uno::Reference< lang::XComponent >& xDoc )
948     throw(lang::IllegalArgumentException, uno::RuntimeException)
949 {
950     mxModel = uno::Reference< frame::XModel >::query( xDoc );
951     if( !mxModel.is() )
952         throw lang::IllegalArgumentException();
953     if (mxModel.is() && !mxEventListener.is())
954     {
955         mxEventListener.set(new SvXMLImportEventListener(this));
956         mxModel->addEventListener(mxEventListener);
957     }
958 
959     DBG_ASSERT( !mpNumImport, "number format import already exists." );
960     if( mpNumImport )
961     {
962         delete mpNumImport;
963         mpNumImport = 0;
964     }
965 }
966 
967 // XFilter
filter(const uno::Sequence<beans::PropertyValue> &)968 sal_Bool SAL_CALL SvXMLImport::filter( const uno::Sequence< beans::PropertyValue >& )
969     throw (uno::RuntimeException)
970 {
971     return sal_False;
972 }
973 
cancel()974 void SAL_CALL SvXMLImport::cancel(  )
975     throw (uno::RuntimeException)
976 {
977 }
978 
979 // XInitialize
initialize(const uno::Sequence<uno::Any> & aArguments)980 void SAL_CALL SvXMLImport::initialize( const uno::Sequence< uno::Any >& aArguments )
981     throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException)
982 {
983     const sal_Int32 nAnyCount = aArguments.getLength();
984     const uno::Any* pAny = aArguments.getConstArray();
985 
986     for( sal_Int32 nIndex = 0; nIndex < nAnyCount; nIndex++, pAny++ )
987     {
988         Reference<XInterface> xValue;
989         *pAny >>= xValue;
990 
991         uno::Reference<task::XStatusIndicator> xTmpStatusIndicator(
992             xValue, UNO_QUERY );
993         if( xTmpStatusIndicator.is() )
994             mxStatusIndicator = xTmpStatusIndicator;
995 
996         uno::Reference<document::XGraphicObjectResolver> xTmpGraphicResolver(
997             xValue, UNO_QUERY );
998         if( xTmpGraphicResolver.is() )
999             mxGraphicResolver = xTmpGraphicResolver;
1000 
1001         uno::Reference<document::XEmbeddedObjectResolver> xTmpObjectResolver(
1002             xValue, UNO_QUERY );
1003         if( xTmpObjectResolver.is() )
1004             mxEmbeddedResolver = xTmpObjectResolver;
1005 
1006         uno::Reference<beans::XPropertySet> xTmpPropSet( xValue, UNO_QUERY );
1007         if( xTmpPropSet.is() )
1008         {
1009             mxImportInfo = xTmpPropSet;
1010             uno::Reference< beans::XPropertySetInfo > xPropertySetInfo = mxImportInfo->getPropertySetInfo();
1011             if (xPropertySetInfo.is())
1012             {
1013                 OUString sPropName(RTL_CONSTASCII_USTRINGPARAM(XML_NUMBERSTYLES));
1014                 if (xPropertySetInfo->hasPropertyByName(sPropName))
1015                 {
1016                     uno::Any aAny = mxImportInfo->getPropertyValue(sPropName);
1017                     aAny >>= mxNumberStyles;
1018                 }
1019 
1020                 sPropName = OUString( RTL_CONSTASCII_USTRINGPARAM("PrivateData" ) );
1021                 if (xPropertySetInfo->hasPropertyByName(sPropName))
1022                 {
1023                     Reference < XInterface > xIfc;
1024                     uno::Any aAny = mxImportInfo->getPropertyValue(sPropName);
1025                     aAny >>= xIfc;
1026 
1027                     StyleMap *pSMap = StyleMap::getImplementation( xIfc );
1028                     if( pSMap )
1029                     {
1030                         mpStyleMap = pSMap;
1031                         mpStyleMap->acquire();
1032                     }
1033                 }
1034                 OUString sBaseURI;
1035                 sPropName = OUString( RTL_CONSTASCII_USTRINGPARAM("BaseURI" ) );
1036                 if (xPropertySetInfo->hasPropertyByName(sPropName))
1037                 {
1038                     uno::Any aAny = mxImportInfo->getPropertyValue(sPropName);
1039                     aAny >>= sBaseURI;
1040                     mpImpl->aBaseURL.SetURL( sBaseURI );
1041                     mpImpl->aDocBase.SetURL( sBaseURI );
1042                 }
1043                 OUString sRelPath;
1044                 sPropName = OUString( RTL_CONSTASCII_USTRINGPARAM("StreamRelPath" ) );
1045                 if( xPropertySetInfo->hasPropertyByName(sPropName) )
1046                 {
1047                     uno::Any aAny = mxImportInfo->getPropertyValue(sPropName);
1048                     aAny >>= sRelPath;
1049                 }
1050                 OUString sName;
1051                 sPropName = OUString( RTL_CONSTASCII_USTRINGPARAM("StreamName" ) );
1052                 if( xPropertySetInfo->hasPropertyByName(sPropName) )
1053                 {
1054                     uno::Any aAny = mxImportInfo->getPropertyValue(sPropName);
1055                     aAny >>= sName;
1056                 }
1057                 if( sBaseURI.getLength() && sName.getLength() )
1058                 {
1059                     if( sRelPath.getLength() )
1060                         mpImpl->aBaseURL.insertName( sRelPath );
1061                     mpImpl->aBaseURL.insertName( sName );
1062                 }
1063                 mpImpl->mStreamName = sName; // Note: may be empty (XSLT)
1064                 // --> OD 2004-08-10 #i28749# - retrieve property <ShapePositionInHoriL2R>
1065                 sPropName = OUString( RTL_CONSTASCII_USTRINGPARAM("ShapePositionInHoriL2R" ) );
1066                 if( xPropertySetInfo->hasPropertyByName(sPropName) )
1067                 {
1068                     uno::Any aAny = mxImportInfo->getPropertyValue(sPropName);
1069                     aAny >>= (mpImpl->mbShapePositionInHoriL2R);
1070                 }
1071                 // <--
1072                 // --> OD 2007-12-19 #152540#
1073                 sPropName = OUString( RTL_CONSTASCII_USTRINGPARAM("TextDocInOOoFileFormat" ) );
1074                 if( xPropertySetInfo->hasPropertyByName(sPropName) )
1075                 {
1076                     uno::Any aAny = mxImportInfo->getPropertyValue(sPropName);
1077                     aAny >>= (mpImpl->mbTextDocInOOoFileFormat);
1078                 }
1079                 // <--
1080             }
1081         }
1082     }
1083 }
1084 
1085 // XServiceInfo
getImplementationName()1086 OUString SAL_CALL SvXMLImport::getImplementationName()
1087     throw(uno::RuntimeException)
1088 {
1089     OUString aStr;
1090     return aStr;
1091 }
1092 
supportsService(const OUString & rServiceName)1093 sal_Bool SAL_CALL SvXMLImport::supportsService( const OUString& rServiceName )
1094     throw(::com::sun::star::uno::RuntimeException)
1095 {
1096     return
1097         rServiceName.equalsAsciiL(
1098             "com.sun.star.document.ImportFilter",
1099             sizeof("com.sun.star.document.ImportFilter")-1 ) ||
1100         rServiceName.equalsAsciiL(
1101             "com.sun.star.xml.XMLImportFilter",
1102             sizeof("com.sun.star.xml.XMLImportFilter")-1);
1103 }
1104 
getSupportedServiceNames()1105 uno::Sequence< OUString > SAL_CALL SvXMLImport::getSupportedServiceNames(  )
1106     throw(uno::RuntimeException)
1107 {
1108     uno::Sequence<OUString> aSeq(2);
1109     aSeq[0] = OUString(
1110         RTL_CONSTASCII_USTRINGPARAM("com.sun.star.document.ImportFilter"));
1111     aSeq[1] = OUString(
1112         RTL_CONSTASCII_USTRINGPARAM("com.sun.star.xml.XMLImportFilter"));
1113     return aSeq;
1114 }
1115 
1116 ///////////////////////////////////////////////////////////////////////
1117 
CreateTextImport()1118 XMLTextImportHelper* SvXMLImport::CreateTextImport()
1119 {
1120     return new XMLTextImportHelper( mxModel, *this );
1121 }
1122 
CreateShapeImport()1123 XMLShapeImportHelper* SvXMLImport::CreateShapeImport()
1124 {
1125     return new XMLShapeImportHelper( *this, mxModel );
1126 }
1127 
1128 #ifndef SVX_LIGHT
CreateChartImport()1129 SchXMLImportHelper* SvXMLImport::CreateChartImport()
1130 {
1131     return new SchXMLImportHelper();
1132 }
1133 #endif
1134 
1135 #ifndef SVX_LIGHT
CreateFormImport()1136 ::xmloff::OFormLayerXMLImport* SvXMLImport::CreateFormImport()
1137 {
1138     return new ::xmloff::OFormLayerXMLImport(*this);
1139 }
1140 #endif // #ifndef SVX_LIGHT
1141 
1142 
1143 ///////////////////////////////////////////////////////////////////////////////
1144 //
1145 // Get or create fill/line/lineend-style-helper
1146 //
1147 
GetGradientHelper()1148 const Reference< container::XNameContainer > & SvXMLImport::GetGradientHelper()
1149 {
1150     if( !mxGradientHelper.is() )
1151     {
1152         if( mxModel.is() )
1153         {
1154             Reference< lang::XMultiServiceFactory > xServiceFact( mxModel, UNO_QUERY);
1155             if( xServiceFact.is() )
1156             {
1157                 try
1158                 {
1159                     mxGradientHelper =  Reference< container::XNameContainer >( xServiceFact->createInstance(
1160                         OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.GradientTable" ) ) ), UNO_QUERY);
1161                 }
1162                 catch( lang::ServiceNotRegisteredException& )
1163                 {}
1164             }
1165         }
1166     }
1167 
1168     return mxGradientHelper;
1169 }
1170 
GetHatchHelper()1171 const Reference< container::XNameContainer > & SvXMLImport::GetHatchHelper()
1172 {
1173     if( !mxHatchHelper.is() )
1174     {
1175         if( mxModel.is() )
1176         {
1177             Reference< lang::XMultiServiceFactory > xServiceFact( mxModel, UNO_QUERY);
1178             if( xServiceFact.is() )
1179             {
1180                 try
1181                 {
1182                     mxHatchHelper =  Reference< container::XNameContainer >( xServiceFact->createInstance(
1183                         OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.HatchTable" ) ) ), UNO_QUERY);
1184                 }
1185                 catch( lang::ServiceNotRegisteredException& )
1186                 {}
1187             }
1188         }
1189     }
1190 
1191     return mxHatchHelper;
1192 }
1193 
GetBitmapHelper()1194 const Reference< container::XNameContainer > & SvXMLImport::GetBitmapHelper()
1195 {
1196     if( !mxBitmapHelper.is() )
1197     {
1198         if( mxModel.is() )
1199         {
1200             Reference< lang::XMultiServiceFactory > xServiceFact( mxModel, UNO_QUERY);
1201             if( xServiceFact.is() )
1202             {
1203                 try
1204                 {
1205                     mxBitmapHelper =  Reference< container::XNameContainer >( xServiceFact->createInstance(
1206                         OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.BitmapTable" ) ) ), UNO_QUERY);
1207                 }
1208                 catch( lang::ServiceNotRegisteredException& )
1209                 {}
1210             }
1211         }
1212     }
1213 
1214     return mxBitmapHelper;
1215 }
1216 
GetTransGradientHelper()1217 const Reference< container::XNameContainer > & SvXMLImport::GetTransGradientHelper()
1218 {
1219     if( !mxTransGradientHelper.is() )
1220     {
1221         if( mxModel.is() )
1222         {
1223             Reference< lang::XMultiServiceFactory > xServiceFact( mxModel, UNO_QUERY);
1224             if( xServiceFact.is() )
1225             {
1226                 try
1227                 {
1228                     mxTransGradientHelper =  Reference< container::XNameContainer >( xServiceFact->createInstance(
1229                         OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.TransparencyGradientTable" ) ) ), UNO_QUERY);
1230                 }
1231                 catch( lang::ServiceNotRegisteredException& )
1232                 {}
1233             }
1234         }
1235     }
1236 
1237     return mxTransGradientHelper;
1238 }
1239 
GetMarkerHelper()1240 const Reference< container::XNameContainer > & SvXMLImport::GetMarkerHelper()
1241 {
1242     if( !mxMarkerHelper.is() )
1243     {
1244         if( mxModel.is() )
1245         {
1246             Reference< lang::XMultiServiceFactory > xServiceFact( mxModel, UNO_QUERY);
1247             if( xServiceFact.is() )
1248             {
1249                 try
1250                 {
1251                     mxMarkerHelper =  Reference< container::XNameContainer >( xServiceFact->createInstance(
1252                         OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.MarkerTable" ) ) ), UNO_QUERY);
1253                 }
1254                 catch( lang::ServiceNotRegisteredException& )
1255                 {}
1256             }
1257         }
1258     }
1259 
1260     return mxMarkerHelper;
1261 }
1262 
GetDashHelper()1263 const Reference< container::XNameContainer > & SvXMLImport::GetDashHelper()
1264 {
1265     if( !mxDashHelper.is() )
1266     {
1267         if( mxModel.is() )
1268         {
1269             Reference< lang::XMultiServiceFactory > xServiceFact( mxModel, UNO_QUERY);
1270             if( xServiceFact.is() )
1271             {
1272                 try
1273                 {
1274                     mxDashHelper =  Reference< container::XNameContainer >( xServiceFact->createInstance(
1275                         OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.DashTable" ) ) ), UNO_QUERY);
1276                 }
1277                 catch( lang::ServiceNotRegisteredException& )
1278                 {}
1279             }
1280         }
1281     }
1282 
1283     return mxDashHelper;
1284 }
1285 
IsPackageURL(const::rtl::OUString & rURL) const1286 sal_Bool SvXMLImport::IsPackageURL( const ::rtl::OUString& rURL ) const
1287 {
1288 
1289     // if, and only if, only parts are imported, then we're in a package
1290     const sal_uInt32 nTest = IMPORT_META|IMPORT_STYLES|IMPORT_CONTENT|IMPORT_SETTINGS;
1291     if( (mnImportFlags & nTest) == nTest )
1292         return sal_False;
1293 
1294     // Some quick tests: Some may rely on the package structure!
1295     sal_Int32 nLen = rURL.getLength();
1296     if( (nLen > 0 && '/' == rURL[0]) )
1297         // RFC2396 net_path or abs_path
1298         return sal_False;
1299     else if( nLen > 1 && '.' == rURL[0] )
1300     {
1301         if( '.' == rURL[1] )
1302             // ../: We are never going up one level, so we know
1303             // it's not an external URI
1304             return sal_False;
1305         else if( '/' == rURL[1] )
1306             // we are remaining on a level, so it's an package URI
1307             return sal_True;
1308     }
1309 
1310     // Now check for a RFC2396 schema
1311     sal_Int32 nPos = 1;
1312     while( nPos < nLen )
1313     {
1314         switch( rURL[nPos] )
1315         {
1316         case '/':
1317             // a relative path segement
1318             return sal_True;
1319         case ':':
1320             // a schema
1321             return sal_False;
1322         default:
1323             break;
1324             // we don't care about any other characters
1325         }
1326         ++nPos;
1327     }
1328 
1329     return sal_True;
1330 }
1331 
ResolveGraphicObjectURL(const::rtl::OUString & rURL,sal_Bool bLoadOnDemand)1332 ::rtl::OUString SvXMLImport::ResolveGraphicObjectURL( const ::rtl::OUString& rURL,
1333                                                       sal_Bool bLoadOnDemand )
1334 {
1335     ::rtl::OUString sRet;
1336 
1337     if( IsPackageURL( rURL ) )
1338     {
1339         if( !bLoadOnDemand && mxGraphicResolver.is() )
1340         {
1341             ::rtl::OUString     aTmp( msPackageProtocol );
1342             aTmp += rURL;
1343             sRet = mxGraphicResolver->resolveGraphicObjectURL( aTmp );
1344         }
1345 
1346         if( !sRet.getLength() )
1347         {
1348             sRet = msPackageProtocol;
1349             sRet += rURL;
1350         }
1351     }
1352 
1353     if( !sRet.getLength() )
1354         sRet = GetAbsoluteReference( rURL );
1355 
1356     return sRet;
1357 }
1358 
GetStreamForGraphicObjectURLFromBase64()1359 Reference< XOutputStream > SvXMLImport::GetStreamForGraphicObjectURLFromBase64()
1360 {
1361     Reference< XOutputStream > xOStm;
1362     Reference< document::XBinaryStreamResolver > xStmResolver( mxGraphicResolver, UNO_QUERY );
1363 
1364     if( xStmResolver.is() )
1365         xOStm = xStmResolver->createOutputStream();
1366 
1367     return xOStm;
1368 }
1369 
ResolveGraphicObjectURLFromBase64(const Reference<XOutputStream> & rOut)1370 ::rtl::OUString SvXMLImport::ResolveGraphicObjectURLFromBase64(
1371                                  const Reference < XOutputStream >& rOut )
1372 {
1373     OUString sURL;
1374     Reference< document::XBinaryStreamResolver > xStmResolver( mxGraphicResolver, UNO_QUERY );
1375     if( xStmResolver.is() )
1376         sURL = xStmResolver->resolveOutputStream( rOut );
1377 
1378     return sURL;
1379 }
1380 
ResolveEmbeddedObjectURL(const::rtl::OUString & rURL,const::rtl::OUString & rClassId)1381 ::rtl::OUString SvXMLImport::ResolveEmbeddedObjectURL(
1382                                     const ::rtl::OUString& rURL,
1383                                     const ::rtl::OUString& rClassId )
1384 {
1385     ::rtl::OUString sRet;
1386 
1387     if( IsPackageURL( rURL ) )
1388     {
1389         if ( mxEmbeddedResolver.is() )
1390         {
1391             OUString sURL( rURL );
1392             if( rClassId.getLength() )
1393             {
1394                 sURL += OUString( sal_Unicode('!') );
1395                 sURL += rClassId;
1396             }
1397             sRet = mxEmbeddedResolver->resolveEmbeddedObjectURL( sURL );
1398         }
1399     }
1400     else
1401         sRet = GetAbsoluteReference( rURL );
1402 
1403     return sRet;
1404 }
1405 
1406 Reference < XOutputStream >
GetStreamForEmbeddedObjectURLFromBase64()1407         SvXMLImport::GetStreamForEmbeddedObjectURLFromBase64()
1408 {
1409     Reference < XOutputStream > xOLEStream;
1410 
1411     if( mxEmbeddedResolver.is() )
1412     {
1413         Reference< XNameAccess > xNA( mxEmbeddedResolver, UNO_QUERY );
1414         if( xNA.is() )
1415         {
1416             OUString aURL( RTL_CONSTASCII_USTRINGPARAM( "Obj12345678" ) );
1417             Any aAny = xNA->getByName( aURL );
1418             aAny >>= xOLEStream;
1419         }
1420     }
1421 
1422     return xOLEStream;
1423 }
1424 
ResolveEmbeddedObjectURLFromBase64()1425 ::rtl::OUString SvXMLImport::ResolveEmbeddedObjectURLFromBase64()
1426 {
1427     ::rtl::OUString sRet;
1428 
1429     if( mxEmbeddedResolver.is() )
1430     {
1431         OUString aURL( RTL_CONSTASCII_USTRINGPARAM( "Obj12345678" ) );
1432         sRet = mxEmbeddedResolver->resolveEmbeddedObjectURL( aURL );
1433     }
1434 
1435     return sRet;
1436 }
1437 
AddStyleDisplayName(sal_uInt16 nFamily,const OUString & rName,const OUString & rDisplayName)1438 void SvXMLImport::AddStyleDisplayName( sal_uInt16 nFamily,
1439                                        const OUString& rName,
1440                                        const OUString& rDisplayName )
1441 {
1442     if( !mpStyleMap )
1443     {
1444         mpStyleMap = new StyleMap;
1445         mpStyleMap->acquire();
1446         if( mxImportInfo.is() )
1447         {
1448             OUString sPrivateData(
1449                     RTL_CONSTASCII_USTRINGPARAM("PrivateData" ) );
1450             Reference< beans::XPropertySetInfo > xPropertySetInfo =
1451                 mxImportInfo->getPropertySetInfo();
1452             if( xPropertySetInfo.is() &&
1453                 xPropertySetInfo->hasPropertyByName(sPrivateData) )
1454             {
1455                 Reference < XInterface > xIfc(
1456                         static_cast< XUnoTunnel *>( mpStyleMap ) );
1457                 Any aAny;
1458                 aAny <<= xIfc;
1459                 mxImportInfo->setPropertyValue( sPrivateData, aAny );
1460             }
1461         }
1462     }
1463 
1464     StyleMap::key_type aKey( nFamily, rName );
1465     StyleMap::value_type aValue( aKey, rDisplayName );
1466     ::std::pair<StyleMap::iterator,bool> aRes( mpStyleMap->insert( aValue ) );
1467     OSL_ENSURE( aRes.second, "duplicate style name" );
1468 
1469 }
1470 
GetStyleDisplayName(sal_uInt16 nFamily,const OUString & rName) const1471 OUString SvXMLImport::GetStyleDisplayName( sal_uInt16 nFamily,
1472                                            const OUString& rName ) const
1473 {
1474     OUString sName( rName );
1475     if( mpStyleMap && rName.getLength() )
1476     {
1477         StyleMap::key_type aKey( nFamily, rName );
1478         StyleMap::const_iterator aIter = mpStyleMap->find( aKey );
1479         if( aIter != mpStyleMap->end() )
1480             sName = (*aIter).second;
1481     }
1482     return sName;
1483 }
1484 
SetViewSettings(const com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> &)1485 void SvXMLImport::SetViewSettings(const com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>&)
1486 {
1487 }
1488 
SetConfigurationSettings(const com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> &)1489 void SvXMLImport::SetConfigurationSettings(const com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>&)
1490 {
1491 }
1492 
SetDocumentSpecificSettings(const::rtl::OUString & _rSettingsGroupName,const uno::Sequence<beans::PropertyValue> & _rSettings)1493 void SvXMLImport::SetDocumentSpecificSettings(const ::rtl::OUString& _rSettingsGroupName, const uno::Sequence<beans::PropertyValue>& _rSettings)
1494 {
1495     (void)_rSettingsGroupName;
1496     (void)_rSettings;
1497 }
1498 
GetProgressBarHelper()1499 ProgressBarHelper*  SvXMLImport::GetProgressBarHelper()
1500 {
1501     if (!mpProgressBarHelper)
1502     {
1503         mpProgressBarHelper = new ProgressBarHelper(mxStatusIndicator, sal_False);
1504 
1505         if (mxImportInfo.is())
1506         {
1507             uno::Reference< beans::XPropertySetInfo > xPropertySetInfo = mxImportInfo->getPropertySetInfo();
1508             if (xPropertySetInfo.is())
1509             {
1510                 OUString sProgressRange(RTL_CONSTASCII_USTRINGPARAM(XML_PROGRESSRANGE));
1511                 OUString sProgressMax(RTL_CONSTASCII_USTRINGPARAM(XML_PROGRESSMAX));
1512                 OUString sProgressCurrent(RTL_CONSTASCII_USTRINGPARAM(XML_PROGRESSCURRENT));
1513                 OUString sRepeat(RTL_CONSTASCII_USTRINGPARAM(XML_PROGRESSREPEAT));
1514                 if (xPropertySetInfo->hasPropertyByName(sProgressMax) &&
1515                     xPropertySetInfo->hasPropertyByName(sProgressCurrent) &&
1516                     xPropertySetInfo->hasPropertyByName(sProgressRange))
1517                 {
1518                     uno::Any aAny;
1519                     sal_Int32 nProgressMax(0);
1520                     sal_Int32 nProgressCurrent(0);
1521                     sal_Int32 nProgressRange(0);
1522                     aAny = mxImportInfo->getPropertyValue(sProgressRange);
1523                     if (aAny >>= nProgressRange)
1524                         mpProgressBarHelper->SetRange(nProgressRange);
1525                     aAny = mxImportInfo->getPropertyValue(sProgressMax);
1526                     if (aAny >>= nProgressMax)
1527                         mpProgressBarHelper->SetReference(nProgressMax);
1528                     aAny = mxImportInfo->getPropertyValue(sProgressCurrent);
1529                     if (aAny >>= nProgressCurrent)
1530                         mpProgressBarHelper->SetValue(nProgressCurrent);
1531                 }
1532                 if (xPropertySetInfo->hasPropertyByName(sRepeat))
1533                 {
1534                     uno::Any aAny = mxImportInfo->getPropertyValue(sRepeat);
1535                     if (aAny.getValueType() == getBooleanCppuType())
1536                         mpProgressBarHelper->SetRepeat(::cppu::any2bool(aAny));
1537                     else {
1538                         DBG_ERRORFILE("why is it no boolean?");
1539                     }
1540                 }
1541             }
1542         }
1543     }
1544     return mpProgressBarHelper;
1545 }
1546 
AddNumberStyle(sal_Int32 nKey,const OUString & rName)1547 void SvXMLImport::AddNumberStyle(sal_Int32 nKey, const OUString& rName)
1548 {
1549     if (!mxNumberStyles.is())
1550         mxNumberStyles = uno::Reference< container::XNameContainer >( comphelper::NameContainer_createInstance( ::getCppuType((const sal_Int32*)0)) );
1551     if (mxNumberStyles.is())
1552     {
1553         uno::Any aAny;
1554         aAny <<= nKey;
1555         try
1556         {
1557             mxNumberStyles->insertByName(rName, aAny);
1558         }
1559         catch ( uno::Exception& )
1560         {
1561             DBG_ERROR("Numberformat could not be inserted");
1562         }
1563     }
1564     else {
1565         DBG_ERROR("not possible to create NameContainer");
1566     }
1567 }
1568 
GetEventImport()1569 XMLEventImportHelper& SvXMLImport::GetEventImport()
1570 {
1571 #ifndef SVX_LIGHT
1572     if (!mpEventImportHelper)
1573     {
1574         // construct event helper and register StarBasic handler and standard
1575         // event tables
1576         mpEventImportHelper = new XMLEventImportHelper();
1577         OUString sStarBasic(GetXMLToken(XML_STARBASIC));
1578         mpEventImportHelper->RegisterFactory(sStarBasic,
1579                                             new XMLStarBasicContextFactory());
1580         OUString sScript(GetXMLToken(XML_SCRIPT));
1581         mpEventImportHelper->RegisterFactory(sScript,
1582                                             new XMLScriptContextFactory());
1583         mpEventImportHelper->AddTranslationTable(aStandardEventTable);
1584 
1585         // register StarBasic event handler with capitalized spelling
1586         OUString sStarBasicCap(RTL_CONSTASCII_USTRINGPARAM("StarBasic"));
1587         mpEventImportHelper->RegisterFactory(sStarBasicCap,
1588                                             new XMLStarBasicContextFactory());
1589     }
1590 #endif
1591 
1592     return *mpEventImportHelper;
1593 }
1594 
SetFontDecls(XMLFontStylesContext * pFontDecls)1595 void SvXMLImport::SetFontDecls( XMLFontStylesContext *pFontDecls )
1596 {
1597     mxFontDecls = pFontDecls;
1598     GetTextImport()->SetFontDecls( pFontDecls );
1599 }
1600 
SetStyles(SvXMLStylesContext * pStyles)1601 void SvXMLImport::SetStyles( SvXMLStylesContext *pStyles )
1602 {
1603     mxStyles = pStyles;
1604 }
1605 
SetAutoStyles(SvXMLStylesContext * pAutoStyles)1606 void SvXMLImport::SetAutoStyles( SvXMLStylesContext *pAutoStyles )
1607 {
1608     if (pAutoStyles && mxNumberStyles.is() && (mnImportFlags & IMPORT_CONTENT) )
1609     {
1610         uno::Reference<xml::sax::XAttributeList> xAttrList;
1611         uno::Sequence< ::rtl::OUString > aNames = mxNumberStyles->getElementNames();
1612         sal_uInt32 nCount(aNames.getLength());
1613         if (nCount)
1614         {
1615             const OUString* pNames = aNames.getConstArray();
1616             if ( pNames )
1617             {
1618                 SvXMLStyleContext* pContext;
1619                 uno::Any aAny;
1620                 sal_Int32 nKey(0);
1621                 for (sal_uInt32 i = 0; i < nCount; i++, pNames++)
1622                 {
1623                     aAny = mxNumberStyles->getByName(*pNames);
1624                     if (aAny >>= nKey)
1625                     {
1626                         pContext = new SvXMLNumFormatContext( *this, XML_NAMESPACE_NUMBER,
1627                                     *pNames, xAttrList, nKey, *pAutoStyles );
1628                         pAutoStyles->AddStyle(*pContext);
1629                     }
1630                 }
1631             }
1632         }
1633     }
1634     mxAutoStyles = pAutoStyles;
1635     GetTextImport()->SetAutoStyles( pAutoStyles );
1636     GetShapeImport()->SetAutoStylesContext( pAutoStyles );
1637 #ifndef SVX_LIGHT
1638     GetChartImport()->SetAutoStylesContext( pAutoStyles );
1639     GetFormImport()->setAutoStyleContext( pAutoStyles );
1640 #endif
1641 }
1642 
SetMasterStyles(SvXMLStylesContext * pMasterStyles)1643 void SvXMLImport::SetMasterStyles( SvXMLStylesContext *pMasterStyles )
1644 {
1645     mxMasterStyles = pMasterStyles;
1646 }
1647 
GetFontDecls()1648 XMLFontStylesContext *SvXMLImport::GetFontDecls()
1649 {
1650     return (XMLFontStylesContext *)&mxFontDecls;
1651 }
1652 
GetStyles()1653 SvXMLStylesContext *SvXMLImport::GetStyles()
1654 {
1655     return (SvXMLStylesContext *)&mxStyles;
1656 }
1657 
GetAutoStyles()1658 SvXMLStylesContext *SvXMLImport::GetAutoStyles()
1659 {
1660     return (SvXMLStylesContext *)&mxAutoStyles;
1661 }
1662 
GetMasterStyles()1663 SvXMLStylesContext *SvXMLImport::GetMasterStyles()
1664 {
1665     return (SvXMLStylesContext *)&mxMasterStyles;
1666 }
1667 
GetFontDecls() const1668 const XMLFontStylesContext *SvXMLImport::GetFontDecls() const
1669 {
1670     return (const XMLFontStylesContext *)&mxFontDecls;
1671 }
1672 
GetStyles() const1673 const SvXMLStylesContext *SvXMLImport::GetStyles() const
1674 {
1675     return (const SvXMLStylesContext *)&mxStyles;
1676 }
1677 
GetAutoStyles() const1678 const SvXMLStylesContext *SvXMLImport::GetAutoStyles() const
1679 {
1680     return (const SvXMLStylesContext *)&mxAutoStyles;
1681 }
1682 
GetMasterStyles() const1683 const SvXMLStylesContext *SvXMLImport::GetMasterStyles() const
1684 {
1685     return (const SvXMLStylesContext *)&mxMasterStyles;
1686 }
1687 
GetAbsoluteReference(const OUString & rValue) const1688 OUString SvXMLImport::GetAbsoluteReference(const OUString& rValue) const
1689 {
1690     if( rValue.getLength() == 0 || rValue[0] == '#' )
1691         return rValue;
1692 
1693     INetURLObject aAbsURL;
1694     if( mpImpl->aBaseURL.GetNewAbsURL( rValue, &aAbsURL ) )
1695         return aAbsURL.GetMainURL( INetURLObject::DECODE_TO_IURI );
1696     else
1697         return rValue;
1698 }
1699 
IsODFVersionConsistent(const::rtl::OUString & aODFVersion)1700 sal_Bool SvXMLImport::IsODFVersionConsistent( const ::rtl::OUString& aODFVersion )
1701 {
1702     // the check returns sal_False only if the storage version could be retrieved
1703     sal_Bool bResult = sal_True;
1704 
1705     if ( aODFVersion.getLength() && aODFVersion.compareTo( ODFVER_012_TEXT ) >= 0 )
1706     {
1707         // check the consistency only for the ODF1.2 and later ( according to content.xml )
1708         // manifest.xml might have no version, it should be checked here and the correct version should be set
1709         try
1710         {
1711             uno::Reference< document::XStorageBasedDocument > xDoc( mxModel, uno::UNO_QUERY_THROW );
1712             uno::Reference< embed::XStorage > xStor = xDoc->getDocumentStorage();
1713             uno::Reference< beans::XPropertySet > xStorProps( xStor, uno::UNO_QUERY_THROW );
1714 
1715             // the check should be done only for OASIS format
1716             ::rtl::OUString aMediaType;
1717             xStorProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaType" ) ) ) >>= aMediaType;
1718             if ( ::comphelper::OStorageHelper::GetXStorageFormat( xStor ) >= SOFFICE_FILEFORMAT_8 )
1719             {
1720                 sal_Bool bRepairPackage = sal_False;
1721                 try
1722                 {
1723                     xStorProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "RepairPackage" ) ) )
1724                         >>= bRepairPackage;
1725                 } catch ( uno::Exception& )
1726                 {}
1727 
1728                 // check only if not in Repair mode
1729                 if ( !bRepairPackage )
1730                 {
1731                     ::rtl::OUString aStorVersion;
1732                     xStorProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Version" ) ) )
1733                         >>= aStorVersion;
1734 
1735                     // if the storage version is set in manifest.xml, it must be the same as in content.xml
1736                     // if not, set it explicitly to be used further ( it will work even for readonly storage )
1737                     // This workaround is not nice, but I see no other way to handle it, since there are
1738                     // ODF1.2 documents without version in manifest.xml
1739                     if ( aStorVersion.getLength() )
1740                         bResult = aODFVersion.equals( aStorVersion );
1741                     else
1742                         xStorProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Version" ) ),
1743                                                       uno::makeAny( aODFVersion ) );
1744 
1745                     if ( bResult )
1746                     {
1747                         sal_Bool bInconsistent = sal_False;
1748                         xStorProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsInconsistent" ) ) )
1749                             >>= bInconsistent;
1750                         bResult = !bInconsistent;
1751                     }
1752                 }
1753             }
1754         }
1755         catch( uno::Exception& )
1756         {}
1757     }
1758 
1759     return bResult;
1760 }
1761 
_CreateNumberFormatsSupplier()1762 void SvXMLImport::_CreateNumberFormatsSupplier()
1763 {
1764     DBG_ASSERT( !mxNumberFormatsSupplier.is(),
1765                 "number formats supplier already exists!" );
1766     if(mxModel.is())
1767         mxNumberFormatsSupplier =
1768             uno::Reference< util::XNumberFormatsSupplier> (mxModel, uno::UNO_QUERY);
1769 }
1770 
1771 
_CreateDataStylesImport()1772 void SvXMLImport::_CreateDataStylesImport()
1773 {
1774     DBG_ASSERT( mpNumImport == NULL, "data styles import already exists!" );
1775     uno::Reference<util::XNumberFormatsSupplier> xNum =
1776         GetNumberFormatsSupplier();
1777     if ( xNum.is() )
1778         mpNumImport = new SvXMLNumFmtHelper(xNum, getServiceFactory());
1779 }
1780 
1781 
ConvStarBatsCharToStarSymbol(sal_Unicode c)1782 sal_Unicode SvXMLImport::ConvStarBatsCharToStarSymbol( sal_Unicode c )
1783 {
1784     sal_Unicode cNew = c;
1785     if( !mpImpl->hBatsFontConv )
1786     {
1787         OUString sStarBats( RTL_CONSTASCII_USTRINGPARAM( "StarBats" ) );
1788         mpImpl->hBatsFontConv = CreateFontToSubsFontConverter( sStarBats,
1789                  FONTTOSUBSFONT_IMPORT|FONTTOSUBSFONT_ONLYOLDSOSYMBOLFONTS );
1790         OSL_ENSURE( mpImpl->hBatsFontConv, "Got no symbol font converter" );
1791     }
1792     if( mpImpl->hBatsFontConv )
1793     {
1794         cNew = ConvertFontToSubsFontChar( mpImpl->hBatsFontConv, c );
1795     }
1796 
1797     return cNew;
1798 }
1799 
ConvStarMathCharToStarSymbol(sal_Unicode c)1800 sal_Unicode SvXMLImport::ConvStarMathCharToStarSymbol( sal_Unicode c )
1801 {
1802     sal_Unicode cNew = c;
1803     if( !mpImpl->hMathFontConv )
1804     {
1805         OUString sStarMath( RTL_CONSTASCII_USTRINGPARAM( "StarMath" ) );
1806         mpImpl->hMathFontConv = CreateFontToSubsFontConverter( sStarMath,
1807                  FONTTOSUBSFONT_IMPORT|FONTTOSUBSFONT_ONLYOLDSOSYMBOLFONTS );
1808         OSL_ENSURE( mpImpl->hMathFontConv, "Got no symbol font converter" );
1809     }
1810     if( mpImpl->hMathFontConv )
1811     {
1812         cNew = ConvertFontToSubsFontChar( mpImpl->hMathFontConv, c );
1813     }
1814 
1815     return cNew;
1816 }
1817 
1818 
1819 
SetError(sal_Int32 nId,const Sequence<OUString> & rMsgParams,const OUString & rExceptionMessage,const Reference<xml::sax::XLocator> & rLocator)1820 void SvXMLImport::SetError(
1821     sal_Int32 nId,
1822     const Sequence<OUString>& rMsgParams,
1823     const OUString& rExceptionMessage,
1824     const Reference<xml::sax::XLocator>& rLocator )
1825 {
1826     // maintain error flags
1827     if ( ( nId & XMLERROR_FLAG_ERROR ) != 0 )
1828         mnErrorFlags |= ERROR_ERROR_OCCURED;
1829     if ( ( nId & XMLERROR_FLAG_WARNING ) != 0 )
1830         mnErrorFlags |= ERROR_WARNING_OCCURED;
1831     if ( ( nId & XMLERROR_FLAG_SEVERE ) != 0 )
1832         mnErrorFlags |= ERROR_DO_NOTHING;
1833 
1834     // create error list on demand
1835     if ( mpXMLErrors == NULL )
1836         mpXMLErrors = new XMLErrors();
1837 
1838     // save error information
1839     // use document locator (if none supplied)
1840     mpXMLErrors->AddRecord( nId, rMsgParams, rExceptionMessage,
1841                            rLocator.is() ? rLocator : mxLocator );
1842 }
1843 
SetError(sal_Int32 nId,const Sequence<OUString> & rMsgParams)1844 void SvXMLImport::SetError(
1845     sal_Int32 nId,
1846     const Sequence<OUString>& rMsgParams)
1847 {
1848     OUString sEmpty;
1849     SetError( nId, rMsgParams, sEmpty, NULL );
1850 }
1851 
SetError(sal_Int32 nId)1852 void SvXMLImport::SetError(
1853     sal_Int32 nId)
1854 {
1855     Sequence<OUString> aSeq(0);
1856     SetError( nId, aSeq );
1857 }
1858 
SetError(sal_Int32 nId,const OUString & rMsg1)1859 void SvXMLImport::SetError(
1860     sal_Int32 nId,
1861     const OUString& rMsg1)
1862 {
1863     Sequence<OUString> aSeq(1);
1864     OUString* pSeq = aSeq.getArray();
1865     pSeq[0] = rMsg1;
1866     SetError( nId, aSeq );
1867 }
1868 
SetError(sal_Int32 nId,const OUString & rMsg1,const OUString & rMsg2)1869 void SvXMLImport::SetError(
1870     sal_Int32 nId,
1871     const OUString& rMsg1,
1872     const OUString& rMsg2)
1873 {
1874     Sequence<OUString> aSeq(2);
1875     OUString* pSeq = aSeq.getArray();
1876     pSeq[0] = rMsg1;
1877     pSeq[1] = rMsg2;
1878     SetError( nId, aSeq );
1879 }
1880 
SetError(sal_Int32 nId,const OUString & rMsg1,const OUString & rMsg2,const OUString & rMsg3)1881 void SvXMLImport::SetError(
1882     sal_Int32 nId,
1883     const OUString& rMsg1,
1884     const OUString& rMsg2,
1885     const OUString& rMsg3)
1886 {
1887     Sequence<OUString> aSeq(3);
1888     OUString* pSeq = aSeq.getArray();
1889     pSeq[0] = rMsg1;
1890     pSeq[1] = rMsg2;
1891     pSeq[2] = rMsg3;
1892     SetError( nId, aSeq );
1893 }
1894 
SetError(sal_Int32 nId,const OUString & rMsg1,const OUString & rMsg2,const OUString & rMsg3,const OUString & rMsg4)1895 void SvXMLImport::SetError(
1896     sal_Int32 nId,
1897     const OUString& rMsg1,
1898     const OUString& rMsg2,
1899     const OUString& rMsg3,
1900     const OUString& rMsg4)
1901 {
1902     Sequence<OUString> aSeq(4);
1903     OUString* pSeq = aSeq.getArray();
1904     pSeq[0] = rMsg1;
1905     pSeq[1] = rMsg2;
1906     pSeq[2] = rMsg3;
1907     pSeq[3] = rMsg4;
1908     SetError( nId, aSeq );
1909 }
1910 
GetErrors()1911 XMLErrors* SvXMLImport::GetErrors()
1912 {
1913     return mpXMLErrors;
1914 }
1915 
DisposingModel()1916 void SvXMLImport::DisposingModel()
1917 {
1918     if( mxFontDecls.Is() )
1919         ((SvXMLStylesContext *)&mxFontDecls)->Clear();
1920     if( mxStyles.Is() )
1921         ((SvXMLStylesContext *)&mxStyles)->Clear();
1922     if( mxAutoStyles.Is() )
1923         ((SvXMLStylesContext *)&mxAutoStyles)->Clear();
1924     if( mxMasterStyles.Is() )
1925         ((SvXMLStylesContext *)&mxMasterStyles)->Clear();
1926 
1927     mxModel.set(0);
1928     mxEventListener.set(NULL);
1929 }
1930 
getInterfaceToIdentifierMapper()1931 ::comphelper::UnoInterfaceToUniqueIdentifierMapper& SvXMLImport::getInterfaceToIdentifierMapper()
1932 {
1933     return mpImpl->maInterfaceToIdentifierMapper;
1934 }
1935 
getServiceFactory()1936 ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > SvXMLImport::getServiceFactory()
1937 {
1938     // #110680#
1939     return mxServiceFactory;
1940 }
1941 
1942 uno::Reference< uno::XComponentContext >
GetComponentContext() const1943 SvXMLImport::GetComponentContext() const
1944 {
1945     return mpImpl->mxComponentContext;
1946 }
1947 
GetBaseURL() const1948 String SvXMLImport::GetBaseURL() const
1949 {
1950     return mpImpl->aBaseURL.GetMainURL( INetURLObject::NO_DECODE );
1951 }
1952 
GetDocumentBase() const1953 String SvXMLImport::GetDocumentBase() const
1954 {
1955     return mpImpl->aDocBase.GetMainURL( INetURLObject::NO_DECODE );
1956 }
1957 
GetStreamName() const1958 ::rtl::OUString SvXMLImport::GetStreamName() const
1959 {
1960     return mpImpl->mStreamName;
1961 }
1962 
1963 // --> OD 2004-08-10 #i28749#
IsShapePositionInHoriL2R() const1964 sal_Bool SvXMLImport::IsShapePositionInHoriL2R() const
1965 {
1966     return mpImpl->mbShapePositionInHoriL2R;
1967 }
1968 // <--
1969 
1970 // --> OD 2007-12-19 #152540#
IsTextDocInOOoFileFormat() const1971 sal_Bool SvXMLImport::IsTextDocInOOoFileFormat() const
1972 {
1973     return mpImpl->mbTextDocInOOoFileFormat;
1974 }
1975 
1976 // <--
1977 
initXForms()1978 void SvXMLImport::initXForms()
1979 {
1980     // dummy method; to be implemented by derived classes supporting XForms
1981 }
1982 
getBuildIds(sal_Int32 & rUPD,sal_Int32 & rBuild) const1983 bool SvXMLImport::getBuildIds( sal_Int32& rUPD, sal_Int32& rBuild ) const
1984 {
1985     bool bRet = false;
1986     if( mxImportInfo.is() ) try
1987     {
1988         const OUString aPropName(RTL_CONSTASCII_USTRINGPARAM("BuildId"));
1989         Reference< XPropertySetInfo > xSetInfo( mxImportInfo->getPropertySetInfo() );
1990         if( xSetInfo.is() && xSetInfo->hasPropertyByName( aPropName ) )
1991         {
1992             OUString aBuildId;
1993             mxImportInfo->getPropertyValue( aPropName ) >>= aBuildId;
1994             if( aBuildId.getLength() )
1995             {
1996                 sal_Int32 nIndex = aBuildId.indexOf('$');
1997                 if( nIndex != -1 )
1998                 {
1999                     rUPD = aBuildId.copy( 0, nIndex ).toInt32();
2000                     rBuild = aBuildId.copy( nIndex+1 ).toInt32();
2001                     bRet = true;
2002                 }
2003             }
2004         }
2005     }
2006     catch( Exception& )
2007     {
2008     }
2009     return bRet;
2010 }
2011 
getGeneratorVersion() const2012 sal_uInt16 SvXMLImport::getGeneratorVersion() const
2013 {
2014     // --> ORW
2015     return mpImpl->getGeneratorVersion( *this );
2016     // <--
2017 }
2018 
isGraphicLoadOnDemandSupported() const2019 bool SvXMLImport::isGraphicLoadOnDemandSupported() const
2020 {
2021     return mbIsGraphicLoadOnDemandSupported;
2022 }
2023 
GetODFVersion() const2024 ::rtl::OUString SvXMLImport::GetODFVersion() const
2025 {
2026     return mpImpl->aODFVersion;
2027 }
2028 
2029 // xml:id for RDF metadata
SetXmlId(uno::Reference<uno::XInterface> const & i_xIfc,::rtl::OUString const & i_rXmlId)2030 void SvXMLImport::SetXmlId(uno::Reference<uno::XInterface> const & i_xIfc,
2031     ::rtl::OUString const & i_rXmlId)
2032 {
2033     if (i_rXmlId.getLength() > 0) {
2034         try {
2035             const uno::Reference<rdf::XMetadatable> xMeta(i_xIfc,
2036                 uno::UNO_QUERY);
2037 //FIXME: not yet
2038 //            OSL_ENSURE(xMeta.is(), "xml:id: not XMetadatable");
2039             if (xMeta.is()) {
2040                 const beans::StringPair mdref( GetStreamName(), i_rXmlId );
2041                 try {
2042                     xMeta->setMetadataReference(mdref);
2043                 } catch (lang::IllegalArgumentException &) {
2044                     // probably duplicate; ignore
2045                     OSL_TRACE("SvXMLImport::SetXmlId: cannot set xml:id");
2046                 }
2047             }
2048         } catch (uno::Exception &) {
2049             OSL_ENSURE(false, "SvXMLImport::SetXmlId: exception?");
2050         }
2051     }
2052 }
2053 
2054 SAL_DLLPRIVATE ::xmloff::RDFaImportHelper &
GetRDFaImportHelper()2055 SvXMLImport::GetRDFaImportHelper()
2056 {
2057     if (!mpImpl->mpRDFaHelper.get())
2058     {
2059         mpImpl->mpRDFaHelper.reset( new ::xmloff::RDFaImportHelper(*this) );
2060     }
2061     return *mpImpl->mpRDFaHelper;
2062 }
2063 
2064 void
AddRDFa(uno::Reference<rdf::XMetadatable> i_xObject,::rtl::OUString const & i_rAbout,::rtl::OUString const & i_rProperty,::rtl::OUString const & i_rContent,::rtl::OUString const & i_rDatatype)2065 SvXMLImport::AddRDFa(uno::Reference<rdf::XMetadatable> i_xObject,
2066     ::rtl::OUString const & i_rAbout,
2067     ::rtl::OUString const & i_rProperty,
2068     ::rtl::OUString const & i_rContent,
2069     ::rtl::OUString const & i_rDatatype)
2070 {
2071     // N.B.: we only get called if i_xObject had xhtml:about attribute
2072     // (an empty attribute value is valid)
2073     ::xmloff::RDFaImportHelper & rRDFaHelper( GetRDFaImportHelper() );
2074     rRDFaHelper.ParseAndAddRDFa(i_xObject,
2075         i_rAbout, i_rProperty, i_rContent, i_rDatatype);
2076 }
2077 
2078