Kaydet (Commit) 350534ab authored tarafından Michael Stahl's avatar Michael Stahl

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
üst be8855eb
...@@ -332,17 +332,26 @@ XclExpPageSettings::XclExpPageSettings( const XclExpRoot& rRoot ) : ...@@ -332,17 +332,26 @@ XclExpPageSettings::XclExpPageSettings( const XclExpRoot& rRoot ) :
maData.maVerPageBreaks.push_back(*itr); 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 // OOXTODO: we currently only emit oddHeader/oddFooter elements, and
// do not support the first/even/odd page distinction. // do not support the first/even/odd page distinction.
rStrm.WriteAttributes( sax_fastparser::FSHelperPtr& rStream = rStrm.GetCurrentStream();
rStream->startElement( mnElement,
// OOXTODO: XML_alignWithMargins, // OOXTODO: XML_alignWithMargins,
XML_differentFirst, "false", // OOXTODO XML_differentFirst, "false", // OOXTODO
XML_differentOddEven, "false", // OOXTODO XML_differentOddEven, "false", // OOXTODO
// OOXTODO: XML_scaleWithDoc // OOXTODO: XML_scaleWithDoc
FSEND ); FSEND );
rStrm.GetCurrentStream()->write( ">" );
} }
void XclExpPageSettings::Save( XclExpStream& rStrm ) void XclExpPageSettings::Save( XclExpStream& rStrm )
...@@ -388,7 +397,7 @@ void XclExpPageSettings::SaveXml( XclExpXmlStream& rStrm ) ...@@ -388,7 +397,7 @@ void XclExpPageSettings::SaveXml( XclExpXmlStream& rStrm )
XclExpSetup( maData ).SaveXml( 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_HEADER, maData.maHeader ).SaveXml( rStrm );
XclExpHeaderFooter( EXC_ID_FOOTER, maData.maFooter ).SaveXml( rStrm ); XclExpHeaderFooter( EXC_ID_FOOTER, maData.maFooter ).SaveXml( rStrm );
XclExpXmlEndElementRecord( XML_headerFooter ).SaveXml( rStrm ); XclExpXmlEndElementRecord( XML_headerFooter ).SaveXml( rStrm );
......
...@@ -57,8 +57,8 @@ void XclExpDelegatingRecord::SaveXml( XclExpXmlStream& rStrm ) ...@@ -57,8 +57,8 @@ void XclExpDelegatingRecord::SaveXml( XclExpXmlStream& rStrm )
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
XclExpXmlElementRecord::XclExpXmlElementRecord( sal_Int32 nElement, void (*pAttributes)( XclExpXmlStream& rStrm) ) XclExpXmlElementRecord::XclExpXmlElementRecord(sal_Int32 const nElement)
: mnElement( nElement ), mpAttributes( pAttributes ) : mnElement( nElement )
{ {
} }
...@@ -68,8 +68,8 @@ XclExpXmlElementRecord::~XclExpXmlElementRecord() ...@@ -68,8 +68,8 @@ XclExpXmlElementRecord::~XclExpXmlElementRecord()
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
XclExpXmlStartElementRecord::XclExpXmlStartElementRecord( sal_Int32 nElement, void (*pAttributes)( XclExpXmlStream& rStrm) ) XclExpXmlStartElementRecord::XclExpXmlStartElementRecord(sal_Int32 const nElement)
: XclExpXmlElementRecord( nElement, pAttributes ) : XclExpXmlElementRecord(nElement)
{ {
} }
...@@ -80,15 +80,9 @@ XclExpXmlStartElementRecord::~XclExpXmlStartElementRecord() ...@@ -80,15 +80,9 @@ XclExpXmlStartElementRecord::~XclExpXmlStartElementRecord()
void XclExpXmlStartElementRecord::SaveXml( XclExpXmlStream& rStrm ) void XclExpXmlStartElementRecord::SaveXml( XclExpXmlStream& rStrm )
{ {
sax_fastparser::FSHelperPtr& rStream = rStrm.GetCurrentStream(); sax_fastparser::FSHelperPtr& rStream = rStrm.GetCurrentStream();
if( ! mpAttributes ) // TODO: no generic way to add attributes here, but it appears to
{ // not be needed yet
rStream->startElement( mnElement, FSEND ); rStream->startElement( mnElement, FSEND );
}
else
{
rStream->write( "<" )->writeId( mnElement );
(*mpAttributes)( rStrm );
}
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
...@@ -109,8 +103,9 @@ void XclExpXmlEndElementRecord::SaveXml( XclExpXmlStream& rStrm ) ...@@ -109,8 +103,9 @@ void XclExpXmlEndElementRecord::SaveXml( XclExpXmlStream& rStrm )
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
XclExpXmlStartSingleElementRecord::XclExpXmlStartSingleElementRecord( sal_Int32 nElement, void (*pAttributes)( XclExpXmlStream& rStrm) ) XclExpXmlStartSingleElementRecord::XclExpXmlStartSingleElementRecord(
: XclExpXmlElementRecord( nElement, pAttributes ) sal_Int32 const nElement)
: XclExpXmlElementRecord( nElement )
{ {
} }
...@@ -122,8 +117,6 @@ void XclExpXmlStartSingleElementRecord::SaveXml( XclExpXmlStream& rStrm ) ...@@ -122,8 +117,6 @@ void XclExpXmlStartSingleElementRecord::SaveXml( XclExpXmlStream& rStrm )
{ {
sax_fastparser::FSHelperPtr& rStream = rStrm.GetCurrentStream(); sax_fastparser::FSHelperPtr& rStream = rStrm.GetCurrentStream();
rStream->write( "<" )->writeId( mnElement ); rStream->write( "<" )->writeId( mnElement );
if( mpAttributes )
(*mpAttributes)( rStrm );
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
......
...@@ -61,12 +61,11 @@ private: ...@@ -61,12 +61,11 @@ private:
class XclExpXmlElementRecord : public XclExpRecordBase class XclExpXmlElementRecord : public XclExpRecordBase
{ {
public: public:
XclExpXmlElementRecord( sal_Int32 nElement, void (*pAttributes)( XclExpXmlStream& rStrm) = NULL ); explicit XclExpXmlElementRecord(sal_Int32 nElement);
virtual ~XclExpXmlElementRecord(); virtual ~XclExpXmlElementRecord();
protected: protected:
sal_Int32 mnElement; sal_Int32 mnElement;
void (*mpAttributes)( XclExpXmlStream& rStrm );
}; };
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
...@@ -74,11 +73,11 @@ protected: ...@@ -74,11 +73,11 @@ protected:
class XclExpXmlStartElementRecord : public XclExpXmlElementRecord class XclExpXmlStartElementRecord : public XclExpXmlElementRecord
{ {
public: public:
XclExpXmlStartElementRecord( sal_Int32 nElement, void (*pAttributes)( XclExpXmlStream& rStrm) = NULL ); explicit XclExpXmlStartElementRecord(sal_Int32 nElement);
virtual ~XclExpXmlStartElementRecord(); virtual ~XclExpXmlStartElementRecord();
/** Starts the element nElement */ /** Starts the element nElement */
virtual void SaveXml( XclExpXmlStream& rStrm ); virtual void SaveXml( XclExpXmlStream& rStrm ) SAL_OVERRIDE;
}; };
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
...@@ -86,11 +85,11 @@ public: ...@@ -86,11 +85,11 @@ public:
class XclExpXmlEndElementRecord : public XclExpXmlElementRecord class XclExpXmlEndElementRecord : public XclExpXmlElementRecord
{ {
public: public:
XclExpXmlEndElementRecord( sal_Int32 nElement ); explicit XclExpXmlEndElementRecord(sal_Int32 nElement);
virtual ~XclExpXmlEndElementRecord(); virtual ~XclExpXmlEndElementRecord();
/** Ends the element nElement */ /** Ends the element nElement */
virtual void SaveXml( XclExpXmlStream& rStrm ); virtual void SaveXml( XclExpXmlStream& rStrm ) SAL_OVERRIDE;
}; };
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
...@@ -98,11 +97,11 @@ public: ...@@ -98,11 +97,11 @@ public:
class XclExpXmlStartSingleElementRecord : public XclExpXmlElementRecord class XclExpXmlStartSingleElementRecord : public XclExpXmlElementRecord
{ {
public: public:
XclExpXmlStartSingleElementRecord( sal_Int32 nElement, void (*pAttributes)( XclExpXmlStream& rStrm) = NULL ); explicit XclExpXmlStartSingleElementRecord(sal_Int32 nElement);
virtual ~XclExpXmlStartSingleElementRecord(); virtual ~XclExpXmlStartSingleElementRecord();
/** Starts the single element nElement */ /** Starts the single element nElement */
virtual void SaveXml( XclExpXmlStream& rStrm ); virtual void SaveXml( XclExpXmlStream& rStrm ) SAL_OVERRIDE;
}; };
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
...@@ -114,7 +113,7 @@ public: ...@@ -114,7 +113,7 @@ public:
virtual ~XclExpXmlEndSingleElementRecord(); virtual ~XclExpXmlEndSingleElementRecord();
/** Ends the single element nElement */ /** Ends the single element nElement */
virtual void SaveXml( XclExpXmlStream& rStrm ); virtual void SaveXml( XclExpXmlStream& rStrm ) SAL_OVERRIDE;
}; };
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
......
...@@ -313,6 +313,7 @@ public: ...@@ -313,6 +313,7 @@ public:
sax_fastparser::FSHelperPtr GetStreamForPath( const OUString& rPath ); 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 ) sax_fastparser::FSHelperPtr& WriteAttributes( sal_Int32 nAttribute, const char* value, FSEND_t )
{ return WriteAttributesInternal( nAttribute, value, FSEND_internal ); } { return WriteAttributesInternal( nAttribute, value, FSEND_internal ); }
sax_fastparser::FSHelperPtr& WriteAttributes( sal_Int32 nAttribute, const OString& value, FSEND_t ) sax_fastparser::FSHelperPtr& WriteAttributes( sal_Int32 nAttribute, const OString& value, FSEND_t )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment