summaryrefslogtreecommitdiff
path: root/sax/source/tools/fastserializer.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sax/source/tools/fastserializer.cxx')
-rw-r--r--sax/source/tools/fastserializer.cxx53
1 files changed, 33 insertions, 20 deletions
diff --git a/sax/source/tools/fastserializer.cxx b/sax/source/tools/fastserializer.cxx
index 0f05ec9a3ff0..ac8376b3be84 100644
--- a/sax/source/tools/fastserializer.cxx
+++ b/sax/source/tools/fastserializer.cxx
@@ -57,6 +57,7 @@ namespace sax_fastparser {
FastSaxSerializer::FastSaxSerializer( const css::uno::Reference< css::io::XOutputStream >& xOutputStream )
: maCachedOutputStream()
, maMarkStack()
+ , mbMarkStackEmpty(true)
, mpDoubleStr(NULL)
, mnDoubleStrCapacity(RTL_STR_MAX_VALUEOFDOUBLE)
{
@@ -152,6 +153,7 @@ namespace sax_fastparser {
void FastSaxSerializer::endDocument()
{
+ assert(mbMarkStackEmpty && maMarkStack.empty());
maCachedOutputStream.flush();
}
@@ -186,8 +188,11 @@ namespace sax_fastparser {
void FastSaxSerializer::startFastElement( ::sal_Int32 Element, FastAttributeList* pAttrList )
{
- if ( !maMarkStack.empty() )
+ if ( !mbMarkStackEmpty )
+ {
+ maCachedOutputStream.flush();
maMarkStack.top()->setCurrentElement( Element );
+ }
#ifdef DBG_UTIL
m_DebugStartedElements.push(Element);
@@ -222,8 +227,11 @@ namespace sax_fastparser {
void FastSaxSerializer::singleFastElement( ::sal_Int32 Element, FastAttributeList* pAttrList )
{
- if ( !maMarkStack.empty() )
+ if ( !mbMarkStackEmpty )
+ {
+ maCachedOutputStream.flush();
maMarkStack.top()->setCurrentElement( Element );
+ }
writeBytes(sOpeningBracket, N_CHARS(sOpeningBracket));
@@ -303,28 +311,47 @@ namespace sax_fastparser {
{
boost::shared_ptr< ForMerge > pSort( new ForSort( aOrder ) );
maMarkStack.push( pSort );
+ maCachedOutputStream.setOutput( pSort );
}
else
{
boost::shared_ptr< ForMerge > pMerge( new ForMerge( ) );
maMarkStack.push( pMerge );
+ maCachedOutputStream.setOutput( pMerge );
}
+ mbMarkStackEmpty = false;
}
void FastSaxSerializer::mergeTopMarks( sax_fastparser::MergeMarksEnum eMergeType )
{
- if ( maMarkStack.empty() )
+ SAL_WARN_IF(mbMarkStackEmpty, "sax", "Empty mark stack - nothing to merge");
+ if ( mbMarkStackEmpty )
return;
+ // flush, so that we get everything in getData()
+ maCachedOutputStream.flush();
+
if ( maMarkStack.size() == 1 && eMergeType != MERGE_MARKS_IGNORE)
{
- writeOutput( maMarkStack.top()->getData() );
+ Sequence<sal_Int8> aSeq( maMarkStack.top()->getData() );
maMarkStack.pop();
+ mbMarkStackEmpty = true;
+ maCachedOutputStream.resetOutputToStream();
+ maCachedOutputStream.writeBytes( aSeq.getConstArray(), aSeq.getLength() );
return;
}
const Int8Sequence aMerge( maMarkStack.top()->getData() );
maMarkStack.pop();
+ if (maMarkStack.empty())
+ {
+ mbMarkStackEmpty = true;
+ maCachedOutputStream.resetOutputToStream();
+ }
+ else
+ {
+ maCachedOutputStream.setOutput( maMarkStack.top() );
+ }
switch ( eMergeType )
{
@@ -338,26 +365,12 @@ namespace sax_fastparser {
void FastSaxSerializer::writeBytes( const Sequence< sal_Int8 >& rData )
{
- writeBytes( reinterpret_cast<const char*>(rData.getConstArray()), rData.getLength() );
+ maCachedOutputStream.writeBytes( rData.getConstArray(), rData.getLength() );
}
void FastSaxSerializer::writeBytes( const char* pStr, size_t nLen )
{
- if ( maMarkStack.empty() )
- writeOutput( reinterpret_cast<const sal_Int8*>(pStr), nLen );
- else
- maMarkStack.top()->append( Sequence< sal_Int8 >(
- reinterpret_cast<const sal_Int8*>(pStr), nLen) );
- }
-
- void FastSaxSerializer::writeOutput( const Sequence< ::sal_Int8 >& aData )
- {
- writeOutput( aData.getConstArray(), aData.getLength() );
- }
-
- void FastSaxSerializer::writeOutput( const sal_Int8* pStr, size_t nLen )
- {
- maCachedOutputStream.writeBytes( pStr, nLen );
+ maCachedOutputStream.writeBytes( reinterpret_cast<const sal_Int8*>(pStr), nLen );
}
FastSaxSerializer::Int8Sequence& FastSaxSerializer::ForMerge::getData()