From 350534aba8f82d57782ec22fa4f6b776509beb2d Mon Sep 17 00:00:00 2001 From: Michael Stahl Date: Wed, 5 Jun 2013 16:44:26 +0200 Subject: sc: XLSX export: remove mpAttributes crack: When there are attributes, XclExpXmlStartElementRecord::SaveXml() would not call startElement() but instead write the XML element all by itself, which means there will be an endElement() for which no previous startElement() was called, which makes checking that these match hard. Since this silly mpAttributes over-engineering is only used in one place anyway, give that a separate subclass and use startElement(). There is still an issue with various WriteAttribute methods; if those are used it's probably not possible to check that for well-formedness. Change-Id: Id842f000a6fecd77211836705545d58031ebd0f8 --- sc/source/filter/excel/xepage.cxx | 17 +++++++++++++---- sc/source/filter/excel/xerecord.cxx | 27 ++++++++++----------------- sc/source/filter/inc/xerecord.hxx | 17 ++++++++--------- sc/source/filter/inc/xestream.hxx | 1 + 4 files changed, 32 insertions(+), 30 deletions(-) diff --git a/sc/source/filter/excel/xepage.cxx b/sc/source/filter/excel/xepage.cxx index 8e1ffb114352..370188788a34 100644 --- a/sc/source/filter/excel/xepage.cxx +++ b/sc/source/filter/excel/xepage.cxx @@ -332,17 +332,26 @@ XclExpPageSettings::XclExpPageSettings( const XclExpRoot& rRoot ) : maData.maVerPageBreaks.push_back(*itr); } -static void lcl_WriteHeaderFooter( XclExpXmlStream& rStrm ) +class XclExpXmlStartHeaderFooterElementRecord : public XclExpXmlElementRecord +{ +public: + explicit XclExpXmlStartHeaderFooterElementRecord(sal_Int32 const nElement) + : XclExpXmlElementRecord(nElement) {} + + virtual void SaveXml( XclExpXmlStream& rStrm ) SAL_OVERRIDE; +}; + +void XclExpXmlStartHeaderFooterElementRecord::SaveXml(XclExpXmlStream& rStrm) { // OOXTODO: we currently only emit oddHeader/oddFooter elements, and // do not support the first/even/odd page distinction. - rStrm.WriteAttributes( + sax_fastparser::FSHelperPtr& rStream = rStrm.GetCurrentStream(); + rStream->startElement( mnElement, // OOXTODO: XML_alignWithMargins, XML_differentFirst, "false", // OOXTODO XML_differentOddEven, "false", // OOXTODO // OOXTODO: XML_scaleWithDoc FSEND ); - rStrm.GetCurrentStream()->write( ">" ); } void XclExpPageSettings::Save( XclExpStream& rStrm ) @@ -388,7 +397,7 @@ void XclExpPageSettings::SaveXml( XclExpXmlStream& rStrm ) XclExpSetup( maData ).SaveXml( rStrm ); - XclExpXmlStartElementRecord( XML_headerFooter, lcl_WriteHeaderFooter ).SaveXml( rStrm ); + XclExpXmlStartHeaderFooterElementRecord(XML_headerFooter).SaveXml(rStrm); XclExpHeaderFooter( EXC_ID_HEADER, maData.maHeader ).SaveXml( rStrm ); XclExpHeaderFooter( EXC_ID_FOOTER, maData.maFooter ).SaveXml( rStrm ); XclExpXmlEndElementRecord( XML_headerFooter ).SaveXml( rStrm ); diff --git a/sc/source/filter/excel/xerecord.cxx b/sc/source/filter/excel/xerecord.cxx index b7f2f8eb20dc..4c1c5e0c2ebc 100644 --- a/sc/source/filter/excel/xerecord.cxx +++ b/sc/source/filter/excel/xerecord.cxx @@ -57,8 +57,8 @@ void XclExpDelegatingRecord::SaveXml( XclExpXmlStream& rStrm ) // ---------------------------------------------------------------------------- -XclExpXmlElementRecord::XclExpXmlElementRecord( sal_Int32 nElement, void (*pAttributes)( XclExpXmlStream& rStrm) ) - : mnElement( nElement ), mpAttributes( pAttributes ) +XclExpXmlElementRecord::XclExpXmlElementRecord(sal_Int32 const nElement) + : mnElement( nElement ) { } @@ -68,8 +68,8 @@ XclExpXmlElementRecord::~XclExpXmlElementRecord() // ---------------------------------------------------------------------------- -XclExpXmlStartElementRecord::XclExpXmlStartElementRecord( sal_Int32 nElement, void (*pAttributes)( XclExpXmlStream& rStrm) ) - : XclExpXmlElementRecord( nElement, pAttributes ) +XclExpXmlStartElementRecord::XclExpXmlStartElementRecord(sal_Int32 const nElement) + : XclExpXmlElementRecord(nElement) { } @@ -80,15 +80,9 @@ XclExpXmlStartElementRecord::~XclExpXmlStartElementRecord() void XclExpXmlStartElementRecord::SaveXml( XclExpXmlStream& rStrm ) { sax_fastparser::FSHelperPtr& rStream = rStrm.GetCurrentStream(); - if( ! mpAttributes ) - { - rStream->startElement( mnElement, FSEND ); - } - else - { - rStream->write( "<" )->writeId( mnElement ); - (*mpAttributes)( rStrm ); - } + // TODO: no generic way to add attributes here, but it appears to + // not be needed yet + rStream->startElement( mnElement, FSEND ); } // ---------------------------------------------------------------------------- @@ -109,8 +103,9 @@ void XclExpXmlEndElementRecord::SaveXml( XclExpXmlStream& rStrm ) // ---------------------------------------------------------------------------- -XclExpXmlStartSingleElementRecord::XclExpXmlStartSingleElementRecord( sal_Int32 nElement, void (*pAttributes)( XclExpXmlStream& rStrm) ) - : XclExpXmlElementRecord( nElement, pAttributes ) +XclExpXmlStartSingleElementRecord::XclExpXmlStartSingleElementRecord( + sal_Int32 const nElement) + : XclExpXmlElementRecord( nElement ) { } @@ -122,8 +117,6 @@ void XclExpXmlStartSingleElementRecord::SaveXml( XclExpXmlStream& rStrm ) { sax_fastparser::FSHelperPtr& rStream = rStrm.GetCurrentStream(); rStream->write( "<" )->writeId( mnElement ); - if( mpAttributes ) - (*mpAttributes)( rStrm ); } // ---------------------------------------------------------------------------- diff --git a/sc/source/filter/inc/xerecord.hxx b/sc/source/filter/inc/xerecord.hxx index 27f272e478d6..78241e8a841e 100644 --- a/sc/source/filter/inc/xerecord.hxx +++ b/sc/source/filter/inc/xerecord.hxx @@ -61,12 +61,11 @@ private: class XclExpXmlElementRecord : public XclExpRecordBase { public: - XclExpXmlElementRecord( sal_Int32 nElement, void (*pAttributes)( XclExpXmlStream& rStrm) = NULL ); + explicit XclExpXmlElementRecord(sal_Int32 nElement); virtual ~XclExpXmlElementRecord(); protected: sal_Int32 mnElement; - void (*mpAttributes)( XclExpXmlStream& rStrm ); }; // ---------------------------------------------------------------------------- @@ -74,11 +73,11 @@ protected: class XclExpXmlStartElementRecord : public XclExpXmlElementRecord { public: - XclExpXmlStartElementRecord( sal_Int32 nElement, void (*pAttributes)( XclExpXmlStream& rStrm) = NULL ); + explicit XclExpXmlStartElementRecord(sal_Int32 nElement); virtual ~XclExpXmlStartElementRecord(); /** Starts the element nElement */ - virtual void SaveXml( XclExpXmlStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ) SAL_OVERRIDE; }; // ---------------------------------------------------------------------------- @@ -86,11 +85,11 @@ public: class XclExpXmlEndElementRecord : public XclExpXmlElementRecord { public: - XclExpXmlEndElementRecord( sal_Int32 nElement ); + explicit XclExpXmlEndElementRecord(sal_Int32 nElement); virtual ~XclExpXmlEndElementRecord(); /** Ends the element nElement */ - virtual void SaveXml( XclExpXmlStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ) SAL_OVERRIDE; }; // ---------------------------------------------------------------------------- @@ -98,11 +97,11 @@ public: class XclExpXmlStartSingleElementRecord : public XclExpXmlElementRecord { public: - XclExpXmlStartSingleElementRecord( sal_Int32 nElement, void (*pAttributes)( XclExpXmlStream& rStrm) = NULL ); + explicit XclExpXmlStartSingleElementRecord(sal_Int32 nElement); virtual ~XclExpXmlStartSingleElementRecord(); /** Starts the single element nElement */ - virtual void SaveXml( XclExpXmlStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ) SAL_OVERRIDE; }; // ---------------------------------------------------------------------------- @@ -114,7 +113,7 @@ public: virtual ~XclExpXmlEndSingleElementRecord(); /** Ends the single element nElement */ - virtual void SaveXml( XclExpXmlStream& rStrm ); + virtual void SaveXml( XclExpXmlStream& rStrm ) SAL_OVERRIDE; }; // ---------------------------------------------------------------------------- diff --git a/sc/source/filter/inc/xestream.hxx b/sc/source/filter/inc/xestream.hxx index 0ac31d4617f1..4b37a68e3707 100644 --- a/sc/source/filter/inc/xestream.hxx +++ b/sc/source/filter/inc/xestream.hxx @@ -313,6 +313,7 @@ public: sax_fastparser::FSHelperPtr GetStreamForPath( const OUString& rPath ); + // FIXME: if written through this cannot be checked for well-formedness sax_fastparser::FSHelperPtr& WriteAttributes( sal_Int32 nAttribute, const char* value, FSEND_t ) { return WriteAttributesInternal( nAttribute, value, FSEND_internal ); } sax_fastparser::FSHelperPtr& WriteAttributes( sal_Int32 nAttribute, const OString& value, FSEND_t ) -- cgit v1.2.3