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