1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include <sal/config.h>
22 #include <tools/diagnose_ex.h>
23 #include <tools/urlobj.hxx>
24 #include <com/sun/star/beans/XPropertySet.hpp>
25 #include <com/sun/star/container/XNameContainer.hpp>
26 #include <com/sun/star/xml/sax/Writer.hpp>
27 #include <com/sun/star/uno/Sequence.hxx>
28 #include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp>
29 #include <com/sun/star/drawing/LineDash.hpp>
30 #include <com/sun/star/awt/Gradient.hpp>
31 #include <com/sun/star/awt/XBitmap.hpp>
32 #include <com/sun/star/drawing/Hatch.hpp>
33 #include <com/sun/star/embed/ElementModes.hpp>
35 #include <sax/tools/converter.hxx>
36 #include <sfx2/docfile.hxx>
37 #include <rtl/ustrbuf.hxx>
38 #include <xmloff/xmlnamespace.hxx>
39 #include <xmloff/namespacemap.hxx>
41 #include <xmloff/xmltoken.hxx>
42 #include <xmloff/xmlmetae.hxx>
43 #include <xmloff/DashStyle.hxx>
44 #include <xmloff/GradientStyle.hxx>
45 #include <xmloff/HatchStyle.hxx>
46 #include <xmloff/ImageStyle.hxx>
47 #include <xmloff/MarkerStyle.hxx>
48 #include <com/sun/star/embed/XTransactedObject.hpp>
49 #include <comphelper/processfactory.hxx>
50 #include <unotools/streamwrap.hxx>
51 #include <svx/xmlgrhlp.hxx>
53 #include <xmlxtexp.hxx>
55 #include <comphelper/storagehelper.hxx>
58 using namespace com::sun::star
;
59 using namespace com::sun::star::container
;
60 using namespace com::sun::star::document
;
61 using namespace com::sun::star::uno
;
62 using namespace com::sun::star::awt
;
63 using namespace com::sun::star::lang
;
64 using namespace com::sun::star::xml::sax
;
65 using namespace ::xmloff::token
;
68 using com::sun::star::embed::XTransactedObject
;
72 class SvxXMLTableEntryExporter
75 explicit SvxXMLTableEntryExporter( SvXMLExport
& rExport
) : mrExport( rExport
) {}
76 virtual ~SvxXMLTableEntryExporter();
78 virtual void exportEntry( const OUString
& rStrName
, const Any
& rValue
) = 0;
81 SvXMLExport
& mrExport
;
84 class SvxXMLColorEntryExporter
: public SvxXMLTableEntryExporter
87 explicit SvxXMLColorEntryExporter( SvXMLExport
& rExport
);
89 virtual void exportEntry( const OUString
& rStrName
, const Any
& rValue
) override
;
92 class SvxXMLLineEndEntryExporter
: public SvxXMLTableEntryExporter
95 explicit SvxXMLLineEndEntryExporter( SvXMLExport
& rExport
);
97 virtual void exportEntry( const OUString
& rStrName
, const Any
& rValue
) override
;
99 XMLMarkerStyleExport maMarkerStyle
;
102 class SvxXMLDashEntryExporter
: public SvxXMLTableEntryExporter
105 explicit SvxXMLDashEntryExporter( SvXMLExport
& rExport
);
107 virtual void exportEntry( const OUString
& rStrName
, const Any
& rValue
) override
;
110 XMLDashStyleExport maDashStyle
;
113 class SvxXMLHatchEntryExporter
: public SvxXMLTableEntryExporter
116 explicit SvxXMLHatchEntryExporter( SvXMLExport
& rExport
);
118 virtual void exportEntry( const OUString
& rStrName
, const Any
& rValue
) override
;
120 XMLHatchStyleExport maHatchStyle
;
123 class SvxXMLGradientEntryExporter
: public SvxXMLTableEntryExporter
126 explicit SvxXMLGradientEntryExporter( SvXMLExport
& rExport
);
128 virtual void exportEntry( const OUString
& rStrName
, const Any
& rValue
) override
;
130 XMLGradientStyleExport maGradientStyle
;
133 class SvxXMLBitmapEntryExporter
: public SvxXMLTableEntryExporter
136 explicit SvxXMLBitmapEntryExporter( SvXMLExport
& rExport
);
138 virtual void exportEntry( const OUString
& rStrName
, const Any
& rValue
) override
;
143 SvxXMLXTableExportComponent::SvxXMLXTableExportComponent(
144 const css::uno::Reference
< css::uno::XComponentContext
>& rContext
,
145 const uno::Reference
<xml::sax::XDocumentHandler
> & rHandler
,
146 const uno::Reference
<container::XNameContainer
>& xTable
,
147 uno::Reference
<document::XGraphicStorageHandler
> const & xGraphicStorageHandler
)
148 : SvXMLExport(rContext
, "", /*rFileName*/"", rHandler
, nullptr, FieldUnit::MM_100TH
, SvXMLExportFlags::NONE
),
152 GetNamespaceMap_().Add( GetXMLToken(XML_NP_OOO
), GetXMLToken(XML_N_OOO
), XML_NAMESPACE_OOO
);
153 GetNamespaceMap_().Add( GetXMLToken(XML_NP_OFFICE
), GetXMLToken(XML_N_OFFICE
), XML_NAMESPACE_OFFICE
);
154 GetNamespaceMap_().Add( GetXMLToken(XML_NP_DRAW
), GetXMLToken(XML_N_DRAW
), XML_NAMESPACE_DRAW
);
155 GetNamespaceMap_().Add( GetXMLToken(XML_NP_XLINK
), GetXMLToken(XML_N_XLINK
), XML_NAMESPACE_XLINK
);
156 GetNamespaceMap_().Add( GetXMLToken(XML_NP_SVG
), GetXMLToken(XML_N_SVG
), XML_NAMESPACE_SVG
);
157 SetGraphicStorageHandler(xGraphicStorageHandler
);
160 SvxXMLXTableExportComponent::~SvxXMLXTableExportComponent()
164 static void initializeStreamMetadata( const uno::Reference
< uno::XInterface
> &xOut
)
166 uno::Reference
< beans::XPropertySet
> xProps( xOut
, uno::UNO_QUERY
);
169 OSL_FAIL( "Missing stream metadata interface" );
175 xProps
->setPropertyValue("MediaType", uno::makeAny( OUString( "text/xml" ) ) );
177 // use stock encryption
178 xProps
->setPropertyValue("UseCommonStoragePasswordEncryption", uno::makeAny( true ) );
179 } catch ( const uno::Exception
& )
181 TOOLS_WARN_EXCEPTION("svx", "exception setting stream metadata");
185 static void createStorageStream( uno::Reference
< io::XOutputStream
> *xOut
,
186 rtl::Reference
<SvXMLGraphicHelper
>& rxGraphicHelper
,
187 const uno::Reference
< embed::XStorage
>& xSubStorage
)
189 uno::Reference
< io::XStream
> xStream
= xSubStorage
->openStreamElement(
191 embed::ElementModes::WRITE
);
192 rxGraphicHelper
= SvXMLGraphicHelper::Create( xSubStorage
, SvXMLGraphicHelperMode::Write
);
193 initializeStreamMetadata( xStream
);
194 *xOut
= xStream
->getOutputStream();
197 bool SvxXMLXTableExportComponent::save(
198 const OUString
& rURL
,
199 const uno::Reference
<container::XNameContainer
>& xTable
,
200 const uno::Reference
<embed::XStorage
>& xStorage
,
204 std::unique_ptr
<SfxMedium
> pMedium
;
205 rtl::Reference
<SvXMLGraphicHelper
> xGraphicHelper
;
207 INetURLObject
aURLObj( rURL
);
208 bool bToStorage
= aURLObj
.GetProtocol() == INetProtocol::NotValid
; // a relative path
209 bool bSaveAsStorage
= xTable
->getElementType() == cppu::UnoType
<awt::XBitmap
>::get();
216 uno::Reference
< uno::XComponentContext
> xContext( ::comphelper::getProcessComponentContext() );
218 uno::Reference
< xml::sax::XWriter
> xWriter
= xml::sax::Writer::create( xContext
);
220 uno::Reference
< io::XStream
> xStream
;
221 uno::Reference
< io::XOutputStream
> xOut
;
222 uno::Reference
<embed::XStorage
> xSubStorage
;
223 uno::Reference
<XGraphicStorageHandler
> xGraphicStorageHandler
;
224 const sal_Int32 eCreate
= embed::ElementModes::WRITE
| embed::ElementModes::TRUNCATE
;
226 if( !bToStorage
|| !xStorage
.is() )
227 { // local URL -> SfxMedium route
229 xSubStorage
= ::comphelper::OStorageHelper::GetStorageFromURL( rURL
, eCreate
);
232 pMedium
.reset(new SfxMedium( rURL
, StreamMode::WRITE
| StreamMode::TRUNC
));
234 SvStream
* pStream
= pMedium
->GetOutStream();
237 OSL_FAIL( "no output stream!" );
241 xOut
= new utl::OOutputStreamWrapper( *pStream
);
244 else // save into the xSubStorage
246 OUString aPath
= rURL
;
251 xSubStorage
= xStorage
->openStorageElement( aPath
, eCreate
);
252 } catch (uno::Exception
&) {
253 OSL_FAIL( "no output storage!" );
261 xStream
= xStorage
->openStreamElement( aPath
, eCreate
);
264 initializeStreamMetadata( xStream
);
265 xOut
= xStream
->getOutputStream();
266 } catch (uno::Exception
&) {
267 OSL_FAIL( "no output stream!" );
275 if( !xOut
.is() && xSubStorage
.is() )
276 createStorageStream( &xOut
, xGraphicHelper
, xSubStorage
);
280 xWriter
->setOutputStream( xOut
);
281 if( xGraphicHelper
.is() )
282 xGraphicStorageHandler
= xGraphicHelper
.get();
284 // Finally do the export
285 rtl::Reference
< SvxXMLXTableExportComponent
> xExporter( new SvxXMLXTableExportComponent( xContext
, xWriter
, xTable
, xGraphicStorageHandler
) );
286 bRet
= xExporter
->exportTable();
289 xGraphicHelper
->dispose();
290 xGraphicHelper
.clear();
292 if( xSubStorage
.is() )
294 uno::Reference
< XTransactedObject
> xTrans( xSubStorage
, UNO_QUERY
);
298 xSubStorage
->dispose();
301 catch( uno::Exception
& )
312 bool SvxXMLXTableExportComponent::exportTable() noexcept
318 GetDocHandler()->startDocument();
320 addChaffWhenEncryptedStorage();
323 sal_uInt16 nPos
= GetNamespaceMap().GetFirstKey();
324 while( USHRT_MAX
!= nPos
)
326 GetAttrList().AddAttribute( GetNamespaceMap().GetAttrNameByKey( nPos
), GetNamespaceMap().GetNameByKey( nPos
) );
327 nPos
= GetNamespaceMap().GetNextKey( nPos
);
335 char const* pEleName
;
336 Type aExportType
= mxTable
->getElementType();
337 std::unique_ptr
<SvxXMLTableEntryExporter
> pExporter
;
339 if( aExportType
== cppu::UnoType
<sal_Int32
>::get() )
341 pExporter
.reset(new SvxXMLColorEntryExporter(*this));
342 pEleName
= "color-table";
344 else if( aExportType
== cppu::UnoType
< drawing::PolyPolygonBezierCoords
>::get() )
346 pExporter
.reset(new SvxXMLLineEndEntryExporter(*this));
347 pEleName
= "marker-table";
349 else if( aExportType
== cppu::UnoType
< drawing::LineDash
>::get() )
351 pExporter
.reset(new SvxXMLDashEntryExporter(*this));
352 pEleName
= "dash-table";
354 else if( aExportType
== cppu::UnoType
< drawing::Hatch
>::get() )
356 pExporter
.reset(new SvxXMLHatchEntryExporter(*this));
357 pEleName
= "hatch-table";
359 else if( aExportType
== cppu::UnoType
< awt::Gradient
>::get() )
361 pExporter
.reset(new SvxXMLGradientEntryExporter(*this));
362 pEleName
= "gradient-table";
364 else if( aExportType
== cppu::UnoType
<awt::XBitmap
>::get())
366 pExporter
.reset(new SvxXMLBitmapEntryExporter(*this));
367 pEleName
= "bitmap-table";
371 OSL_FAIL( "unknown type for export");
375 SvXMLElementExport
aElem( *this, XML_NAMESPACE_OOO
, pEleName
, true, true );
377 const Sequence
< OUString
> aNames
= mxTable
->getElementNames();
380 for( const OUString
& rName
: aNames
)
382 aAny
= mxTable
->getByName( rName
);
383 pExporter
->exportEntry( rName
, aAny
);
390 GetDocHandler()->endDocument();
392 catch( Exception
const& )
400 // methods without content:
401 void SvxXMLXTableExportComponent::ExportAutoStyles_() {}
402 void SvxXMLXTableExportComponent::ExportMasterStyles_() {}
403 void SvxXMLXTableExportComponent::ExportContent_() {}
406 SvxXMLTableEntryExporter::~SvxXMLTableEntryExporter()
411 SvxXMLColorEntryExporter::SvxXMLColorEntryExporter( SvXMLExport
& rExport
)
412 : SvxXMLTableEntryExporter( rExport
)
416 void SvxXMLColorEntryExporter::exportEntry( const OUString
& rStrName
, const Any
& rValue
)
418 mrExport
.AddAttribute( XML_NAMESPACE_DRAW
, XML_NAME
, rStrName
);
420 sal_Int32 nColor
= 0;
424 ::sax::Converter::convertColor( aOut
, nColor
);
425 mrExport
.AddAttribute( XML_NAMESPACE_DRAW
, XML_COLOR
, aOut
.makeStringAndClear() );
427 SvXMLElementExport
aElem( mrExport
, XML_NAMESPACE_DRAW
, XML_COLOR
, true, true );
431 SvxXMLLineEndEntryExporter::SvxXMLLineEndEntryExporter( SvXMLExport
& rExport
)
432 : SvxXMLTableEntryExporter( rExport
), maMarkerStyle( rExport
)
436 void SvxXMLLineEndEntryExporter::exportEntry( const OUString
& rStrName
, const Any
& rValue
)
438 maMarkerStyle
.exportXML( rStrName
, rValue
);
442 SvxXMLDashEntryExporter::SvxXMLDashEntryExporter( SvXMLExport
& rExport
)
443 : SvxXMLTableEntryExporter( rExport
), maDashStyle( rExport
)
447 void SvxXMLDashEntryExporter::exportEntry( const OUString
& rStrName
, const Any
& rValue
)
449 maDashStyle
.exportXML( rStrName
, rValue
);
453 SvxXMLHatchEntryExporter::SvxXMLHatchEntryExporter( SvXMLExport
& rExport
)
454 : SvxXMLTableEntryExporter( rExport
), maHatchStyle( rExport
)
458 void SvxXMLHatchEntryExporter::exportEntry( const OUString
& rStrName
, const Any
& rValue
)
460 maHatchStyle
.exportXML( rStrName
, rValue
);
464 SvxXMLGradientEntryExporter::SvxXMLGradientEntryExporter( SvXMLExport
& rExport
)
465 : SvxXMLTableEntryExporter( rExport
), maGradientStyle( rExport
)
469 void SvxXMLGradientEntryExporter::exportEntry( const OUString
& rStrName
, const Any
& rValue
)
471 maGradientStyle
.exportXML( rStrName
, rValue
);
475 SvxXMLBitmapEntryExporter::SvxXMLBitmapEntryExporter( SvXMLExport
& rExport
)
476 : SvxXMLTableEntryExporter( rExport
)
480 void SvxXMLBitmapEntryExporter::exportEntry( const OUString
& rStrName
, const Any
& rValue
)
482 XMLImageStyle::exportXML(rStrName
, rValue
, mrExport
);
485 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */