xref: /trunk/main/sw/source/filter/xml/xmltexte.cxx (revision 870262e3)
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 #include <sot/clsids.hxx>
28 #include <com/sun/star/embed/XEmbedObjectCreator.hpp>
29 #include <com/sun/star/embed/XEmbeddedObject.hpp>
30 #include <com/sun/star/embed/XLinkageSupport.hpp>
31 #include <com/sun/star/embed/EmbedStates.hpp>
32 #include <com/sun/star/embed/XClassifiedObject.hpp>
33 #include <com/sun/star/embed/Aspects.hpp>
34 #include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
35 #include <com/sun/star/document/XEmbeddedObjectSupplier.hpp>
36 #include <xmloff/families.hxx>
37 #include <xmloff/xmlnmspe.hxx>
38 #include <xmloff/xmltoken.hxx>
39 #include <xmloff/txtprmap.hxx>
40 
41 #include <svx/svdobj.hxx>
42 #include <doc.hxx>
43 #include <ndole.hxx>
44 #include <fmtcntnt.hxx>
45 #include <unostyle.hxx>
46 #include <unoframe.hxx>
47 #include <ndgrf.hxx>
48 #include "xmlexp.hxx"
49 #include "xmltexte.hxx"
50 #include <tools/urlobj.hxx>
51 #include <SwAppletImpl.hxx>
52 
53 #define _SVSTDARR_ULONGS
54 #include <svl/svstdarr.hxx>
55 #include "svl/urihelper.hxx"
56 #include <sfx2/frmdescr.hxx>
57 #include <SwStyleNameMapper.hxx>
58 
59 
60 using ::rtl::OUString;
61 using ::rtl::OUStringBuffer;
62 using namespace ::com::sun::star;
63 using namespace ::com::sun::star::uno;
64 using namespace ::com::sun::star::style;
65 using namespace ::com::sun::star::beans;
66 using namespace ::com::sun::star::lang;
67 using namespace ::com::sun::star::document;
68 using namespace ::com::sun::star::io;
69 using namespace ::xmloff::token;
70 
71 enum SvEmbeddedObjectTypes
72 {
73     SV_EMBEDDED_OWN,
74     SV_EMBEDDED_OUTPLACE,
75     SV_EMBEDDED_APPLET,
76     SV_EMBEDDED_PLUGIN,
77     SV_EMBEDDED_FRAME
78 };
79 
80 const sal_Char sObjectReplacements[] = "ObjectReplacements/";
81 
82 // ---------------------------------------------------------------------
83 
GetNoTxtNode(const Reference<XPropertySet> & rPropSet) const84 SwNoTxtNode *SwXMLTextParagraphExport::GetNoTxtNode(
85 	const Reference < XPropertySet >& rPropSet ) const
86 {
87 	Reference<XUnoTunnel> xCrsrTunnel( rPropSet, UNO_QUERY );
88 	ASSERT( xCrsrTunnel.is(), "missing XUnoTunnel for embedded" );
89 	SwXFrame *pFrame = reinterpret_cast< SwXFrame * >(
90 				sal::static_int_cast< sal_IntPtr >( xCrsrTunnel->getSomething( SwXFrame::getUnoTunnelId() )));
91 	ASSERT( pFrame, "SwXFrame missing" );
92 	SwFrmFmt *pFrmFmt = pFrame->GetFrmFmt();
93 	const SwFmtCntnt& rCntnt = pFrmFmt->GetCntnt();
94 	const SwNodeIndex *pNdIdx = rCntnt.GetCntntIdx();
95 	return	pNdIdx->GetNodes()[pNdIdx->GetIndex() + 1]->GetNoTxtNode();
96 }
97 
exportStyleContent(const Reference<XStyle> & rStyle)98 void SwXMLTextParagraphExport::exportStyleContent(
99 		const Reference< XStyle > & rStyle )
100 {
101 
102 	const SwXStyle* pStyle = 0;
103 	Reference<XUnoTunnel> xStyleTunnel( rStyle, UNO_QUERY);
104 	if( xStyleTunnel.is() )
105 	{
106 		pStyle = reinterpret_cast< SwXStyle * >(
107 				sal::static_int_cast< sal_IntPtr >( xStyleTunnel->getSomething( SwXStyle::getUnoTunnelId() )));
108 	}
109 	if( pStyle && SFX_STYLE_FAMILY_PARA == pStyle->GetFamily() )
110 	{
111 		const SwDoc *pDoc = pStyle->GetDoc();
112 		const SwTxtFmtColl *pColl =
113 			pDoc->FindTxtFmtCollByName( pStyle->GetStyleName() );
114 		ASSERT( pColl, "There is the text collection?" );
115 		if( pColl && RES_CONDTXTFMTCOLL == pColl->Which() )
116 		{
117 			const SwFmtCollConditions& rConditions =
118 				((const SwConditionTxtFmtColl *)pColl)->GetCondColls();
119 			for( sal_uInt16 i=0; i < rConditions.Count(); i++ )
120 			{
121 				const SwCollCondition& rCond = *rConditions[i];
122 
123 				enum XMLTokenEnum eFunc = XML_TOKEN_INVALID;
124 				OUStringBuffer sBuffer( 20 );
125 				switch( rCond.GetCondition() )
126 				{
127 				case PARA_IN_LIST:
128 					eFunc = XML_LIST_LEVEL;
129 					sBuffer.append( (sal_Int32)(rCond.GetSubCondition()+1) );
130 					break;
131 				case PARA_IN_OUTLINE:
132 					eFunc = XML_OUTLINE_LEVEL;
133 					sBuffer.append( (sal_Int32)(rCond.GetSubCondition()+1) );
134 					break;
135 				case PARA_IN_FRAME:
136 					eFunc = XML_TEXT_BOX;
137 					break;
138 				case PARA_IN_TABLEHEAD:
139 					eFunc = XML_TABLE_HEADER;
140 					break;
141 				case PARA_IN_TABLEBODY:
142 					eFunc = XML_TABLE;
143 					break;
144 				case PARA_IN_SECTION:
145 					eFunc = XML_SECTION;
146 					break;
147 				case PARA_IN_FOOTENOTE:
148 					eFunc = XML_FOOTNOTE;
149 					break;
150 				case PARA_IN_FOOTER:
151 					eFunc = XML_FOOTER;
152 					break;
153 				case PARA_IN_HEADER:
154 					eFunc = XML_HEADER;
155 					break;
156 				case PARA_IN_ENDNOTE:
157 					eFunc = XML_ENDNOTE;
158 					break;
159 				}
160 				OUString sVal( sBuffer.makeStringAndClear() );
161 
162 				DBG_ASSERT( eFunc != XML_TOKEN_INVALID,
163                             "SwXMLExport::ExportFmt: unknown condition" );
164 				if( eFunc != XML_TOKEN_INVALID )
165 				{
166 					sBuffer.append( GetXMLToken(eFunc) );
167 					sBuffer.append( (sal_Unicode)'(' );
168 					sBuffer.append( (sal_Unicode)')' );
169 					if( sVal.getLength() )
170 					{
171 						sBuffer.append( (sal_Unicode)'=' );
172 						sBuffer.append( sVal );
173 					}
174 
175 					GetExport().AddAttribute( XML_NAMESPACE_STYLE,
176 								XML_CONDITION,
177 								sBuffer.makeStringAndClear() );
178 					String aString;
179 					SwStyleNameMapper::FillProgName(
180 									rCond.GetTxtFmtColl()->GetName(),
181 									aString,
182 									nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL,
183 									sal_True);
184 					aString = GetExport().EncodeStyleName( aString );
185 					GetExport().AddAttribute( XML_NAMESPACE_STYLE,
186 								XML_APPLY_STYLE_NAME, aString );
187 					SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_STYLE,
188 											  XML_MAP, sal_True, sal_True );
189 				}
190 			}
191 		}
192 	}
193 }
194 
SwXMLTextParagraphExport(SwXMLExport & rExp,SvXMLAutoStylePoolP & _rAutoStylePool)195 SwXMLTextParagraphExport::SwXMLTextParagraphExport(
196 		SwXMLExport& rExp,
197 	 	SvXMLAutoStylePoolP& _rAutoStylePool ) :
198 	XMLTextParagraphExport( rExp, _rAutoStylePool ),
199 	sTextTable( RTL_CONSTASCII_USTRINGPARAM( "TextTable" ) ),
200 	sEmbeddedObjectProtocol( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.EmbeddedObject:" ) ),
201 	sGraphicObjectProtocol( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.GraphicObject:" ) ),
202 	aAppletClassId( SO3_APPLET_CLASSID ),
203 	aPluginClassId( SO3_PLUGIN_CLASSID ),
204 	aIFrameClassId( SO3_IFRAME_CLASSID ),
205 	aOutplaceClassId( SO3_OUT_CLASSID )
206 {
207 }
208 
~SwXMLTextParagraphExport()209 SwXMLTextParagraphExport::~SwXMLTextParagraphExport()
210 {
211 }
212 
setTextEmbeddedGraphicURL(const Reference<XPropertySet> & rPropSet,OUString & rURL) const213 void SwXMLTextParagraphExport::setTextEmbeddedGraphicURL(
214     const Reference< XPropertySet >& rPropSet,
215     OUString& rURL ) const
216     {
217     if ( !rURL.getLength() )
218         return;
219 
220     SwGrfNode *pGrfNd = GetNoTxtNode( rPropSet )->GetGrfNode();
221     if ( !pGrfNd->IsGrfLink() )
222     {
223         // Apply new embedded stream name, only if graphic node already has one.
224         // - The saving of recovery information triggers this method, but for a newly created
225         //   document the new embedded stream name shall not be applied.
226         // - The saving of a newly created document to own format (ODF) triggers this method,
227         //   but the embedded stream name is not needed as its original inserted data is still in use.
228         if ( pGrfNd->HasEmbeddedStreamName() )
229         {
230             String aNewURL( RTL_CONSTASCII_STRINGPARAM( "vnd.sun.star.Package:" ) );
231             aNewURL += String( rURL );
232             pGrfNd->ApplyNewEmbeddedStreamName( aNewURL );
233         }
234 
235         // #i15411# save-as will swap all graphics in; we need to swap
236         // them out again, to prevent excessive memory use
237         pGrfNd->SwapOut();
238     }
239 }
240 
241 
lcl_addURL(SvXMLExport & rExport,const String & rURL,sal_Bool bToRel=sal_True)242 static void lcl_addURL ( SvXMLExport &rExport, const String &rURL,
243 						 sal_Bool bToRel = sal_True )
244 {
245     String sRelURL;
246 
247 	if( bToRel && (rURL.Len() > 0) )
248     sRelURL = URIHelper::simpleNormalizedMakeRelative(rExport.GetOrigFileName(),
249               rURL);
250 	else
251 		sRelURL = rURL;
252 
253     if (sRelURL.Len())
254     {
255         rExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_HREF, sRelURL );
256         rExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
257         rExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED );
258         rExport.AddAttribute ( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD );
259     }
260 }
261 
lcl_addAspect(const svt::EmbeddedObjectRef & rObj,const XMLPropertyState ** pStates,const UniReference<XMLPropertySetMapper> & rMapper)262 void lcl_addAspect(
263 		const svt::EmbeddedObjectRef& rObj,
264 		const XMLPropertyState **pStates,
265 		const UniReference < XMLPropertySetMapper >& rMapper )
266 {
267 	{
268 		sal_Int64 nAspect = rObj.GetViewAspect();
269 
270 		if ( nAspect )
271 		{
272 			*pStates = new XMLPropertyState( rMapper->FindEntryIndex( CTF_OLE_DRAW_ASPECT ), uno::makeAny( nAspect ) );
273 			pStates++;
274 		}
275 	}
276 }
277 
lcl_addOutplaceProperties(const svt::EmbeddedObjectRef & rObj,const XMLPropertyState ** pStates,const UniReference<XMLPropertySetMapper> & rMapper)278 void lcl_addOutplaceProperties(
279 		const svt::EmbeddedObjectRef& rObj,
280 		const XMLPropertyState **pStates,
281 		const UniReference < XMLPropertySetMapper >& rMapper )
282 {
283 	{
284         MapMode aMode( MAP_100TH_MM ); // the API expects this map mode for the embedded objects
285 		Size aSize = rObj.GetSize( &aMode ); // get the size in the requested map mode
286 
287         if( aSize.Width() && aSize.Height() )
288 		{
289 			Any aAny;
290             //aAny <<= (sal_Int32)rVisArea.Left();
291             aAny <<= 0L;
292 			*pStates = new XMLPropertyState( rMapper->FindEntryIndex( CTF_OLE_VIS_AREA_LEFT ), aAny );
293 			pStates++;
294 
295             //aAny <<= (sal_Int32)rVisArea.Top();
296             aAny <<= 0L;
297 			*pStates = new XMLPropertyState( rMapper->FindEntryIndex( CTF_OLE_VIS_AREA_TOP ), aAny );
298 			pStates++;
299 
300             //aAny <<= (sal_Int32)rVisArea.GetWidth();
301             aAny <<= (sal_Int32)aSize.Width();
302 			*pStates = new XMLPropertyState( rMapper->FindEntryIndex( CTF_OLE_VIS_AREA_WIDTH ), aAny );
303 			pStates++;
304 
305             //aAny <<= (sal_Int32)rVisArea.GetHeight();
306             aAny <<= (sal_Int32)aSize.Height();
307 			*pStates = new XMLPropertyState( rMapper->FindEntryIndex( CTF_OLE_VIS_AREA_HEIGHT ), aAny );
308 			pStates++;
309 		}
310 	}
311 }
312 
lcl_addFrameProperties(const uno::Reference<embed::XEmbeddedObject> & xObj,const XMLPropertyState ** pStates,const UniReference<XMLPropertySetMapper> & rMapper)313 void lcl_addFrameProperties(
314         const uno::Reference < embed::XEmbeddedObject >& xObj,
315 		const XMLPropertyState **pStates,
316 		const UniReference < XMLPropertySetMapper >& rMapper )
317 {
318     if ( !::svt::EmbeddedObjectRef::TryRunningState( xObj ) )
319         return;
320 
321     uno::Reference < beans::XPropertySet > xSet( xObj->getComponent(), uno::UNO_QUERY );
322     if ( !xSet.is() )
323         return;
324 
325     ::rtl::OUString aURL;
326     Any aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameURL") );
327     aAny >>= aURL;
328 
329     ::rtl::OUString aName;
330     aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameName") );
331     aAny >>= aName;
332 
333     sal_Bool bIsAutoScroll = sal_False, bIsScrollingMode;
334     aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameIsAutoScroll") );
335     aAny >>= bIsAutoScroll;
336     if ( !bIsAutoScroll )
337     {
338         aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameIsScrollingMode") );
339         aAny >>= bIsScrollingMode;
340     }
341 
342     sal_Bool bIsBorderSet, bIsAutoBorder = sal_False;
343     aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameIsAutoBorder") );
344     aAny >>= bIsAutoBorder;
345     if ( !bIsAutoBorder )
346     {
347         aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameIsBorder") );
348         aAny >>= bIsBorderSet;
349     }
350 
351     sal_Int32 nWidth, nHeight;
352     aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameMarginWidth") );
353     aAny >>= nWidth;
354     aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameMarginHeight") );
355     aAny >>= nHeight;
356 
357     if( !bIsAutoScroll )
358 	{
359         Any aAny2( &bIsScrollingMode, ::getBooleanCppuType() );
360 		*pStates = new XMLPropertyState( rMapper->FindEntryIndex( CTF_FRAME_DISPLAY_SCROLLBAR ), aAny2 );
361 		pStates++;
362 	}
363     if( !bIsAutoBorder )
364 	{
365         Any aAny2( &bIsBorderSet, ::getBooleanCppuType() );
366 		*pStates = new XMLPropertyState( rMapper->FindEntryIndex( CTF_FRAME_DISPLAY_BORDER ), aAny2 );
367 		pStates++;
368 	}
369     if( SIZE_NOT_SET != nWidth )
370 	{
371 		Any aAny2;
372         aAny <<= nWidth;
373 		*pStates = new XMLPropertyState( rMapper->FindEntryIndex( CTF_FRAME_MARGIN_HORI ), aAny2 );
374 		pStates++;
375 	}
376     if( SIZE_NOT_SET != nHeight )
377 	{
378 		Any aAny2;
379         aAny <<= nHeight;
380 		*pStates = new XMLPropertyState( rMapper->FindEntryIndex( CTF_FRAME_MARGIN_VERT ), aAny2 );
381 		pStates++;
382 	}
383 }
384 
_collectTextEmbeddedAutoStyles(const Reference<XPropertySet> & rPropSet)385 void SwXMLTextParagraphExport::_collectTextEmbeddedAutoStyles(
386 		const Reference < XPropertySet > & rPropSet )
387 {
388 	SwOLENode *pOLENd = GetNoTxtNode( rPropSet )->GetOLENode();
389 	svt::EmbeddedObjectRef& rObjRef = pOLENd->GetOLEObj().GetObject();
390     if( !rObjRef.is() )
391 		return;
392 
393 	const XMLPropertyState *aStates[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
394     SvGlobalName aClassId( rObjRef->getClassID() );
395 
396     if( aIFrameClassId == aClassId )
397 	{
398         lcl_addFrameProperties( rObjRef.GetObject(), aStates,
399 		   	GetAutoFramePropMapper()->getPropertySetMapper() );
400 	}
401     else if ( !SotExchange::IsInternal( aClassId ) )
402     {
403         lcl_addOutplaceProperties( rObjRef, aStates,
404 		   	GetAutoFramePropMapper()->getPropertySetMapper() );
405     }
406 
407     lcl_addAspect( rObjRef, aStates,
408 	   	GetAutoFramePropMapper()->getPropertySetMapper() );
409 
410 	Add( XML_STYLE_FAMILY_TEXT_FRAME, rPropSet, aStates );
411 
412 	const XMLPropertyState **pStates = aStates;
413 	while( *pStates )
414 	{
415 		delete *pStates;
416 		pStates++;
417 	}
418 }
419 
_exportTextEmbedded(const Reference<XPropertySet> & rPropSet,const Reference<XPropertySetInfo> & rPropSetInfo)420 void SwXMLTextParagraphExport::_exportTextEmbedded(
421 		const Reference < XPropertySet > & rPropSet,
422 		const Reference < XPropertySetInfo > & rPropSetInfo )
423 {
424 	SwOLENode *pOLENd = GetNoTxtNode( rPropSet )->GetOLENode();
425 	SwOLEObj& rOLEObj = pOLENd->GetOLEObj();
426 	svt::EmbeddedObjectRef& rObjRef = rOLEObj.GetObject();
427     if( !rObjRef.is() )
428 		return;
429 
430     SvGlobalName aClassId( rObjRef->getClassID() );
431 
432     SvEmbeddedObjectTypes nType = SV_EMBEDDED_OWN;
433 	if( aPluginClassId == aClassId )
434 	{
435         nType = SV_EMBEDDED_PLUGIN;
436 	}
437 	else if( aAppletClassId == aClassId )
438 	{
439         nType = SV_EMBEDDED_APPLET;
440 	}
441 	else if( aIFrameClassId == aClassId )
442 	{
443         nType = SV_EMBEDDED_FRAME;
444 	}
445     else if ( !SotExchange::IsInternal( aClassId ) )
446 	{
447         nType = SV_EMBEDDED_OUTPLACE;
448 	}
449 
450     enum XMLTokenEnum eElementName = XML__UNKNOWN_;
451     SvXMLExport &rXMLExport = GetExport();
452 
453 	// First the stuff common to each of Applet/Plugin/Floating Frame
454 	OUString sStyle;
455 	Any aAny;
456 	if( rPropSetInfo->hasPropertyByName( sFrameStyleName ) )
457 	{
458 		aAny = rPropSet->getPropertyValue( sFrameStyleName );
459 		aAny >>= sStyle;
460 	}
461 
462 	const XMLPropertyState *aStates[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
463 	switch( nType )
464 	{
465 	case SV_EMBEDDED_FRAME:
466         lcl_addFrameProperties( rObjRef.GetObject(), aStates,
467 			GetAutoFramePropMapper()->getPropertySetMapper() );
468 		break;
469 	case SV_EMBEDDED_OUTPLACE:
470         lcl_addOutplaceProperties( rObjRef, aStates,
471 			GetAutoFramePropMapper()->getPropertySetMapper() );
472 		break;
473 	default:
474 		;
475 	}
476 
477     lcl_addAspect( rObjRef, aStates,
478 		GetAutoFramePropMapper()->getPropertySetMapper() );
479 
480 	OUString sAutoStyle( sStyle );
481 	sAutoStyle = Find( XML_STYLE_FAMILY_TEXT_FRAME, rPropSet, sStyle,
482 					   aStates );
483 	const XMLPropertyState **pStates = aStates;
484 	while( *pStates )
485 	{
486 		delete *pStates;
487 		pStates++;
488 	}
489 
490 	if( sAutoStyle.getLength() )
491 		rXMLExport.AddAttribute( XML_NAMESPACE_DRAW, XML_STYLE_NAME, sAutoStyle );
492 	addTextFrameAttributes( rPropSet, sal_False );
493 
494 	SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_DRAW,
495 							  XML_FRAME, sal_False, sal_True );
496 
497 	switch (nType)
498 	{
499 	case SV_EMBEDDED_OUTPLACE:
500 	case SV_EMBEDDED_OWN:
501 		if( (rXMLExport.getExportFlags() & EXPORT_EMBEDDED) == 0 )
502 		{
503 			OUString sURL;
504 
505 			sal_Bool bIsOwnLink = sal_False;
506 			if( SV_EMBEDDED_OWN == nType )
507 			{
508 				try
509 				{
510 					uno::Reference< embed::XLinkageSupport > xLinkage( rObjRef.GetObject(), uno::UNO_QUERY );
511 					bIsOwnLink = xLinkage.is() && xLinkage->isLink();
512 					if ( bIsOwnLink )
513 						sURL = xLinkage->getLinkURL();
514 				}
515 				catch( uno::Exception )
516 				{
517 					// TODO/LATER: error handling
518 					DBG_ERROR( "Link detection or retrieving of the URL of OOo link is failed!\n" );
519 				}
520 			}
521 
522 			if ( !bIsOwnLink )
523 			{
524 				sURL = OUString( sEmbeddedObjectProtocol );
525                 sURL += rOLEObj.GetCurrentPersistName();
526 			}
527 
528 			sURL = GetExport().AddEmbeddedObject( sURL );
529 			lcl_addURL( rXMLExport, sURL, sal_False );
530 		}
531 		if( SV_EMBEDDED_OWN == nType && pOLENd->GetChartTblName().Len() )
532 		{
533 			OUString sRange( pOLENd->GetChartTblName() );
534 			OUStringBuffer aBuffer( sRange.getLength() + 2 );
535 			for( sal_Int32 i=0; i < sRange.getLength(); i++ )
536 			{
537 				sal_Unicode c = sRange[i];
538 				switch( c  )
539 				{
540 					case ' ':
541 					case '.':
542 					case '\'':
543 					case '\\':
544 						if( !aBuffer.getLength() )
545 						{
546 							aBuffer.append( (sal_Unicode)'\'' );
547 							aBuffer.append( sRange.copy( 0, i ) );
548 						}
549 						if( '\'' == c || '\\' == c )
550 							aBuffer.append( (sal_Unicode)'\\' );
551 						// no break!
552 					default:
553 						if( aBuffer.getLength() )
554 							aBuffer.append( c );
555 				}
556 			}
557 			if( aBuffer.getLength() )
558 			{
559 				aBuffer.append( (sal_Unicode)'\'' );
560 				sRange = aBuffer.makeStringAndClear();
561 			}
562 
563 			rXMLExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NOTIFY_ON_UPDATE_OF_RANGES,
564 			sRange );
565 		}
566 		eElementName = SV_EMBEDDED_OUTPLACE==nType ? XML_OBJECT_OLE
567 												   : XML_OBJECT;
568 		break;
569 	case SV_EMBEDDED_APPLET:
570 		{
571 			// It's an applet!
572             if( svt::EmbeddedObjectRef::TryRunningState( rObjRef.GetObject() ) )
573             {
574                 uno::Reference < beans::XPropertySet > xSet( rObjRef->getComponent(), uno::UNO_QUERY );
575                 ::rtl::OUString aStr;
576                 Any aAny2 = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("AppletCodeBase") );
577                 aAny2 >>= aStr;
578                 if (aStr.getLength() )
579                     lcl_addURL(rXMLExport, aStr);
580 
581                 aAny2 = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("AppletName") );
582                 aAny2 >>= aStr;
583                 if (aStr.getLength())
584                     rXMLExport.AddAttribute( XML_NAMESPACE_DRAW, XML_APPLET_NAME, aStr );
585 
586                 aAny2 = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("AppletCode") );
587                 aAny2 >>= aStr;
588                 rXMLExport.AddAttribute( XML_NAMESPACE_DRAW, XML_CODE, aStr );
589 
590                 sal_Bool bScript = sal_False;
591                 aAny2 = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("AppletIsScript") );
592                 aAny2 >>= bScript;
593                 rXMLExport.AddAttribute( XML_NAMESPACE_DRAW, XML_MAY_SCRIPT, bScript ? XML_TRUE : XML_FALSE );
594 
595                 uno::Sequence < beans::PropertyValue > aProps;
596                 aAny2 = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("AppletCommands") );
597                 aAny2 >>= aProps;
598 
599                 sal_Int32 i = aProps.getLength();
600                 while ( i > 0 )
601                 {
602                     beans::PropertyValue& aProp = aProps[--i];
603                     sal_uInt16 nType2 = SwApplet_Impl::GetOptionType( aProp.Name, sal_True );
604                     if ( nType2 == SWHTML_OPTTYPE_TAG)
605                     {
606                         ::rtl::OUString aStr2;
607                         aProp.Value >>= aStr2;
608                         rXMLExport.AddAttribute( XML_NAMESPACE_DRAW, aProp.Name, aStr2);
609                     }
610                 }
611 
612                 eElementName = XML_APPLET;
613             }
614 		}
615 		break;
616 	case SV_EMBEDDED_PLUGIN:
617 		{
618 			// It's a plugin!
619             if ( svt::EmbeddedObjectRef::TryRunningState( rObjRef.GetObject() ) )
620             {
621                 uno::Reference < beans::XPropertySet > xSet( rObjRef->getComponent(), uno::UNO_QUERY );
622                 ::rtl::OUString aStr;
623                 Any aAny2 = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("PluginURL") );
624                 aAny2 >>= aStr;
625                 lcl_addURL( rXMLExport, aStr );
626 
627                 aAny2 = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("PluginMimeType") );
628                 aAny2 >>= aStr;
629                 if (aStr.getLength())
630                     rXMLExport.AddAttribute( XML_NAMESPACE_DRAW, XML_MIME_TYPE, aStr );
631                 eElementName = XML_PLUGIN;
632             }
633 		}
634 		break;
635 	case SV_EMBEDDED_FRAME:
636 		{
637 			// It's a floating frame!
638             if ( svt::EmbeddedObjectRef::TryRunningState( rObjRef.GetObject() ) )
639             {
640                 uno::Reference < beans::XPropertySet > xSet( rObjRef->getComponent(), uno::UNO_QUERY );
641                 ::rtl::OUString aStr;
642                 Any aAny2 = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameURL") );
643                 aAny2 >>= aStr;
644 
645                 lcl_addURL( rXMLExport, aStr );
646 
647                 aAny2 = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameName") );
648                 aAny2 >>= aStr;
649 
650                 if (aStr.getLength())
651                     rXMLExport.AddAttribute( XML_NAMESPACE_DRAW, XML_FRAME_NAME, aStr );
652                 eElementName = XML_FLOATING_FRAME;
653             }
654 		}
655 		break;
656 	default:
657 		ASSERT( sal_False, "unknown object type! Base class should have been called!" );
658 	}
659 
660 	{
661 		SvXMLElementExport aElementExport( rXMLExport, XML_NAMESPACE_DRAW, eElementName,
662 									  sal_False, sal_True );
663 		switch( nType )
664 		{
665 		case SV_EMBEDDED_OWN:
666 			if( (rXMLExport.getExportFlags() & EXPORT_EMBEDDED) != 0 )
667 			{
668 				Reference < XEmbeddedObjectSupplier > xEOS( rPropSet, UNO_QUERY );
669 				ASSERT( xEOS.is(), "no embedded object supplier for own object" );
670 				Reference < XComponent > xComp = xEOS->getEmbeddedObject();
671 				rXMLExport.ExportEmbeddedOwnObject( xComp );
672 			}
673 			break;
674 		case SV_EMBEDDED_OUTPLACE:
675 			if( (rXMLExport.getExportFlags() & EXPORT_EMBEDDED) != 0 )
676 			{
677 				OUString sURL( sEmbeddedObjectProtocol );
678             	sURL += rOLEObj.GetCurrentPersistName();
679 
680 				if ( ( rXMLExport.getExportFlags() & EXPORT_OASIS ) == 0 )
681 					sURL += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "?oasis=false" ) );
682 
683 				rXMLExport.AddEmbeddedObjectAsBase64( sURL );
684 			}
685 			break;
686 		case SV_EMBEDDED_APPLET:
687 			{
688                 if ( svt::EmbeddedObjectRef::TryRunningState( rObjRef.GetObject() ) )
689                 {
690                     uno::Reference < beans::XPropertySet > xSet( rObjRef->getComponent(), uno::UNO_QUERY );
691                     uno::Sequence < beans::PropertyValue > aProps;
692                     aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("AppletCommands") );
693                     aAny >>= aProps;
694 
695                     sal_Int32 i = aProps.getLength();
696                     while ( i > 0 )
697                     {
698                         beans::PropertyValue& aProp = aProps[--i];
699                         sal_uInt16 nType2 = SwApplet_Impl::GetOptionType( aProp.Name, sal_True );
700                         if (SWHTML_OPTTYPE_PARAM == nType2 || SWHTML_OPTTYPE_SIZE == nType2 )
701                         {
702                             ::rtl::OUString aStr;
703                             aProp.Value >>= aStr;
704                             rXMLExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME, aProp.Name );
705                             rXMLExport.AddAttribute( XML_NAMESPACE_DRAW, XML_VALUE, aStr );
706                             SvXMLElementExport aElementExport2( rXMLExport, XML_NAMESPACE_DRAW, XML_PARAM, sal_False, sal_True );
707                         }
708                     }
709                 }
710 			}
711 			break;
712 		case SV_EMBEDDED_PLUGIN:
713 			{
714                 if ( svt::EmbeddedObjectRef::TryRunningState( rObjRef.GetObject() ) )
715                 {
716                     uno::Reference < beans::XPropertySet > xSet( rObjRef->getComponent(), uno::UNO_QUERY );
717                     uno::Sequence < beans::PropertyValue > aProps;
718                     aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("PluginCommands") );
719                     aAny >>= aProps;
720 
721                     sal_Int32 i = aProps.getLength();
722                     while ( i > 0 )
723                     {
724                         beans::PropertyValue& aProp = aProps[--i];
725                         sal_uInt16 nType2 = SwApplet_Impl::GetOptionType( aProp.Name, sal_False );
726                         if ( nType2 == SWHTML_OPTTYPE_TAG)
727                         {
728                             ::rtl::OUString aStr;
729                             aProp.Value >>= aStr;
730                             rXMLExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME, aProp.Name );
731                             rXMLExport.AddAttribute( XML_NAMESPACE_DRAW, XML_VALUE, aStr );
732                             SvXMLElementExport aElementExport2( rXMLExport, XML_NAMESPACE_DRAW, XML_PARAM, sal_False, sal_True );
733                         }
734                     }
735                 }
736 			}
737 			break;
738 		default:
739 			break;
740 		}
741 	}
742 	if( SV_EMBEDDED_OUTPLACE==nType || SV_EMBEDDED_OWN==nType )
743 	{
744 		OUString sURL( sGraphicObjectProtocol );
745 		sURL += rOLEObj.GetCurrentPersistName();
746 		if( (rXMLExport.getExportFlags() & EXPORT_EMBEDDED) == 0 )
747 		{
748 			sURL = GetExport().AddEmbeddedObject( sURL );
749 			lcl_addURL( rXMLExport, sURL, sal_False );
750 		}
751 
752 		SvXMLElementExport aElementExport( GetExport(), XML_NAMESPACE_DRAW,
753 								  XML_IMAGE, sal_False, sal_True );
754 
755 		if( (rXMLExport.getExportFlags() & EXPORT_EMBEDDED) != 0 )
756 			GetExport().AddEmbeddedObjectAsBase64( sURL );
757 	}
758 
759 	// Lastly the stuff common to each of Applet/Plugin/Floating Frame
760 	exportEvents( rPropSet );
761     // --> OD 2009-07-22 #i73249#
762     exportTitleAndDescription( rPropSet, rPropSetInfo );
763     // <--
764 	exportContour( rPropSet, rPropSetInfo );
765 }
766