xref: /trunk/main/svx/source/xml/xmlxtexp.cxx (revision f6e50924)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svx.hxx"
26 #include <tools/debug.hxx>
27 #include <com/sun/star/container/XNameContainer.hpp>
28 #include <com/sun/star/xml/sax/XDocumentHandler.hpp>
29 #include <com/sun/star/uno/Sequence.hxx>
30 #include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp>
31 #include <com/sun/star/drawing/LineDash.hpp>
32 #include <com/sun/star/awt/Gradient.hpp>
33 #include <com/sun/star/drawing/Hatch.hpp>
34 #include <com/sun/star/io/XActiveDataSource.hpp>
35 #include <com/sun/star/embed/ElementModes.hpp>
36 #include <sfx2/docfile.hxx>
37 #include <rtl/ustrbuf.hxx>
38 #include <xmloff/xmluconv.hxx>
39 #include "xmloff/xmlnmspe.hxx"
40 #include "xmloff/nmspmap.hxx"
41 
42 #include "xmloff/xmltoken.hxx"
43 #include "xmloff/xmlmetae.hxx"
44 #include "xmloff/DashStyle.hxx"
45 #include "xmloff/GradientStyle.hxx"
46 #include "xmloff/HatchStyle.hxx"
47 #include "xmloff/ImageStyle.hxx"
48 #include "xmloff/MarkerStyle.hxx"
49 #include <com/sun/star/container/XNameContainer.hpp>
50 #include <com/sun/star/embed/XTransactedObject.hpp>
51 #include <comphelper/processfactory.hxx>
52 #include <unotools/streamwrap.hxx>
53 #include "svx/xmlgrhlp.hxx"
54 
55 #include "xmlxtexp.hxx"
56 
57 #include <comphelper/storagehelper.hxx>
58 
59 using namespace com::sun::star;
60 using namespace com::sun::star::container;
61 using namespace com::sun::star::document;
62 using namespace com::sun::star::uno;
63 using namespace com::sun::star::awt;
64 using namespace com::sun::star::lang;
65 using namespace com::sun::star::xml::sax;
66 using namespace ::xmloff::token;
67 using namespace ::rtl;
68 using namespace cppu;
69 
70 using com::sun::star::embed::XTransactedObject;
71 
72 class SvxXMLTableEntryExporter
73 {
74 public:
SvxXMLTableEntryExporter(SvXMLExport & rExport)75 	SvxXMLTableEntryExporter( SvXMLExport& rExport ) : mrExport( rExport ) {}
76 	virtual ~SvxXMLTableEntryExporter();
77 
78 	virtual void exportEntry( const OUString& rStrName, const Any& rValue ) = 0;
79 
80 protected:
81 	SvXMLExport& mrExport;
82 };
83 
84 class SvxXMLColorEntryExporter : public SvxXMLTableEntryExporter
85 {
86 public:
87 	SvxXMLColorEntryExporter( SvXMLExport& rExport );
88 	virtual ~SvxXMLColorEntryExporter();
89 
90 	virtual void exportEntry( const OUString& rStrName, const Any& rValue );
91 };
92 
93 class SvxXMLLineEndEntryExporter : public SvxXMLTableEntryExporter
94 {
95 public:
96 	SvxXMLLineEndEntryExporter( SvXMLExport& rExport );
97 	SvxXMLLineEndEntryExporter();
98 	virtual ~SvxXMLLineEndEntryExporter();
99 
100 	virtual void exportEntry( const OUString& rStrName, const Any& rValue );
101 private:
102 	XMLMarkerStyleExport maMarkerStyle;
103 };
104 
105 class SvxXMLDashEntryExporter : public SvxXMLTableEntryExporter
106 {
107 public:
108 	SvxXMLDashEntryExporter( SvXMLExport& rExport );
109 	virtual ~SvxXMLDashEntryExporter();
110 
111 	virtual void exportEntry( const OUString& rStrName, const Any& rValue );
112 
113 private:
114 	XMLDashStyleExport maDashStyle;
115 };
116 
117 class SvxXMLHatchEntryExporter : public SvxXMLTableEntryExporter
118 {
119 public:
120 	SvxXMLHatchEntryExporter( SvXMLExport& rExport );
121 	virtual ~SvxXMLHatchEntryExporter();
122 
123 	virtual void exportEntry( const OUString& rStrName, const Any& rValue );
124 private:
125 	XMLHatchStyleExport maHatchStyle;
126 };
127 
128 class SvxXMLGradientEntryExporter : public SvxXMLTableEntryExporter
129 {
130 public:
131 	SvxXMLGradientEntryExporter( SvXMLExport& rExport );
132 	virtual ~SvxXMLGradientEntryExporter();
133 
134 	virtual void exportEntry( const OUString& rStrName, const Any& rValue );
135 private:
136 	XMLGradientStyleExport maGradientStyle;
137 };
138 
139 class SvxXMLBitmapEntryExporter : public SvxXMLTableEntryExporter
140 {
141 public:
142 	SvxXMLBitmapEntryExporter( SvXMLExport& rExport );
143 	virtual ~SvxXMLBitmapEntryExporter();
144 
145 	virtual void exportEntry( const OUString& rStrName, const Any& rValue );
146 
147 private:
148 	XMLImageStyle maImageStyle;
149 };
150 
151 ///////////////////////////////////////////////////////////////////////
152 
153 // #110680#
SvxXMLXTableExportComponent(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> xServiceFactory,const OUString & rFileName,const uno::Reference<xml::sax::XDocumentHandler> & rHandler,const uno::Reference<container::XNameContainer> & xTable,uno::Reference<document::XGraphicObjectResolver> & xGrfResolver)154 SvxXMLXTableExportComponent::SvxXMLXTableExportComponent(
155 	const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xServiceFactory,
156 	const OUString& rFileName,
157 	const uno::Reference<xml::sax::XDocumentHandler> & rHandler,
158 	const uno::Reference<container::XNameContainer >& xTable,
159 	uno::Reference<document::XGraphicObjectResolver >& xGrfResolver )
160 :	SvXMLExport( xServiceFactory, rFileName, rHandler, NULL, MAP_100TH_MM),
161 	mxTable( xTable )
162 {
163 
164 	_GetNamespaceMap().Add( GetXMLToken(XML_NP_OOO), GetXMLToken(XML_N_OOO), XML_NAMESPACE_OOO );
165 	_GetNamespaceMap().Add( GetXMLToken(XML_NP_OFFICE), GetXMLToken(XML_N_OFFICE), XML_NAMESPACE_OFFICE );
166 	_GetNamespaceMap().Add( GetXMLToken(XML_NP_DRAW), GetXMLToken(XML_N_DRAW), XML_NAMESPACE_DRAW );
167 	_GetNamespaceMap().Add( GetXMLToken(XML_NP_XLINK), GetXMLToken(XML_N_XLINK), XML_NAMESPACE_XLINK );
168 	_GetNamespaceMap().Add( GetXMLToken(XML_NP_SVG), GetXMLToken(XML_N_SVG),  XML_NAMESPACE_SVG );
169 	SetGraphicResolver( xGrfResolver );
170 	setExportFlags( 0 );
171 }
172 
~SvxXMLXTableExportComponent()173 SvxXMLXTableExportComponent::~SvxXMLXTableExportComponent()
174 {
175 }
176 
save(const OUString & rURL,const uno::Reference<container::XNameContainer> & xTable)177 sal_Bool SvxXMLXTableExportComponent::save( const OUString& rURL, const uno::Reference<container::XNameContainer >& xTable ) throw()
178 {
179     uno::Reference < embed::XStorage > xStorage;
180 	SfxMedium* pMedium = NULL;
181 	sal_Bool bRet = sal_False;
182 
183 	uno::Reference< XGraphicObjectResolver >	xGrfResolver;
184 	SvXMLGraphicHelper*	pGraphicHelper = 0;
185 
186 	try
187 	{
188 		do
189 		{
190             uno::Reference < io::XOutputStream > xOut;
191             uno::Reference < io::XStream > xStream;
192 
193 			sal_Bool bNeedStorage = xTable->getElementType() == ::getCppuType((const OUString*)0);
194 
195 			uno::Reference< lang::XMultiServiceFactory> xServiceFactory( ::comphelper::getProcessServiceFactory() );
196 			if( !xServiceFactory.is() )
197 			{
198 				DBG_ERROR( "got no service manager" );
199 				return sal_False;
200 			}
201 
202 			uno::Reference< uno::XInterface > xWriter( xServiceFactory->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.sax.Writer" ) ) ) );
203 			if( !xWriter.is() )
204 			{
205 				DBG_ERROR( "com.sun.star.xml.sax.Writer service missing" );
206 				return sal_False;
207 			}
208 
209 			uno::Reference<xml::sax::XDocumentHandler>	xHandler( xWriter, uno::UNO_QUERY );
210 
211 			if( bNeedStorage )
212 			{
213                 xStorage =
214                   ::comphelper::OStorageHelper::GetStorageFromURL( rURL, embed::ElementModes::WRITE | embed::ElementModes::TRUNCATE );
215 
216                 if( !xStorage.is() )
217 				{
218 					DBG_ERROR( "no storage!" );
219 					break;
220 				}
221 
222 				OUString sMetaName( RTL_CONSTASCII_USTRINGPARAM( "Content.xml" ) );
223                 xStream = xStorage->openStreamElement( sMetaName, embed::ElementModes::WRITE );
224                 pGraphicHelper = SvXMLGraphicHelper::Create( xStorage, GRAPHICHELPER_MODE_WRITE );
225 				xGrfResolver = pGraphicHelper;
226                 xOut = xStream->getOutputStream();
227 			}
228 			else
229 			{
230 				pMedium = new SfxMedium( rURL, STREAM_WRITE | STREAM_TRUNC, sal_True );
231 				pMedium->IsRemote();
232 
233 				SvStream* pStream = pMedium->GetOutStream();
234 				if( NULL == pStream )
235 				{
236 					DBG_ERROR( "no output stream!" );
237 					break;
238 				}
239 
240 				xOut = new utl::OOutputStreamWrapper( *pStream );
241 			}
242 
243 			uno::Reference<io::XActiveDataSource> xMetaSrc( xWriter, uno::UNO_QUERY );
244 			xMetaSrc->setOutputStream( xOut );
245 
246 			const OUString aName;
247 
248 			// #110680#
249 			// SvxXMLXTableExportComponent aExporter( aName, xHandler, xTable, xGrfResolver );
250 			SvxXMLXTableExportComponent aExporter( xServiceFactory, aName, xHandler, xTable, xGrfResolver );
251 
252 			bRet = aExporter.exportTable();
253 
254 		}
255 		while( 0 );
256 
257 		if( pGraphicHelper )
258 			SvXMLGraphicHelper::Destroy( pGraphicHelper );
259 
260 		if( xStorage.is() )
261 		{
262 			uno::Reference< XTransactedObject > xTrans( xStorage, UNO_QUERY );
263 			if( xTrans.is() )
264 				xTrans->commit();
265 
266 			uno::Reference< XComponent > xComp( xStorage, UNO_QUERY );
267 			if( xComp.is() )
268 				xStorage->dispose();
269 		}
270 	}
271 	catch( uno::Exception& )
272 	{
273 		bRet = sal_False;
274 	}
275 
276 	if( pMedium )
277 	{
278 		pMedium->Commit();
279 		delete pMedium;
280 	}
281 
282 	return bRet;
283 }
284 
exportTable()285 sal_Bool SvxXMLXTableExportComponent::exportTable() throw()
286 {
287 	sal_Bool bRet = sal_False;
288 
289 	try
290 	{
291 		GetDocHandler()->startDocument();
292 
293 		// export namespaces
294 		sal_uInt16 nPos = GetNamespaceMap().GetFirstKey();
295 		while( USHRT_MAX != nPos )
296 		{
297 			GetAttrList().AddAttribute( GetNamespaceMap().GetAttrNameByKey( nPos ), GetNamespaceMap().GetNameByKey( nPos ) );
298 			nPos = GetNamespaceMap().GetNextKey( nPos );
299 		}
300 
301 		do
302 		{
303 			if( !mxTable.is() )
304 				break;
305 
306 			char const* pEleName;
307 			Type aExportType = mxTable->getElementType();
308 			SvxXMLTableEntryExporter* pExporter = NULL;
309 
310 			if( aExportType == ::getCppuType((const sal_Int32*)0) )
311 			{
312 				pExporter = new SvxXMLColorEntryExporter(*this);
313 				pEleName = "color-table";
314 			}
315 			else if( aExportType == ::getCppuType((const drawing::PolyPolygonBezierCoords*)0) )
316 			{
317 				pExporter = new SvxXMLLineEndEntryExporter(*this);
318 				pEleName = "marker-table";
319 			}
320 			else if( aExportType == ::getCppuType((const drawing::LineDash*)0) )
321 			{
322 				pExporter = new SvxXMLDashEntryExporter(*this);
323 				pEleName = "dash-table";
324 			}
325 			else if( aExportType == ::getCppuType((const drawing::Hatch*)0) )
326 			{
327 				pExporter = new SvxXMLHatchEntryExporter(*this);
328 				pEleName = "hatch-table";
329 			}
330 			else if( aExportType == ::getCppuType((const awt::Gradient*)0))
331 			{
332 				pExporter = new SvxXMLGradientEntryExporter(*this);
333 				pEleName = "gradient-table";
334 			}
335 			else if( aExportType == ::getCppuType((const OUString*)0))
336 			{
337 				pExporter = new SvxXMLBitmapEntryExporter(*this);
338 				pEleName = "bitmap-table";
339 			}
340 			else
341 			{
342 				DBG_ERROR( "unknown type for export");
343 				break;
344 			}
345 
346 			SvXMLElementExport aElem( *this, XML_NAMESPACE_OOO, pEleName, sal_True, sal_True );
347 
348 			Sequence< OUString > aNames = mxTable->getElementNames();
349 			const sal_Int32 nCount = aNames.getLength();
350 			const OUString* pNames = aNames.getConstArray();
351 			Any aAny;
352 
353 			sal_Int32 nIndex;
354 			for( nIndex = 0; nIndex < nCount; nIndex++, pNames++ )
355 			{
356 				aAny = mxTable->getByName( *pNames );
357 				pExporter->exportEntry( *pNames, aAny );
358 			}
359 
360 			bRet = sal_True;
361 		}
362 		while(0);
363 
364 		GetDocHandler()->endDocument();
365 	}
366 	catch( Exception e )
367 	{
368 		bRet = sal_False;
369 	}
370 
371 	return bRet;
372 }
373 
374 // methods without content:
_ExportAutoStyles()375 void SvxXMLXTableExportComponent::_ExportAutoStyles() {}
_ExportMasterStyles()376 void SvxXMLXTableExportComponent::_ExportMasterStyles() {}
_ExportContent()377 void SvxXMLXTableExportComponent::_ExportContent() {}
378 
379 ///////////////////////////////////////////////////////////////////////
380 
~SvxXMLTableEntryExporter()381 SvxXMLTableEntryExporter::~SvxXMLTableEntryExporter()
382 {
383 }
384 
385 ///////////////////////////////////////////////////////////////////////
386 
SvxXMLColorEntryExporter(SvXMLExport & rExport)387 SvxXMLColorEntryExporter::SvxXMLColorEntryExporter( SvXMLExport& rExport )
388 : SvxXMLTableEntryExporter( rExport )
389 {
390 }
391 
~SvxXMLColorEntryExporter()392 SvxXMLColorEntryExporter::~SvxXMLColorEntryExporter()
393 {
394 }
395 
exportEntry(const OUString & rStrName,const Any & rValue)396 void SvxXMLColorEntryExporter::exportEntry( const OUString& rStrName, const Any& rValue )
397 {
398 	mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME, rStrName );
399 
400 	sal_Int32 nColor = 0;
401 	rValue >>= nColor;
402 
403 	OUStringBuffer aOut;
404 	mrExport.GetMM100UnitConverter().convertColor( aOut, nColor );
405 	mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_COLOR, aOut.makeStringAndClear() );
406 
407 	SvXMLElementExport aElem( mrExport, XML_NAMESPACE_DRAW, XML_COLOR, sal_True, sal_True );
408 }
409 
410 ///////////////////////////////////////////////////////////////////////
411 
SvxXMLLineEndEntryExporter(SvXMLExport & rExport)412 SvxXMLLineEndEntryExporter::SvxXMLLineEndEntryExporter( SvXMLExport& rExport )
413 : SvxXMLTableEntryExporter( rExport ), maMarkerStyle( rExport )
414 {
415 }
416 
~SvxXMLLineEndEntryExporter()417 SvxXMLLineEndEntryExporter::~SvxXMLLineEndEntryExporter()
418 {
419 }
420 
exportEntry(const OUString & rStrName,const Any & rValue)421 void SvxXMLLineEndEntryExporter::exportEntry( const OUString& rStrName, const Any& rValue )
422 {
423 	maMarkerStyle.exportXML( rStrName, rValue );
424 }
425 
426 ///////////////////////////////////////////////////////////////////////
427 
SvxXMLDashEntryExporter(SvXMLExport & rExport)428 SvxXMLDashEntryExporter::SvxXMLDashEntryExporter( SvXMLExport& rExport )
429 : SvxXMLTableEntryExporter( rExport ), maDashStyle( rExport )
430 {
431 }
432 
~SvxXMLDashEntryExporter()433 SvxXMLDashEntryExporter::~SvxXMLDashEntryExporter()
434 {
435 }
436 
exportEntry(const OUString & rStrName,const Any & rValue)437 void SvxXMLDashEntryExporter::exportEntry( const OUString& rStrName, const Any& rValue )
438 {
439 	maDashStyle.exportXML( rStrName, rValue );
440 }
441 
442 ///////////////////////////////////////////////////////////////////////
443 
SvxXMLHatchEntryExporter(SvXMLExport & rExport)444 SvxXMLHatchEntryExporter::SvxXMLHatchEntryExporter( SvXMLExport& rExport )
445 : SvxXMLTableEntryExporter( rExport ), maHatchStyle( rExport )
446 {
447 }
448 
~SvxXMLHatchEntryExporter()449 SvxXMLHatchEntryExporter::~SvxXMLHatchEntryExporter()
450 {
451 }
452 
exportEntry(const OUString & rStrName,const Any & rValue)453 void SvxXMLHatchEntryExporter::exportEntry( const OUString& rStrName, const Any& rValue )
454 {
455 	maHatchStyle.exportXML( rStrName, rValue );
456 }
457 
458 ///////////////////////////////////////////////////////////////////////
459 
SvxXMLGradientEntryExporter(SvXMLExport & rExport)460 SvxXMLGradientEntryExporter::SvxXMLGradientEntryExporter( SvXMLExport& rExport )
461 : SvxXMLTableEntryExporter( rExport ), maGradientStyle( rExport )
462 {
463 }
464 
~SvxXMLGradientEntryExporter()465 SvxXMLGradientEntryExporter::~SvxXMLGradientEntryExporter()
466 {
467 }
468 
exportEntry(const OUString & rStrName,const Any & rValue)469 void SvxXMLGradientEntryExporter::exportEntry( const OUString& rStrName, const Any& rValue )
470 {
471 	maGradientStyle.exportXML( rStrName, rValue );
472 }
473 
474 ///////////////////////////////////////////////////////////////////////
475 
SvxXMLBitmapEntryExporter(SvXMLExport & rExport)476 SvxXMLBitmapEntryExporter::SvxXMLBitmapEntryExporter( SvXMLExport& rExport )
477 : SvxXMLTableEntryExporter( rExport )
478 {
479 }
480 
~SvxXMLBitmapEntryExporter()481 SvxXMLBitmapEntryExporter::~SvxXMLBitmapEntryExporter()
482 {
483 }
484 
exportEntry(const OUString & rStrName,const Any & rValue)485 void SvxXMLBitmapEntryExporter::exportEntry( const OUString& rStrName, const Any& rValue )
486 {
487 	maImageStyle.exportXML( rStrName, rValue, mrExport );
488 }
489