diff options
Diffstat (limited to 'svx/source/xml/xmlxtexp.cxx')
-rw-r--r-- | svx/source/xml/xmlxtexp.cxx | 495 |
1 files changed, 495 insertions, 0 deletions
diff --git a/svx/source/xml/xmlxtexp.cxx b/svx/source/xml/xmlxtexp.cxx new file mode 100644 index 000000000000..7c207cc54fcc --- /dev/null +++ b/svx/source/xml/xmlxtexp.cxx @@ -0,0 +1,495 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: xmlxtexp.cxx,v $ + * $Revision: 1.21 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svx.hxx" +#include <tools/debug.hxx> +#include <com/sun/star/container/XNameContainer.hpp> +#include <com/sun/star/xml/sax/XDocumentHandler.hpp> +#include <com/sun/star/uno/Sequence.hxx> +#include <com/sun/star/drawing/PolyPolygonBezierCoords.hpp> +#include <com/sun/star/drawing/LineDash.hpp> +#include <com/sun/star/awt/Gradient.hpp> +#include <com/sun/star/drawing/Hatch.hpp> +#include <com/sun/star/io/XActiveDataSource.hpp> +#include <com/sun/star/embed/ElementModes.hpp> +#include <sfx2/docfile.hxx> +#include <rtl/ustrbuf.hxx> +#include <xmloff/xmluconv.hxx> +#include "xmloff/xmlnmspe.hxx" +#include "xmloff/nmspmap.hxx" + +#include "xmloff/xmltoken.hxx" +#include "xmloff/xmlmetae.hxx" +#include "xmloff/DashStyle.hxx" +#include "xmloff/GradientStyle.hxx" +#include "xmloff/HatchStyle.hxx" +#include "xmloff/ImageStyle.hxx" +#include "xmloff/MarkerStyle.hxx" +#include <com/sun/star/container/XNameContainer.hpp> +#include <com/sun/star/embed/XTransactedObject.hpp> +#include <comphelper/processfactory.hxx> +#include <unotools/streamwrap.hxx> +#include "xmlgrhlp.hxx" + +#include "xmlxtexp.hxx" + +#include <comphelper/storagehelper.hxx> + +using namespace com::sun::star; +using namespace com::sun::star::container; +using namespace com::sun::star::document; +using namespace com::sun::star::uno; +using namespace com::sun::star::awt; +using namespace com::sun::star::lang; +using namespace com::sun::star::xml::sax; +using namespace ::xmloff::token; +using namespace ::rtl; +using namespace cppu; + +using com::sun::star::embed::XTransactedObject; + +class SvxXMLTableEntryExporter +{ +public: + SvxXMLTableEntryExporter( SvXMLExport& rExport ) : mrExport( rExport ) {} + virtual ~SvxXMLTableEntryExporter(); + + virtual void exportEntry( const OUString& rStrName, const Any& rValue ) = 0; + +protected: + SvXMLExport& mrExport; +}; + +class SvxXMLColorEntryExporter : public SvxXMLTableEntryExporter +{ +public: + SvxXMLColorEntryExporter( SvXMLExport& rExport ); + virtual ~SvxXMLColorEntryExporter(); + + virtual void exportEntry( const OUString& rStrName, const Any& rValue ); +}; + +class SvxXMLLineEndEntryExporter : public SvxXMLTableEntryExporter +{ +public: + SvxXMLLineEndEntryExporter( SvXMLExport& rExport ); + SvxXMLLineEndEntryExporter(); + virtual ~SvxXMLLineEndEntryExporter(); + + virtual void exportEntry( const OUString& rStrName, const Any& rValue ); +private: + XMLMarkerStyleExport maMarkerStyle; +}; + +class SvxXMLDashEntryExporter : public SvxXMLTableEntryExporter +{ +public: + SvxXMLDashEntryExporter( SvXMLExport& rExport ); + virtual ~SvxXMLDashEntryExporter(); + + virtual void exportEntry( const OUString& rStrName, const Any& rValue ); + +private: + XMLDashStyleExport maDashStyle; +}; + +class SvxXMLHatchEntryExporter : public SvxXMLTableEntryExporter +{ +public: + SvxXMLHatchEntryExporter( SvXMLExport& rExport ); + virtual ~SvxXMLHatchEntryExporter(); + + virtual void exportEntry( const OUString& rStrName, const Any& rValue ); +private: + XMLHatchStyleExport maHatchStyle; +}; + +class SvxXMLGradientEntryExporter : public SvxXMLTableEntryExporter +{ +public: + SvxXMLGradientEntryExporter( SvXMLExport& rExport ); + virtual ~SvxXMLGradientEntryExporter(); + + virtual void exportEntry( const OUString& rStrName, const Any& rValue ); +private: + XMLGradientStyleExport maGradientStyle; +}; + +class SvxXMLBitmapEntryExporter : public SvxXMLTableEntryExporter +{ +public: + SvxXMLBitmapEntryExporter( SvXMLExport& rExport ); + virtual ~SvxXMLBitmapEntryExporter(); + + virtual void exportEntry( const OUString& rStrName, const Any& rValue ); + +private: + XMLImageStyle maImageStyle; +}; + +/////////////////////////////////////////////////////////////////////// + +// #110680# +SvxXMLXTableExportComponent::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 ) +: SvXMLExport( xServiceFactory, rFileName, rHandler, NULL, MAP_100TH_MM), + mxTable( xTable ) +{ + + _GetNamespaceMap().Add( GetXMLToken(XML_NP_OOO), GetXMLToken(XML_N_OOO), XML_NAMESPACE_OOO ); + _GetNamespaceMap().Add( GetXMLToken(XML_NP_OFFICE), GetXMLToken(XML_N_OFFICE), XML_NAMESPACE_OFFICE ); + _GetNamespaceMap().Add( GetXMLToken(XML_NP_DRAW), GetXMLToken(XML_N_DRAW), XML_NAMESPACE_DRAW ); + _GetNamespaceMap().Add( GetXMLToken(XML_NP_XLINK), GetXMLToken(XML_N_XLINK), XML_NAMESPACE_XLINK ); + _GetNamespaceMap().Add( GetXMLToken(XML_NP_SVG), GetXMLToken(XML_N_SVG), XML_NAMESPACE_SVG ); + SetGraphicResolver( xGrfResolver ); + setExportFlags( 0 ); +} + +SvxXMLXTableExportComponent::~SvxXMLXTableExportComponent() +{ +} + +sal_Bool SvxXMLXTableExportComponent::save( const OUString& rURL, const uno::Reference<container::XNameContainer >& xTable ) throw() +{ + uno::Reference < embed::XStorage > xStorage; + SfxMedium* pMedium = NULL; + sal_Bool bRet = sal_False; + + uno::Reference< XGraphicObjectResolver > xGrfResolver; + SvXMLGraphicHelper* pGraphicHelper = 0; + + try + { + do + { + uno::Reference < io::XOutputStream > xOut; + uno::Reference < io::XStream > xStream; + + sal_Bool bNeedStorage = xTable->getElementType() == ::getCppuType((const OUString*)0); + + uno::Reference< lang::XMultiServiceFactory> xServiceFactory( ::comphelper::getProcessServiceFactory() ); + if( !xServiceFactory.is() ) + { + DBG_ERROR( "got no service manager" ); + return FALSE; + } + + uno::Reference< uno::XInterface > xWriter( xServiceFactory->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.sax.Writer" ) ) ) ); + if( !xWriter.is() ) + { + DBG_ERROR( "com.sun.star.xml.sax.Writer service missing" ); + return FALSE; + } + + uno::Reference<xml::sax::XDocumentHandler> xHandler( xWriter, uno::UNO_QUERY ); + + if( bNeedStorage ) + { + xStorage = + ::comphelper::OStorageHelper::GetStorageFromURL( rURL, embed::ElementModes::WRITE | embed::ElementModes::TRUNCATE ); + + if( !xStorage.is() ) + { + DBG_ERROR( "no storage!" ); + break; + } + + OUString sMetaName( RTL_CONSTASCII_USTRINGPARAM( "Content.xml" ) ); + xStream = xStorage->openStreamElement( sMetaName, embed::ElementModes::WRITE ); + pGraphicHelper = SvXMLGraphicHelper::Create( xStorage, GRAPHICHELPER_MODE_WRITE ); + xGrfResolver = pGraphicHelper; + xOut = xStream->getOutputStream(); + } + else + { + pMedium = new SfxMedium( rURL, STREAM_WRITE | STREAM_TRUNC, TRUE ); + pMedium->IsRemote(); + + SvStream* pStream = pMedium->GetOutStream(); + if( NULL == pStream ) + { + DBG_ERROR( "no output stream!" ); + break; + } + + xOut = new utl::OOutputStreamWrapper( *pStream ); + } + + uno::Reference<io::XActiveDataSource> xMetaSrc( xWriter, uno::UNO_QUERY ); + xMetaSrc->setOutputStream( xOut ); + + const OUString aName; + + // #110680# + // SvxXMLXTableExportComponent aExporter( aName, xHandler, xTable, xGrfResolver ); + SvxXMLXTableExportComponent aExporter( xServiceFactory, aName, xHandler, xTable, xGrfResolver ); + + bRet = aExporter.exportTable(); + + } + while( 0 ); + + if( pGraphicHelper ) + SvXMLGraphicHelper::Destroy( pGraphicHelper ); + + if( xStorage.is() ) + { + uno::Reference< XTransactedObject > xTrans( xStorage, UNO_QUERY ); + if( xTrans.is() ) + xTrans->commit(); + + uno::Reference< XComponent > xComp( xStorage, UNO_QUERY ); + if( xComp.is() ) + xStorage->dispose(); + } + } + catch( uno::Exception& ) + { + bRet = sal_False; + } + + if( pMedium ) + { + pMedium->Commit(); + delete pMedium; + } + + return bRet; +} + +sal_Bool SvxXMLXTableExportComponent::exportTable() throw() +{ + sal_Bool bRet = sal_False; + + try + { + GetDocHandler()->startDocument(); + + // export namespaces + sal_uInt16 nPos = GetNamespaceMap().GetFirstKey(); + while( USHRT_MAX != nPos ) + { + GetAttrList().AddAttribute( GetNamespaceMap().GetAttrNameByKey( nPos ), GetNamespaceMap().GetNameByKey( nPos ) ); + nPos = GetNamespaceMap().GetNextKey( nPos ); + } + + do + { + if( !mxTable.is() ) + break; + + char const* pEleName; + Type aExportType = mxTable->getElementType(); + SvxXMLTableEntryExporter* pExporter = NULL; + + if( aExportType == ::getCppuType((const sal_Int32*)0) ) + { + pExporter = new SvxXMLColorEntryExporter(*this); + pEleName = "color-table"; + } + else if( aExportType == ::getCppuType((const drawing::PolyPolygonBezierCoords*)0) ) + { + pExporter = new SvxXMLLineEndEntryExporter(*this); + pEleName = "marker-table"; + } + else if( aExportType == ::getCppuType((const drawing::LineDash*)0) ) + { + pExporter = new SvxXMLDashEntryExporter(*this); + pEleName = "dash-table"; + } + else if( aExportType == ::getCppuType((const drawing::Hatch*)0) ) + { + pExporter = new SvxXMLHatchEntryExporter(*this); + pEleName = "hatch-table"; + } + else if( aExportType == ::getCppuType((const awt::Gradient*)0)) + { + pExporter = new SvxXMLGradientEntryExporter(*this); + pEleName = "gradient-table"; + } + else if( aExportType == ::getCppuType((const OUString*)0)) + { + pExporter = new SvxXMLBitmapEntryExporter(*this); + pEleName = "bitmap-table"; + } + else + { + DBG_ERROR( "unknown type for export"); + break; + } + + SvXMLElementExport aElem( *this, XML_NAMESPACE_OOO, pEleName, sal_True, sal_True ); + + Sequence< OUString > aNames = mxTable->getElementNames(); + const sal_Int32 nCount = aNames.getLength(); + const OUString* pNames = aNames.getConstArray(); + Any aAny; + + sal_Int32 nIndex; + for( nIndex = 0; nIndex < nCount; nIndex++, pNames++ ) + { + aAny = mxTable->getByName( *pNames ); + pExporter->exportEntry( *pNames, aAny ); + } + + bRet = sal_True; + } + while(0); + + GetDocHandler()->endDocument(); + } + catch( Exception e ) + { + bRet = sal_False; + } + + return bRet; +} + +// methods without content: +void SvxXMLXTableExportComponent::_ExportAutoStyles() {} +void SvxXMLXTableExportComponent::_ExportMasterStyles() {} +void SvxXMLXTableExportComponent::_ExportContent() {} + +/////////////////////////////////////////////////////////////////////// + +SvxXMLTableEntryExporter::~SvxXMLTableEntryExporter() +{ +} + +/////////////////////////////////////////////////////////////////////// + +SvxXMLColorEntryExporter::SvxXMLColorEntryExporter( SvXMLExport& rExport ) +: SvxXMLTableEntryExporter( rExport ) +{ +} + +SvxXMLColorEntryExporter::~SvxXMLColorEntryExporter() +{ +} + +void SvxXMLColorEntryExporter::exportEntry( const OUString& rStrName, const Any& rValue ) +{ + mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME, rStrName ); + + sal_Int32 nColor = 0; + rValue >>= nColor; + + OUStringBuffer aOut; + mrExport.GetMM100UnitConverter().convertColor( aOut, nColor ); + mrExport.AddAttribute( XML_NAMESPACE_DRAW, XML_COLOR, aOut.makeStringAndClear() ); + + SvXMLElementExport aElem( mrExport, XML_NAMESPACE_DRAW, XML_COLOR, sal_True, sal_True ); +} + +/////////////////////////////////////////////////////////////////////// + +SvxXMLLineEndEntryExporter::SvxXMLLineEndEntryExporter( SvXMLExport& rExport ) +: SvxXMLTableEntryExporter( rExport ), maMarkerStyle( rExport ) +{ +} + +SvxXMLLineEndEntryExporter::~SvxXMLLineEndEntryExporter() +{ +} + +void SvxXMLLineEndEntryExporter::exportEntry( const OUString& rStrName, const Any& rValue ) +{ + maMarkerStyle.exportXML( rStrName, rValue ); +} + +/////////////////////////////////////////////////////////////////////// + +SvxXMLDashEntryExporter::SvxXMLDashEntryExporter( SvXMLExport& rExport ) +: SvxXMLTableEntryExporter( rExport ), maDashStyle( rExport ) +{ +} + +SvxXMLDashEntryExporter::~SvxXMLDashEntryExporter() +{ +} + +void SvxXMLDashEntryExporter::exportEntry( const OUString& rStrName, const Any& rValue ) +{ + maDashStyle.exportXML( rStrName, rValue ); +} + +/////////////////////////////////////////////////////////////////////// + +SvxXMLHatchEntryExporter::SvxXMLHatchEntryExporter( SvXMLExport& rExport ) +: SvxXMLTableEntryExporter( rExport ), maHatchStyle( rExport ) +{ +} + +SvxXMLHatchEntryExporter::~SvxXMLHatchEntryExporter() +{ +} + +void SvxXMLHatchEntryExporter::exportEntry( const OUString& rStrName, const Any& rValue ) +{ + maHatchStyle.exportXML( rStrName, rValue ); +} + +/////////////////////////////////////////////////////////////////////// + +SvxXMLGradientEntryExporter::SvxXMLGradientEntryExporter( SvXMLExport& rExport ) +: SvxXMLTableEntryExporter( rExport ), maGradientStyle( rExport ) +{ +} + +SvxXMLGradientEntryExporter::~SvxXMLGradientEntryExporter() +{ +} + +void SvxXMLGradientEntryExporter::exportEntry( const OUString& rStrName, const Any& rValue ) +{ + maGradientStyle.exportXML( rStrName, rValue ); +} + +/////////////////////////////////////////////////////////////////////// + +SvxXMLBitmapEntryExporter::SvxXMLBitmapEntryExporter( SvXMLExport& rExport ) +: SvxXMLTableEntryExporter( rExport ) +{ +} + +SvxXMLBitmapEntryExporter::~SvxXMLBitmapEntryExporter() +{ +} + +void SvxXMLBitmapEntryExporter::exportEntry( const OUString& rStrName, const Any& rValue ) +{ + maImageStyle.exportXML( rStrName, rValue, mrExport ); +} |