xref: /AOO42X/main/sw/source/filter/xml/swxml.cxx (revision 24bfd58a22cfb80b428cb1c60b777f026258e048)
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_sw.hxx"
26 
27 #define _SVSTDARR_STRINGS
28 #include <rsc/rscsfx.hxx>
29 #include <tools/urlobj.hxx>
30 #include <com/sun/star/embed/XStorage.hpp>
31 #include <com/sun/star/embed/ElementModes.hpp>
32 #include <comphelper/processfactory.hxx>
33 #include <comphelper/componentcontext.hxx>
34 #include <com/sun/star/xml/sax/InputSource.hpp>
35 #include <com/sun/star/xml/sax/XParser.hpp>
36 #include <com/sun/star/io/XActiveDataControl.hpp>
37 #include <com/sun/star/text/XTextRange.hpp>
38 #include <com/sun/star/container/XChild.hpp>
39 #include <com/sun/star/beans/XPropertySetInfo.hpp>
40 #include <com/sun/star/beans/PropertyValue.hpp>
41 #include <com/sun/star/beans/NamedValue.hpp>
42 #include <com/sun/star/beans/PropertyAttribute.hpp>
43 #include <com/sun/star/task/XStatusIndicatorFactory.hpp>
44 #include <com/sun/star/io/XActiveDataSource.hpp>
45 #include <com/sun/star/packages/zip/ZipIOException.hpp>
46 #include <com/sun/star/packages/WrongPasswordException.hpp>
47 #include <com/sun/star/ucb/InteractiveAugmentedIOException.hpp>
48 #include <svl/svstdarr.hxx>
49 #include <sfx2/docfile.hxx>
50 #include <svtools/sfxecode.hxx>
51 #include <svl/stritem.hxx>
52 #include <unotools/streamwrap.hxx>
53 #include <svx/xmlgrhlp.hxx>
54 #include <svx/xmleohlp.hxx>
55 #include <comphelper/genericpropertyset.hxx>
56 #include <rtl/logfile.hxx>
57 #include <sfx2/frame.hxx>
58 #include <unotools/ucbstreamhelper.hxx>
59 #include <swerror.h>
60 #include <errhdl.hxx>
61 #include <fltini.hxx>
62 #include <doc.hxx>
63 #include <docsh.hxx>
64 #include <unotextrange.hxx>
65 #include <swmodule.hxx>
66 #include <SwXMLSectionList.hxx>
67 #include <statstr.hrc>
68 #include <SwStyleNameMapper.hxx>
69 #include <poolfmt.hxx>
70 #include <numrule.hxx>
71 #include <paratr.hxx>
72 #include <svx/svdmodel.hxx>
73 #include <svx/svdpage.hxx>
74 #include <svx/svditer.hxx>
75 #include <svx/svdoole2.hxx>
76 #include <svx/svdograf.hxx>
77 #include <sfx2/docfilt.hxx>
78 #include <istyleaccess.hxx>
79 #define LOGFILE_AUTHOR "mb93740"
80 #include <sfx2/DocumentMetadataAccess.hxx>
81 #include <drawdoc.hxx>
82 
83 using namespace ::com::sun::star;
84 using namespace ::com::sun::star::uno;
85 using namespace ::com::sun::star::text;
86 using namespace ::com::sun::star::container;
87 using namespace ::com::sun::star::document;
88 using namespace ::com::sun::star::lang;
89 using ::rtl::OUString;
90 
91 
lcl_EnsureValidPam(SwPaM & rPam)92 void lcl_EnsureValidPam( SwPaM& rPam )
93 {
94     if( rPam.GetCntntNode() != NULL )
95     {
96         // set proper point content
97         if( rPam.GetCntntNode() != rPam.GetPoint()->nContent.GetIdxReg() )
98         {
99             rPam.GetPoint()->nContent.Assign( rPam.GetCntntNode(), 0 );
100         }
101         // else: point was already valid
102 
103         // if mark is invalid, we delete it
104         if( ( rPam.GetCntntNode( sal_False ) == NULL ) ||
105             ( rPam.GetCntntNode( sal_False ) != rPam.GetMark()->nContent.GetIdxReg() ) )
106         {
107             rPam.DeleteMark();
108         }
109     }
110     else
111     {
112         // point is not valid, so move it into the first content
113         rPam.DeleteMark();
114         rPam.GetPoint()->nNode =
115             *rPam.GetDoc()->GetNodes().GetEndOfContent().StartOfSectionNode();
116         ++ rPam.GetPoint()->nNode;
117         rPam.Move( fnMoveForward, fnGoCntnt ); // go into content
118     }
119 }
120 
XMLReader()121 XMLReader::XMLReader()
122 {
123 }
124 
GetReaderType()125 int XMLReader::GetReaderType()
126 {
127     return SW_STORAGE_READER;
128 }
129 
130 /// read a component (file + filter version)
ReadThroughComponent(uno::Reference<io::XInputStream> xInputStream,uno::Reference<XComponent> xModelComponent,const String & rStreamName,uno::Reference<lang::XMultiServiceFactory> & rFactory,const sal_Char * pFilterName,const Sequence<Any> & rFilterArguments,const OUString & rName,sal_Bool bMustBeSuccessfull,sal_Bool bEncrypted)131 sal_Int32 ReadThroughComponent(
132     uno::Reference<io::XInputStream> xInputStream,
133     uno::Reference<XComponent> xModelComponent,
134     const String& rStreamName,
135     uno::Reference<lang::XMultiServiceFactory> & rFactory,
136     const sal_Char* pFilterName,
137     const Sequence<Any>& rFilterArguments,
138     const OUString& rName,
139     sal_Bool bMustBeSuccessfull,
140     sal_Bool bEncrypted )
141 {
142     DBG_ASSERT(xInputStream.is(), "input stream missing");
143     DBG_ASSERT(xModelComponent.is(), "document missing");
144     DBG_ASSERT(rFactory.is(), "factory missing");
145     DBG_ASSERT(NULL != pFilterName,"I need a service name for the component!");
146 
147     RTL_LOGFILE_CONTEXT_AUTHOR( aLog, "sw", LOGFILE_AUTHOR, "ReadThroughComponent" );
148 
149     // prepare ParserInputSrouce
150     xml::sax::InputSource aParserInput;
151     aParserInput.sSystemId = rName;
152     aParserInput.aInputStream = xInputStream;
153 
154     // get parser
155     uno::Reference< xml::sax::XParser > xParser(
156         rFactory->createInstance(
157             OUString::createFromAscii("com.sun.star.xml.sax.Parser") ),
158         UNO_QUERY );
159     DBG_ASSERT( xParser.is(), "Can't create parser" );
160     if( !xParser.is() )
161         return ERR_SWG_READ_ERROR;
162     RTL_LOGFILE_CONTEXT_TRACE( aLog, "parser created" );
163 
164     // get filter
165     uno::Reference< xml::sax::XDocumentHandler > xFilter(
166         rFactory->createInstanceWithArguments(
167             OUString::createFromAscii(pFilterName), rFilterArguments),
168         UNO_QUERY );
169     DBG_ASSERT( xFilter.is(), "Can't instantiate filter component." );
170     if( !xFilter.is() )
171         return ERR_SWG_READ_ERROR;
172     RTL_LOGFILE_CONTEXT_TRACE1( aLog, "%s created", pFilterName );
173 
174     // connect parser and filter
175     xParser->setDocumentHandler( xFilter );
176 
177     // connect model and filter
178     uno::Reference < XImporter > xImporter( xFilter, UNO_QUERY );
179     xImporter->setTargetDocument( xModelComponent );
180 
181 
182 #ifdef TIMELOG
183     // if we do profiling, we want to know the stream
184     ByteString aString( (String)rStreamName, RTL_TEXTENCODING_ASCII_US );
185     RTL_LOGFILE_TRACE_AUTHOR1( "sw", LOGFILE_AUTHOR,
186                                "ReadThroughComponent : parsing \"%s\"", aString.GetBuffer() );
187 #endif
188 
189     // finally, parser the stream
190     try
191     {
192         xParser->parseStream( aParserInput );
193     }
194     catch( xml::sax::SAXParseException& r )
195     {
196         // sax parser sends wrapped exceptions,
197         // try to find the original one
198         xml::sax::SAXException aSaxEx = *(xml::sax::SAXException*)(&r);
199         sal_Bool bTryChild = sal_True;
200 
201         while( bTryChild )
202         {
203             xml::sax::SAXException aTmp;
204             if ( aSaxEx.WrappedException >>= aTmp )
205                 aSaxEx = aTmp;
206             else
207                 bTryChild = sal_False;
208         }
209 
210         packages::zip::ZipIOException aBrokenPackage;
211         if ( aSaxEx.WrappedException >>= aBrokenPackage )
212             return ERRCODE_IO_BROKENPACKAGE;
213 
214         if( bEncrypted )
215             return ERRCODE_SFX_WRONGPASSWORD;
216 
217 #if OSL_DEBUG_LEVEL > 1
218         ByteString aError( "SAX parse exception caught while importing:\n" );
219         aError += ByteString( String( r.Message), RTL_TEXTENCODING_ASCII_US );
220         DBG_ERROR( aError.GetBuffer() );
221 #endif
222 
223         String sErr( String::CreateFromInt32( r.LineNumber ));
224         sErr += ',';
225         sErr += String::CreateFromInt32( r.ColumnNumber );
226 
227         if( rStreamName.Len() )
228         {
229             return *new TwoStringErrorInfo(
230                             (bMustBeSuccessfull ? ERR_FORMAT_FILE_ROWCOL
231                                                 : WARN_FORMAT_FILE_ROWCOL),
232                             rStreamName, sErr,
233                             ERRCODE_BUTTON_OK | ERRCODE_MSG_ERROR );
234         }
235         else
236         {
237             ASSERT( bMustBeSuccessfull, "Warnings are not supported" );
238             return *new StringErrorInfo( ERR_FORMAT_ROWCOL, sErr,
239                              ERRCODE_BUTTON_OK | ERRCODE_MSG_ERROR );
240         }
241     }
242     catch( xml::sax::SAXException& r)
243     {
244         packages::zip::ZipIOException aBrokenPackage;
245         if ( r.WrappedException >>= aBrokenPackage )
246             return ERRCODE_IO_BROKENPACKAGE;
247 
248         if( bEncrypted )
249             return ERRCODE_SFX_WRONGPASSWORD;
250 
251 #if OSL_DEBUG_LEVEL > 1
252         ByteString aError( "SAX exception caught while importing:\n" );
253         aError += ByteString( String( r.Message), RTL_TEXTENCODING_ASCII_US );
254         DBG_ERROR( aError.GetBuffer() );
255 #endif
256 
257         return ERR_SWG_READ_ERROR;
258     }
259     catch( packages::zip::ZipIOException& r)
260     {
261         (void)r;
262 #if OSL_DEBUG_LEVEL > 1
263         ByteString aError( "Zip exception caught while importing:\n" );
264         aError += ByteString( String( r.Message), RTL_TEXTENCODING_ASCII_US );
265         DBG_ERROR( aError.GetBuffer() );
266 #endif
267         return ERRCODE_IO_BROKENPACKAGE;
268     }
269     catch( io::IOException& r)
270     {
271         (void)r;
272 #if OSL_DEBUG_LEVEL > 1
273         ByteString aError( "IO exception caught while importing:\n" );
274         aError += ByteString( String( r.Message), RTL_TEXTENCODING_ASCII_US );
275         DBG_ERROR( aError.GetBuffer() );
276 #endif
277         return ERR_SWG_READ_ERROR;
278     }
279     catch( uno::Exception& r)
280     {
281         (void)r;
282 #if OSL_DEBUG_LEVEL > 1
283         ByteString aError( "uno exception caught while importing:\n" );
284         aError += ByteString( String( r.Message), RTL_TEXTENCODING_ASCII_US );
285         DBG_ERROR( aError.GetBuffer() );
286 #endif
287         return ERR_SWG_READ_ERROR;
288     }
289 
290     // success!
291     return 0;
292 }
293 
294 /// read a component (storage version)
ReadThroughComponent(uno::Reference<embed::XStorage> xStorage,uno::Reference<XComponent> xModelComponent,const sal_Char * pStreamName,const sal_Char * pCompatibilityStreamName,uno::Reference<lang::XMultiServiceFactory> & rFactory,const sal_Char * pFilterName,const Sequence<Any> & rFilterArguments,const OUString & rName,sal_Bool bMustBeSuccessfull)295 sal_Int32 ReadThroughComponent(
296     uno::Reference<embed::XStorage> xStorage,
297     uno::Reference<XComponent> xModelComponent,
298     const sal_Char* pStreamName,
299     const sal_Char* pCompatibilityStreamName,
300     uno::Reference<lang::XMultiServiceFactory> & rFactory,
301     const sal_Char* pFilterName,
302     const Sequence<Any>& rFilterArguments,
303     const OUString& rName,
304     sal_Bool bMustBeSuccessfull)
305 {
306     DBG_ASSERT(xStorage.is(), "Need storage!");
307     DBG_ASSERT(NULL != pStreamName, "Please, please, give me a name!");
308 
309     // open stream (and set parser input)
310     OUString sStreamName = OUString::createFromAscii(pStreamName);
311     sal_Bool bContainsStream = sal_False;
312     try
313     {
314         bContainsStream = xStorage->isStreamElement(sStreamName);
315     }
316     catch( container::NoSuchElementException& )
317     {
318     }
319 
320     if (!bContainsStream )
321     {
322         // stream name not found! Then try the compatibility name.
323         // if no stream can be opened, return immediately with OK signal
324 
325         // do we even have an alternative name?
326         if ( NULL == pCompatibilityStreamName )
327             return 0;
328 
329         // if so, does the stream exist?
330         sStreamName = OUString::createFromAscii(pCompatibilityStreamName);
331         try
332         {
333             bContainsStream = xStorage->isStreamElement(sStreamName);
334         }
335         catch( container::NoSuchElementException& )
336         {
337         }
338 
339         if (! bContainsStream )
340             return 0;
341     }
342 
343     // set Base URL
344     uno::Reference< beans::XPropertySet > xInfoSet;
345     if( rFilterArguments.getLength() > 0 )
346         rFilterArguments.getConstArray()[0] >>= xInfoSet;
347     DBG_ASSERT( xInfoSet.is(), "missing property set" );
348     if( xInfoSet.is() )
349     {
350         OUString sPropName( RTL_CONSTASCII_USTRINGPARAM("StreamName") );
351         xInfoSet->setPropertyValue( sPropName, makeAny( sStreamName ) );
352     }
353 
354     try
355     {
356         // get input stream
357         uno::Reference <io::XStream> xStream = xStorage->openStreamElement( sStreamName, embed::ElementModes::READ );
358         uno::Reference <beans::XPropertySet > xProps( xStream, uno::UNO_QUERY );
359 
360         Any aAny = xProps->getPropertyValue(
361                 OUString( RTL_CONSTASCII_USTRINGPARAM("Encrypted") ) );
362 
363         sal_Bool bEncrypted = aAny.getValueType() == ::getBooleanCppuType() &&
364                 *(sal_Bool *)aAny.getValue();
365 
366         uno::Reference <io::XInputStream> xInputStream = xStream->getInputStream();
367 
368         // read from the stream
369         return ReadThroughComponent(
370             xInputStream, xModelComponent, sStreamName, rFactory,
371             pFilterName, rFilterArguments,
372             rName, bMustBeSuccessfull, bEncrypted );
373     }
374     catch ( packages::WrongPasswordException& )
375     {
376         return ERRCODE_SFX_WRONGPASSWORD;
377     }
378     catch( packages::zip::ZipIOException& )
379     {
380         return ERRCODE_IO_BROKENPACKAGE;
381     }
382     catch ( uno::Exception& )
383     {
384         OSL_ENSURE( sal_False, "Error on import!\n" );
385         // TODO/LATER: error handling
386     }
387 
388     return ERR_SWG_READ_ERROR;
389 }
390 
391 
lcl_AdjustOutlineStylesForOOo(SwDoc & _rDoc)392 void lcl_AdjustOutlineStylesForOOo( SwDoc& _rDoc )
393 {
394     // array containing the names of the default outline styles ('Heading 1',
395     // 'Heading 2', ..., 'Heading 10')
396     String aDefOutlStyleNames[ MAXLEVEL ];
397     {
398         String sStyleName;
399         for ( sal_uInt8 i = 0; i < MAXLEVEL; ++i )
400         {
401             sStyleName =
402                 SwStyleNameMapper::GetProgName( static_cast< sal_uInt16 >(RES_POOLCOLL_HEADLINE1 + i),
403                                                 sStyleName );
404             aDefOutlStyleNames[i] = sStyleName;
405         }
406     }
407 
408     // array indicating, which outline level already has a style assigned.
409     bool aOutlineLevelAssigned[ MAXLEVEL ];
410     // array of the default outline styles, which are created for the document.
411     SwTxtFmtColl* aCreatedDefaultOutlineStyles[ MAXLEVEL ];
412 
413     {
414         for ( sal_uInt8 i = 0; i < MAXLEVEL; ++i )
415         {
416             aOutlineLevelAssigned[ i ] = false;
417             aCreatedDefaultOutlineStyles[ i ] = 0L;
418         }
419     }
420 
421     // determine, which outline level has already a style assigned and
422     // which of the default outline styles is created.
423     const SwTxtFmtColls& rColls = *(_rDoc.GetTxtFmtColls());
424     for ( sal_uInt16 n = 1; n < rColls.Count(); ++n )
425     {
426         SwTxtFmtColl* pColl = rColls[ n ];
427         //if ( pColl->GetOutlineLevel() != NO_NUMBERING ) //#outline level zhaojianwei
428         if ( pColl->IsAssignedToListLevelOfOutlineStyle() )
429         {
430         //  aOutlineLevelAssigned[ pColl->GetOutlineLevel() ] = true;
431             aOutlineLevelAssigned[ pColl->GetAssignedOutlineStyleLevel() ] = true; //<-end,zhaojianwei
432         }
433 
434         for ( sal_uInt8 i = 0; i < MAXLEVEL; ++i )
435         {
436             if ( aCreatedDefaultOutlineStyles[ i ] == 0L &&
437                  pColl->GetName() == aDefOutlStyleNames[i] )
438             {
439                 aCreatedDefaultOutlineStyles[ i ] = pColl;
440                 break;
441             }
442         }
443     }
444 
445     // assign already created default outline style to outline level, which
446     // doesn't have a style assigned to it.
447     const SwNumRule* pOutlineRule = _rDoc.GetOutlineNumRule();
448     for ( sal_uInt8 i = 0; i < MAXLEVEL; ++i )
449     {
450         // #i73361#
451         // Do not change assignment of already created default outline style
452         // to a certain outline level.
453         if ( !aOutlineLevelAssigned[ i ] &&
454              aCreatedDefaultOutlineStyles[ i ] != 0 &&
455              ! aCreatedDefaultOutlineStyles[ i ]->IsAssignedToListLevelOfOutlineStyle() )
456         {
457             // apply outline level at created default outline style
458             aCreatedDefaultOutlineStyles[i]->AssignToListLevelOfOutlineStyle( i ); //#outline level added by zhaojianwei
459 
460             // apply outline numbering rule, if none is set.
461             const SfxPoolItem& rItem =
462                 aCreatedDefaultOutlineStyles[ i ]->GetFmtAttr( RES_PARATR_NUMRULE, sal_False );
463             if ( static_cast<const SwNumRuleItem&>(rItem).GetValue().Len() == 0 )
464             {
465                 SwNumRuleItem aItem( pOutlineRule->GetName() );
466                 aCreatedDefaultOutlineStyles[ i ]->SetFmtAttr( aItem );
467             }
468         }
469     }
470 
471 }
472 
473 
lcl_ConvertSdrOle2ObjsToSdrGrafObjs(SwDoc & _rDoc)474 void lcl_ConvertSdrOle2ObjsToSdrGrafObjs( SwDoc& _rDoc )
475 {
476     if ( _rDoc.GetDrawModel() &&
477          _rDoc.GetDrawModel()->GetPage( 0 ) )
478     {
479         const SdrPage& rSdrPage( *(_rDoc.GetDrawModel()->GetPage( 0 )) );
480 
481         // iterate recursive with group objects over all shapes on the draw page
482         SdrObjListIter aIter( rSdrPage );
483         while( aIter.IsMore() )
484         {
485             SdrOle2Obj* pOle2Obj = dynamic_cast< SdrOle2Obj* >( aIter.Next() );
486             if( pOle2Obj )
487             {
488                 // found an ole2 shape
489                 SdrObjList* pObjList = pOle2Obj->GetObjList();
490 
491                 // get its graphic
492                 Graphic aGraphic;
493                 pOle2Obj->Connect();
494                 Graphic* pGraphic = pOle2Obj->GetGraphic();
495                 if( pGraphic )
496                     aGraphic = *pGraphic;
497                 pOle2Obj->Disconnect();
498 
499                 // create new graphic shape with the ole graphic and shape size
500                 SdrGrafObj* pGraphicObj = new SdrGrafObj( aGraphic, pOle2Obj->GetCurrentBoundRect() );
501                 // apply layer of ole2 shape at graphic shape
502                 pGraphicObj->SetLayer( pOle2Obj->GetLayer() );
503 
504                 // replace ole2 shape with the new graphic object and delete the ol2 shape
505                 SdrObject* pReplaced = pObjList->ReplaceObject( pGraphicObj, pOle2Obj->GetOrdNum() );
506                 SdrObject::Free( pReplaced );
507             }
508         }
509     }
510 }
511 
512 
Read(SwDoc & rDoc,const String & rBaseURL,SwPaM & rPaM,const String & rName)513 sal_uLong XMLReader::Read( SwDoc &rDoc, const String& rBaseURL, SwPaM &rPaM, const String & rName )
514 {
515     // Get service factory
516     uno::Reference< lang::XMultiServiceFactory > xServiceFactory =
517             comphelper::getProcessServiceFactory();
518     ASSERT( xServiceFactory.is(),
519             "XMLReader::Read: got no service manager" );
520     if( !xServiceFactory.is() )
521         return ERR_SWG_READ_ERROR;
522 
523     uno::Reference< io::XActiveDataSource > xSource;
524     uno::Reference< XInterface > xPipe;
525     uno::Reference< document::XGraphicObjectResolver > xGraphicResolver;
526     SvXMLGraphicHelper *pGraphicHelper = 0;
527     uno::Reference< document::XEmbeddedObjectResolver > xObjectResolver;
528     SvXMLEmbeddedObjectHelper *pObjectHelper = 0;
529 
530     // get the input stream (storage or stream)
531     uno::Reference<io::XInputStream> xInputStream;
532     uno::Reference<embed::XStorage> xStorage;
533     if( pMedium )
534         xStorage = pMedium->GetStorage();
535     else
536         xStorage = xStg;
537 
538     if( !xStorage.is() )
539         return ERR_SWG_READ_ERROR;
540 
541     pGraphicHelper = SvXMLGraphicHelper::Create( xStorage,
542                                                  GRAPHICHELPER_MODE_READ,
543                                                  sal_False );
544     xGraphicResolver = pGraphicHelper;
545     SfxObjectShell *pPersist = rDoc.GetPersist();
546     if( pPersist )
547     {
548         pObjectHelper = SvXMLEmbeddedObjectHelper::Create(
549                                         xStorage, *pPersist,
550                                         EMBEDDEDOBJECTHELPER_MODE_READ,
551                                         sal_False );
552         xObjectResolver = pObjectHelper;
553     }
554 
555     // Get the docshell, the model, and finally the model's component
556     SwDocShell *pDocSh = rDoc.GetDocShell();
557     ASSERT( pDocSh, "XMLReader::Read: got no doc shell" );
558     if( !pDocSh )
559         return ERR_SWG_READ_ERROR;
560     uno::Reference< lang::XComponent > xModelComp( pDocSh->GetModel(), UNO_QUERY );
561     ASSERT( xModelComp.is(),
562             "XMLReader::Read: got no model" );
563     if( !xModelComp.is() )
564         return ERR_SWG_READ_ERROR;
565 
566 
567     // create and prepare the XPropertySet that gets passed through
568     // the components, and the XStatusIndicator that shows progress to
569     // the user.
570 
571     // create XPropertySet with three properties for status indicator
572     comphelper::PropertyMapEntry aInfoMap[] =
573     {
574         { "ProgressRange", sizeof("ProgressRange")-1, 0,
575               &::getCppuType((sal_Int32*)0),
576               beans::PropertyAttribute::MAYBEVOID, 0},
577         { "ProgressMax", sizeof("ProgressMax")-1, 0,
578               &::getCppuType((sal_Int32*)0),
579               beans::PropertyAttribute::MAYBEVOID, 0},
580         { "ProgressCurrent", sizeof("ProgressCurrent")-1, 0,
581               &::getCppuType((sal_Int32*)0),
582               beans::PropertyAttribute::MAYBEVOID, 0},
583         { "NumberStyles", sizeof("NumberStyles")-1, 0,
584               &::getCppuType( (uno::Reference<container::XNameContainer> *) 0),
585               beans::PropertyAttribute::MAYBEVOID, 0},
586         { "RecordChanges", sizeof("RecordChanges")-1, 0,
587               &::getBooleanCppuType(),
588               beans::PropertyAttribute::MAYBEVOID, 0 },
589         { "ShowChanges", sizeof("ShowChanges")-1, 0,
590               &::getBooleanCppuType(),
591               beans::PropertyAttribute::MAYBEVOID, 0 },
592         { "RedlineProtectionKey", sizeof("RedlineProtectionKey")-1, 0,
593 #if (defined(__SUNPRO_CC) && (__SUNPRO_CC == 0x500))
594               new uno::Type(::getCppuType((Sequence<sal_Int8>*)0)),
595 #else
596               &::getCppuType((Sequence<sal_Int8>*)0),
597 #endif
598               beans::PropertyAttribute::MAYBEVOID, 0 },
599         { "PrivateData", sizeof("PrivateData")-1, 0,
600               &::getCppuType( (uno::Reference<XInterface> *)0 ),
601               beans::PropertyAttribute::MAYBEVOID, 0 },
602         { "BaseURI", sizeof("BaseURI")-1, 0,
603               &::getCppuType( (OUString *)0 ),
604               beans::PropertyAttribute::MAYBEVOID, 0 },
605         { "StreamRelPath", sizeof("StreamRelPath")-1, 0,
606               &::getCppuType( (OUString *)0 ),
607               beans::PropertyAttribute::MAYBEVOID, 0 },
608         { "StreamName", sizeof("StreamName")-1, 0,
609               &::getCppuType( (OUString *)0 ),
610               beans::PropertyAttribute::MAYBEVOID, 0 },
611         // properties for insert modes
612         { "StyleInsertModeFamilies", sizeof("StyleInsertModeFamilies")-1, 0,
613               &::getCppuType((Sequence<OUString>*)0),
614               beans::PropertyAttribute::MAYBEVOID, 0 },
615         { "StyleInsertModeOverwrite", sizeof("StyleInsertModeOverwrite")-1, 0,
616               &::getBooleanCppuType(),
617               beans::PropertyAttribute::MAYBEVOID, 0 },
618         { "TextInsertModeRange", sizeof("TextInsertModeRange")-1, 0,
619               &::getCppuType( (uno::Reference<text::XTextRange> *) 0),
620               beans::PropertyAttribute::MAYBEVOID, 0},
621         { "AutoTextMode", sizeof("AutoTextMode")-1, 0,
622               &::getBooleanCppuType(),
623               beans::PropertyAttribute::MAYBEVOID, 0 },
624         { "OrganizerMode", sizeof("OrganizerMode")-1, 0,
625               &::getBooleanCppuType(),
626               beans::PropertyAttribute::MAYBEVOID, 0 },
627         // --> OD 2004-08-10 #i28749# - Add property, which indicates, if the
628         // shape position attributes are given in horizontal left-to-right layout.
629         // This is the case for the OpenOffice.org file format.
630         { "ShapePositionInHoriL2R", sizeof("ShapePositionInHoriL2R")-1, 0,
631               &::getBooleanCppuType(),
632               beans::PropertyAttribute::MAYBEVOID, 0 },
633         // <--
634         { "BuildId", sizeof("BuildId")-1, 0,
635               &::getCppuType( (OUString *)0 ),
636               beans::PropertyAttribute::MAYBEVOID, 0 },
637         // --> OD 2007-12-19 #152540#
638         // Add property, which indicates, if a text document in OpenOffice.org
639         // file format is read.
640         // Note: Text documents read via the binary filter are also finally
641         //       read using the OpenOffice.org file format. Thus, e.g. for text
642         //       documents in StarOffice 5.2 binary file format this property
643         //       will be sal_True.
644         { "TextDocInOOoFileFormat", sizeof("TextDocInOOoFileFormat")-1, 0,
645               &::getBooleanCppuType(),
646               beans::PropertyAttribute::MAYBEVOID, 0 },
647         // <--
648         { NULL, 0, 0, NULL, 0, 0 }
649     };
650     uno::Reference< beans::XPropertySet > xInfoSet(
651                 comphelper::GenericPropertySet_CreateInstance(
652                             new comphelper::PropertySetInfo( aInfoMap ) ) );
653 
654     // ---- get BuildId from parent container if available
655 
656     uno::Reference< container::XChild > xChild( xModelComp, uno::UNO_QUERY );
657     if( xChild.is() )
658     {
659         uno::Reference< beans::XPropertySet > xParentSet( xChild->getParent(), uno::UNO_QUERY );
660         if( xParentSet.is() )
661         {
662             uno::Reference< beans::XPropertySetInfo > xPropSetInfo( xParentSet->getPropertySetInfo() );
663             OUString sPropName( RTL_CONSTASCII_USTRINGPARAM("BuildId" ) );
664             if( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName(sPropName) )
665             {
666                 xInfoSet->setPropertyValue( sPropName, xParentSet->getPropertyValue(sPropName) );
667             }
668         }
669     }
670 
671     // try to get an XStatusIndicator from the Medium
672     uno::Reference<task::XStatusIndicator> xStatusIndicator;
673 
674     if (pDocSh->GetMedium())
675     {
676         SfxItemSet* pSet = pDocSh->GetMedium()->GetItemSet();
677         if (pSet)
678         {
679             const SfxUnoAnyItem* pItem = static_cast<const SfxUnoAnyItem*>(
680                 pSet->GetItem(SID_PROGRESS_STATUSBAR_CONTROL) );
681             if (pItem)
682             {
683                 pItem->GetValue() >>= xStatusIndicator;
684             }
685         }
686     }
687 
688 
689     // set progress range and start status indicator
690     sal_Int32 nProgressRange(1000000);
691     if (xStatusIndicator.is())
692     {
693         xStatusIndicator->start(SW_RESSTR(STR_STATSTR_SWGREAD), nProgressRange);
694     }
695     uno::Any aProgRange;
696     aProgRange <<= nProgressRange;
697     OUString sProgressRange(RTL_CONSTASCII_USTRINGPARAM("ProgressRange"));
698     xInfoSet->setPropertyValue(sProgressRange, aProgRange);
699 
700     ::comphelper::ComponentContext aContext( xServiceFactory );
701     Reference< container::XNameAccess > xLateInitSettings(
702         aContext.createComponent( "com.sun.star.document.NamedPropertyValues" ), UNO_QUERY_THROW );
703     beans::NamedValue aLateInitSettings(
704         ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LateInitSettings" ) ),
705         makeAny( xLateInitSettings )
706     );
707 
708     // prepare filter arguments, WARNING: the order is important!
709     Sequence<Any> aFilterArgs( 5 );
710     Any *pArgs = aFilterArgs.getArray();
711     *pArgs++ <<= xInfoSet;
712     *pArgs++ <<= xStatusIndicator;
713     *pArgs++ <<= xGraphicResolver;
714     *pArgs++ <<= xObjectResolver;
715     *pArgs++ <<= aLateInitSettings;
716 
717     Sequence<Any> aEmptyArgs( 3 );
718     pArgs = aEmptyArgs.getArray();
719     *pArgs++ <<= xInfoSet;
720     *pArgs++ <<= xStatusIndicator;
721 
722     // prepare for special modes
723     if( aOpt.IsFmtsOnly() )
724     {
725         sal_Int32 nCount =
726             (aOpt.IsFrmFmts() ? 1 : 0) +
727             (aOpt.IsPageDescs() ? 1 : 0) +
728             (aOpt.IsTxtFmts() ? 2 : 0) +
729             (aOpt.IsNumRules() ? 1 : 0);
730 
731         Sequence< OUString> aFamiliesSeq( nCount );
732         OUString *pSeq = aFamiliesSeq.getArray();
733         if( aOpt.IsFrmFmts() )
734             // SFX_STYLE_FAMILY_FRAME;
735             *pSeq++ = OUString::createFromAscii("FrameStyles");
736         if( aOpt.IsPageDescs() )
737             // SFX_STYLE_FAMILY_PAGE;
738             *pSeq++ = OUString::createFromAscii("PageStyles");
739         if( aOpt.IsTxtFmts() )
740         {
741             // (SFX_STYLE_FAMILY_CHAR|SFX_STYLE_FAMILY_PARA);
742             *pSeq++ = OUString::createFromAscii("CharacterStyles");
743             *pSeq++ = OUString::createFromAscii("ParagraphStyles");
744         }
745         if( aOpt.IsNumRules() )
746             // SFX_STYLE_FAMILY_PSEUDO;
747             *pSeq++ = OUString::createFromAscii("NumberingStyles");
748 
749         OUString sStyleInsertModeFamilies(
750                 RTL_CONSTASCII_USTRINGPARAM("StyleInsertModeFamilies"));
751         xInfoSet->setPropertyValue( sStyleInsertModeFamilies,
752                                     makeAny(aFamiliesSeq) );
753 
754         OUString sStyleInsertModeOverwrite(
755                 RTL_CONSTASCII_USTRINGPARAM("StyleInsertModeOverwrite"));
756         sal_Bool bTmp = !aOpt.IsMerge();
757         Any aAny;
758         aAny.setValue( &bTmp, ::getBooleanCppuType() );
759         xInfoSet->setPropertyValue( sStyleInsertModeOverwrite, aAny );
760     }
761     else if( bInsertMode )
762     {
763         const uno::Reference<text::XTextRange> xInsertTextRange =
764             SwXTextRange::CreateXTextRange(rDoc, *rPaM.GetPoint(), 0);
765         OUString sTextInsertModeRange(
766                 RTL_CONSTASCII_USTRINGPARAM("TextInsertModeRange"));
767         xInfoSet->setPropertyValue( sTextInsertModeRange,
768                                     makeAny(xInsertTextRange) );
769     }
770     else
771     {
772         rPaM.GetBound(true).nContent.Assign(0, 0);
773         rPaM.GetBound(false).nContent.Assign(0, 0);
774     }
775 
776     if( IsBlockMode() )
777     {
778         OUString sAutoTextMode(
779                 RTL_CONSTASCII_USTRINGPARAM("AutoTextMode"));
780         sal_Bool bTmp = sal_True;
781         Any aAny;
782         aAny.setValue( &bTmp, ::getBooleanCppuType() );
783         xInfoSet->setPropertyValue( sAutoTextMode, aAny );
784     }
785     if( IsOrganizerMode() )
786     {
787         OUString sOrganizerMode(
788                 RTL_CONSTASCII_USTRINGPARAM("OrganizerMode"));
789         sal_Bool bTmp = sal_True;
790         Any aAny;
791         aAny.setValue( &bTmp, ::getBooleanCppuType() );
792         xInfoSet->setPropertyValue( sOrganizerMode, aAny );
793     }
794 
795     // Set base URI
796     // there is ambiguity which medium should be used here
797     // for now the own medium has a preference
798     SfxMedium* pMedDescrMedium = pMedium ? pMedium : pDocSh->GetMedium();
799     OSL_ENSURE( pMedDescrMedium, "There is no medium to get MediaDescriptor from!\n" );
800 
801     ::rtl::OUString aBaseURL( rBaseURL );
802     OUString sPropName( RTL_CONSTASCII_USTRINGPARAM("BaseURI") );
803     xInfoSet->setPropertyValue( sPropName, makeAny( aBaseURL ) );
804 
805     // TODO/LATER: separate links from usual embedded objects
806     ::rtl::OUString StreamPath;
807     if( SFX_CREATE_MODE_EMBEDDED == rDoc.GetDocShell()->GetCreateMode() )
808     {
809         if ( pMedDescrMedium && pMedDescrMedium->GetItemSet() )
810         {
811             const SfxStringItem* pDocHierarchItem = static_cast<const SfxStringItem*>(
812                 pMedDescrMedium->GetItemSet()->GetItem(SID_DOC_HIERARCHICALNAME) );
813             if ( pDocHierarchItem )
814                 StreamPath = pDocHierarchItem->GetValue();
815         }
816         else
817         {
818             StreamPath = ::rtl::OUString::createFromAscii( "dummyObjectName" );
819         }
820 
821         if( StreamPath.getLength() )
822         {
823             sPropName = OUString(RTL_CONSTASCII_USTRINGPARAM("StreamRelPath"));
824             xInfoSet->setPropertyValue( sPropName, makeAny( StreamPath ) );
825         }
826     }
827 
828     rDoc.acquire(); // prevent deletion
829     sal_uInt32 nRet = 0;
830 
831     // save redline mode into import info property set
832     Any aAny;
833     sal_Bool bTmp;
834     OUString sShowChanges( RTL_CONSTASCII_USTRINGPARAM("ShowChanges") );
835     bTmp = IDocumentRedlineAccess::IsShowChanges( rDoc.GetRedlineMode() );
836     aAny.setValue( &bTmp, ::getBooleanCppuType() );
837     xInfoSet->setPropertyValue( sShowChanges, aAny );
838     OUString sRecordChanges( RTL_CONSTASCII_USTRINGPARAM("RecordChanges") );
839     bTmp = IDocumentRedlineAccess::IsRedlineOn(rDoc.GetRedlineMode());
840     aAny.setValue( &bTmp, ::getBooleanCppuType() );
841     xInfoSet->setPropertyValue( sRecordChanges, aAny );
842     OUString sRedlineProtectionKey( RTL_CONSTASCII_USTRINGPARAM("RedlineProtectionKey") );
843     aAny <<= rDoc.GetRedlinePassword();
844     xInfoSet->setPropertyValue( sRedlineProtectionKey, aAny );
845 
846 
847     // force redline mode to "none"
848     rDoc.SetRedlineMode_intern( nsRedlineMode_t::REDLINE_NONE );
849 
850     const sal_Bool bOASIS = ( SotStorage::GetVersion( xStorage ) > SOFFICE_FILEFORMAT_60 );
851     // --> OD 2004-08-10 #i28749# - set property <ShapePositionInHoriL2R>
852     {
853         const sal_Bool bShapePositionInHoriL2R = !bOASIS;
854         xInfoSet->setPropertyValue(
855                 OUString(RTL_CONSTASCII_USTRINGPARAM("ShapePositionInHoriL2R")),
856                 makeAny( bShapePositionInHoriL2R ) );
857     }
858     // <--
859     // --> OD 2007-12-19 #152540#
860     {
861         const sal_Bool bTextDocInOOoFileFormat = !bOASIS;
862         xInfoSet->setPropertyValue(
863                 OUString(RTL_CONSTASCII_USTRINGPARAM("TextDocInOOoFileFormat")),
864                 makeAny( bTextDocInOOoFileFormat ) );
865     }
866     // <--
867 
868     sal_uInt32 nWarnRDF = 0;
869     if ( !(IsOrganizerMode() || IsBlockMode() || aOpt.IsFmtsOnly() ||
870            bInsertMode) )
871     {
872         // RDF metadata - must be read before styles/content
873         // N.B.: embedded documents have their own manifest.rdf!
874         try
875         {
876             const uno::Reference<rdf::XDocumentMetadataAccess> xDMA(xModelComp,
877                 uno::UNO_QUERY_THROW);
878             const uno::Reference<rdf::XURI> xBaseURI( ::sfx2::createBaseURI(
879                 aContext.getUNOContext(), xStorage, aBaseURL, StreamPath) );
880             const uno::Reference<task::XInteractionHandler> xHandler(
881                 pDocSh->GetMedium()->GetInteractionHandler() );
882             xDMA->loadMetadataFromStorage(xStorage, xBaseURI, xHandler);
883         }
884         catch (lang::WrappedTargetException & e)
885         {
886             ucb::InteractiveAugmentedIOException iaioe;
887             if (e.TargetException >>= iaioe)
888             {
889                 // import error that was not ignored by InteractionHandler!
890                 nWarnRDF = ERR_SWG_READ_ERROR;
891             }
892             else
893             {
894                 nWarnRDF = WARN_SWG_FEATURES_LOST; // uhh... something wrong?
895             }
896         }
897         catch (uno::Exception &)
898         {
899             nWarnRDF = WARN_SWG_FEATURES_LOST; // uhh... something went wrong?
900         }
901     }
902 
903     // read storage streams
904 
905     // #i103539#: always read meta.xml for generator
906     sal_uInt32 const nWarn = ReadThroughComponent(
907         xStorage, xModelComp, "meta.xml", "Meta.xml", xServiceFactory,
908         (bOASIS ? "com.sun.star.comp.Writer.XMLOasisMetaImporter"
909                 : "com.sun.star.comp.Writer.XMLMetaImporter"),
910         aEmptyArgs, rName, sal_False );
911 
912     sal_uInt32 nWarn2 = 0;
913     if( !(IsOrganizerMode() || IsBlockMode() || aOpt.IsFmtsOnly() ||
914           bInsertMode) )
915     {
916         nWarn2 = ReadThroughComponent(
917             xStorage, xModelComp, "settings.xml", NULL, xServiceFactory,
918             (bOASIS ? "com.sun.star.comp.Writer.XMLOasisSettingsImporter"
919                     : "com.sun.star.comp.Writer.XMLSettingsImporter"),
920             aFilterArgs, rName, sal_False );
921     }
922 
923     nRet = ReadThroughComponent(
924         xStorage, xModelComp, "styles.xml", NULL, xServiceFactory,
925         (bOASIS ? "com.sun.star.comp.Writer.XMLOasisStylesImporter"
926                 : "com.sun.star.comp.Writer.XMLStylesImporter"),
927         aFilterArgs, rName, sal_True );
928 
929     if( !nRet && !(IsOrganizerMode() || aOpt.IsFmtsOnly()) )
930         nRet = ReadThroughComponent(
931            xStorage, xModelComp, "content.xml", "Content.xml", xServiceFactory,
932             (bOASIS ? "com.sun.star.comp.Writer.XMLOasisContentImporter"
933                     : "com.sun.star.comp.Writer.XMLContentImporter"),
934            aFilterArgs, rName, sal_True );
935 
936     if( !(IsOrganizerMode() || IsBlockMode() || bInsertMode ||
937           aOpt.IsFmtsOnly() ) )
938     {
939         OUString sStreamName( RTL_CONSTASCII_USTRINGPARAM("layout-cache") );
940         try
941         {
942             uno::Reference < io::XStream > xStm = xStorage->openStreamElement( sStreamName, embed::ElementModes::READ );
943             SvStream* pStrm2 = utl::UcbStreamHelper::CreateStream( xStm );
944             if( !pStrm2->GetError() )
945                 rDoc.ReadLayoutCache( *pStrm2 );
946             delete pStrm2;
947         }
948         catch ( uno::Exception& )
949         {
950         }
951     }
952 
953     // Notify Math objects
954     if( bInsertMode )
955         rDoc.PrtOLENotify( sal_False );
956     else if ( rDoc.IsOLEPrtNotifyPending() )
957         rDoc.PrtOLENotify( sal_True );
958 
959     nRet = nRet ? nRet : (nWarn ? nWarn : (nWarn2 ? nWarn2 : nWarnRDF ) );
960 
961     aOpt.ResetAllFmtsOnly();
962 
963     // redline password
964     aAny = xInfoSet->getPropertyValue( sRedlineProtectionKey );
965     Sequence<sal_Int8> aKey;
966     aAny >>= aKey;
967     rDoc.SetRedlinePassword( aKey );
968 
969     // restore redline mode from import info property set
970     sal_Int16 nRedlineMode = nsRedlineMode_t::REDLINE_SHOW_INSERT;
971     aAny = xInfoSet->getPropertyValue( sShowChanges );
972     if ( *(sal_Bool*)aAny.getValue() )
973         nRedlineMode |= nsRedlineMode_t::REDLINE_SHOW_DELETE;
974     aAny = xInfoSet->getPropertyValue( sRecordChanges );
975     if ( *(sal_Bool*)aAny.getValue() || (aKey.getLength() > 0) )
976         nRedlineMode |= nsRedlineMode_t::REDLINE_ON;
977     else
978         nRedlineMode |= nsRedlineMode_t::REDLINE_NONE;
979 
980     // ... restore redline mode
981     // (First set bogus mode to make sure the mode in SetRedlineMode()
982     //  is different from its previous mode.)
983     rDoc.SetRedlineMode_intern((RedlineMode_t)( ~nRedlineMode ));
984     rDoc.SetRedlineMode( (RedlineMode_t)( nRedlineMode ));
985 
986     // #103728# move Pam into valid content
987     lcl_EnsureValidPam( rPaM );
988 
989     if( pGraphicHelper )
990         SvXMLGraphicHelper::Destroy( pGraphicHelper );
991     xGraphicResolver = 0;
992     if( pObjectHelper )
993         SvXMLEmbeddedObjectHelper::Destroy( pObjectHelper );
994     xObjectResolver = 0;
995     rDoc.release();
996 
997     if ( !bOASIS )
998     {
999         // --> OD 2005-09-06 #i44177# - assure that for documents in OpenOffice.org
1000         // file format the relation between outline numbering rule and styles is
1001         // filled-up accordingly.
1002         // Note: The OpenOffice.org file format, which has no content that applies
1003         //       a certain style, which is related to the outline numbering rule,
1004         //       has lost the information, that this certain style is related to
1005         //       the outline numbering rule.
1006         // --> OD 2008-12-17 #i70748# - only for templates
1007         if ( pMedium && pMedium->GetFilter() &&
1008             pMedium->GetFilter()->IsOwnTemplateFormat() )
1009         {
1010             lcl_AdjustOutlineStylesForOOo( rDoc );
1011         }
1012         // <--
1013         // Fix #i58251#: Unfortunately is the static default different to SO7 behavior,
1014         // so we have to set a dynamic default after importing SO7
1015         rDoc.SetDefault( SfxBoolItem( RES_ROW_SPLIT, sal_False ) );
1016     }
1017     // <--
1018 
1019     rDoc.PropagateOutlineRule();
1020 
1021     // --> OD 2006-03-14 #i62875#
1022     if ( rDoc.get(IDocumentSettingAccess::DO_NOT_CAPTURE_DRAW_OBJS_ON_PAGE) && !docfunc::ExistsDrawObjs( rDoc ) )
1023     {
1024         rDoc.set(IDocumentSettingAccess::DO_NOT_CAPTURE_DRAW_OBJS_ON_PAGE, false);
1025     }
1026     // <--
1027 
1028     // --> OD 2006-02-22 #b6382898#
1029     // Convert all instances of <SdrOle2Obj> into <SdrGrafObj>, because the
1030     // Writer doesn't support such objects.
1031     lcl_ConvertSdrOle2ObjsToSdrGrafObjs( rDoc );
1032     // <--
1033 
1034     // set BuildId on XModel for later OLE object loading
1035     if( xInfoSet.is() )
1036     {
1037         uno::Reference< beans::XPropertySet > xModelSet( xModelComp, uno::UNO_QUERY );
1038         if( xModelSet.is() )
1039         {
1040             uno::Reference< beans::XPropertySetInfo > xModelSetInfo( xModelSet->getPropertySetInfo() );
1041             OUString sName( RTL_CONSTASCII_USTRINGPARAM("BuildId" ) );
1042             if( xModelSetInfo.is() && xModelSetInfo->hasPropertyByName(sName) )
1043             {
1044                 xModelSet->setPropertyValue( sName, xInfoSet->getPropertyValue(sName) );
1045             }
1046         }
1047     }
1048 
1049     if (xStatusIndicator.is())
1050     {
1051         xStatusIndicator->end();
1052     }
1053 
1054     rDoc.GetIStyleAccess().clearCaches(); // Clear Automatic-Style-Caches(shared_pointer!)
1055     return nRet;
1056 }
1057 
1058     // read the sections of the document, which is equal to the medium.
1059     // returns the count of it
GetSectionList(SfxMedium & rMedium,SvStrings & rStrings) const1060 sal_uInt16 XMLReader::GetSectionList( SfxMedium& rMedium,
1061                                     SvStrings& rStrings ) const
1062 {
1063     uno::Reference< lang::XMultiServiceFactory > xServiceFactory =
1064             comphelper::getProcessServiceFactory();
1065     ASSERT( xServiceFactory.is(),
1066             "XMLReader::Read: got no service manager" );
1067     uno::Reference < embed::XStorage > xStg2;
1068     if( xServiceFactory.is() && ( xStg2 = rMedium.GetStorage() ).is() )
1069     {
1070         try
1071         {
1072 
1073             xml::sax::InputSource aParserInput;
1074             OUString sDocName( RTL_CONSTASCII_USTRINGPARAM( "content.xml" ) );
1075             aParserInput.sSystemId = sDocName;
1076 
1077             uno::Reference < io::XStream > xStm = xStg2->openStreamElement( sDocName, embed::ElementModes::READ );
1078             aParserInput.aInputStream = xStm->getInputStream();
1079 
1080             // get parser
1081             uno::Reference< XInterface > xXMLParser = xServiceFactory->createInstance(
1082                 OUString::createFromAscii("com.sun.star.xml.sax.Parser") );
1083             ASSERT( xXMLParser.is(),
1084                 "XMLReader::Read: com.sun.star.xml.sax.Parser service missing" );
1085             if( xXMLParser.is() )
1086             {
1087                 // get filter
1088                 // #110680#
1089                 uno::Reference< xml::sax::XDocumentHandler > xFilter = new SwXMLSectionList( xServiceFactory, rStrings );
1090 
1091                 // connect parser and filter
1092                 uno::Reference< xml::sax::XParser > xParser( xXMLParser, UNO_QUERY );
1093                 xParser->setDocumentHandler( xFilter );
1094 
1095                 // parse
1096                 xParser->parseStream( aParserInput );
1097             }
1098         }
1099         catch( xml::sax::SAXParseException& )
1100         {
1101             // re throw ?
1102         }
1103         catch( xml::sax::SAXException& )
1104         {
1105             // re throw ?
1106         }
1107         catch( io::IOException& )
1108         {
1109             // re throw ?
1110         }
1111         catch( packages::WrongPasswordException& )
1112         {
1113             // re throw ?
1114         }
1115     }
1116     return rStrings.Count();
1117 }
1118