diff options
author | Henry Castro <hcastro@collabora.com> | 2023-07-25 15:18:10 -0400 |
---|---|---|
committer | Henry Castro <hcastro@collabora.com> | 2023-08-02 16:06:31 +0200 |
commit | 98321ad324d386a9ad14a428fae949c3d7f5e3d3 (patch) | |
tree | c39efc5eb22316113fe26529cb2b2ffdcc9dc256 | |
parent | a3a00555d4b0e07ee921f85ac088e7b17047c6cf (diff) |
sc: filter: rtf: use a separate document stream
"An RTF file has the following syntax:
'{' <header> <document>'}' "
In order to build the header:
<header>
\rtf <charset> \deff? <fonttbl> <filetbl>? <colortbl>? <stylesheet>? <listtables>? <revtbl>?
The font table should be created while visiting the column/rows.
Signed-off-by: Henry Castro <hcastro@collabora.com>
Change-Id: Id72a3c87acab6cfc7889cf81f7e83a0d73e378a2
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154903
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/155258
-rw-r--r-- | sc/source/filter/inc/rtfexp.hxx | 1 | ||||
-rw-r--r-- | sc/source/filter/rtf/rtfexp.cxx | 54 |
2 files changed, 29 insertions, 26 deletions
diff --git a/sc/source/filter/inc/rtfexp.hxx b/sc/source/filter/inc/rtfexp.hxx index 0d5e69f79d8e..9a4fe43d9d02 100644 --- a/sc/source/filter/inc/rtfexp.hxx +++ b/sc/source/filter/inc/rtfexp.hxx @@ -26,6 +26,7 @@ class ScRTFExport : public ScExportBase { std::unique_ptr<sal_uLong[]> pCellX; // cumulative range in a table + SvMemoryStream m_aDocStrm; void WriteTab( SCTAB nTab ); void WriteRow( SCTAB nTab, SCROW nRow ); diff --git a/sc/source/filter/rtf/rtfexp.cxx b/sc/source/filter/rtf/rtfexp.cxx index b8e4015fde1c..a97eeb19a053 100644 --- a/sc/source/filter/rtf/rtfexp.cxx +++ b/sc/source/filter/rtf/rtfexp.cxx @@ -63,16 +63,18 @@ void ScRTFExport::Write() for ( SCTAB nTab = aRange.aStart.Tab(); nTab <= aRange.aEnd.Tab(); nTab++ ) { if ( nTab > aRange.aStart.Tab() ) - rStrm.WriteCharPtr( OOO_STRING_SVTOOLS_RTF_PAR ); + m_aDocStrm.WriteOString( OOO_STRING_SVTOOLS_RTF_PAR ); WriteTab( nTab ); } - rStrm.WriteChar( '}' ).WriteCharPtr( SAL_NEWLINE_STRING ); + m_aDocStrm.Seek(0); + rStrm.WriteStream(m_aDocStrm); + rStrm.WriteChar( '}' ).WriteOString( SAL_NEWLINE_STRING ); } void ScRTFExport::WriteTab( SCTAB nTab ) { - rStrm.WriteChar( '{' ).WriteCharPtr( SAL_NEWLINE_STRING ); + m_aDocStrm.WriteChar( '{' ).WriteOString( SAL_NEWLINE_STRING ); if ( pDoc->HasTable( nTab ) ) { memset( &pCellX[0], 0, (pDoc->MaxCol()+2) * sizeof(sal_uLong) ); @@ -89,13 +91,13 @@ void ScRTFExport::WriteTab( SCTAB nTab ) WriteRow( nTab, nRow ); } } - rStrm.WriteChar( '}' ).WriteCharPtr( SAL_NEWLINE_STRING ); + m_aDocStrm.WriteChar( '}' ).WriteOString( SAL_NEWLINE_STRING ); } void ScRTFExport::WriteRow( SCTAB nTab, SCROW nRow ) { - rStrm.WriteCharPtr( OOO_STRING_SVTOOLS_RTF_TROWD ).WriteCharPtr( OOO_STRING_SVTOOLS_RTF_TRGAPH ).WriteCharPtr( "30" ).WriteCharPtr( OOO_STRING_SVTOOLS_RTF_TRLEFT ).WriteCharPtr( "-30" ); - rStrm.WriteCharPtr( OOO_STRING_SVTOOLS_RTF_TRRH ).WriteOString( OString::number(pDoc->GetRowHeight(nRow, nTab)) ); + m_aDocStrm.WriteOString( OOO_STRING_SVTOOLS_RTF_TROWD ).WriteOString( OOO_STRING_SVTOOLS_RTF_TRGAPH ).WriteOString( "30" ).WriteOString( OOO_STRING_SVTOOLS_RTF_TRLEFT ).WriteOString( "-30" ); + m_aDocStrm.WriteOString( OOO_STRING_SVTOOLS_RTF_TRRH ).WriteOString( OString::number(pDoc->GetRowHeight(nRow, nTab)) ); SCCOL nCol; SCCOL nEndCol = aRange.aEnd.Col(); for ( nCol = aRange.aStart.Col(); nCol <= nEndCol; nCol++ ) @@ -107,12 +109,12 @@ void ScRTFExport::WriteRow( SCTAB nTab, SCROW nRow ) const char* pChar; if ( rMergeAttr.GetColMerge() != 0 ) - rStrm.WriteCharPtr( OOO_STRING_SVTOOLS_RTF_CLMGF ); + m_aDocStrm.WriteOString( OOO_STRING_SVTOOLS_RTF_CLMGF ); else { const ScMergeFlagAttr& rMergeFlagAttr = pAttr->GetItem( ATTR_MERGE_FLAG ); if ( rMergeFlagAttr.IsHorOverlapped() ) - rStrm.WriteCharPtr( OOO_STRING_SVTOOLS_RTF_CLMRG ); + m_aDocStrm.WriteOString( OOO_STRING_SVTOOLS_RTF_CLMRG ); } switch( rVerJustifyItem.GetValue() ) @@ -124,25 +126,25 @@ void ScRTFExport::WriteRow( SCTAB nTab, SCROW nRow ) default: pChar = nullptr; break; } if ( pChar ) - rStrm.WriteCharPtr( pChar ); + m_aDocStrm.WriteOString( pChar ); - rStrm.WriteCharPtr( OOO_STRING_SVTOOLS_RTF_CELLX ).WriteOString( OString::number(pCellX[nCol+1]) ); + m_aDocStrm.WriteOString( OOO_STRING_SVTOOLS_RTF_CELLX ).WriteOString( OString::number(pCellX[nCol+1]) ); if ( (nCol & 0x0F) == 0x0F ) - rStrm.WriteCharPtr( SAL_NEWLINE_STRING ); // Do not let lines get too long + m_aDocStrm.WriteOString( SAL_NEWLINE_STRING ); // Do not let lines get too long } - rStrm.WriteCharPtr( OOO_STRING_SVTOOLS_RTF_PARD ).WriteCharPtr( OOO_STRING_SVTOOLS_RTF_PLAIN ).WriteCharPtr( OOO_STRING_SVTOOLS_RTF_INTBL ).WriteCharPtr( SAL_NEWLINE_STRING ); + m_aDocStrm.WriteOString( OOO_STRING_SVTOOLS_RTF_PARD ).WriteOString( OOO_STRING_SVTOOLS_RTF_PLAIN ).WriteOString( OOO_STRING_SVTOOLS_RTF_INTBL ).WriteOString( SAL_NEWLINE_STRING ); - sal_uInt64 nStrmPos = rStrm.Tell(); + sal_uInt64 nStrmPos = m_aDocStrm.Tell(); for ( nCol = aRange.aStart.Col(); nCol <= nEndCol; nCol++ ) { WriteCell( nTab, nRow, nCol ); - if ( rStrm.Tell() - nStrmPos > 255 ) + if ( m_aDocStrm.Tell() - nStrmPos > 255 ) { // Do not let lines get too long - rStrm.WriteCharPtr( SAL_NEWLINE_STRING ); - nStrmPos = rStrm.Tell(); + m_aDocStrm.WriteOString( SAL_NEWLINE_STRING ); + nStrmPos = m_aDocStrm.Tell(); } } - rStrm.WriteCharPtr( OOO_STRING_SVTOOLS_RTF_ROW ).WriteCharPtr( SAL_NEWLINE_STRING ); + m_aDocStrm.WriteOString( OOO_STRING_SVTOOLS_RTF_ROW ).WriteOString( SAL_NEWLINE_STRING ); } void ScRTFExport::WriteCell( SCTAB nTab, SCROW nRow, SCCOL nCol ) @@ -152,7 +154,7 @@ void ScRTFExport::WriteCell( SCTAB nTab, SCROW nRow, SCCOL nCol ) const ScMergeFlagAttr& rMergeFlagAttr = pAttr->GetItem( ATTR_MERGE_FLAG ); if ( rMergeFlagAttr.IsHorOverlapped() ) { - rStrm.WriteCharPtr( OOO_STRING_SVTOOLS_RTF_CELL ); + m_aDocStrm.WriteOString( OOO_STRING_SVTOOLS_RTF_CELL ); return ; } @@ -204,30 +206,30 @@ void ScRTFExport::WriteCell( SCTAB nTab, SCROW nRow, SCCOL nCol ) case SvxCellHorJustify::Repeat: default: pChar = OOO_STRING_SVTOOLS_RTF_QL; break; } - rStrm.WriteCharPtr( pChar ); + m_aDocStrm.WriteOString( pChar ); if ( rWeightItem.GetWeight() >= WEIGHT_BOLD ) { // bold bResetAttr = true; - rStrm.WriteCharPtr( OOO_STRING_SVTOOLS_RTF_B ); + m_aDocStrm.WriteOString( OOO_STRING_SVTOOLS_RTF_B ); } if ( rPostureItem.GetPosture() != ITALIC_NONE ) { // italic bResetAttr = true; - rStrm.WriteCharPtr( OOO_STRING_SVTOOLS_RTF_I ); + m_aDocStrm.WriteOString( OOO_STRING_SVTOOLS_RTF_I ); } if ( rUnderlineItem.GetLineStyle() != LINESTYLE_NONE ) { // underline bResetAttr = true; - rStrm.WriteCharPtr( OOO_STRING_SVTOOLS_RTF_UL ); + m_aDocStrm.WriteOString( OOO_STRING_SVTOOLS_RTF_UL ); } - rStrm.WriteChar( ' ' ); - RTFOutFuncs::Out_String( rStrm, aContent ); - rStrm.WriteCharPtr( OOO_STRING_SVTOOLS_RTF_CELL ); + m_aDocStrm.WriteChar( ' ' ); + RTFOutFuncs::Out_String( m_aDocStrm, aContent ); + m_aDocStrm.WriteOString( OOO_STRING_SVTOOLS_RTF_CELL ); if ( bResetAttr ) - rStrm.WriteCharPtr( OOO_STRING_SVTOOLS_RTF_PLAIN ); + m_aDocStrm.WriteOString( OOO_STRING_SVTOOLS_RTF_PLAIN ); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |