From 1f2c079dd2bc9a2f5aa3597a8222bde3073a04da Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Fri, 11 Jan 2013 14:34:04 +0100 Subject: sax: add methods to duplicate current top marker and reapply it later The need for this is ooxml: we need to have a duplicate entry (rPr) like this:

... ...

This patch allows to do that by setting aside a copy of the line, and then merging the copy when needed. Change-Id: I3868a822aa9e5210f3d814c68398a38f95072cd5 Reviewed-on: https://gerrit.libreoffice.org/1648 Reviewed-by: Noel Power Tested-by: Noel Power --- sax/inc/sax/fshelper.hxx | 2 ++ sax/source/tools/fastserializer.cxx | 14 ++++++++++++++ sax/source/tools/fastserializer.hxx | 3 +++ sax/source/tools/fshelper.cxx | 10 ++++++++++ 4 files changed, 29 insertions(+) (limited to 'sax') diff --git a/sax/inc/sax/fshelper.hxx b/sax/inc/sax/fshelper.hxx index b0b8b0970465..2e9d07b7ce26 100644 --- a/sax/inc/sax/fshelper.hxx +++ b/sax/inc/sax/fshelper.hxx @@ -142,6 +142,8 @@ public: void mark( ::com::sun::star::uno::Sequence< sal_Int32 > aOrder = ::com::sun::star::uno::Sequence< sal_Int32 >() ); void mergeTopMarks( MergeMarksEnum eMergeType = MERGE_MARKS_APPEND ); + void copyTopMarkPush(); + void copyTopMarkPop(); /* Now create all the overloads in a typesafe way (i.e. without varargs) by creating a number of overloads diff --git a/sax/source/tools/fastserializer.cxx b/sax/source/tools/fastserializer.cxx index bc2b12e92a9d..31aac1e285f8 100644 --- a/sax/source/tools/fastserializer.cxx +++ b/sax/source/tools/fastserializer.cxx @@ -265,6 +265,20 @@ namespace sax_fastparser { } } + void FastSaxSerializer::copyTopMarkPush() + { + assert (!maMarkStack.empty()); + maSavedMarkStack.push(boost::shared_ptr< ForMerge > ( new ForMerge(*maMarkStack.top()))); + } + + void FastSaxSerializer::copyTopMarkPop() + { + assert (!maSavedMarkStack.empty()); + maMarkStack.push(maSavedMarkStack.top()); + mergeTopMarks(); + maSavedMarkStack.pop(); + } + void FastSaxSerializer::writeBytes( const Sequence< ::sal_Int8 >& aData ) throw ( NotConnectedException, BufferSizeExceededException, IOException, RuntimeException ) { if ( maMarkStack.empty() ) diff --git a/sax/source/tools/fastserializer.hxx b/sax/source/tools/fastserializer.hxx index b80f1ccaecc2..70bc1533b482 100644 --- a/sax/source/tools/fastserializer.hxx +++ b/sax/source/tools/fastserializer.hxx @@ -145,6 +145,8 @@ public: @see mark() */ void mergeTopMarks( sax_fastparser::MergeMarksEnum eMergeType = sax_fastparser::MERGE_MARKS_APPEND ); + void copyTopMarkPush(); + void copyTopMarkPop(); private: ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > mxOutputStream; @@ -203,6 +205,7 @@ private: }; ::std::stack< boost::shared_ptr< ForMerge > > maMarkStack; + ::std::stack< boost::shared_ptr< ForMerge > > maSavedMarkStack; void writeFastAttributeList( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ); void write( const ::rtl::OUString& s ); diff --git a/sax/source/tools/fshelper.cxx b/sax/source/tools/fshelper.cxx index 2f3f7bfc5292..37cf3d06394a 100644 --- a/sax/source/tools/fshelper.cxx +++ b/sax/source/tools/fshelper.cxx @@ -162,6 +162,16 @@ void FastSerializerHelper::mergeTopMarks( MergeMarksEnum eMergeType ) mpSerializer->mergeTopMarks( eMergeType ); } +void FastSerializerHelper::copyTopMarkPush() +{ + mpSerializer->copyTopMarkPush(); +} + +void FastSerializerHelper::copyTopMarkPop() +{ + mpSerializer->copyTopMarkPop(); +} + FastAttributeList * FastSerializerHelper::createAttrList() { return new FastAttributeList( mxTokenHandler ); -- cgit