summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenry Castro <hcastro@collabora.com>2023-07-25 15:18:10 -0400
committerHenry Castro <hcastro@collabora.com>2023-08-02 16:06:31 +0200
commit98321ad324d386a9ad14a428fae949c3d7f5e3d3 (patch)
treec39efc5eb22316113fe26529cb2b2ffdcc9dc256
parenta3a00555d4b0e07ee921f85ac088e7b17047c6cf (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.hxx1
-rw-r--r--sc/source/filter/rtf/rtfexp.cxx54
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: */