diff options
Diffstat (limited to 'sw/source/filter/ww8/wrtww8.cxx')
-rw-r--r-- | sw/source/filter/ww8/wrtww8.cxx | 1338 |
1 files changed, 741 insertions, 597 deletions
diff --git a/sw/source/filter/ww8/wrtww8.cxx b/sw/source/filter/ww8/wrtww8.cxx index d8e4241422c8..f56a04de65a4 100644 --- a/sw/source/filter/ww8/wrtww8.cxx +++ b/sw/source/filter/ww8/wrtww8.cxx @@ -37,7 +37,6 @@ #include <docsh.hxx> #include <drawdoc.hxx> -#include <unotools/fltrcfg.hxx> #include <sot/storage.hxx> #include <sfx2/docinf.hxx> #include <editeng/tstpitem.hxx> @@ -87,6 +86,7 @@ #include <strings.hrc> #include <fmtline.hxx> #include <fmtfsize.hxx> +#include <formatflysplit.hxx> #include "sprmids.hxx" #include <comphelper/sequenceashashmap.hxx> @@ -116,6 +116,9 @@ #include <rdfhelper.hxx> #include <fmtclbl.hxx> #include <iodetect.hxx> +#include <fmtwrapinfluenceonobjpos.hxx> +#include <officecfg/Office/Common.hxx> +#include <fmtanchr.hxx> using namespace css; using namespace sw::util; @@ -125,15 +128,15 @@ using namespace sw::types; */ class WW8_WrFkp { - sal_uInt8* pFkp; // Fkp total ( first and only FCs and Sprms ) - sal_uInt8* pOfs; // pointer to the offset area, later copied to pFkp - ePLCFT ePlc; - short nStartGrp; // from here on grpprls - short nOldStartGrp; - sal_uInt8 nItemSize; - sal_uInt8 nIMax; // number of entry pairs - sal_uInt8 nOldVarLen; - bool bCombined; // true : paste not allowed + sal_uInt8* m_pFkp; // Fkp total ( first and only FCs and Sprms ) + sal_uInt8* m_pOfs; // pointer to the offset area, later copied to pFkp + ePLCFT m_ePlc; + short m_nStartGrp; // from here on grpprls + short m_nOldStartGrp; + sal_uInt8 m_nItemSize; + sal_uInt8 m_nIMax; // number of entry pairs + sal_uInt8 m_nOldVarLen; + bool m_bCombined; // true : paste not allowed sal_uInt8 SearchSameSprm( sal_uInt16 nVarLen, const sal_uInt8* pSprms ); @@ -148,12 +151,12 @@ public: void Write( SvStream& rStrm, SwWW8WrGrf& rGrf ); bool IsEqualPos(WW8_FC nEndFc) const - { return !bCombined && nIMax && nEndFc == reinterpret_cast<sal_Int32*>(pFkp)[nIMax]; } + { return !m_bCombined && m_nIMax && nEndFc == reinterpret_cast<sal_Int32*>(m_pFkp)[m_nIMax]; } void MergeToNew( short& rVarLen, sal_uInt8 *& pNewSprms ); bool IsEmptySprm() const - { return !bCombined && nIMax && !nOldVarLen; } + { return !m_bCombined && m_nIMax && !m_nOldVarLen; } void SetNewEnd( WW8_FC nEnd ) - { reinterpret_cast<sal_Int32*>(pFkp)[nIMax] = nEnd; } + { reinterpret_cast<sal_Int32*>(m_pFkp)[m_nIMax] = nEnd; } WW8_FC GetStartFc() const; WW8_FC GetEndFc() const; @@ -164,19 +167,19 @@ public: // class WW8_WrPc collects all piece entries for one piece class WW8_WrPc { - WW8_CP nStartCp; // Starting character position of the text - WW8_FC nStartFc; // Starting file position of the text - sal_uInt16 nStatus; // End of paragraph inside the piece? + WW8_CP m_nStartCp; // Starting character position of the text + WW8_FC m_nStartFc; // Starting file position of the text + sal_uInt16 m_nStatus; // End of paragraph inside the piece? public: WW8_WrPc(WW8_FC nSFc, WW8_CP nSCp ) - : nStartCp( nSCp ), nStartFc( nSFc ), nStatus( 0x0040 ) + : m_nStartCp( nSCp ), m_nStartFc( nSFc ), m_nStatus( 0x0040 ) {} - void SetStatus() { nStatus = 0x0050; } - sal_uInt16 GetStatus() const { return nStatus; } - WW8_CP GetStartCp() const { return nStartCp; } - WW8_FC GetStartFc() const { return nStartFc; } + void SetStatus() { m_nStatus = 0x0050; } + sal_uInt16 GetStatus() const { return m_nStatus; } + WW8_CP GetStartCp() const { return m_nStartCp; } + WW8_FC GetStartFc() const { return m_nStartFc; } }; typedef std::map<OUString,tools::Long> BKMKNames; @@ -189,7 +192,7 @@ class WW8_WrtBookmarks { private: /// Structure of one item inside this map: (startPos, (endPos, (a bool value?, bookmarkName))) - BKMKCPs aSttCps; + BKMKCPs maSttCps; BKMKNames maSwBkmkNms; WW8_WrtBookmarks(WW8_WrtBookmarks const&) = delete; @@ -211,7 +214,7 @@ WW8_WrtBookmarks::WW8_WrtBookmarks() WW8_WrtBookmarks::~WW8_WrtBookmarks() { - for (auto& rEntry : aSttCps) + for (auto& rEntry : maSttCps) { if (rEntry.second) { @@ -228,12 +231,12 @@ void WW8_WrtBookmarks::Append( WW8_CP nStartCp, const OUString& rNm) { BKMK aBK(false,rNm); BKMKCP* pBKCP = new BKMKCP(static_cast<tools::Long>(nStartCp),aBK); - aSttCps.insert(std::pair<tools::Long,BKMKCP*>(nStartCp,pBKCP)); + maSttCps.insert(std::pair<tools::Long,BKMKCP*>(nStartCp,pBKCP)); aResult.first->second = static_cast<tools::Long>(nStartCp); } else { - std::pair<CPItr,CPItr> aRange = aSttCps.equal_range(aResult.first->second); + std::pair<CPItr,CPItr> aRange = maSttCps.equal_range(aResult.first->second); for (CPItr aItr = aRange.first;aItr != aRange.second;++aItr) { if (aItr->second && aItr->second->second.second == rNm) @@ -249,7 +252,7 @@ void WW8_WrtBookmarks::Append( WW8_CP nStartCp, const OUString& rNm) void WW8_WrtBookmarks::Write( WW8Export& rWrt) { - if (aSttCps.empty()) + if (maSttCps.empty()) return; tools::Long n; std::vector<OUString> aNames; @@ -257,7 +260,7 @@ void WW8_WrtBookmarks::Write( WW8Export& rWrt) SvMemoryStream aTempStrm2(65535,65535); BKMKCPs aEndCps; - for (const auto& rEntry : aSttCps) + for (const auto& rEntry : maSttCps) { if (rEntry.second) { @@ -280,28 +283,28 @@ void WW8_WrtBookmarks::Write( WW8Export& rWrt) } aTempStrm2.Seek(0); - rWrt.WriteAsStringTable(aNames, rWrt.pFib->m_fcSttbfbkmk,rWrt.pFib->m_lcbSttbfbkmk); - SvStream& rStrm = *rWrt.pTableStrm; - rWrt.pFib->m_fcPlcfbkf = rStrm.Tell(); + rWrt.WriteAsStringTable(aNames, rWrt.m_pFib->m_fcSttbfbkmk,rWrt.m_pFib->m_lcbSttbfbkmk); + SvStream& rStrm = *rWrt.m_pTableStrm; + rWrt.m_pFib->m_fcPlcfbkf = rStrm.Tell(); rStrm.WriteStream( aTempStrm1 ); - SwWW8Writer::WriteLong(rStrm, rWrt.pFib->m_ccpText + rWrt.pFib->m_ccpTxbx); - for (const auto& rEntry : aSttCps) + SwWW8Writer::WriteLong(rStrm, rWrt.m_pFib->m_ccpText + rWrt.m_pFib->m_ccpTxbx); + for (const auto& rEntry : maSttCps) { if (rEntry.second) { SwWW8Writer::WriteLong(rStrm, rEntry.second->first); } } - rWrt.pFib->m_lcbPlcfbkf = rStrm.Tell() - rWrt.pFib->m_fcPlcfbkf; - rWrt.pFib->m_fcPlcfbkl = rStrm.Tell(); + rWrt.m_pFib->m_lcbPlcfbkf = rStrm.Tell() - rWrt.m_pFib->m_fcPlcfbkf; + rWrt.m_pFib->m_fcPlcfbkl = rStrm.Tell(); rStrm.WriteStream( aTempStrm2 ); - SwWW8Writer::WriteLong(rStrm, rWrt.pFib->m_ccpText + rWrt.pFib->m_ccpTxbx); - rWrt.pFib->m_lcbPlcfbkl = rStrm.Tell() - rWrt.pFib->m_fcPlcfbkl; + SwWW8Writer::WriteLong(rStrm, rWrt.m_pFib->m_ccpText + rWrt.m_pFib->m_ccpTxbx); + rWrt.m_pFib->m_lcbPlcfbkl = rStrm.Tell() - rWrt.m_pFib->m_fcPlcfbkl; } void WW8_WrtBookmarks::MoveFieldMarks(WW8_CP nFrom, WW8_CP nTo) { - std::pair<CPItr,CPItr> aRange = aSttCps.equal_range(nFrom); + std::pair<CPItr,CPItr> aRange = maSttCps.equal_range(nFrom); CPItr aItr = aRange.first; while (aItr != aRange.second) { @@ -312,9 +315,9 @@ void WW8_WrtBookmarks::MoveFieldMarks(WW8_CP nFrom, WW8_CP nTo) aItr->second->second.first = true; aItr->second->first = nTo; } - aSttCps.insert(std::pair<tools::Long,BKMKCP*>(nTo,aItr->second)); + maSttCps.insert(std::pair<tools::Long,BKMKCP*>(nTo,aItr->second)); aItr->second = nullptr; - aRange = aSttCps.equal_range(nFrom); + aRange = maSttCps.equal_range(nFrom); aItr = aRange.first; continue; } @@ -355,11 +358,11 @@ void WW8_WrtFactoids::Write(WW8Export& rExport) return; // Smart tags are otherwise removed by Word on saving. - rExport.pDop->fEmbedFactoids = true; + rExport.m_pDop->fEmbedFactoids = true; - SvStream& rStream = *rExport.pTableStrm; + SvStream& rStream = *rExport.m_pTableStrm; - rExport.pFib->m_fcSttbfBkmkFactoid = rStream.Tell(); + rExport.m_pFib->m_fcSttbfBkmkFactoid = rStream.Tell(); // Write SttbfBkmkFactoid. rStream.WriteUInt16(0xffff); // fExtend rStream.WriteUInt16(m_aStartCPs.size()); // cData @@ -374,12 +377,12 @@ void WW8_WrtFactoids::Write(WW8Export& rExport) rStream.WriteUInt16(0); // fto rStream.WriteUInt32(0); // pfpb } - rExport.pFib->m_lcbSttbfBkmkFactoid = rStream.Tell() - rExport.pFib->m_fcSttbfBkmkFactoid; + rExport.m_pFib->m_lcbSttbfBkmkFactoid = rStream.Tell() - rExport.m_pFib->m_fcSttbfBkmkFactoid; - rExport.pFib->m_fcPlcfBkfFactoid = rStream.Tell(); + rExport.m_pFib->m_fcPlcfBkfFactoid = rStream.Tell(); for (const WW8_CP& rCP : m_aStartCPs) rStream.WriteInt32(rCP); - rStream.WriteInt32(rExport.pFib->m_ccpText + rExport.pFib->m_ccpTxbx); + rStream.WriteInt32(rExport.m_pFib->m_ccpText + rExport.m_pFib->m_ccpTxbx); // Write FBKFD. for (size_t i = 0; i < m_aStartCPs.size(); ++i) @@ -389,12 +392,12 @@ void WW8_WrtFactoids::Write(WW8Export& rExport) rStream.WriteInt16(1); // cDepth, 1 as start and end is the same. } - rExport.pFib->m_lcbPlcfBkfFactoid = rStream.Tell() - rExport.pFib->m_fcPlcfBkfFactoid; + rExport.m_pFib->m_lcbPlcfBkfFactoid = rStream.Tell() - rExport.m_pFib->m_fcPlcfBkfFactoid; - rExport.pFib->m_fcPlcfBklFactoid = rStream.Tell(); + rExport.m_pFib->m_fcPlcfBklFactoid = rStream.Tell(); for (const WW8_CP& rCP : m_aEndCPs) rStream.WriteInt32(rCP); - rStream.WriteInt32(rExport.pFib->m_ccpText + rExport.pFib->m_ccpTxbx); + rStream.WriteInt32(rExport.m_pFib->m_ccpText + rExport.m_pFib->m_ccpTxbx); // Write FBKLD. for (size_t i = 0; i < m_aEndCPs.size(); ++i) @@ -402,9 +405,9 @@ void WW8_WrtFactoids::Write(WW8Export& rExport) rStream.WriteInt16(i); // ibkf rStream.WriteInt16(0); // cDepth, 0 as does not overlap with any other smart tag. } - rExport.pFib->m_lcbPlcfBklFactoid = rStream.Tell() - rExport.pFib->m_fcPlcfBklFactoid; + rExport.m_pFib->m_lcbPlcfBklFactoid = rStream.Tell() - rExport.m_pFib->m_fcPlcfBklFactoid; - rExport.pFib->m_fcFactoidData = rStream.Tell(); + rExport.m_pFib->m_fcFactoidData = rStream.Tell(); // Write SmartTagData. MSOFactoidType aFactoidType; aFactoidType.m_nId = 1; @@ -439,18 +442,18 @@ void WW8_WrtFactoids::Write(WW8Export& rExport) } aSmartTagData.Write(rExport); - rExport.pFib->m_lcbFactoidData = rStream.Tell() - rExport.pFib->m_fcFactoidData; + rExport.m_pFib->m_lcbFactoidData = rStream.Tell() - rExport.m_pFib->m_fcFactoidData; } #define DEFAULT_STYLES_COUNT 16 // Names of the storage streams constexpr OUStringLiteral sMainStream = u"WordDocument"; -#define sCompObj "\1CompObj" +constexpr OUStringLiteral sCompObj = u"\1CompObj"; static void WriteDop( WW8Export& rWrt ) { - WW8Dop& rDop = *rWrt.pDop; + WW8Dop& rDop = *rWrt.m_pDop; // i#78951#, store the value of unknown compatibility options rDop.SetCompatibilityOptions( rWrt.m_rDoc.getIDocumentSettingAccess().Getn32DummyCompatibilityOptions1()); @@ -461,8 +464,8 @@ static void WriteDop( WW8Export& rWrt ) // write default TabStop const SvxTabStopItem& rTabStop = - DefaultItemGet<SvxTabStopItem>(rWrt.m_rDoc, RES_PARATR_TABSTOP); - rDop.dxaTab = static_cast<sal_uInt16>(rTabStop[0].GetTabPos()); + rWrt.m_rDoc.GetAttrPool().GetUserOrPoolDefaultItem(RES_PARATR_TABSTOP); + rDop.dxaTab = o3tl::narrowing<sal_uInt16>(rTabStop[0].GetTabPos()); // Zoom factor and type SwViewShell *pViewShell(rWrt.m_rDoc.getIDocumentLayoutAccess().GetCurrentViewShell()); @@ -505,7 +508,7 @@ static void WriteDop( WW8Export& rWrt ) rDop.lKeyProtDoc = pDocShell->GetModifyPasswordHash(); } - if ((rWrt.pSepx && rWrt.pSepx->DocumentIsProtected()) || + if ((rWrt.m_pSepx && rWrt.m_pSepx->DocumentIsProtected()) || rWrt.m_rDoc.getIDocumentSettingAccess().get(DocumentSettingId::PROTECT_FORM ) || rDop.lKeyProtDoc != 0) { @@ -556,7 +559,10 @@ static void WriteDop( WW8Export& rWrt ) rDop.fExpShRtn = !rWrt.m_rDoc.getIDocumentSettingAccess().get(DocumentSettingId::DO_NOT_JUSTIFY_LINES_WITH_MANUAL_BREAK); // #i56856# - rDop.Write( *rWrt.pTableStrm, *rWrt.pFib ); + IDocumentSettingAccess& rIDSA = rWrt.m_rDoc.getIDocumentSettingAccess(); + rDop.fDontBreakWrappedTables = rIDSA.get(DocumentSettingId::DO_NOT_BREAK_WRAPPED_TABLES); + + rDop.Write( *rWrt.m_pTableStrm, *rWrt.m_pFib ); } static int lcl_CmpBeginEndChars( const OUString& rSWStr, @@ -698,14 +704,14 @@ void WW8Export::ExportDopTypography(WW8DopTypography &rTypo) !lcl_CmpBeginEndChars ( pForbidden->endLine, - OUString(WW8DopTypography::JapanNotEndLevel1).getStr(), + WW8DopTypography::JapanNotEndLevel1.getStr(), WW8DopTypography::nMaxLeading * sizeof(sal_Unicode) ) && !lcl_CmpBeginEndChars ( pForbidden->beginLine, - OUString(WW8DopTypography::JapanNotBeginLevel1).getStr(), + WW8DopTypography::JapanNotBeginLevel1.getStr(), WW8DopTypography::nMaxFollowing * sizeof(sal_Unicode) ) ) @@ -793,9 +799,9 @@ const SfxPoolItem& MSWordExportBase::GetItem(sal_uInt16 nWhich) const } WW8_WrPlc1::WW8_WrPlc1( sal_uInt16 nStructSz ) - : pData( new sal_uInt8[ 16 * nStructSz ] ), - nDataLen(16 * nStructSz), - nStructSiz( nStructSz ) + : m_pData( new sal_uInt8[ 16 * nStructSz ] ), + m_nDataLen(16 * nStructSz), + m_nStructSiz( nStructSz ) { } @@ -805,43 +811,43 @@ WW8_WrPlc1::~WW8_WrPlc1() WW8_CP WW8_WrPlc1::Prev() const { - bool b = !aPos.empty(); + bool b = !m_aPos.empty(); OSL_ENSURE(b,"Prev called on empty list"); - return b ? aPos.back() : 0; + return b ? m_aPos.back() : 0; } void WW8_WrPlc1::Append( WW8_CP nCp, const void* pNewData ) { - sal_uLong nInsPos = aPos.size() * nStructSiz; - aPos.push_back( nCp ); - if( nDataLen < nInsPos + nStructSiz ) + sal_uLong nInsPos = m_aPos.size() * m_nStructSiz; + m_aPos.push_back( nCp ); + if( m_nDataLen < nInsPos + m_nStructSiz ) { - sal_uInt8* pNew = new sal_uInt8[ 2 * nDataLen ]; - memcpy( pNew, pData.get(), nDataLen ); - pData.reset(pNew); - nDataLen *= 2; + sal_uInt8* pNew = new sal_uInt8[ 2 * m_nDataLen ]; + memcpy( pNew, m_pData.get(), m_nDataLen ); + m_pData.reset(pNew); + m_nDataLen *= 2; } - memcpy( pData.get() + nInsPos, pNewData, nStructSiz ); + memcpy( m_pData.get() + nInsPos, pNewData, m_nStructSiz ); } void WW8_WrPlc1::Finish( sal_uLong nLastCp, sal_uLong nSttCp ) { - if( !aPos.empty() ) + if( !m_aPos.empty() ) { - aPos.push_back( nLastCp ); + m_aPos.push_back( nLastCp ); if( nSttCp ) - for(WW8_CP & rCp : aPos) + for(WW8_CP & rCp : m_aPos) rCp -= nSttCp; } } void WW8_WrPlc1::Write( SvStream& rStrm ) { - decltype(aPos)::size_type i; - for( i = 0; i < aPos.size(); ++i ) - SwWW8Writer::WriteLong( rStrm, aPos[i] ); + decltype(m_aPos)::size_type i; + for( i = 0; i < m_aPos.size(); ++i ) + SwWW8Writer::WriteLong( rStrm, m_aPos[i] ); if( i ) - rStrm.WriteBytes(pData.get(), (i-1) * nStructSiz); + rStrm.WriteBytes(m_pData.get(), (i-1) * m_nStructSiz); } // Class WW8_WrPlcField for fields @@ -853,40 +859,40 @@ void WW8_WrPlcField::Write( WW8Export& rWrt ) WW8_FC *pfc; sal_Int32 *plc; - switch (nTextTyp) + switch (m_nTextTyp) { case TXT_MAINTEXT: - pfc = &rWrt.pFib->m_fcPlcffldMom; - plc = &rWrt.pFib->m_lcbPlcffldMom; + pfc = &rWrt.m_pFib->m_fcPlcffldMom; + plc = &rWrt.m_pFib->m_lcbPlcffldMom; break; case TXT_HDFT: - pfc = &rWrt.pFib->m_fcPlcffldHdr; - plc = &rWrt.pFib->m_lcbPlcffldHdr; + pfc = &rWrt.m_pFib->m_fcPlcffldHdr; + plc = &rWrt.m_pFib->m_lcbPlcffldHdr; break; case TXT_FTN: - pfc = &rWrt.pFib->m_fcPlcffldFootnote; - plc = &rWrt.pFib->m_lcbPlcffldFootnote; + pfc = &rWrt.m_pFib->m_fcPlcffldFootnote; + plc = &rWrt.m_pFib->m_lcbPlcffldFootnote; break; case TXT_EDN: - pfc = &rWrt.pFib->m_fcPlcffldEdn; - plc = &rWrt.pFib->m_lcbPlcffldEdn; + pfc = &rWrt.m_pFib->m_fcPlcffldEdn; + plc = &rWrt.m_pFib->m_lcbPlcffldEdn; break; case TXT_ATN: - pfc = &rWrt.pFib->m_fcPlcffldAtn; - plc = &rWrt.pFib->m_lcbPlcffldAtn; + pfc = &rWrt.m_pFib->m_fcPlcffldAtn; + plc = &rWrt.m_pFib->m_lcbPlcffldAtn; break; case TXT_TXTBOX: - pfc = &rWrt.pFib->m_fcPlcffldTxbx; - plc = &rWrt.pFib->m_lcbPlcffldTxbx; + pfc = &rWrt.m_pFib->m_fcPlcffldTxbx; + plc = &rWrt.m_pFib->m_lcbPlcffldTxbx; break; case TXT_HFTXTBOX: - pfc = &rWrt.pFib->m_fcPlcffldHdrTxbx; - plc = &rWrt.pFib->m_lcbPlcffldHdrTxbx; + pfc = &rWrt.m_pFib->m_fcPlcffldHdrTxbx; + plc = &rWrt.m_pFib->m_lcbPlcffldHdrTxbx; break; default: @@ -896,10 +902,10 @@ void WW8_WrPlcField::Write( WW8Export& rWrt ) if( pfc && plc ) { - sal_uInt64 nFcStart = rWrt.pTableStrm->Tell(); - WW8_WrPlc1::Write( *rWrt.pTableStrm ); + sal_uInt64 nFcStart = rWrt.m_pTableStrm->Tell(); + WW8_WrPlc1::Write( *rWrt.m_pTableStrm ); *pfc = nFcStart; - *plc = rWrt.pTableStrm->Tell() - nFcStart; + *plc = rWrt.m_pTableStrm->Tell() - nFcStart; } } @@ -907,10 +913,10 @@ void WW8_WrMagicTable::Write( WW8Export& rWrt ) { if( WW8_WrPlc1::Count() <= 1 ) return; - sal_uLong nFcStart = rWrt.pTableStrm->Tell(); - WW8_WrPlc1::Write( *rWrt.pTableStrm ); - rWrt.pFib->m_fcPlcfTch = nFcStart; - rWrt.pFib->m_lcbPlcfTch = rWrt.pTableStrm->Tell() - nFcStart; + sal_uInt64 nFcStart = rWrt.m_pTableStrm->Tell(); + WW8_WrPlc1::Write( *rWrt.m_pTableStrm ); + rWrt.m_pFib->m_fcPlcfTch = nFcStart; + rWrt.m_pFib->m_lcbPlcfTch = rWrt.m_pTableStrm->Tell() - nFcStart; } void WW8_WrMagicTable::Append( WW8_CP nCp, sal_uLong nData) @@ -959,11 +965,11 @@ sal_uLong SwWW8Writer::FillUntil( SvStream& rStrm, sal_uLong nEndPos ) } WW8_WrPlcPn::WW8_WrPlcPn(WW8Export& rWr, ePLCFT ePl, WW8_FC nStartFc) - : rWrt(rWr) - , nFkpStartPage(0) - , ePlc(ePl) + : m_rWrt(rWr) + , m_nFkpStartPage(0) + , m_ePlc(ePl) { - m_Fkps.push_back(std::make_unique<WW8_WrFkp>(ePlc, nStartFc)); + m_Fkps.push_back(std::make_unique<WW8_WrFkp>(m_ePlc, nStartFc)); } WW8_WrPlcPn::~WW8_WrPlcPn() @@ -983,16 +989,16 @@ void WW8_WrPlcPn::AppendFkpEntry(WW8_FC nEndFc,short nVarLen,const sal_uInt8* pS // big sprm? build the sprmPHugePapx sal_uInt8* pNewSprms = const_cast<sal_uInt8*>(pSprms); sal_uInt8 aHugePapx[ 8 ]; - if (PAP == ePlc && 488 <= nVarLen) + if (PAP == m_ePlc && 488 <= nVarLen) { sal_uInt8* p = aHugePapx; *p++ = *pSprms++; // set style Id *p++ = *pSprms++; nVarLen -= 2; - tools::Long nDataPos = rWrt.pDataStrm->Tell(); - SwWW8Writer::WriteShort( *rWrt.pDataStrm, nVarLen ); - rWrt.pDataStrm->WriteBytes(pSprms, nVarLen); + sal_uInt64 nDataPos = m_rWrt.m_pDataStrm->Tell(); + SwWW8Writer::WriteShort( *m_rWrt.m_pDataStrm, nVarLen ); + m_rWrt.m_pDataStrm->WriteBytes(pSprms, nVarLen); Set_UInt16( p, 0x6646 ); // set SprmCode Set_UInt32( p, nDataPos ); // set startpos (FC) in the datastream @@ -1015,7 +1021,7 @@ void WW8_WrPlcPn::AppendFkpEntry(WW8_FC nEndFc,short nVarLen,const sal_uInt8* pS if( !bOk ) { pF->Combine(); - pF = new WW8_WrFkp(ePlc, pF->GetEndFc()); // Start new Fkp == end of old Fkp + pF = new WW8_WrFkp(m_ePlc, pF->GetEndFc()); // Start new Fkp == end of old Fkp m_Fkps.push_back(std::unique_ptr<WW8_WrFkp>(pF)); if( !pF->Append( nEndFc, nVarLen, pNewSprms ) ) @@ -1029,73 +1035,73 @@ void WW8_WrPlcPn::AppendFkpEntry(WW8_FC nEndFc,short nVarLen,const sal_uInt8* pS void WW8_WrPlcPn::WriteFkps() { - nFkpStartPage = static_cast<sal_uInt16>( SwWW8Writer::FillUntil( rWrt.Strm() ) >> 9 ); + m_nFkpStartPage = o3tl::narrowing<sal_uInt16>( SwWW8Writer::FillUntil( m_rWrt.Strm() ) >> 9 ); for(const std::unique_ptr<WW8_WrFkp> & rp : m_Fkps) { - rp->Write( rWrt.Strm(), *rWrt.m_pGrf ); + rp->Write( m_rWrt.Strm(), *m_rWrt.m_pGrf ); } - if( CHP == ePlc ) + if( CHP == m_ePlc ) { - rWrt.pFib->m_pnChpFirst = nFkpStartPage; - rWrt.pFib->m_cpnBteChp = m_Fkps.size(); + m_rWrt.m_pFib->m_pnChpFirst = m_nFkpStartPage; + m_rWrt.m_pFib->m_cpnBteChp = m_Fkps.size(); } else { - rWrt.pFib->m_pnPapFirst = nFkpStartPage; - rWrt.pFib->m_cpnBtePap = m_Fkps.size(); + m_rWrt.m_pFib->m_pnPapFirst = m_nFkpStartPage; + m_rWrt.m_pFib->m_cpnBtePap = m_Fkps.size(); } } void WW8_WrPlcPn::WritePlc() { - sal_uInt64 nFcStart = rWrt.pTableStrm->Tell(); + sal_uInt64 nFcStart = m_rWrt.m_pTableStrm->Tell(); decltype(m_Fkps)::size_type i; for (i = 0; i < m_Fkps.size(); ++i) { - SwWW8Writer::WriteLong( *rWrt.pTableStrm, + SwWW8Writer::WriteLong( *m_rWrt.m_pTableStrm, m_Fkps[ i ]->GetStartFc() ); } - SwWW8Writer::WriteLong( *rWrt.pTableStrm, + SwWW8Writer::WriteLong( *m_rWrt.m_pTableStrm, m_Fkps[ i - 1 ]->GetEndFc() ); // for every FKP output the page for (i = 0; i < m_Fkps.size(); ++i) { - SwWW8Writer::WriteLong( *rWrt.pTableStrm, i + nFkpStartPage ); + SwWW8Writer::WriteLong( *m_rWrt.m_pTableStrm, i + m_nFkpStartPage ); } - if( CHP == ePlc ) + if( CHP == m_ePlc ) { - rWrt.pFib->m_fcPlcfbteChpx = nFcStart; - rWrt.pFib->m_lcbPlcfbteChpx = rWrt.pTableStrm->Tell() - nFcStart; + m_rWrt.m_pFib->m_fcPlcfbteChpx = nFcStart; + m_rWrt.m_pFib->m_lcbPlcfbteChpx = m_rWrt.m_pTableStrm->Tell() - nFcStart; } else { - rWrt.pFib->m_fcPlcfbtePapx = nFcStart; - rWrt.pFib->m_lcbPlcfbtePapx = rWrt.pTableStrm->Tell() - nFcStart; + m_rWrt.m_pFib->m_fcPlcfbtePapx = nFcStart; + m_rWrt.m_pFib->m_lcbPlcfbtePapx = m_rWrt.m_pTableStrm->Tell() - nFcStart; } } WW8_WrFkp::WW8_WrFkp(ePLCFT ePl, WW8_FC nStartFc) - : ePlc(ePl), nStartGrp(511), nOldStartGrp(511), - nItemSize( ( CHP == ePl ) ? 1 : 13 ), - nIMax(0), nOldVarLen(0), bCombined(false) + : m_ePlc(ePl), m_nStartGrp(511), m_nOldStartGrp(511), + m_nItemSize( ( CHP == ePl ) ? 1 : 13 ), + m_nIMax(0), m_nOldVarLen(0), m_bCombined(false) { - pFkp = reinterpret_cast<sal_uInt8*>(new sal_Int32[128]); // 512 Byte - pOfs = reinterpret_cast<sal_uInt8*>(new sal_Int32[128]); // 512 Byte - memset( pFkp, 0, 4 * 128 ); - memset( pOfs, 0, 4 * 128 ); - reinterpret_cast<sal_Int32*>(pFkp)[0] = nStartFc; // 0th entry FC at nStartFc + m_pFkp = reinterpret_cast<sal_uInt8*>(new sal_Int32[128]); // 512 Byte + m_pOfs = reinterpret_cast<sal_uInt8*>(new sal_Int32[128]); // 512 Byte + memset( m_pFkp, 0, 4 * 128 ); + memset( m_pOfs, 0, 4 * 128 ); + reinterpret_cast<sal_Int32*>(m_pFkp)[0] = nStartFc; // 0th entry FC at nStartFc } WW8_WrFkp::~WW8_WrFkp() { - delete[] reinterpret_cast<sal_Int32 *>(pFkp); - delete[] reinterpret_cast<sal_Int32 *>(pOfs); + delete[] reinterpret_cast<sal_Int32 *>(m_pFkp); + delete[] reinterpret_cast<sal_Int32 *>(m_pOfs); } sal_uInt8 WW8_WrFkp::SearchSameSprm( sal_uInt16 nVarLen, const sal_uInt8* pSprms ) @@ -1111,15 +1117,15 @@ sal_uInt8 WW8_WrFkp::SearchSameSprm( sal_uInt16 nVarLen, const sal_uInt8* pSprms } short i; - for( i = 0; i < nIMax; i++ ) + for( i = 0; i < m_nIMax; i++ ) { - sal_uInt8 nStart = pOfs[i * nItemSize]; + sal_uInt8 nStart = m_pOfs[i * m_nItemSize]; if( nStart ) { // has Sprms - const sal_uInt8* p = pFkp + ( static_cast<sal_uInt16>(nStart) << 1 ); - if( ( CHP == ePlc + const sal_uInt8* p = m_pFkp + ( o3tl::narrowing<sal_uInt16>(nStart) << 1 ); + if( ( CHP == m_ePlc ? (*p++ == nVarLen) - : ((static_cast<sal_uInt16>(*p++) << 1 ) == (( nVarLen+1) & 0xfffe)) ) + : ((o3tl::narrowing<sal_uInt16>(*p++) << 1 ) == (( nVarLen+1) & 0xfffe)) ) && !memcmp( p, pSprms, nVarLen ) ) return nStart; // found it } @@ -1132,14 +1138,14 @@ sal_uInt8 *WW8_WrFkp::CopyLastSprms(sal_uInt8 &rLen) rLen=0; sal_uInt8 *pStart=nullptr,*pRet=nullptr; - if (!bCombined) - pStart = pOfs; + if (!m_bCombined) + pStart = m_pOfs; else - pStart = pFkp + ( nIMax + 1 ) * 4; + pStart = m_pFkp + ( m_nIMax + 1 ) * 4; - sal_uInt8 nStart = *(pStart + (nIMax-1) * nItemSize); + sal_uInt8 nStart = *(pStart + (m_nIMax-1) * m_nItemSize); - const sal_uInt8* p = pFkp + ( static_cast<sal_uInt16>(nStart) << 1 ); + const sal_uInt8* p = m_pFkp + ( o3tl::narrowing<sal_uInt16>(nStart) << 1 ); if (!*p) p++; @@ -1147,7 +1153,7 @@ sal_uInt8 *WW8_WrFkp::CopyLastSprms(sal_uInt8 &rLen) if (*p) { rLen = *p++; - if (PAP == ePlc) + if (PAP == m_ePlc) rLen *= 2; pRet = new sal_uInt8[rLen]; memcpy(pRet,p,rLen); @@ -1159,14 +1165,14 @@ bool WW8_WrFkp::Append( WW8_FC nEndFc, sal_uInt16 nVarLen, const sal_uInt8* pSpr { assert((!nVarLen || pSprms) && "Item pointer missing"); - OSL_ENSURE( nVarLen < ( ( ePlc == PAP ) ? 497U : 502U ), "Sprms too long !" ); + OSL_ENSURE( nVarLen < ( ( m_ePlc == PAP ) ? 497U : 502U ), "Sprms too long !" ); - if( bCombined ) + if( m_bCombined ) { OSL_ENSURE( false, "Fkp::Append: Fkp is already combined" ); return false; } - sal_Int32 n = reinterpret_cast<sal_Int32*>(pFkp)[nIMax]; // last entry + sal_Int32 n = reinterpret_cast<sal_Int32*>(m_pFkp)[m_nIMax]; // last entry if( nEndFc <= n ) { OSL_ENSURE( nEndFc >= n, "+Fkp: FC backwards" ); @@ -1179,67 +1185,67 @@ bool WW8_WrFkp::Append( WW8_FC nEndFc, sal_uInt16 nVarLen, const sal_uInt8* pSpr sal_uInt8 nOldP = nVarLen ? SearchSameSprm( nVarLen, pSprms ) : 0; // Combine equal entries - short nOffset=0, nPos = nStartGrp; + short nOffset=0, nPos = m_nStartGrp; if (nVarLen && !nOldP) { - nPos = PAP == ePlc - ? ( 13 == nItemSize // HACK: PAP and bWrtWW8 !! - ? (nStartGrp & 0xFFFE ) - nVarLen - 1 - : (nStartGrp - (((nVarLen + 1) & 0xFFFE)+1)) & 0xFFFE ) - : ((nStartGrp - nVarLen - 1) & 0xFFFE); + nPos = PAP == m_ePlc + ? ( 13 == m_nItemSize // HACK: PAP and bWrtWW8 !! + ? (m_nStartGrp & 0xFFFE ) - nVarLen - 1 + : (m_nStartGrp - (((nVarLen + 1) & 0xFFFE)+1)) & 0xFFFE ) + : ((m_nStartGrp - nVarLen - 1) & 0xFFFE); if( nPos < 0 ) return false; // doesn't fit at all nOffset = nPos; // save offset (can also be uneven!) nPos &= 0xFFFE; // Pos for Sprms ( gerade Pos ) } - if( o3tl::make_unsigned(nPos) <= ( nIMax + 2U ) * 4U + ( nIMax + 1U ) * nItemSize ) + if( o3tl::make_unsigned(nPos) <= ( m_nIMax + 2U ) * 4U + ( m_nIMax + 1U ) * m_nItemSize ) // does it fits after the CPs and offsets? return false; // no - reinterpret_cast<sal_Int32*>(pFkp)[nIMax + 1] = nEndFc; // insert FC + reinterpret_cast<sal_Int32*>(m_pFkp)[m_nIMax + 1] = nEndFc; // insert FC - nOldVarLen = static_cast<sal_uInt8>(nVarLen); + m_nOldVarLen = static_cast<sal_uInt8>(nVarLen); if( nVarLen && !nOldP ) { // insert it for real - nOldStartGrp = nStartGrp; + m_nOldStartGrp = m_nStartGrp; - nStartGrp = nPos; - pOfs[nIMax * nItemSize] = static_cast<sal_uInt8>( nStartGrp >> 1 ); + m_nStartGrp = nPos; + m_pOfs[m_nIMax * m_nItemSize] = static_cast<sal_uInt8>( m_nStartGrp >> 1 ); // insert (start-of-data >> 1) - sal_uInt8 nCnt = static_cast< sal_uInt8 >(CHP == ePlc + sal_uInt8 nCnt = static_cast< sal_uInt8 >(CHP == m_ePlc ? ( nVarLen < 256 ) ? static_cast<sal_uInt8>(nVarLen) : 255 : ( ( nVarLen + 1 ) >> 1 )); - pFkp[ nOffset ] = nCnt; // Enter data length - memcpy( pFkp + nOffset + 1, pSprms, nVarLen ); // store Sprms + m_pFkp[ nOffset ] = nCnt; // Enter data length + memcpy( m_pFkp + nOffset + 1, pSprms, nVarLen ); // store Sprms } else { // do not enter for real ( no Sprms or recurrence ) // start-of-data 0 ( no data ) or recurrence - pOfs[nIMax * nItemSize] = nOldP; + m_pOfs[m_nIMax * m_nItemSize] = nOldP; } - nIMax++; + m_nIMax++; return true; } void WW8_WrFkp::Combine() { - if( bCombined ) + if( m_bCombined ) return; - if( nIMax ) - memcpy( pFkp + ( nIMax + 1 ) * 4, pOfs, nIMax * nItemSize ); - delete[] pOfs; - pOfs = nullptr; - pFkp[511] = nIMax; - bCombined = true; + if( m_nIMax ) + memcpy( m_pFkp + ( m_nIMax + 1 ) * 4, m_pOfs, m_nIMax * m_nItemSize ); + delete[] m_pOfs; + m_pOfs = nullptr; + m_pFkp[511] = m_nIMax; + m_bCombined = true; #if defined OSL_BIGENDIAN // only the FCs will be rotated here sal_uInt16 i; // the Sprms must be rotated elsewhere sal_uInt32* p; - for( i = 0, p = (sal_uInt32*)pFkp; i <= nIMax; i++, p++ ) + for( i = 0, p = (sal_uInt32*)m_pFkp; i <= m_nIMax; i++, p++ ) *p = OSL_SWAPDWORD( *p ); #endif // ifdef OSL_BIGENDIAN } @@ -1249,8 +1255,8 @@ void WW8_WrFkp::Write( SvStream& rStrm, SwWW8WrGrf& rGrf ) Combine(); // If not already combined sal_uInt8* p; // search magic for nPicLocFc - sal_uInt8* pEnd = pFkp + nStartGrp; - for( p = pFkp + 511 - 4; p >= pEnd; p-- ) + sal_uInt8* pEnd = m_pFkp + m_nStartGrp; + for( p = m_pFkp + 511 - 4; p >= pEnd; p-- ) { if( *p != GRF_MAGIC_1 ) // search for signature 0x12 0x34 0x56 0xXX continue; @@ -1263,40 +1269,40 @@ void WW8_WrFkp::Write( SvStream& rStrm, SwWW8WrGrf& rGrf ) UInt32ToSVBT32( rGrf.GetFPos(), nPos ); // FilePos the graphics memcpy( p, nPos, 4 ); // patch FilePos over the signature } - rStrm.WriteBytes(pFkp, 512); + rStrm.WriteBytes(m_pFkp, 512); } void WW8_WrFkp::MergeToNew( short& rVarLen, sal_uInt8 *& rpNewSprms ) { - sal_uInt8 nStart = pOfs[ (nIMax-1) * nItemSize ]; + sal_uInt8 nStart = m_pOfs[ (m_nIMax-1) * m_nItemSize ]; if( !nStart ) return; // has Sprms - sal_uInt8* p = pFkp + ( static_cast<sal_uInt16>(nStart) << 1 ); + sal_uInt8* p = m_pFkp + ( o3tl::narrowing<sal_uInt16>(nStart) << 1 ); // old and new equal? Then copy only one into the new sprms - if( nOldVarLen == rVarLen && !memcmp( p+1, rpNewSprms, nOldVarLen )) + if( m_nOldVarLen == rVarLen && !memcmp( p+1, rpNewSprms, m_nOldVarLen )) { - sal_uInt8* pNew = new sal_uInt8[ nOldVarLen ]; - memcpy( pNew, p+1, nOldVarLen ); + sal_uInt8* pNew = new sal_uInt8[ m_nOldVarLen ]; + memcpy( pNew, p+1, m_nOldVarLen ); rpNewSprms = pNew; } else { - sal_uInt8* pNew = new sal_uInt8[ nOldVarLen + rVarLen ]; - memcpy( pNew, p+1, nOldVarLen ); - memcpy( pNew + nOldVarLen, rpNewSprms, rVarLen ); + sal_uInt8* pNew = new sal_uInt8[ m_nOldVarLen + rVarLen ]; + memcpy( pNew, p+1, m_nOldVarLen ); + memcpy( pNew + m_nOldVarLen, rpNewSprms, rVarLen ); rpNewSprms = pNew; - rVarLen = rVarLen + nOldVarLen; + rVarLen = rVarLen + m_nOldVarLen; } - --nIMax; + --m_nIMax; // if this Sprms don't used from others, remove it bool bFnd = false; - for (sal_uInt16 n = 0; n < nIMax; ++n) + for (sal_uInt16 n = 0; n < m_nIMax; ++n) { - if (nStart == pOfs[n * nItemSize]) + if (nStart == m_pOfs[n * m_nItemSize]) { bFnd = true; break; @@ -1304,8 +1310,8 @@ void WW8_WrFkp::MergeToNew( short& rVarLen, sal_uInt8 *& rpNewSprms ) } if (!bFnd) { - nStartGrp = nOldStartGrp; - memset( p, 0, nOldVarLen+1 ); + m_nStartGrp = m_nOldStartGrp; + memset( p, 0, m_nOldVarLen+1 ); } } @@ -1314,23 +1320,23 @@ WW8_FC WW8_WrFkp::GetStartFc() const // when bCombined, then the array beginning with pFkp is already byte-swapped // to LittleEndian, so to extract the start and end positions they must // be swapped back. - if( bCombined ) - return SVBT32ToUInt32( pFkp ); // 0. Element - return reinterpret_cast<sal_Int32*>(pFkp)[0]; + if( m_bCombined ) + return SVBT32ToUInt32( m_pFkp ); // 0. Element + return reinterpret_cast<sal_Int32*>(m_pFkp)[0]; } WW8_FC WW8_WrFkp::GetEndFc() const { - if( bCombined ) - return SVBT32ToUInt32( &(pFkp[nIMax*4]) ); // nIMax-th SVBT32-Element - return reinterpret_cast<sal_Int32*>(pFkp)[nIMax]; + if( m_bCombined ) + return SVBT32ToUInt32( &(m_pFkp[m_nIMax*4]) ); // nIMax-th SVBT32-Element + return reinterpret_cast<sal_Int32*>(m_pFkp)[m_nIMax]; } // Method for managing the piece table WW8_WrPct::WW8_WrPct(WW8_FC nfcMin) - : nOldFc(nfcMin) + : m_nOldFc(nfcMin) { - AppendPc(nOldFc); + AppendPc(m_nOldFc); } WW8_WrPct::~WW8_WrPct() @@ -1340,14 +1346,14 @@ WW8_WrPct::~WW8_WrPct() // Fill the piece and create a new one void WW8_WrPct::AppendPc(WW8_FC nStartFc) { - WW8_CP nStartCp = nStartFc - nOldFc; // subtract the beginning of the text + WW8_CP nStartCp = nStartFc - m_nOldFc; // subtract the beginning of the text if ( !nStartCp && !m_Pcts.empty()) { OSL_ENSURE(1 == m_Pcts.size(), "empty Piece!"); m_Pcts.pop_back(); } - nOldFc = nStartFc; // remember StartFc as old + m_nOldFc = nStartFc; // remember StartFc as old nStartCp >>= 1; // for Unicode: number of characters / 2 @@ -1364,37 +1370,37 @@ void WW8_WrPct::WritePc( WW8Export& rWrt ) sal_uInt64 nPctStart; sal_uLong nOldPos, nEndPos; - nPctStart = rWrt.pTableStrm->Tell(); // Start piece table - rWrt.pTableStrm->WriteChar( char(0x02) ); // Status byte PCT + nPctStart = rWrt.m_pTableStrm->Tell(); // Start piece table + rWrt.m_pTableStrm->WriteChar( char(0x02) ); // Status byte PCT nOldPos = nPctStart + 1; // remember Position - SwWW8Writer::WriteLong( *rWrt.pTableStrm, 0 ); // then the length + SwWW8Writer::WriteLong( *rWrt.m_pTableStrm, 0 ); // then the length for (auto const& it : m_Pcts) // ranges { - SwWW8Writer::WriteLong( *rWrt.pTableStrm, it->GetStartCp() ); + SwWW8Writer::WriteLong( *rWrt.m_pTableStrm, it->GetStartCp() ); } // calculate the last Pos - sal_uLong nStartCp = rWrt.pFib->m_fcMac - nOldFc; + sal_uLong nStartCp = rWrt.m_pFib->m_fcMac - m_nOldFc; nStartCp >>= 1; // For Unicode: number of characters / 2 nStartCp += m_Pcts.back()->GetStartCp(); - SwWW8Writer::WriteLong( *rWrt.pTableStrm, nStartCp ); + SwWW8Writer::WriteLong( *rWrt.m_pTableStrm, nStartCp ); // piece references for (auto const& it : m_Pcts) { - SwWW8Writer::WriteShort(*rWrt.pTableStrm, it->GetStatus()); - SwWW8Writer::WriteLong(*rWrt.pTableStrm, it->GetStartFc()); - SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0); // PRM=0 + SwWW8Writer::WriteShort(*rWrt.m_pTableStrm, it->GetStatus()); + SwWW8Writer::WriteLong(*rWrt.m_pTableStrm, it->GetStartFc()); + SwWW8Writer::WriteShort( *rWrt.m_pTableStrm, 0); // PRM=0 } // entries in the FIB - rWrt.pFib->m_fcClx = nPctStart; - nEndPos = rWrt.pTableStrm->Tell(); - rWrt.pFib->m_lcbClx = nEndPos - nPctStart; + rWrt.m_pFib->m_fcClx = nPctStart; + nEndPos = rWrt.m_pTableStrm->Tell(); + rWrt.m_pFib->m_lcbClx = nEndPos - nPctStart; // and register the length as well - SwWW8Writer::WriteLong( *rWrt.pTableStrm, nOldPos, + SwWW8Writer::WriteLong( *rWrt.m_pTableStrm, nOldPos, nEndPos - nPctStart-5 ); } @@ -1407,23 +1413,24 @@ void WW8_WrPct::SetParaBreak() WW8_CP WW8_WrPct::Fc2Cp( sal_uLong nFc ) const { - OSL_ENSURE( nFc >= o3tl::make_unsigned(nOldFc), "FilePos lies in front of last piece" ); + OSL_ENSURE( nFc >= o3tl::make_unsigned(m_nOldFc), "FilePos lies in front of last piece" ); OSL_ENSURE( ! m_Pcts.empty(), "Fc2Cp no piece available" ); - nFc -= nOldFc; + nFc -= m_nOldFc; nFc /= 2; // Unicode return nFc + m_Pcts.back()->GetStartCp(); } -void WW8Export::AppendBookmarks( const SwTextNode& rNd, sal_Int32 nCurrentPos, sal_Int32 nLen ) +void WW8Export::AppendBookmarks( const SwTextNode& rNd, sal_Int32 nCurrentPos, sal_Int32 nLen, const SwRedlineData* /*pRedlineData*/ ) { std::vector< const ::sw::mark::IMark* > aArr; - sal_uInt16 nContent; + sal_Int32 nContent; const sal_Int32 nCurrentEnd = nCurrentPos + nLen; if( !GetWriter().GetBookmarks( rNd, nCurrentPos, nCurrentEnd, aArr )) return; - sal_uLong nNd = rNd.GetIndex(), nSttCP = Fc2Cp( Strm().Tell() ); + SwNodeOffset nNd = rNd.GetIndex(); + sal_uLong nSttCP = Fc2Cp( Strm().Tell() ); for(const ::sw::mark::IMark* p : aArr) { const ::sw::mark::IMark& rBkmk = *p; @@ -1434,25 +1441,25 @@ void WW8Export::AppendBookmarks( const SwTextNode& rNd, sal_Int32 nCurrentPos, s const SwPosition* pOPos = nullptr; if(rBkmk.IsExpanded()) pOPos = &rBkmk.GetOtherMarkPos(); - if( pOPos && pOPos->nNode == pPos->nNode && - pOPos->nContent < pPos->nContent ) + if( pOPos && pOPos->GetNode() == pPos->GetNode() && + pOPos->GetContentIndex() < pPos->GetContentIndex() ) { pPos = pOPos; pOPos = &rBkmk.GetMarkPos(); } - if( !pOPos || ( nNd == pPos->nNode.GetIndex() && - ( nContent = pPos->nContent.GetIndex() ) >= nCurrentPos && + if( !pOPos || ( nNd == pPos->GetNodeIndex() && + ( nContent = pPos->GetContentIndex() ) >= nCurrentPos && nContent < nCurrentEnd ) ) { - sal_uLong nCp = nSttCP + pPos->nContent.GetIndex() - nCurrentPos; + sal_uLong nCp = nSttCP + pPos->GetContentIndex() - nCurrentPos; m_pBkmks->Append(nCp, BookmarkToWord(rBkmk.GetName())); } - if( pOPos && nNd == pOPos->nNode.GetIndex() && - ( nContent = pOPos->nContent.GetIndex() ) >= nCurrentPos && + if( pOPos && nNd == pOPos->GetNodeIndex() && + ( nContent = pOPos->GetContentIndex() ) >= nCurrentPos && nContent < nCurrentEnd ) { - sal_uLong nCp = nSttCP + pOPos->nContent.GetIndex() - nCurrentPos; + sal_uLong nCp = nSttCP + pOPos->GetContentIndex() - nCurrentPos; m_pBkmks->Append(nCp, BookmarkToWord(rBkmk.GetName())); } } @@ -1465,7 +1472,7 @@ void WW8Export::AppendAnnotationMarks(const SwWW8AttrIter& rAttrs, sal_Int32 nCu { for (const sw::mark::IMark* pMark : aMarks) { - const sal_Int32 nStart = pMark->GetMarkStart().nContent.GetIndex(); + const sal_Int32 nStart = pMark->GetMarkStart().GetContentIndex(); if (nStart == nCurrentPos) { m_pAtn->AddRangeStartPosition(pMark->GetName(), Fc2Cp(Strm().Tell()), @@ -1492,13 +1499,13 @@ void WW8Export::MoveFieldMarks(WW8_CP nFrom, WW8_CP nTo) void WW8Export::AppendBookmark( const OUString& rName ) { - sal_uLong nSttCP = Fc2Cp( Strm().Tell() ); + sal_uInt64 nSttCP = Fc2Cp( Strm().Tell() ); m_pBkmks->Append( nSttCP, rName ); } void WW8Export::AppendBookmarkEndWithCorrection( const OUString& rName ) { - sal_uLong nEndCP = Fc2Cp( Strm().Tell() ); + sal_uInt64 nEndCP = Fc2Cp( Strm().Tell() ); m_pBkmks->Append( nEndCP - 1, rName ); } @@ -1511,7 +1518,7 @@ std::unique_ptr<SvxBrushItem> MSWordExportBase::getBackground() if (SfxItemState::SET == eState) { // The 'color' is set for the first page style - take it and use it as the background color of the entire DOCX - if (aBrush->GetColor() != COL_AUTO) + if (aBrush->GetColor() != COL_AUTO || aBrush->GetGraphicObject()) return aBrush; } return nullptr; @@ -1597,12 +1604,12 @@ void WW8Export::ExportGrfBullet(const SwTextNode& rNd) static sal_uInt8 nAttrMagicIdx = 0; void WW8Export::OutGrfBullets(const ww8::Frame & rFrame) { - if ( !m_pGrf || !m_pChpPlc || !pO ) + if ( !m_pGrf || !m_pChpPlc || !m_pO ) return; m_pGrf->Insert(rFrame); - m_pChpPlc->AppendFkpEntry( Strm().Tell(), pO->size(), pO->data() ); - pO->clear(); + m_pChpPlc->AppendFkpEntry( Strm().Tell(), m_pO->size(), m_pO->data() ); + m_pO->clear(); // if links... WriteChar( char(1) ); @@ -1649,15 +1656,15 @@ int MSWordExportBase::GetGrfIndex(const SvxBrushItem& rBrush) void WW8_WrtRedlineAuthor::Write( Writer& rWrt ) { WW8Export & rWW8Wrt = *(static_cast<SwWW8Writer&>(rWrt).m_pExport); - rWW8Wrt.WriteAsStringTable(maAuthors, rWW8Wrt.pFib->m_fcSttbfRMark, - rWW8Wrt.pFib->m_lcbSttbfRMark); + rWW8Wrt.WriteAsStringTable(maAuthors, rWW8Wrt.m_pFib->m_fcSttbfRMark, + rWW8Wrt.m_pFib->m_lcbSttbfRMark); } sal_uInt16 WW8Export::AddRedlineAuthor( std::size_t nId ) { if( !m_pRedlAuthors ) { - m_pRedlAuthors = new WW8_WrtRedlineAuthor; + m_pRedlAuthors.reset(new WW8_WrtRedlineAuthor); m_pRedlAuthors->AddName("Unknown"); } return m_pRedlAuthors->AddName( SW_MOD()->GetRedlineAuthor( nId ) ); @@ -1672,7 +1679,7 @@ void WW8Export::WriteAsStringTable(const std::vector<OUString>& rStrings, // we have some Redlines found in the document -> the // Author Name Stringtable - SvStream& rStrm = *pTableStrm; + SvStream& rStrm = *m_pTableStrm; rfcSttbf = rStrm.Tell(); SwWW8Writer::WriteShort( rStrm, -1 ); SwWW8Writer::WriteLong( rStrm, nCount ); @@ -1794,13 +1801,13 @@ void WW8Export::WriteStringAsPara( const OUString& rText ) m_pChpPlc->AppendFkpEntry( nPos ); } -void MSWordExportBase::WriteSpecialText( sal_uLong nStart, sal_uLong nEnd, sal_uInt8 nTTyp ) +void MSWordExportBase::WriteSpecialText( SwNodeOffset nStart, SwNodeOffset nEnd, sal_uInt8 nTTyp ) { sal_uInt8 nOldTyp = m_nTextTyp; m_nTextTyp = nTTyp; auto const pOldPam = m_pCurPam; //!! Simply shifting the PaM without restoring should do the job too - sal_uLong nOldStart = m_nCurStart; - sal_uLong nOldEnd = m_nCurEnd; + SwNodeOffset nOldStart = m_nCurStart; + SwNodeOffset nOldEnd = m_nCurEnd; SwPaM* pOldEnd = m_pOrigPam; bool bOldPageDescs = m_bOutPageDescs; m_bOutPageDescs = false; @@ -1815,12 +1822,12 @@ void MSWordExportBase::WriteSpecialText( sal_uLong nStart, sal_uLong nEnd, sal_u // tdf#106261 Reset table infos, otherwise the depth of the cells will be // incorrect, in case the header/footer had table(s) and we try to export // the same table second time. - ww8::WW8TableInfo::Pointer_t pOldTableInfo = m_pTableInfo; + ww8::WW8TableInfo::Pointer_t xOldTableInfo(m_pTableInfo); m_pTableInfo = std::make_shared<ww8::WW8TableInfo>(); WriteText(); - m_pTableInfo = pOldTableInfo; + m_pTableInfo = std::move(xOldTableInfo); m_bOutPageDescs = bOldPageDescs; m_pCurPam = pOldPam; // delete Pam @@ -1872,24 +1879,24 @@ void WW8Export::WriteChar( sal_Unicode c ) Strm().WriteUInt16( c ); } -void MSWordExportBase::SetCurPam(sal_uLong nStt, sal_uLong nEnd) +void MSWordExportBase::SetCurPam(SwNodeOffset nStt, SwNodeOffset nEnd) { m_nCurStart = nStt; m_nCurEnd = nEnd; m_pCurPam = Writer::NewUnoCursor( m_rDoc, nStt, nEnd ); // Recognize tables in special cases - if ( nStt != m_pCurPam->GetMark()->nNode.GetIndex() && + if ( nStt != m_pCurPam->GetMark()->GetNodeIndex() && m_rDoc.GetNodes()[ nStt ]->IsTableNode() ) { - m_pCurPam->GetMark()->nNode = nStt; + m_pCurPam->GetMark()->Assign(nStt); } m_pOrigPam = m_pCurPam.get(); // ??? m_pCurPam->Exchange(); } -void MSWordExportBase::SaveData( sal_uLong nStt, sal_uLong nEnd ) +void MSWordExportBase::SaveData( SwNodeOffset nStt, SwNodeOffset nEnd ) { MSWordSaveData aData; @@ -1905,6 +1912,7 @@ void MSWordExportBase::SaveData( sal_uLong nStt, sal_uLong nEnd ) aData.pOldFlyOffset = m_pFlyOffset; aData.eOldAnchorType = m_eNewAnchorType; + aData.bOldWriteAll = false; aData.bOldOutTable = m_bOutTable; aData.bOldFlyFrameAttrs = m_bOutFlyFrameAttrs; aData.bOldStartTOX = m_bStartTOX; @@ -1944,16 +1952,16 @@ void MSWordExportBase::RestoreData() m_aSaveData.pop(); } -void WW8Export::SaveData( sal_uLong nStt, sal_uLong nEnd ) +void WW8Export::SaveData( SwNodeOffset nStt, SwNodeOffset nEnd ) { MSWordExportBase::SaveData( nStt, nEnd ); MSWordSaveData &rData = m_aSaveData.top(); - if ( !pO->empty() ) + if ( !m_pO->empty() ) { - rData.pOOld = std::move(pO); - pO.reset(new ww::bytes); + rData.pOOld = std::move(m_pO); + m_pO.reset(new ww::bytes); } else rData.pOOld = nullptr; // reuse pO @@ -1968,16 +1976,16 @@ void WW8Export::RestoreData() GetWriter().m_bWriteAll = rData.bOldWriteAll; - OSL_ENSURE( pO->empty(), "pO is not empty in WW8Export::RestoreData()" ); + OSL_ENSURE( m_pO->empty(), "pO is not empty in WW8Export::RestoreData()" ); if ( rData.pOOld ) { - pO = std::move(rData.pOOld); + m_pO = std::move(rData.pOOld); } MSWordExportBase::RestoreData(); } -void WW8AttributeOutput::TableInfoCell( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) +void WW8AttributeOutput::TableInfoCell(const ww8::WW8TableNodeInfoInner::Pointer_t& pTableTextNodeInfoInner) { sal_uInt32 nDepth = pTableTextNodeInfoInner->getDepth(); @@ -1986,18 +1994,18 @@ void WW8AttributeOutput::TableInfoCell( ww8::WW8TableNodeInfoInner::Pointer_t pT /* Cell */ m_rWW8Export.InsUInt16( NS_sprm::PFInTable::val ); - m_rWW8Export.pO->push_back( sal_uInt8(0x1) ); + m_rWW8Export.m_pO->push_back( sal_uInt8(0x1) ); m_rWW8Export.InsUInt16( NS_sprm::PItap::val ); m_rWW8Export.InsUInt32( nDepth ); if ( nDepth > 1 && pTableTextNodeInfoInner->isEndOfCell() ) { m_rWW8Export.InsUInt16( NS_sprm::PFInnerTableCell::val ); - m_rWW8Export.pO->push_back( sal_uInt8(0x1) ); + m_rWW8Export.m_pO->push_back( sal_uInt8(0x1) ); } } -void WW8AttributeOutput::TableInfoRow( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) +void WW8AttributeOutput::TableInfoRow(const ww8::WW8TableNodeInfoInner::Pointer_t& pTableTextNodeInfoInner) { sal_uInt32 nDepth = pTableTextNodeInfoInner->getDepth(); @@ -2009,12 +2017,12 @@ void WW8AttributeOutput::TableInfoRow( ww8::WW8TableNodeInfoInner::Pointer_t pTa return; m_rWW8Export.InsUInt16( NS_sprm::PFInTable::val ); - m_rWW8Export.pO->push_back( sal_uInt8(0x1) ); + m_rWW8Export.m_pO->push_back( sal_uInt8(0x1) ); if ( nDepth == 1 ) { m_rWW8Export.InsUInt16( NS_sprm::PFTtp::val ); - m_rWW8Export.pO->push_back( sal_uInt8(0x1) ); + m_rWW8Export.m_pO->push_back( sal_uInt8(0x1) ); } m_rWW8Export.InsUInt16( NS_sprm::PItap::val ); @@ -2023,9 +2031,9 @@ void WW8AttributeOutput::TableInfoRow( ww8::WW8TableNodeInfoInner::Pointer_t pTa if ( nDepth > 1 ) { m_rWW8Export.InsUInt16( NS_sprm::PFInnerTableCell::val ); - m_rWW8Export.pO->push_back( sal_uInt8(0x1) ); + m_rWW8Export.m_pO->push_back( sal_uInt8(0x1) ); m_rWW8Export.InsUInt16( NS_sprm::PFInnerTtp::val ); - m_rWW8Export.pO->push_back( sal_uInt8(0x1) ); + m_rWW8Export.m_pO->push_back( sal_uInt8(0x1) ); } // Most of these are per-row definitions, not per-table. @@ -2071,16 +2079,14 @@ static sal_uInt16 lcl_TCFlags(SwDoc &rDoc, const SwTableBox * pBox, sal_Int32 nR if(pSttNd) { SwNodeIndex aIdx( *pSttNd ); - const SwContentNode * pCNd = pSttNd->GetNodes().GoNext( &aIdx ); + const SwContentNode* pCNd = SwNodes::GoNext(&aIdx); if( pCNd && pCNd->IsTextNode()) { - SfxItemSet aCoreSet(rDoc.GetAttrPool(), svl::Items<RES_CHRATR_ROTATE, RES_CHRATR_ROTATE>{}); + SfxItemSetFixed<RES_CHRATR_ROTATE, RES_CHRATR_ROTATE> aCoreSet(rDoc.GetAttrPool()); static_cast<const SwTextNode*>(pCNd)->GetParaAttr(aCoreSet, 0, static_cast<const SwTextNode*>(pCNd)->GetText().getLength()); - const SfxPoolItem * pRotItem; - if ( SfxItemState::SET == aCoreSet.GetItemState(RES_CHRATR_ROTATE, true, &pRotItem)) + if ( const SvxCharRotateItem * pRotate = aCoreSet.GetItemIfSet(RES_CHRATR_ROTATE)) { - const SvxCharRotateItem * pRotate = static_cast<const SvxCharRotateItem*>(pRotItem); if(pRotate && pRotate->GetValue() == 900_deg10) { nFlags = nFlags | 0x0004 | 0x0008; @@ -2097,7 +2103,7 @@ static sal_uInt16 lcl_TCFlags(SwDoc &rDoc, const SwTableBox * pBox, sal_Int32 nR return nFlags; } -void WW8AttributeOutput::TableVerticalCell( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) +void WW8AttributeOutput::TableVerticalCell(const ww8::WW8TableNodeInfoInner::Pointer_t& pTableTextNodeInfoInner) { const SwTableBox * pTabBox = pTableTextNodeInfoInner->getTableBox(); const SwTableLine * pTabLine = pTabBox->GetUpper(); @@ -2126,14 +2132,14 @@ void WW8AttributeOutput::TableVerticalCell( ww8::WW8TableNodeInfoInner::Pointer_ if (nTextFlow != 0) { m_rWW8Export.InsUInt16( NS_sprm::TTextFlow::val ); - m_rWW8Export.pO->push_back( n ); //start range - m_rWW8Export.pO->push_back( sal_uInt8(n + 1) ); //end range + m_rWW8Export.m_pO->push_back( n ); //start range + m_rWW8Export.m_pO->push_back( sal_uInt8(n + 1) ); //end range m_rWW8Export.InsUInt16(nTextFlow); } } } -void WW8AttributeOutput::TableCanSplit( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) +void WW8AttributeOutput::TableCanSplit(const ww8::WW8TableNodeInfoInner::Pointer_t& pTableTextNodeInfoInner ) { const SwTableBox * pTabBox = pTableTextNodeInfoInner->getTableBox(); const SwTableLine * pTabLine = pTabBox->GetUpper(); @@ -2148,12 +2154,12 @@ void WW8AttributeOutput::TableCanSplit( ww8::WW8TableNodeInfoInner::Pointer_t pT const SwFormatRowSplit& rSplittable = pLineFormat->GetRowSplit(); sal_uInt8 nCantSplit = (!rSplittable.GetValue()) ? 1 : 0; m_rWW8Export.InsUInt16( NS_sprm::TFCantSplit::val ); - m_rWW8Export.pO->push_back( nCantSplit ); + m_rWW8Export.m_pO->push_back( nCantSplit ); m_rWW8Export.InsUInt16( NS_sprm::TFCantSplit90::val ); // also write fCantSplit90 - m_rWW8Export.pO->push_back( nCantSplit ); + m_rWW8Export.m_pO->push_back( nCantSplit ); } -void WW8AttributeOutput::TableBidi( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) +void WW8AttributeOutput::TableBidi(const ww8::WW8TableNodeInfoInner::Pointer_t& pTableTextNodeInfoInner) { const SwTable * pTable = pTableTextNodeInfoInner->getTable(); const SwFrameFormat * pFrameFormat = pTable->GetFrameFormat(); @@ -2165,15 +2171,15 @@ void WW8AttributeOutput::TableBidi( ww8::WW8TableNodeInfoInner::Pointer_t pTable } } -void WW8AttributeOutput::TableRowRedline( ww8::WW8TableNodeInfoInner::Pointer_t /*pTableTextNodeInfoInner*/ ) +void WW8AttributeOutput::TableRowRedline(const ww8::WW8TableNodeInfoInner::Pointer_t& /*pTableTextNodeInfoInner*/) { } -void WW8AttributeOutput::TableCellRedline( ww8::WW8TableNodeInfoInner::Pointer_t /*pTableTextNodeInfoInner*/ ) +void WW8AttributeOutput::TableCellRedline(const ww8::WW8TableNodeInfoInner::Pointer_t& /*pTableTextNodeInfoInner*/) { } -void WW8AttributeOutput::TableHeight( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) +void WW8AttributeOutput::TableHeight(const ww8::WW8TableNodeInfoInner::Pointer_t& pTableTextNodeInfoInner) { const SwTableBox * pTabBox = pTableTextNodeInfoInner->getTableBox(); const SwTableLine * pTabLine = pTabBox->GetUpper(); @@ -2193,12 +2199,12 @@ void WW8AttributeOutput::TableHeight( ww8::WW8TableNodeInfoInner::Pointer_t pTab if ( nHeight ) { m_rWW8Export.InsUInt16( NS_sprm::TDyaRowHeight::val ); - m_rWW8Export.InsUInt16( static_cast<sal_uInt16>(nHeight) ); + m_rWW8Export.InsUInt16( o3tl::narrowing<sal_uInt16>(nHeight) ); } } -void WW8AttributeOutput::TableOrientation( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) +void WW8AttributeOutput::TableOrientation(const ww8::WW8TableNodeInfoInner::Pointer_t& pTableTextNodeInfoInner) { const SwTable * pTable = pTableTextNodeInfoInner->getTable(); @@ -2260,7 +2266,7 @@ void WW8AttributeOutput::TableOrientation( ww8::WW8TableNodeInfoInner::Pointer_t } } -void WW8AttributeOutput::TableSpacing(ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner) +void WW8AttributeOutput::TableSpacing(const ww8::WW8TableNodeInfoInner::Pointer_t& pTableTextNodeInfoInner) { const SwTable * pTable = pTableTextNodeInfoInner->getTable(); const SwTableFormat* pTableFormat = pTable->GetFrameFormat(); @@ -2282,7 +2288,7 @@ void WW8AttributeOutput::TableSpacing(ww8::WW8TableNodeInfoInner::Pointer_t pTab sal_uInt8 const nTPc = (nPadding << 4) | (nPcVert << 2) | nPcHorz; m_rWW8Export.InsUInt16(NS_sprm::TPc::val); - m_rWW8Export.pO->push_back( nTPc ); + m_rWW8Export.m_pO->push_back( nTPc ); m_rWW8Export.InsUInt16(NS_sprm::TDyaAbs::val); m_rWW8Export.InsUInt16(rUL.GetUpper()); @@ -2298,14 +2304,129 @@ void WW8AttributeOutput::TableSpacing(ww8::WW8TableNodeInfoInner::Pointer_t pTab } } -void WW8AttributeOutput::TableDefinition( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) +void WW8AttributeOutput::TablePositioning(SwFrameFormat* pFlyFormat) +{ + if (!pFlyFormat || !pFlyFormat->GetFlySplit().GetValue()) + { + return; + } + + sal_uInt8 nPcVert = 0; + switch (pFlyFormat->GetVertOrient().GetRelationOrient()) + { + case text::RelOrientation::PAGE_PRINT_AREA: + // relative to margin + nPcVert = 0; + break; + case text::RelOrientation::PAGE_FRAME: + // relative to page + nPcVert = 1; + break; + default: + // text::RelOrientation::FRAME + // relative to text + nPcVert = 2; + break; + } + sal_uInt8 nPcHorz = 0; + switch (pFlyFormat->GetHoriOrient().GetRelationOrient()) + { + case text::RelOrientation::FRAME: + // relative to column + nPcHorz = 0; + break; + case text::RelOrientation::PAGE_PRINT_AREA: + // relative to margin + nPcHorz = 1; + break; + default: + // text::RelOrientation::PAGE_FRAME + // relative to page + nPcHorz = 2; + break; + } + sal_uInt8 nTPc = (nPcVert << 4) | (nPcHorz << 6); + m_rWW8Export.InsUInt16(NS_sprm::TPc::val); + m_rWW8Export.m_pO->push_back(nTPc); + + // Similar to WW8AttributeOutput::FormatHorizOrientation(), but for tables. + sal_Int16 nTDxaAbs = 0; + switch (pFlyFormat->GetHoriOrient().GetHoriOrient()) + { + case text::HoriOrientation::LEFT: + // left + nTDxaAbs = 0; + break; + case text::HoriOrientation::CENTER: + // centered + nTDxaAbs = -4; + break; + case text::HoriOrientation::RIGHT: + // right + nTDxaAbs = -8; + break; + default: + nTDxaAbs = pFlyFormat->GetHoriOrient().GetPos(); + break; + } + m_rWW8Export.InsUInt16(NS_sprm::TDxaAbs::val); + m_rWW8Export.InsInt16(nTDxaAbs); + + // Similar to WW8AttributeOutput::FormatVertOrientation(), but for tables. + sal_Int16 nTDyaAbs = 0; + switch (pFlyFormat->GetVertOrient().GetVertOrient()) + { + case text::VertOrientation::TOP: + // up + nTDyaAbs = -4; + break; + case text::VertOrientation::CENTER: + // centered + nTDyaAbs = -8; + break; + case text::VertOrientation::BOTTOM: + // down + nTDyaAbs = -12; + break; + default: + nTDyaAbs = pFlyFormat->GetVertOrient().GetPos(); + break; + } + m_rWW8Export.InsUInt16(NS_sprm::TDyaAbs::val); + m_rWW8Export.InsInt16(nTDyaAbs); + + // Similar to WW8AttributeOutput::FormatULSpace(), but for tables. + sal_uInt16 nDyaFromText = pFlyFormat->GetULSpace().GetUpper(); + m_rWW8Export.InsUInt16(NS_sprm::TDyaFromText::val); + m_rWW8Export.InsUInt16(nDyaFromText); + sal_uInt16 nDyaFromTextBottom = pFlyFormat->GetULSpace().GetLower(); + m_rWW8Export.InsUInt16(NS_sprm::TDyaFromTextBottom::val); + m_rWW8Export.InsUInt16(nDyaFromTextBottom); + + // Similar to WW8AttributeOutput::FormatLRSpace(), but for tables. + sal_uInt16 nDxaFromText = pFlyFormat->GetLRSpace().GetLeft(); + m_rWW8Export.InsUInt16(NS_sprm::TDxaFromText::val); + m_rWW8Export.InsUInt16(nDxaFromText); + sal_uInt16 nDxaFromTextRight = pFlyFormat->GetLRSpace().GetRight(); + m_rWW8Export.InsUInt16(NS_sprm::TDxaFromTextRight::val); + m_rWW8Export.InsUInt16(nDxaFromTextRight); + + if (!pFlyFormat->GetWrapInfluenceOnObjPos().GetAllowOverlap()) + { + // Allowing overlap is the default in both Writer and in WW8. + m_rWW8Export.InsUInt16(NS_sprm::TFNoAllowOverlap::val); + m_rWW8Export.m_pO->push_back(1); + } +} + +void WW8AttributeOutput::TableDefinition(const ww8::WW8TableNodeInfoInner::Pointer_t& pTableTextNodeInfoInner) { const SwTable * pTable = pTableTextNodeInfoInner->getTable(); if ( pTable->GetRowsToRepeat() > pTableTextNodeInfoInner->getRow() ) { m_rWW8Export.InsUInt16( NS_sprm::TTableHeader::val ); - m_rWW8Export.pO->push_back( 1 ); + m_rWW8Export.m_pO->push_back( 1 ); } ww8::TableBoxVectorPtr pTableBoxes = @@ -2320,7 +2441,7 @@ void WW8AttributeOutput::TableDefinition( ww8::WW8TableNodeInfoInner::Pointer_t m_rWW8Export.InsUInt16( nSprmSize ); // length // number of boxes - m_rWW8Export.pO->push_back( static_cast<sal_uInt8>(nBoxes) ); + m_rWW8Export.m_pO->push_back( static_cast<sal_uInt8>(nBoxes) ); /* cells */ /* @@ -2378,9 +2499,9 @@ void WW8AttributeOutput::TableDefinition( ww8::WW8TableNodeInfoInner::Pointer_t ww8::GridColsPtr pGridCols = GetGridCols( pTableTextNodeInfoInner ); for ( const auto nCol : *pGridCols ) - { - m_rWW8Export.InsUInt16( static_cast<sal_uInt16>(nCol) + nTableOffset ); - } + { + m_rWW8Export.InsUInt16( o3tl::narrowing<sal_uInt16>(nCol) + nTableOffset ); + } /* TCs */ ww8::RowSpansPtr pRowSpans = pTableTextNodeInfoInner->getRowSpansOfRow(); @@ -2388,7 +2509,7 @@ void WW8AttributeOutput::TableDefinition( ww8::WW8TableNodeInfoInner::Pointer_t for (const SwTableBox * pTabBox1 : *pTableBoxes) { - sal_uInt16 npOCount = m_rWW8Export.pO->size(); + sal_uInt16 npOCount = m_rWW8Export.m_pO->size(); const SwFrameFormat * pBoxFormat = nullptr; if (pTabBox1 != nullptr) @@ -2400,28 +2521,36 @@ void WW8AttributeOutput::TableDefinition( ww8::WW8TableNodeInfoInner::Pointer_t static sal_uInt8 aNullBytes[] = { 0x0, 0x0 }; - m_rWW8Export.pO->insert( m_rWW8Export.pO->end(), aNullBytes, aNullBytes+2 ); // dummy + m_rWW8Export.m_pO->insert( m_rWW8Export.m_pO->end(), aNullBytes, aNullBytes+2 ); // dummy if (pBoxFormat != nullptr) { const SvxBoxItem & rBoxItem = pBoxFormat->GetBox(); - WW8Export::Out_SwFormatTableBox( *m_rWW8Export.pO, &rBoxItem ); // 8/16 Byte + WW8Export::Out_SwFormatTableBox( *m_rWW8Export.m_pO, &rBoxItem ); // 8/16 Byte } else - WW8Export::Out_SwFormatTableBox( *m_rWW8Export.pO, nullptr); // 8/16 Byte + WW8Export::Out_SwFormatTableBox( *m_rWW8Export.m_pO, nullptr); // 8/16 Byte - SAL_INFO( "sw.ww8.level2", "<tclength>" << ( m_rWW8Export.pO->size() - npOCount ) << "</tclength>" ); + SAL_INFO( "sw.ww8.level2", "<tclength>" << ( m_rWW8Export.m_pO->size() - npOCount ) << "</tclength>" ); ++aItRowSpans; } int nWidthPercent = pFormat->GetFrameSize().GetWidthPercent(); + + // The best fit for "automatic" table placement is relative 100% + if (!nWidthPercent && rHori.GetHoriOrient() == text::HoriOrientation::FULL) + nWidthPercent = 100; + // Width is in fiftieths of a percent. For sprmTTableWidth, must be non-negative and 600% max if ( nWidthPercent > 0 && nWidthPercent <= 600 ) { m_rWW8Export.InsUInt16( NS_sprm::TTableWidth::val ); - m_rWW8Export.pO->push_back( sal_uInt8/*ftsPercent*/ (2) ); - m_rWW8Export.InsUInt16( static_cast<sal_uInt16>(nWidthPercent) * 50 ); + m_rWW8Export.m_pO->push_back( sal_uInt8/*ftsPercent*/ (2) ); + m_rWW8Export.InsUInt16( o3tl::narrowing<sal_uInt16>(nWidthPercent) * 50 ); } + + // Write table positioning properties in case this is a floating table. + TablePositioning(pTable->GetTableNode()->GetFlyFormat()); } ww8::GridColsPtr AttributeOutputBase::GetGridCols( ww8::WW8TableNodeInfoInner::Pointer_t const & pTableTextNodeInfoInner ) @@ -2512,7 +2641,7 @@ void AttributeOutputBase::GetTablePageSize( ww8::WW8TableNodeInfoInner const * p rRelBoxSize = bRelBoxSize; } -void WW8AttributeOutput::TableDefaultBorders( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) +void WW8AttributeOutput::TableDefaultBorders( const ww8::WW8TableNodeInfoInner::Pointer_t& pTableTextNodeInfoInner ) { // This function name is misleading because it is not a table default, but a row default, // and it also only sets default cell margins (aka border padding). @@ -2529,14 +2658,14 @@ void WW8AttributeOutput::TableDefaultBorders( ww8::WW8TableNodeInfoInner::Pointe // Set row default cell margins using this last cell in the row for ( int i = 0; i < 4; ++i ) { - SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::TCellPaddingDefault::val ); - m_rWW8Export.pO->push_back( sal_uInt8(6) ); - m_rWW8Export.pO->push_back( sal_uInt8(0) ); - m_rWW8Export.pO->push_back( sal_uInt8(1) ); - m_rWW8Export.pO->push_back( sal_uInt8(1 << i) ); - m_rWW8Export.pO->push_back( sal_uInt8(3) ); + SwWW8Writer::InsUInt16( *m_rWW8Export.m_pO, NS_sprm::TCellPaddingDefault::val ); + m_rWW8Export.m_pO->push_back( sal_uInt8(6) ); + m_rWW8Export.m_pO->push_back( sal_uInt8(0) ); + m_rWW8Export.m_pO->push_back( sal_uInt8(1) ); + m_rWW8Export.m_pO->push_back( sal_uInt8(1 << i) ); + m_rWW8Export.m_pO->push_back( sal_uInt8(3) ); - SwWW8Writer::InsUInt16( *m_rWW8Export.pO, + SwWW8Writer::InsUInt16( *m_rWW8Export.m_pO, pFrameFormat->GetBox().GetDistance( aBorders[i] ) ); } } @@ -2590,7 +2719,7 @@ void WW8AttributeOutput::TableCellBorders( sal_uInt8 nSideBits[4] = {0, 0, 0, 0}; // 0001:top, 0010:left, 0100:bottom, 1000:right for ( int i = 0; i < 4; ++i ) // sides: top, left, bottom, right { - nMargin[i] = std::min(sal_uInt16(31680), pLastBox->GetDistance( aBorders[i] )); + nMargin[i] = std::min(sal_Int16(31680), pLastBox->GetDistance( aBorders[i] )); if ( nMargin[i] == nDefaultMargin[i] ) continue; @@ -2610,13 +2739,13 @@ void WW8AttributeOutput::TableCellBorders( { if ( nSideBits[i] ) { - SwWW8Writer::InsUInt16( *m_rWW8Export.pO, NS_sprm::TCellPadding::val ); - m_rWW8Export.pO->push_back( sal_uInt8(6) ); // 6 bytes - m_rWW8Export.pO->push_back( sal_uInt8(nSeqStart) ); // first cell: apply margin - m_rWW8Export.pO->push_back( sal_uInt8(n) ); // end cell: do not apply margin - m_rWW8Export.pO->push_back( sal_uInt8(nSideBits[i]) ); - m_rWW8Export.pO->push_back( sal_uInt8(3) ); // FtsDxa: size in twips - SwWW8Writer::InsUInt16( *m_rWW8Export.pO, nMargin[i] ); + SwWW8Writer::InsUInt16( *m_rWW8Export.m_pO, NS_sprm::TCellPadding::val ); + m_rWW8Export.m_pO->push_back( sal_uInt8(6) ); // 6 bytes + m_rWW8Export.m_pO->push_back( sal_uInt8(nSeqStart) ); // first cell: apply margin + m_rWW8Export.m_pO->push_back( sal_uInt8(n) ); // end cell: do not apply margin + m_rWW8Export.m_pO->push_back( sal_uInt8(nSideBits[i]) ); + m_rWW8Export.m_pO->push_back( sal_uInt8(3) ); // FtsDxa: size in twips + SwWW8Writer::InsUInt16( *m_rWW8Export.m_pO, nMargin[i] ); } } @@ -2626,7 +2755,7 @@ void WW8AttributeOutput::TableCellBorders( } } -void WW8AttributeOutput::TableBackgrounds( ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner ) +void WW8AttributeOutput::TableBackgrounds(const ww8::WW8TableNodeInfoInner::Pointer_t& pTableTextNodeInfoInner) { const SwTable * pTab = pTableTextNodeInfoInner->getTable(); const SwTableBox * pTabBox = pTableTextNodeInfoInner->getTableBox(); @@ -2635,7 +2764,7 @@ void WW8AttributeOutput::TableBackgrounds( ww8::WW8TableNodeInfoInner::Pointer_t sal_uInt8 nBoxes = rTabBoxes.size(); m_rWW8Export.InsUInt16( NS_sprm::TDefTableShd80::val ); - m_rWW8Export.pO->push_back( static_cast<sal_uInt8>(nBoxes * 2) ); // Len + m_rWW8Export.m_pO->push_back( static_cast<sal_uInt8>(nBoxes * 2) ); // Len Color aRowColor = COL_AUTO; const SvxBrushItem *pTableColorProp = pTab->GetFrameFormat()->GetAttrSet().GetItem<SvxBrushItem>(RES_BACKGROUND); @@ -2701,7 +2830,7 @@ void WW8AttributeOutput::TableBackgrounds( ww8::WW8TableNodeInfoInner::Pointer_t break; m_rWW8Export.InsUInt16( m ); - m_rWW8Export.pO->push_back( static_cast<sal_uInt8>((nStop-nStart) * 10) ); + m_rWW8Export.m_pO->push_back( static_cast<sal_uInt8>((nStop-nStart) * 10) ); for ( sal_uInt8 n = nStart; n < nStop; n++ ) { @@ -2738,9 +2867,9 @@ class TrackContentToExport { private: SwPaM *m_pCurPam; - sal_uLong m_nStart, m_nEnd; + SwNodeOffset m_nStart, m_nEnd; public: - TrackContentToExport(SwPaM *pCurPam, sal_uLong nCurStart, sal_uLong nCurEnd) + TrackContentToExport(SwPaM *pCurPam, SwNodeOffset nCurStart, SwNodeOffset nCurEnd) : m_pCurPam(pCurPam) , m_nStart(nCurStart) , m_nEnd(nCurEnd) @@ -2749,9 +2878,9 @@ public: bool contentRemainsToExport(ww8::WW8TableInfo *pTableInfo) { - bool bSimpleContentRemains = m_pCurPam->GetPoint()->nNode < m_pCurPam->GetMark()->nNode || - (m_pCurPam->GetPoint()->nNode == m_pCurPam->GetMark()->nNode && - m_pCurPam->GetPoint()->nContent.GetIndex() <= m_pCurPam->GetMark()->nContent.GetIndex()); + bool bSimpleContentRemains = m_pCurPam->GetPoint()->GetNode() < m_pCurPam->GetMark()->GetNode() || + (m_pCurPam->GetPoint()->GetNode() == m_pCurPam->GetMark()->GetNode() && + m_pCurPam->GetPoint()->GetContentIndex() <= m_pCurPam->GetMark()->GetContentIndex()); if (bSimpleContentRemains) return true; @@ -2763,7 +2892,7 @@ public: //skipped cell to output it in a sane sequence. See ooo47778-3.sxw for one of these //horrors. So if we are at the end of the selection, but this end point is a table //cell whose next cell is in the selection allow jumping back to it - const SwNode* pCurrentNode = &m_pCurPam->GetPoint()->nNode.GetNode(); + const SwNode* pCurrentNode = &m_pCurPam->GetPoint()->GetNode(); const SwNode* pNextNode = pTableInfo->getNextNode(pCurrentNode); if (pNextNode && pCurrentNode != pNextNode) @@ -2783,7 +2912,7 @@ void MSWordExportBase::WriteText() TrackContentToExport aContentTracking(m_pCurPam.get(), m_nCurStart, m_nCurEnd); while (aContentTracking.contentRemainsToExport(m_pTableInfo.get())) { - SwNode& rNd = m_pCurPam->GetNode(); + SwNode& rNd = m_pCurPam->GetPointNode(); // no section breaks exported for Endnotes if ( rNd.IsTextNode() && m_nTextTyp != TXT_EDN && m_nTextTyp != TXT_FTN ) @@ -2805,7 +2934,7 @@ void MSWordExportBase::WriteText() if ( pTemp ) m_pCurrentPageDesc = pTemp; - m_pCurPam->GetPoint()->nContent.Assign( pCNd, 0 ); + m_pCurPam->GetPoint()->SetContent( 0 ); OutputContentNode( *pCNd ); } else if ( rNd.IsTableNode() ) @@ -2838,9 +2967,10 @@ void MSWordExportBase::WriteText() SwTextNode *pTempNext = aIdx.GetNode().GetTextNode(); if ( pTempNext ) { - const SfxPoolItem * pTempItem = nullptr; - if (pTempNext->GetpSwAttrSet() && SfxItemState::SET == pTempNext->GetpSwAttrSet()->GetItemState(RES_PAGEDESC, false, &pTempItem) - && pTempItem && static_cast<const SwFormatPageDesc*>(pTempItem)->GetRegisteredIn()) + const SwFormatPageDesc * pTempItem = nullptr; + if (pTempNext->GetpSwAttrSet() + && (pTempItem = pTempNext->GetpSwAttrSet()->GetItemIfSet(RES_PAGEDESC, false)) + && pTempItem->GetRegisteredIn()) { //Next node has a new page style which means this node is a section end. Do not insert another page/section break here bNeedExportBreakHere = false; @@ -2902,7 +3032,7 @@ void MSWordExportBase::WriteText() if ( &rNd == &rNd.GetNodes().GetEndOfContent() ) break; - const SwNode * pCurrentNode = &m_pCurPam->GetPoint()->nNode.GetNode(); + const SwNode * pCurrentNode = &m_pCurPam->GetPoint()->GetNode(); const SwNode * pNextNode = m_pTableInfo->getNextNode(pCurrentNode); if (pCurrentNode == pNextNode) @@ -2912,12 +3042,12 @@ void MSWordExportBase::WriteText() } if (pNextNode != nullptr) - m_pCurPam->GetPoint()->nNode.Assign(*pNextNode); + m_pCurPam->GetPoint()->Assign(*pNextNode); else - ++m_pCurPam->GetPoint()->nNode; + m_pCurPam->GetPoint()->Adjust(SwNodeOffset(1)); - sal_uLong nPos = m_pCurPam->GetPoint()->nNode.GetIndex(); - ::SetProgressState( nPos, m_pCurPam->GetDoc().GetDocShell() ); + SwNodeOffset nPos = m_pCurPam->GetPoint()->GetNodeIndex(); + ::SetProgressState( sal_Int32(nPos), m_pCurPam->GetDoc().GetDocShell() ); } SAL_INFO( "sw.ww8.level2", "</WriteText>" ); @@ -2927,24 +3057,24 @@ void WW8Export::WriteMainText() { SAL_INFO( "sw.ww8.level2", "<WriteMainText>" ); - pFib->m_fcMin = Strm().Tell(); + m_pFib->m_fcMin = Strm().Tell(); - m_pCurPam->GetPoint()->nNode = m_rDoc.GetNodes().GetEndOfContent().StartOfSectionNode()->GetIndex(); + m_pCurPam->GetPoint()->Assign(*m_rDoc.GetNodes().GetEndOfContent().StartOfSectionNode()); WriteText(); - if( 0 == Strm().Tell() - pFib->m_fcMin ) // no text ? + if( 0 == Strm().Tell() - m_pFib->m_fcMin ) // no text ? WriteCR(); // then CR at the end ( otherwise WW will complain ) - pFib->m_ccpText = Fc2Cp( Strm().Tell() ); - m_pFieldMain->Finish( pFib->m_ccpText, 0 ); + m_pFib->m_ccpText = Fc2Cp( Strm().Tell() ); + m_pFieldMain->Finish( m_pFib->m_ccpText, 0 ); // ccpText includes Footnote and KF-text // therefore pFib->ccpText may get updated as well // save the StyleId of the last paragraph. Because WW97 take the style // from the last CR, that will be written after footer/Header/footnotes/ // annotation etc. - const SwTextNode* pLastNd = m_pCurPam->GetMark()->nNode.GetNode().GetTextNode(); + const SwTextNode* pLastNd = m_pCurPam->GetMark()->GetNode().GetTextNode(); if( pLastNd ) m_nLastFormatId = GetId( static_cast<SwTextFormatColl&>(pLastNd->GetAnyFormatColl()) ); @@ -2957,7 +3087,7 @@ bool MSWordExportBase::IsInTable() const if (m_pCurPam != nullptr) { - SwNode& rNode = m_pCurPam->GetNode(); + SwNode& rNode = m_pCurPam->GetPointNode(); if (m_pTableInfo) { @@ -2983,18 +3113,18 @@ void WW8Export::WriteFkpPlcUsw() // output into WordDocument stream m_pChpPlc->WriteFkps(); // Fkp.Chpx m_pPapPlc->WriteFkps(); // Fkp.Papx - pSepx->WriteSepx( Strm() ); // Sepx + m_pSepx->WriteSepx( Strm() ); // Sepx // output into Table stream m_pStyles->OutputStylesTable(); // for WW8 StyleTab - pFootnote->WritePlc( *this ); // Footnote-Ref & Text Plc - pEdn->WritePlc( *this ); // Endnote-Ref & Text Plc + m_pFootnote->WritePlc( *this ); // Footnote-Ref & Text Plc + m_pEdn->WritePlc( *this ); // Endnote-Ref & Text Plc m_pTextBxs->WritePlc( *this ); // Textbox Text Plc m_pHFTextBxs->WritePlc( *this ); // Head/Foot-Textbox Text Plc m_pAtn->WritePlc( *this ); // Annotation-Ref & Text Plc - pSepx->WritePlcSed( *this ); // Slcx.PlcSed - pSepx->WritePlcHdd( *this ); // Slcx.PlcHdd + m_pSepx->WritePlcSed( *this ); // Slcx.PlcSed + m_pSepx->WritePlcHdd( *this ); // Slcx.PlcHdd m_pChpPlc->WritePlc(); // Plcx.Chpx m_pPapPlc->WritePlc(); // Plcx.Papx @@ -3028,7 +3158,7 @@ void WW8Export::WriteFkpPlcUsw() some magic. */ // avoid memory leak #i120098#, the unnamed obj will be released in destructor. - xEscherStg = GetWriter().GetStorage().OpenSotStorage(SL::aObjectPool); + m_xEscherStg = GetWriter().GetStorage().OpenSotStorage(SL::aObjectPool); } // dggInfo - escher stream @@ -3050,10 +3180,10 @@ void WW8Export::WriteFkpPlcUsw() m_pMagicTable->Write( *this ); m_pPiece->WritePc( *this ); // Piece-Table - m_aFontHelper.WriteFontTable(pTableStrm, *pFib); // FFNs + m_aFontHelper.WriteFontTable(m_pTableStrm, *m_pFib); // FFNs //Convert OOo asian typography into MS typography structure - ExportDopTypography(pDop->doptypography); + ExportDopTypography(m_pDop->doptypography); WriteDop( *this ); // Document-Properties @@ -3064,8 +3194,8 @@ void WW8Export::WriteFkpPlcUsw() if ( pSttbfAssoc ) // #i106057# { std::vector<OUString> aStrings(pSttbfAssoc->getStrings()); - WriteAsStringTable(aStrings, pFib->m_fcSttbfAssoc, - pFib->m_lcbSttbfAssoc); + WriteAsStringTable(aStrings, m_pFib->m_fcSttbfAssoc, + m_pFib->m_lcbSttbfAssoc); } Strm().Seek( 0 ); @@ -3076,29 +3206,29 @@ void WW8Export::WriteFkpPlcUsw() if ( pFibData ) { - pFib->m_fReadOnlyRecommended = - pFibData->getReadOnlyRecommended(); - pFib->m_fWriteReservation = - pFibData->getWriteReservation(); + m_pFib->m_fReadOnlyRecommended = + pFibData->getReadOnlyRecommended(); + m_pFib->m_fWriteReservation = + pFibData->getWriteReservation(); } - pFib->Write( Strm() ); // FIB + m_pFib->Write( Strm() ); // FIB } void WW8Export::StoreDoc1() { bool bNeedsFinalPara = false; // Start of Text ( overwrite ) - SwWW8Writer::FillUntil( Strm(), pFib->m_fcMin ); + SwWW8Writer::FillUntil( Strm(), m_pFib->m_fcMin ); WriteMainText(); // main text sal_uInt8 nSprmsLen; sal_uInt8 *pLastSprms = m_pPapPlc->CopyLastSprms(nSprmsLen); - bNeedsFinalPara |= pFootnote->WriteText( *this ); // Footnote-Text - bNeedsFinalPara |= pSepx->WriteKFText( *this ); // K/F-Text + bNeedsFinalPara |= m_pFootnote->WriteText( *this ); // Footnote-Text + bNeedsFinalPara |= m_pSepx->WriteKFText( *this ); // K/F-Text bNeedsFinalPara |= m_pAtn->WriteText( *this ); // Annotation-Text - bNeedsFinalPara |= pEdn->WriteText( *this ); // EndNote-Text + bNeedsFinalPara |= m_pEdn->WriteText( *this ); // EndNote-Text // create the escher streams CreateEscher(); @@ -3113,10 +3243,10 @@ void WW8Export::StoreDoc1() } delete[] pLastSprms; - pSepx->Finish( Fc2Cp( Strm().Tell() ));// Text + Footnote + HdFt as section end + m_pSepx->Finish( Fc2Cp( Strm().Tell() ));// Text + Footnote + HdFt as section end m_pMagicTable->Finish( Fc2Cp( Strm().Tell() ),0); - pFib->m_fcMac = Strm().Tell(); // End of all texts + m_pFib->m_fcMac = Strm().Tell(); // End of all texts WriteFkpPlcUsw(); // FKP, PLC, ... } @@ -3137,9 +3267,6 @@ void MSWordExportBase::AddLinkTarget(std::u16string_view rURL) return; sCmp = sCmp.toAsciiLowerCase(); - sal_uLong nIdx = 0; - bool noBookmark = false; - if( sCmp == "outline" ) { SwPosition aPos(*m_pCurPam->GetPoint()); @@ -3148,106 +3275,83 @@ void MSWordExportBase::AddLinkTarget(std::u16string_view rURL) // save the name of the bookmark and the // node index number of where it points to if( m_rDoc.GotoOutline( aPos, aName ) ) - { - nIdx = aPos.nNode.GetIndex(); - noBookmark = true; - } + m_aImplicitBookmarks.emplace_back(aURL, aPos.GetNodeIndex()); } else if( sCmp == "graphic" ) { - SwNodeIndex* pIdx; OUString aName(BookmarkToWriter(aURL.subView(0, nPos))); - const SwFlyFrameFormat* pFormat = m_rDoc.FindFlyByName(aName, SwNodeType::Grf); - if (pFormat && nullptr != (pIdx = const_cast<SwNodeIndex*>(pFormat->GetContent().GetContentIdx()))) + if (const SwFlyFrameFormat* pFormat = m_rDoc.FindFlyByName(aName, SwNodeType::Grf)) { - nIdx = pIdx->GetNext()->GetIndex(); - noBookmark = true; + const SwFormatAnchor& rFormatAnchor = pFormat->GetAnchor(); + if (SwNode* pAnchorNode = rFormatAnchor.GetAnchorNode()) + m_aImplicitBookmarks.emplace_back(aURL, pAnchorNode->GetIndex()); } } else if( sCmp == "frame" ) { - SwNodeIndex* pIdx; OUString aName(BookmarkToWriter(aURL.subView(0, nPos))); - const SwFlyFrameFormat* pFormat = m_rDoc.FindFlyByName(aName, SwNodeType::Text); - if (pFormat && nullptr != (pIdx = const_cast<SwNodeIndex*>(pFormat->GetContent().GetContentIdx()))) - { - nIdx = pIdx->GetIndex() + 1; - noBookmark = true; - } + if (const SwFlyFrameFormat* pFormat = m_rDoc.FindFlyByName(aName, SwNodeType::Text)) + if (const SwNodeIndex* pIdx = pFormat->GetContent().GetContentIdx()) + m_aImplicitBookmarks.emplace_back(aURL, pIdx->GetIndex() + 1); } else if( sCmp == "ole" ) { - SwNodeIndex* pIdx; OUString aName(BookmarkToWriter(aURL.subView(0, nPos))); - const SwFlyFrameFormat* pFormat = m_rDoc.FindFlyByName(aName, SwNodeType::Ole); - if (pFormat && nullptr != (pIdx = const_cast<SwNodeIndex*>(pFormat->GetContent().GetContentIdx()))) + if (const SwFlyFrameFormat* pFormat = m_rDoc.FindFlyByName(aName, SwNodeType::Ole)) { - nIdx = pIdx->GetNext()->GetIndex(); - noBookmark = true; + const SwFormatAnchor& rFormatAnchor = pFormat->GetAnchor(); + if (SwNode* pAnchorNode = rFormatAnchor.GetAnchorNode()) + m_aImplicitBookmarks.emplace_back(aURL, pAnchorNode->GetIndex()); } } else if( sCmp == "region" ) { - SwNodeIndex* pIdx; OUString aName(BookmarkToWriter(aURL.subView(0, nPos))); for (const SwSectionFormat* pFormat : m_rDoc.GetSections()) { - if (aName == pFormat->GetSection()->GetSectionName() - && nullptr != (pIdx = const_cast<SwNodeIndex*>(pFormat->GetContent().GetContentIdx()))) + if (aName == pFormat->GetSection()->GetSectionName()) { - nIdx = pIdx->GetIndex() + 1; - noBookmark = true; - break; + if (const SwNodeIndex* pIdx = pFormat->GetContent().GetContentIdx()) + { + m_aImplicitBookmarks.emplace_back(aURL, pIdx->GetIndex() + 1); + break; + } } } } else if( sCmp == "table" ) { OUString aName(BookmarkToWriter(aURL.subView(0, nPos))); - const SwTable* pTable = SwTable::FindTable(m_rDoc.FindTableFormatByName(aName)); - if (pTable) - { - SwTableNode* pTableNode = const_cast<SwTableNode*>(pTable->GetTabSortBoxes()[1]->GetSttNd()->FindTableNode()); - if (pTableNode) - { - nIdx = pTableNode->GetIndex() + 2; - noBookmark = true; - } - } + if (const SwTable* pTable = SwTable::FindTable(m_rDoc.FindTableFormatByName(aName))) + if (const SwTableNode* pTableNode = pTable->GetTabSortBoxes()[1]->GetSttNd()->FindTableNode()) + m_aImplicitBookmarks.emplace_back(aURL, pTableNode->GetIndex() + 2); } else if (sCmp == "toxmark") { OUString const name(aURL.copy(0, nPos)); OUString const nameDecoded(INetURLObject::decode(name, INetURLObject::DecodeMechanism::WithCharset)); - std::optional<std::pair<SwTOXMark, sal_Int32>> const tmp( - sw::PrepareJumpToTOXMark(m_rDoc, nameDecoded)); - if (tmp) + if (const auto tmp = sw::PrepareJumpToTOXMark(m_rDoc, nameDecoded)) { SwTOXMark const* pMark(&tmp->first); for (sal_Int32 i = 0; i < tmp->second; ++i) { pMark = &m_rDoc.GotoTOXMark(*pMark, TOX_SAME_NXT, true); } - if (pMark != &tmp->first) + if (!SfxPoolItem::areSame(pMark, &tmp->first)) { m_TOXMarkBookmarksByURL.emplace(aURL, name); m_TOXMarkBookmarksByTOXMark.emplace(pMark, nameDecoded); } } } - if (noBookmark) - { - aBookmarkPair aImplicitBookmark; - aImplicitBookmark.first = aURL; - aImplicitBookmark.second = nIdx; - m_aImplicitBookmarks.push_back(aImplicitBookmark); - } } void MSWordExportBase::CollectOutlineBookmarks(const SwDoc &rDoc) { - for (const SfxPoolItem* pItem : rDoc.GetAttrPool().GetItemSurrogates(RES_TXTATR_INETFMT)) + ItemSurrogates aSurrogates; + rDoc.GetAttrPool().GetItemSurrogates(aSurrogates, RES_TXTATR_INETFMT); + for (const SfxPoolItem* pItem : aSurrogates) { auto pINetFormat = dynamic_cast<const SwFormatINetFormat*>(pItem); if (!pINetFormat) @@ -3267,7 +3371,8 @@ void MSWordExportBase::CollectOutlineBookmarks(const SwDoc &rDoc) AddLinkTarget( pINetFormat->GetValue() ); } - for (const SfxPoolItem* pItem : rDoc.GetAttrPool().GetItemSurrogates(RES_URL)) + rDoc.GetAttrPool().GetItemSurrogates(aSurrogates, RES_URL); + for (const SfxPoolItem* pItem : aSurrogates) { auto pURL = dynamic_cast<const SwFormatURL*>(pItem); if (!pURL) @@ -3290,11 +3395,11 @@ void MSWordExportBase::CollectOutlineBookmarks(const SwDoc &rDoc) namespace { - const sal_uLong WW_BLOCKSIZE = 0x200; + const sal_uInt64 WW_BLOCKSIZE = 0x200; ErrCode EncryptRC4(msfilter::MSCodec_Std97& rCtx, SvStream &rIn, SvStream &rOut) { - sal_uLong nLen = rIn.TellEnd(); + sal_uInt64 nLen = rIn.TellEnd(); rIn.Seek(0); sal_uInt8 in[WW_BLOCKSIZE]; @@ -3336,20 +3441,19 @@ ErrCode MSWordExportBase::ExportDocument( bool bWriteAll ) m_pRedlAuthors = nullptr; m_aTOXArr.clear(); - if ( !m_pOLEExp ) + if ( !m_oOLEExp ) { sal_uInt32 nSvxMSDffOLEConvFlags = 0; - const SvtFilterOptions& rOpt = SvtFilterOptions::Get(); - if ( rOpt.IsMath2MathType() ) + if (officecfg::Office::Common::Filter::Microsoft::Export::MathToMathType::get()) nSvxMSDffOLEConvFlags |= OLE_STARMATH_2_MATHTYPE; - if ( rOpt.IsWriter2WinWord() ) + if (officecfg::Office::Common::Filter::Microsoft::Export::WriterToWinWord::get()) nSvxMSDffOLEConvFlags |= OLE_STARWRITER_2_WINWORD; - if ( rOpt.IsCalc2Excel() ) + if (officecfg::Office::Common::Filter::Microsoft::Export::CalcToExcel::get()) nSvxMSDffOLEConvFlags |= OLE_STARCALC_2_EXCEL; - if ( rOpt.IsImpress2PowerPoint() ) + if (officecfg::Office::Common::Filter::Microsoft::Export::ImpressToPowerPoint::get()) nSvxMSDffOLEConvFlags |= OLE_STARIMPRESS_2_POWERPOINT; - m_pOLEExp.reset(new SvxMSExportOLEObjects( nSvxMSDffOLEConvFlags )); + m_oOLEExp.emplace( nSvxMSDffOLEConvFlags ); } if ( !m_pOCXExp && m_rDoc.GetDocShell() ) @@ -3388,11 +3492,11 @@ ErrCode MSWordExportBase::ExportDocument( bool bWriteAll ) m_aFrames.clear(); // park m_pCurPam in a "safe place" now that document is fully exported - // before toggling redline mode to avoid ~SwIndexReg assert e.g. export + // before toggling redline mode to avoid ~SwContentIndexReg assert e.g. export // ooo103014-1.odt to .doc // park m_pOrigPam as well, as needed for exporting abi9915-1.odt to doc m_pOrigPam->DeleteMark(); - *m_pOrigPam->GetPoint() = SwPosition(m_rDoc.GetNodes().GetEndOfContent()); + m_pOrigPam->GetPoint()->Assign(m_rDoc.GetNodes().GetEndOfContent()); static_cast<SwPaM&>(*m_pCurPam) = *m_pOrigPam; m_rDoc.getIDocumentRedlineAccess().SetRedlineFlags(m_nOrigRedlineFlags); @@ -3406,7 +3510,7 @@ bool SwWW8Writer::InitStd97CodecUpdateMedium( ::msfilter::MSCodec_Std97& rCodec if ( mpMedium ) { - const SfxUnoAnyItem* pEncryptionDataItem = SfxItemSet::GetItem<SfxUnoAnyItem>(mpMedium->GetItemSet(), SID_ENCRYPTIONDATA, false); + const SfxUnoAnyItem* pEncryptionDataItem = mpMedium->GetItemSet().GetItem(SID_ENCRYPTIONDATA, false); if ( pEncryptionDataItem && ( pEncryptionDataItem->GetValue() >>= aEncryptionData ) && !rCodec.InitCodec( aEncryptionData ) ) { OSL_ENSURE( false, "Unexpected EncryptionData!" ); @@ -3416,15 +3520,15 @@ bool SwWW8Writer::InitStd97CodecUpdateMedium( ::msfilter::MSCodec_Std97& rCodec if ( !aEncryptionData.hasElements() ) { // try to generate the encryption data based on password - const SfxStringItem* pPasswordItem = SfxItemSet::GetItem<SfxStringItem>(mpMedium->GetItemSet(), SID_PASSWORD, false); + const SfxStringItem* pPasswordItem = mpMedium->GetItemSet().GetItem(SID_PASSWORD, false); if ( pPasswordItem && !pPasswordItem->GetValue().isEmpty() && pPasswordItem->GetValue().getLength() <= 15 ) { // Generate random number with a seed of time as salt. - rtlRandomPool aRandomPool = rtl_random_createPool (); sal_uInt8 pDocId[ 16 ]; - rtl_random_getBytes( aRandomPool, pDocId, 16 ); - - rtl_random_destroyPool( aRandomPool ); + if (rtl_random_getBytes(nullptr, pDocId, 16) != rtl_Random_E_None) + { + throw uno::RuntimeException("rtl_random_getBytes failed"); + } sal_uInt16 aPassword[16] = {}; @@ -3435,12 +3539,12 @@ bool SwWW8Writer::InitStd97CodecUpdateMedium( ::msfilter::MSCodec_Std97& rCodec rCodec.InitKey( aPassword, pDocId ); aEncryptionData = rCodec.GetEncryptionData(); - mpMedium->GetItemSet()->Put( SfxUnoAnyItem( SID_ENCRYPTIONDATA, uno::makeAny( aEncryptionData ) ) ); + mpMedium->GetItemSet().Put( SfxUnoAnyItem( SID_ENCRYPTIONDATA, uno::Any( aEncryptionData ) ) ); } } if ( aEncryptionData.hasElements() ) - mpMedium->GetItemSet()->ClearItem( SID_PASSWORD ); + mpMedium->GetItemSet().ClearItem( SID_PASSWORD ); } // nonempty encryption data means here that the codec was successfully initialized @@ -3451,13 +3555,16 @@ ErrCode WW8Export::ExportDocument_Impl() { PrepareStorage(); - pFib.reset(new WW8Fib(8, m_bDot)); + m_pFib.reset(new WW8Fib(8, m_bDot)); - tools::SvRef<SotStorageStream> xWwStrm( GetWriter().GetStorage().OpenSotStream( m_aMainStg ) ); - tools::SvRef<SotStorageStream> xTableStrm( xWwStrm ), xDataStrm( xWwStrm ); + rtl::Reference<SotStorageStream> xWwStrm(GetWriter().GetStorage().OpenSotStream(m_aMainStg)); + if (!xWwStrm->IsWritable()) + return ERRCODE_IO_ACCESSDENIED; + + rtl::Reference<SotStorageStream> xTableStrm(xWwStrm), xDataStrm(xWwStrm); xWwStrm->SetBufferSize( 32768 ); - pFib->m_fWhichTableStm = true; + m_pFib->m_fWhichTableStm = true; xTableStrm = GetWriter().GetStorage().OpenSotStream(SL::a1Table, StreamMode::STD_WRITE); xDataStrm = GetWriter().GetStorage().OpenSotStream(SL::aData, StreamMode::STD_WRITE); @@ -3468,17 +3575,14 @@ ErrCode WW8Export::ExportDocument_Impl() xDataStrm->SetEndian( SvStreamEndian::LITTLE ); GetWriter().SetStream( xWwStrm.get() ); - pTableStrm = xTableStrm.get(); - pDataStrm = xDataStrm.get(); + m_pTableStrm = xTableStrm.get(); + m_pDataStrm = xDataStrm.get(); Strm().SetEndian( SvStreamEndian::LITTLE ); - utl::TempFile aTempMain; - aTempMain.EnableKillingFile(); - utl::TempFile aTempTable; - aTempTable.EnableKillingFile(); - utl::TempFile aTempData; - aTempData.EnableKillingFile(); + utl::TempFileFast aTempMain; + utl::TempFileFast aTempTable; + utl::TempFileFast aTempData; msfilter::MSCodec_Std97 aCtx; bool bEncrypt = GetWriter().InitStd97CodecUpdateMedium(aCtx); @@ -3487,33 +3591,33 @@ ErrCode WW8Export::ExportDocument_Impl() GetWriter().SetStream( aTempMain.GetStream( StreamMode::READWRITE | StreamMode::SHARE_DENYWRITE ) ); - pTableStrm = aTempTable.GetStream( StreamMode::READWRITE | StreamMode::SHARE_DENYWRITE ); + m_pTableStrm = aTempTable.GetStream( StreamMode::READWRITE | StreamMode::SHARE_DENYWRITE ); - pDataStrm = aTempData.GetStream( StreamMode::READWRITE | StreamMode::SHARE_DENYWRITE ); + m_pDataStrm = aTempData.GetStream( StreamMode::READWRITE | StreamMode::SHARE_DENYWRITE ); sal_uInt8 const aRC4EncryptionHeader[ 52 ] = {0}; - pTableStrm->WriteBytes(aRC4EncryptionHeader, 52); + m_pTableStrm->WriteBytes(aRC4EncryptionHeader, 52); } // Default: "Standard" - pSepx.reset(new WW8_WrPlcSepx( *this )); // Sections/headers/footers + m_pSepx.reset(new WW8_WrPlcSepx( *this )); // Sections/headers/footers - pFootnote.reset(new WW8_WrPlcFootnoteEdn( TXT_FTN )); // Footnotes - pEdn.reset(new WW8_WrPlcFootnoteEdn( TXT_EDN )); // Endnotes - m_pAtn = new WW8_WrPlcAnnotations; // PostIts + m_pFootnote.reset(new WW8_WrPlcFootnoteEdn( TXT_FTN )); // Footnotes + m_pEdn.reset(new WW8_WrPlcFootnoteEdn( TXT_EDN )); // Endnotes + m_pAtn.reset(new WW8_WrPlcAnnotations); // PostIts m_pFactoids.reset(new WW8_WrtFactoids); // Smart tags. - m_pTextBxs = new WW8_WrPlcTextBoxes( TXT_TXTBOX ); - m_pHFTextBxs = new WW8_WrPlcTextBoxes( TXT_HFTXTBOX ); + m_pTextBxs.reset(new WW8_WrPlcTextBoxes( TXT_TXTBOX )); + m_pHFTextBxs.reset(new WW8_WrPlcTextBoxes( TXT_HFTXTBOX )); - m_pSdrObjs = new MainTextPlcDrawObj; // Draw-/Fly-Objects for main text - m_pHFSdrObjs = new HdFtPlcDrawObj; // Draw-/Fly-Objects for header/footer + m_pSdrObjs.reset(new MainTextPlcDrawObj); // Draw-/Fly-Objects for main text + m_pHFSdrObjs.reset(new HdFtPlcDrawObj); // Draw-/Fly-Objects for header/footer - m_pBkmks = new WW8_WrtBookmarks; // Bookmarks + m_pBkmks.reset(new WW8_WrtBookmarks); // Bookmarks GetWriter().CreateBookmarkTable(); - m_pPapPlc.reset(new WW8_WrPlcPn( *this, PAP, pFib->m_fcMin )); - m_pChpPlc.reset(new WW8_WrPlcPn( *this, CHP, pFib->m_fcMin )); - pO.reset(new ww::bytes); + m_pPapPlc.reset(new WW8_WrPlcPn( *this, PAP, m_pFib->m_fcMin )); + m_pChpPlc.reset(new WW8_WrPlcPn( *this, CHP, m_pFib->m_fcMin )); + m_pO.reset(new ww::bytes); m_pStyles.reset(new MSWordStyles( *this )); m_pFieldMain.reset(new WW8_WrPlcField( 2, TXT_MAINTEXT )); m_pFieldHdFt.reset(new WW8_WrPlcField( 2, TXT_HDFT )); @@ -3526,22 +3630,22 @@ ErrCode WW8Export::ExportDocument_Impl() m_pMagicTable.reset(new WW8_WrMagicTable); m_pGrf.reset(new SwWW8WrGrf( *this )); - m_pPiece = new WW8_WrPct( pFib->m_fcMin ); - pDop.reset(new WW8Dop); + m_pPiece.reset(new WW8_WrPct( m_pFib->m_fcMin )); + m_pDop.reset(new WW8Dop); - pDop->fRevMarking = bool( RedlineFlags::On & m_nOrigRedlineFlags ); + m_pDop->fRevMarking = bool( RedlineFlags::On & m_nOrigRedlineFlags ); SwRootFrame const*const pLayout(m_rDoc.getIDocumentLayoutAccess().GetCurrentLayout()); - pDop->fRMView = pLayout == nullptr || !pLayout->IsHideRedlines(); - pDop->fRMPrint = pDop->fRMView; + m_pDop->fRMView = pLayout == nullptr || !pLayout->IsHideRedlines(); + m_pDop->fRMPrint = m_pDop->fRMView; // set AutoHyphenation flag if found in default para style - const SfxPoolItem* pItem; + const SvxHyphenZoneItem* pItem; SwTextFormatColl* pStdTextFormatColl = m_rDoc.getIDocumentStylePoolAccess().GetTextCollFromPool(RES_POOLCOLL_STANDARD, false); - if (pStdTextFormatColl && SfxItemState::SET == pStdTextFormatColl->GetItemState( - RES_PARATR_HYPHENZONE, false, &pItem)) + if (pStdTextFormatColl && (pItem = pStdTextFormatColl->GetItemIfSet( + RES_PARATR_HYPHENZONE, false))) { - pDop->fAutoHyphen = static_cast<const SvxHyphenZoneItem*>(pItem)->IsHyphen(); + m_pDop->fAutoHyphen = pItem->IsHyphen(); } StoreDoc1(); @@ -3555,13 +3659,13 @@ ErrCode WW8Export::ExportDocument_Impl() pDataStrmTemp = xDataStrm.get(); if ( pDataStrmTemp && pDataStrmTemp != pStrmTemp) { - err = EncryptRC4(aCtx, *pDataStrm, *pDataStrmTemp); + err = EncryptRC4(aCtx, *m_pDataStrm, *pDataStrmTemp); if (err != ERRCODE_NONE) { goto done; } } - err = EncryptRC4(aCtx, *pTableStrm, *pTableStrmTemp); + err = EncryptRC4(aCtx, *m_pTableStrm, *pTableStrmTemp); if (err != ERRCODE_NONE) { goto done; } @@ -3588,13 +3692,13 @@ ErrCode WW8Export::ExportDocument_Impl() } // Write Unencrypted Fib 68 bytes to the start of the workdocument stream - pFib->m_fEncrypted = true; // fEncrypted indicates the document is encrypted. - pFib->m_fObfuscated = false; // Must be 0 for RC4. - pFib->m_nHash = 0x34; // encrypt header bytes count of table stream. - pFib->m_nKey = 0; // lkey2 must be 0 for RC4. + m_pFib->m_fEncrypted = true; // fEncrypted indicates the document is encrypted. + m_pFib->m_fObfuscated = false; // Must be 0 for RC4. + m_pFib->m_nHash = 0x34; // encrypt header bytes count of table stream. + m_pFib->m_nKey = 0; // lkey2 must be 0 for RC4. pStrmTemp->Seek( 0 ); - pFib->WriteHeader( *pStrmTemp ); + m_pFib->WriteHeader( *pStrmTemp ); done:; } @@ -3608,32 +3712,32 @@ ErrCode WW8Export::ExportDocument_Impl() m_pFieldHdFt.reset(); m_pFieldMain.reset(); m_pStyles.reset(); - pO.reset(); + m_pO.reset(); m_pChpPlc.reset(); m_pPapPlc.reset(); - pSepx.reset(); - - delete m_pRedlAuthors; - delete m_pSdrObjs; - delete m_pHFSdrObjs; - delete m_pTextBxs; - delete m_pHFTextBxs; - delete m_pAtn; - pEdn.reset(); - pFootnote.reset(); - delete m_pBkmks; - delete m_pPiece; - pDop.reset(); - pFib.reset(); + m_pSepx.reset(); + + m_pRedlAuthors.reset(); + m_pSdrObjs.reset(); + m_pHFSdrObjs.reset(); + m_pTextBxs.reset(); + m_pHFTextBxs.reset(); + m_pAtn.reset(); + m_pEdn.reset(); + m_pFootnote.reset(); + m_pBkmks.reset(); + m_pPiece.reset(); + m_pDop.reset(); + m_pFib.reset(); GetWriter().SetStream( nullptr ); xWwStrm->SetBufferSize( 0 ); xTableStrm->SetBufferSize( 0 ); xDataStrm->SetBufferSize( 0 ); - if( 0 == pDataStrm->Seek( STREAM_SEEK_TO_END )) + if( 0 == m_pDataStrm->Seek( STREAM_SEEK_TO_END )) { xDataStrm.clear(); - pDataStrm = nullptr; + m_pDataStrm = nullptr; GetWriter().GetStorage().Remove(SL::aData); } @@ -3669,7 +3773,7 @@ void WW8Export::PrepareStorage() SvGlobalName aGName(MSO_WW8_CLASSID); GetWriter().GetStorage().SetClass( aGName, SotClipboardFormatId::NONE, "Microsoft Word-Document"); - tools::SvRef<SotStorageStream> xStor( GetWriter().GetStorage().OpenSotStream(sCompObj) ); + rtl::Reference<SotStorageStream> xStor(GetWriter().GetStorage().OpenSotStream(sCompObj)); xStor->WriteBytes(pData, sizeof(pData)); SwDocShell* pDocShell = m_rDoc.GetDocShell (); @@ -3686,7 +3790,7 @@ void WW8Export::PrepareStorage() if (!xDocProps.is()) return; - if ( SvtFilterOptions::Get().IsEnableWordPreview() ) + if (officecfg::Office::Common::Filter::Microsoft::Export::EnableWordPreview::get()) { std::shared_ptr<GDIMetaFile> xMetaFile = pDocShell->GetPreviewMetaFile(); @@ -3698,16 +3802,16 @@ void WW8Export::PrepareStorage() sfx2::SaveOlePropertySet( xDocProps, &GetWriter().GetStorage() ); } -ErrCode SwWW8Writer::WriteStorage() +ErrCodeMsg SwWW8Writer::WriteStorage() { - tools::SvRef<SotStorage> pOrigStg; + rtl::Reference<SotStorage> pOrigStg; uno::Reference< packages::XPackageEncryption > xPackageEncryption; std::shared_ptr<SvStream> pSotStorageStream; uno::Sequence< beans::NamedValue > aEncryptionData; if (mpMedium) { // Check for specific encryption requests - const SfxUnoAnyItem* pEncryptionDataItem = SfxItemSet::GetItem<SfxUnoAnyItem>(mpMedium->GetItemSet(), SID_ENCRYPTIONDATA, false); + const SfxUnoAnyItem* pEncryptionDataItem = mpMedium->GetItemSet().GetItem(SID_ENCRYPTIONDATA, false); if (pEncryptionDataItem && (pEncryptionDataItem->GetValue() >>= aEncryptionData)) { ::comphelper::SequenceAsHashMap aHashData(aEncryptionData); @@ -3717,12 +3821,12 @@ ErrCode SwWW8Writer::WriteStorage() { uno::Reference<uno::XComponentContext> xComponentContext(comphelper::getProcessComponentContext()); uno::Sequence<uno::Any> aArguments{ - uno::makeAny(beans::NamedValue("Binary", uno::makeAny(true))) }; + uno::Any(beans::NamedValue("Binary", uno::Any(true))) }; xPackageEncryption.set( xComponentContext->getServiceManager()->createInstanceWithArgumentsAndContext( "com.sun.star.comp.oox.crypto." + sCryptoType, aArguments, xComponentContext), uno::UNO_QUERY); - if (xPackageEncryption.is()) + if (xPackageEncryption) { // We have an encryptor // Create new temporary storage for content @@ -3736,8 +3840,10 @@ ErrCode SwWW8Writer::WriteStorage() ErrCode nErrorCode = WriteStorageImpl(); - if (xPackageEncryption.is()) + if (xPackageEncryption) { + assert(pSotStorageStream && m_pStg && "because always set if xPackageEncryption was set"); + m_pStg->Commit(); pSotStorageStream->Seek(0); @@ -3748,11 +3854,11 @@ ErrCode SwWW8Writer::WriteStorage() uno::Sequence<beans::NamedValue> aStreams = xPackageEncryption->encrypt(xInputStream); m_pStg = pOrigStg; - for (const beans::NamedValue & aStreamData : std::as_const(aStreams)) + for (const beans::NamedValue& aStreamData : aStreams) { // To avoid long paths split and open substorages recursively // Splitting paths manually, since comphelper::string::split is trimming special characters like \0x01, \0x09 - tools::SvRef<SotStorage> pStorage = m_pStg.get(); + rtl::Reference<SotStorage> pStorage = m_pStg; OUString sFileName; sal_Int32 idx = 0; while (pStorage && idx >= 0) @@ -3779,7 +3885,7 @@ ErrCode SwWW8Writer::WriteStorage() break; } - tools::SvRef<SotStorageStream> pStream = pStorage->OpenSotStream(sFileName); + rtl::Reference<SotStorageStream> pStream = pStorage->OpenSotStream(sFileName); if (!pStream) { nErrorCode = ERRCODE_IO_GENERAL; @@ -3805,15 +3911,15 @@ ErrCode SwWW8Writer::WriteStorageImpl() if( pViewShell != nullptr ) pViewShell->CalcLayout(); - tools::Long nMaxNode = m_pDoc->GetNodes().Count(); - ::StartProgress( STR_STATSTR_W4WWRITE, 0, nMaxNode, m_pDoc->GetDocShell() ); + SwNodeOffset nMaxNode = m_pDoc->GetNodes().Count(); + ::StartProgress( STR_STATSTR_W4WWRITE, 0, sal_Int32(nMaxNode), m_pDoc->GetDocShell() ); // Respect table at the beginning of the document { - SwTableNode* pTNd = m_pCurrentPam->GetNode().FindTableNode(); + SwTableNode* pTNd = m_pCurrentPam->GetPointNode().FindTableNode(); if( pTNd && m_bWriteAll ) // start with the table node !! - m_pCurrentPam->GetPoint()->nNode = *pTNd; + m_pCurrentPam->GetPoint()->Assign(*pTNd); } // Do the actual export @@ -3830,16 +3936,16 @@ ErrCode SwWW8Writer::WriteStorageImpl() return err; } -ErrCode SwWW8Writer::WriteMedium( SfxMedium& ) +ErrCodeMsg SwWW8Writer::WriteMedium( SfxMedium& ) { return WriteStorage(); } -ErrCode SwWW8Writer::Write( SwPaM& rPaM, SfxMedium& rMed, +ErrCodeMsg SwWW8Writer::Write( SwPaM& rPaM, SfxMedium& rMed, const OUString* pFileName ) { mpMedium = &rMed; - ErrCode nRet = StgWriter::Write( rPaM, rMed, pFileName ); + ErrCodeMsg nRet = StgWriter::Write( rPaM, rMed, pFileName ); mpMedium = nullptr; return nRet; } @@ -3847,10 +3953,7 @@ ErrCode SwWW8Writer::Write( SwPaM& rPaM, SfxMedium& rMed, MSWordExportBase::MSWordExportBase( SwDoc& rDocument, std::shared_ptr<SwUnoCursor> & pCurrentPam, SwPaM* pOriginalPam ) : m_aMainStg(sMainStream) , m_pISet(nullptr) - , m_pPiece(nullptr) , m_pTopNodeOfHdFtPage(nullptr) - , m_pBkmks(nullptr) - , m_pRedlAuthors(nullptr) , m_pTableInfo(std::make_shared<ww8::WW8TableInfo>()) , m_nCharFormatStart(0) , m_nFormatCollStart(0) @@ -3861,19 +3964,15 @@ MSWordExportBase::MSWordExportBase( SwDoc& rDocument, std::shared_ptr<SwUnoCurso , m_nOrigRedlineFlags(RedlineFlags::NONE) , m_bOrigShowChanges(true) , m_pCurrentPageDesc(nullptr) + , m_pPreviousSectionPageDesc(nullptr) , m_bFirstTOCNodeWithSection(false) , m_pChpIter(nullptr) - , m_pAtn(nullptr) - , m_pTextBxs(nullptr) - , m_pHFTextBxs(nullptr) , m_pParentFrame(nullptr) , m_pFlyOffset(nullptr) , m_eNewAnchorType(RndStdIds::FLY_AS_CHAR) , m_pStyAttr(nullptr) , m_pOutFormatNode(nullptr) , m_pCurrentStyle(nullptr) - , m_pSdrObjs(nullptr) - , m_pHFSdrObjs(nullptr) , m_pEscher(nullptr) , m_nTextTyp(0) , m_bStyDef(false) @@ -3898,8 +3997,8 @@ MSWordExportBase::MSWordExportBase( SwDoc& rDocument, std::shared_ptr<SwUnoCurso , m_bFontSizeWritten(false) , m_bAddFootnoteTab(false) , m_rDoc(rDocument) - , m_nCurStart(pCurrentPam->GetPoint()->nNode.GetIndex()) - , m_nCurEnd(pCurrentPam->GetMark()->nNode.GetIndex()) + , m_nCurStart(pCurrentPam->GetPoint()->GetNodeIndex()) + , m_nCurEnd(pCurrentPam->GetMark()->GetNodeIndex()) , m_pCurPam(pCurrentPam) , m_pOrigPam(pOriginalPam) { @@ -3915,7 +4014,7 @@ MSWordExportBase::~MSWordExportBase() m_pUsedNumTable->erase(m_pUsedNumTable->begin(), m_pUsedNumTable->begin() + m_pUsedNumTable->size() - m_nUniqueList); m_pUsedNumTable.reset(); } - m_pOLEExp.reset(); + m_oOLEExp.reset(); m_pOCXExp.reset(); } @@ -3923,8 +4022,8 @@ WW8Export::WW8Export( SwWW8Writer *pWriter, SwDoc& rDocument, std::shared_ptr<SwUnoCursor> & pCurrentPam, SwPaM* pOriginalPam, bool bDot ) : MSWordExportBase( rDocument, pCurrentPam, pOriginalPam ) - , pTableStrm(nullptr) - , pDataStrm(nullptr) + , m_pTableStrm(nullptr) + , m_pDataStrm(nullptr) , m_bDot(bDot) , m_pWriter(pWriter) , m_pAttrOutput(new WW8AttributeOutput(*this)) @@ -3942,12 +4041,11 @@ AttributeOutputBase& WW8Export::AttrOutput() const MSWordSections& WW8Export::Sections() const { - return *pSepx; + return *m_pSepx; } -SwWW8Writer::SwWW8Writer(const OUString& rFltName, const OUString& rBaseURL) - : StgWriter(), - m_pExport( nullptr ), +SwWW8Writer::SwWW8Writer(std::u16string_view rFltName, const OUString& rBaseURL) + : m_pExport( nullptr ), mpMedium( nullptr ) { assert(rFltName == FILTER_WW8); // WW6/7 export was removed @@ -3965,7 +4063,7 @@ extern "C" SAL_DLLPUBLIC_EXPORT sal_uInt32 SaveOrDelMSVBAStorage_ww8( SfxObjectS return sal_uInt32(aTmp.SaveOrDelMSVBAStorage( bSaveInto, rStorageName )); } -extern "C" SAL_DLLPUBLIC_EXPORT void ExportDOC( const OUString& rFltName, const OUString& rBaseURL, WriterRef& xRet ) +extern "C" SAL_DLLPUBLIC_EXPORT void ExportDOC( std::u16string_view rFltName, const OUString& rBaseURL, WriterRef& xRet ) { xRet = new SwWW8Writer( rFltName, rBaseURL ); } @@ -3978,73 +4076,73 @@ extern "C" SAL_DLLPUBLIC_EXPORT sal_uInt32 GetSaveWarningOfMSVBAStorage_ww8( Sf bool WW8_WrPlcFootnoteEdn::WriteText( WW8Export& rWrt ) { bool bRet = false; - if (TXT_FTN == nTyp) + if (TXT_FTN == m_nTyp) { - bRet = WriteGenericText( rWrt, TXT_FTN, rWrt.pFib->m_ccpFootnote ); + bRet = WriteGenericText( rWrt, TXT_FTN, rWrt.m_pFib->m_ccpFootnote ); rWrt.m_pFieldFootnote->Finish( rWrt.Fc2Cp( rWrt.Strm().Tell() ), - rWrt.pFib->m_ccpText ); + rWrt.m_pFib->m_ccpText ); } else { - bRet = WriteGenericText( rWrt, TXT_EDN, rWrt.pFib->m_ccpEdn ); + bRet = WriteGenericText( rWrt, TXT_EDN, rWrt.m_pFib->m_ccpEdn ); rWrt.m_pFieldEdn->Finish( rWrt.Fc2Cp( rWrt.Strm().Tell() ), - rWrt.pFib->m_ccpText + rWrt.pFib->m_ccpFootnote - + rWrt.pFib->m_ccpHdr + rWrt.pFib->m_ccpAtn ); + rWrt.m_pFib->m_ccpText + rWrt.m_pFib->m_ccpFootnote + + rWrt.m_pFib->m_ccpHdr + rWrt.m_pFib->m_ccpAtn ); } return bRet; } void WW8_WrPlcFootnoteEdn::WritePlc( WW8Export& rWrt ) const { - if( TXT_FTN == nTyp ) + if( TXT_FTN == m_nTyp ) { - WriteGenericPlc( rWrt, TXT_FTN, rWrt.pFib->m_fcPlcffndText, - rWrt.pFib->m_lcbPlcffndText, rWrt.pFib->m_fcPlcffndRef, - rWrt.pFib->m_lcbPlcffndRef ); + WriteGenericPlc( rWrt, TXT_FTN, rWrt.m_pFib->m_fcPlcffndText, + rWrt.m_pFib->m_lcbPlcffndText, rWrt.m_pFib->m_fcPlcffndRef, + rWrt.m_pFib->m_lcbPlcffndRef ); } else { - WriteGenericPlc( rWrt, TXT_EDN, rWrt.pFib->m_fcPlcfendText, - rWrt.pFib->m_lcbPlcfendText, rWrt.pFib->m_fcPlcfendRef, - rWrt.pFib->m_lcbPlcfendRef ); + WriteGenericPlc( rWrt, TXT_EDN, rWrt.m_pFib->m_fcPlcfendText, + rWrt.m_pFib->m_lcbPlcfendText, rWrt.m_pFib->m_fcPlcfendRef, + rWrt.m_pFib->m_lcbPlcfendRef ); } } bool WW8_WrPlcAnnotations::WriteText( WW8Export& rWrt ) { - bool bRet = WriteGenericText( rWrt, TXT_ATN, rWrt.pFib->m_ccpAtn ); + bool bRet = WriteGenericText( rWrt, TXT_ATN, rWrt.m_pFib->m_ccpAtn ); rWrt.m_pFieldAtn->Finish( rWrt.Fc2Cp( rWrt.Strm().Tell() ), - rWrt.pFib->m_ccpText + rWrt.pFib->m_ccpFootnote - + rWrt.pFib->m_ccpHdr ); + rWrt.m_pFib->m_ccpText + rWrt.m_pFib->m_ccpFootnote + + rWrt.m_pFib->m_ccpHdr ); return bRet; } void WW8_WrPlcAnnotations::WritePlc( WW8Export& rWrt ) const { - WriteGenericPlc( rWrt, TXT_ATN, rWrt.pFib->m_fcPlcfandText, - rWrt.pFib->m_lcbPlcfandText, rWrt.pFib->m_fcPlcfandRef, - rWrt.pFib->m_lcbPlcfandRef ); + WriteGenericPlc( rWrt, TXT_ATN, rWrt.m_pFib->m_fcPlcfandText, + rWrt.m_pFib->m_lcbPlcfandText, rWrt.m_pFib->m_fcPlcfandRef, + rWrt.m_pFib->m_lcbPlcfandRef ); } void WW8_WrPlcTextBoxes::WritePlc( WW8Export& rWrt ) const { - if( TXT_TXTBOX == nTyp ) + if( TXT_TXTBOX == m_nTyp ) { - WriteGenericPlc( rWrt, nTyp, rWrt.pFib->m_fcPlcftxbxBkd, - rWrt.pFib->m_lcbPlcftxbxBkd, rWrt.pFib->m_fcPlcftxbxText, - rWrt.pFib->m_lcbPlcftxbxText ); + WriteGenericPlc( rWrt, m_nTyp, rWrt.m_pFib->m_fcPlcftxbxBkd, + rWrt.m_pFib->m_lcbPlcftxbxBkd, rWrt.m_pFib->m_fcPlcftxbxText, + rWrt.m_pFib->m_lcbPlcftxbxText ); } else { - WriteGenericPlc( rWrt, nTyp, rWrt.pFib->m_fcPlcfHdrtxbxBkd, - rWrt.pFib->m_lcbPlcfHdrtxbxBkd, rWrt.pFib->m_fcPlcfHdrtxbxText, - rWrt.pFib->m_lcbPlcfHdrtxbxText ); + WriteGenericPlc( rWrt, m_nTyp, rWrt.m_pFib->m_fcPlcfHdrtxbxBkd, + rWrt.m_pFib->m_lcbPlcfHdrtxbxBkd, rWrt.m_pFib->m_fcPlcfHdrtxbxText, + rWrt.m_pFib->m_lcbPlcfHdrtxbxText ); } } void WW8Export::RestoreMacroCmds() { - pFib->m_fcCmds = pTableStrm->Tell(); + m_pFib->m_fcCmds = m_pTableStrm->Tell(); uno::Reference < embed::XStorage > xSrcRoot(m_rDoc.GetDocShell()->GetStorage()); try @@ -4055,13 +4153,13 @@ void WW8Export::RestoreMacroCmds() if ( pStream && ERRCODE_NONE == pStream->GetError()) { - pFib->m_lcbCmds = pStream->TellEnd(); + m_pFib->m_lcbCmds = pStream->TellEnd(); pStream->Seek(0); - std::unique_ptr<sal_uInt8[]> pBuffer( new sal_uInt8[pFib->m_lcbCmds] ); - bool bReadOk = checkRead(*pStream, pBuffer.get(), pFib->m_lcbCmds); + std::unique_ptr<sal_uInt8[]> pBuffer( new sal_uInt8[m_pFib->m_lcbCmds] ); + bool bReadOk = checkRead(*pStream, pBuffer.get(), m_pFib->m_lcbCmds); if (bReadOk) - pTableStrm->WriteBytes(pBuffer.get(), pFib->m_lcbCmds); + m_pTableStrm->WriteBytes(pBuffer.get(), m_pFib->m_lcbCmds); } } catch ( const uno::Exception& ) @@ -4069,7 +4167,7 @@ void WW8Export::RestoreMacroCmds() } // set len to FIB - pFib->m_lcbCmds = pTableStrm->Tell() - pFib->m_fcCmds; + m_pFib->m_lcbCmds = m_pTableStrm->Tell() - m_pFib->m_fcCmds; } void WW8SHDLong::Write( WW8Export& rExport ) @@ -4098,17 +4196,11 @@ void WW8Export::WriteFormData( const ::sw::mark::IFieldmark& rFieldmark ) if ( rFieldmark.GetFieldname() == ODF_FORMDROPDOWN ) type=2; - ::sw::mark::IFieldmark::parameter_map_t::const_iterator pParameter = rFieldmark.GetParameters()->find("name"); - OUString ffname; - if ( pParameter != rFieldmark.GetParameters()->end() ) - { - OUString aName; - pParameter->second >>= aName; - const sal_Int32 nLen = std::min( sal_Int32(20), aName.getLength() ); - ffname = aName.copy(0, nLen); - } + OUString ffname = rFieldmark.GetName(); + if (ffname.getLength() > 20) + ffname = ffname.copy(0, 20); - sal_uInt64 nDataStt = pDataStrm->Tell(); + sal_uInt64 nDataStt = m_pDataStrm->Tell(); m_pChpPlc->AppendFkpEntry(Strm().Tell()); WriteChar(0x01); @@ -4158,10 +4250,12 @@ void WW8Export::WriteFormData( const ::sw::mark::IFieldmark& rFieldmark ) OUString ffstattext; OUString ffentrymcr; OUString ffexitmcr; + + ::sw::mark::IFieldmark::parameter_map_t::const_iterator pParameter + = rFieldmark.GetParameters()->find("Type"); if (type == 0) // iTypeText { sal_uInt16 nType = 0; - pParameter = rFieldmark.GetParameters()->find("Type"); if ( pParameter != rFieldmark.GetParameters()->end() ) { OUString aType; @@ -4257,7 +4351,8 @@ void WW8Export::WriteFormData( const ::sw::mark::IFieldmark& rFieldmark ) { uno::Sequence< OUString > vListEntries; pListEntries->second >>= vListEntries; - copy(vListEntries.begin(), vListEntries.end(), back_inserter(aListItems)); + aListItems.reserve(vListEntries.getLength()); + copy(std::cbegin(vListEntries), std::cend(vListEntries), back_inserter(aListItems)); } } @@ -4293,33 +4388,33 @@ void WW8Export::WriteFormData( const ::sw::mark::IFieldmark& rFieldmark ) } } - pDataStrm->WriteUInt32( slen ); + m_pDataStrm->WriteUInt32( slen ); int len = sizeof( aFieldData ); OSL_ENSURE( len == 0x44-sizeof(sal_uInt32), "SwWW8Writer::WriteFormData(..) - wrong aFieldData length" ); - pDataStrm->WriteBytes( aFieldData, len ); + m_pDataStrm->WriteBytes( aFieldData, len ); - pDataStrm->WriteUInt32( aFieldHeader.version ).WriteUInt16( aFieldHeader.bits ).WriteUInt16( aFieldHeader.cch ).WriteUInt16( aFieldHeader.hps ); + m_pDataStrm->WriteUInt32( aFieldHeader.version ).WriteUInt16( aFieldHeader.bits ).WriteUInt16( aFieldHeader.cch ).WriteUInt16( aFieldHeader.hps ); - SwWW8Writer::WriteString_xstz( *pDataStrm, ffname, true ); // Form field name + SwWW8Writer::WriteString_xstz( *m_pDataStrm, ffname, true ); // Form field name if ( !type ) - SwWW8Writer::WriteString_xstz( *pDataStrm, ffdeftext, true ); + SwWW8Writer::WriteString_xstz( *m_pDataStrm, ffdeftext, true ); if ( type ) - pDataStrm->WriteUInt16( 0 ); + m_pDataStrm->WriteUInt16( 0 ); - SwWW8Writer::WriteString_xstz( *pDataStrm, ffformat, true ); - SwWW8Writer::WriteString_xstz( *pDataStrm, ffhelptext, true ); - SwWW8Writer::WriteString_xstz( *pDataStrm, ffstattext, true ); - SwWW8Writer::WriteString_xstz( *pDataStrm, ffentrymcr, true ); - SwWW8Writer::WriteString_xstz( *pDataStrm, ffexitmcr, true ); + SwWW8Writer::WriteString_xstz( *m_pDataStrm, ffformat, true ); + SwWW8Writer::WriteString_xstz( *m_pDataStrm, ffhelptext, true ); + SwWW8Writer::WriteString_xstz( *m_pDataStrm, ffstattext, true ); + SwWW8Writer::WriteString_xstz( *m_pDataStrm, ffentrymcr, true ); + SwWW8Writer::WriteString_xstz( *m_pDataStrm, ffexitmcr, true ); if (type==2) { - pDataStrm->WriteUInt16( 0xFFFF ); + m_pDataStrm->WriteUInt16( 0xFFFF ); const int items=aListItems.size(); - pDataStrm->WriteUInt32( items ); + m_pDataStrm->WriteUInt32( items ); for(int i=0;i<items;i++) { OUString item=aListItems[i]; - SwWW8Writer::WriteString_xstz( *pDataStrm, item, false ); + SwWW8Writer::WriteString_xstz( *m_pDataStrm, item, false ); } } } @@ -4329,7 +4424,7 @@ void WW8Export::WriteHyperlinkData( const sw::mark::IFieldmark& /*rFieldmark*/ ) //@TODO implement me !!! } -void WW8AttributeOutput::TableNodeInfoInner( ww8::WW8TableNodeInfoInner::Pointer_t pNodeInfoInner ) +void WW8AttributeOutput::TableNodeInfoInner(const ww8::WW8TableNodeInfoInner::Pointer_t& pNodeInfoInner) { SVBT16 nStyle; ShortToSVBT16( m_rWW8Export.m_nStyleBeforeFly, nStyle ); @@ -4338,7 +4433,7 @@ void WW8AttributeOutput::TableNodeInfoInner( ww8::WW8TableNodeInfoInner::Pointer SAL_INFO( "sw.ww8", "<OutWW8_TableNodeInfoInner>" << pNodeInfoInner->toString()); #endif - m_rWW8Export.pO->clear(); + m_rWW8Export.m_pO->clear(); sal_uInt32 nShadowsBefore = pNodeInfoInner->getShadowsBefore(); if (nShadowsBefore > 0) @@ -4353,12 +4448,12 @@ void WW8AttributeOutput::TableNodeInfoInner( ww8::WW8TableNodeInfoInner::Pointer { m_rWW8Export.WriteCR(pTmpNodeInfoInner); - m_rWW8Export.pO->insert( m_rWW8Export.pO->end(), nStyle, nStyle+2 ); // Style # + m_rWW8Export.m_pO->insert( m_rWW8Export.m_pO->end(), nStyle, nStyle+2 ); // Style # TableInfoCell(pTmpNodeInfoInner); m_rWW8Export.m_pPapPlc->AppendFkpEntry - ( m_rWW8Export.Strm().Tell(), m_rWW8Export.pO->size(), m_rWW8Export.pO->data() ); + ( m_rWW8Export.Strm().Tell(), m_rWW8Export.m_pO->size(), m_rWW8Export.m_pO->data() ); - m_rWW8Export.pO->clear(); + m_rWW8Export.m_pO->clear(); } } @@ -4368,11 +4463,11 @@ void WW8AttributeOutput::TableNodeInfoInner( ww8::WW8TableNodeInfoInner::Pointer m_rWW8Export.WriteCR(pNodeInfoInner); - m_rWW8Export.pO->insert( m_rWW8Export.pO->end(), nStyle, nStyle+2 ); // Style # + m_rWW8Export.m_pO->insert( m_rWW8Export.m_pO->end(), nStyle, nStyle+2 ); // Style # TableInfoCell(pNodeInfoInner); - m_rWW8Export.m_pPapPlc->AppendFkpEntry( m_rWW8Export.Strm().Tell(), m_rWW8Export.pO->size(), m_rWW8Export.pO->data() ); + m_rWW8Export.m_pPapPlc->AppendFkpEntry( m_rWW8Export.Strm().Tell(), m_rWW8Export.m_pO->size(), m_rWW8Export.m_pO->data() ); - m_rWW8Export.pO->clear(); + m_rWW8Export.m_pO->clear(); } sal_uInt32 nShadowsAfter = pNodeInfoInner->getShadowsAfter(); @@ -4388,11 +4483,11 @@ void WW8AttributeOutput::TableNodeInfoInner( ww8::WW8TableNodeInfoInner::Pointer { m_rWW8Export.WriteCR(pTmpNodeInfoInner); - m_rWW8Export.pO->insert( m_rWW8Export.pO->end(), nStyle, nStyle+2 ); // Style # + m_rWW8Export.m_pO->insert( m_rWW8Export.m_pO->end(), nStyle, nStyle+2 ); // Style # TableInfoCell(pTmpNodeInfoInner); - m_rWW8Export.m_pPapPlc->AppendFkpEntry( m_rWW8Export.Strm().Tell(), m_rWW8Export.pO->size(), m_rWW8Export.pO->data() ); + m_rWW8Export.m_pPapPlc->AppendFkpEntry( m_rWW8Export.Strm().Tell(), m_rWW8Export.m_pO->size(), m_rWW8Export.m_pO->data() ); - m_rWW8Export.pO->clear(); + m_rWW8Export.m_pO->clear(); } } @@ -4403,11 +4498,11 @@ void WW8AttributeOutput::TableNodeInfoInner( ww8::WW8TableNodeInfoInner::Pointer TableRowEnd(pNodeInfoInner->getDepth()); ShortToSVBT16(0, nStyle); - m_rWW8Export.pO->insert( m_rWW8Export.pO->end(), nStyle, nStyle+2 ); // Style # + m_rWW8Export.m_pO->insert( m_rWW8Export.m_pO->end(), nStyle, nStyle+2 ); // Style # TableInfoRow(pNodeInfoInner); - m_rWW8Export.m_pPapPlc->AppendFkpEntry( m_rWW8Export.Strm().Tell(), m_rWW8Export.pO->size(), m_rWW8Export.pO->data() ); + m_rWW8Export.m_pPapPlc->AppendFkpEntry( m_rWW8Export.Strm().Tell(), m_rWW8Export.m_pO->size(), m_rWW8Export.m_pO->data() ); - m_rWW8Export.pO->clear(); + m_rWW8Export.m_pO->clear(); } SAL_INFO( "sw.ww8", "</OutWW8_TableNodeInfoInner>" ); } @@ -4491,4 +4586,53 @@ const NfKeywordTable & MSWordExportBase::GetNfKeywordTable() return *m_pKeyMap; } +OUString MSWordExportBase::BookmarkToWord(const OUString& rBookmark, bool* pIsMove, bool* pIsFrom) +{ + OUString sLookup = rBookmark; + if (pIsMove) + { + static constexpr OUStringLiteral MoveFrom_Bookmark_NamePrefix = u"__RefMoveFrom__"; + static constexpr OUStringLiteral MoveTo_Bookmark_NamePrefix = u"__RefMoveTo__"; + if (rBookmark.startsWith(MoveFrom_Bookmark_NamePrefix, &sLookup)) + { + *pIsMove = true; + *pIsFrom = true; + } + else if (rBookmark.startsWith(MoveTo_Bookmark_NamePrefix, &sLookup)) + { + *pIsMove = true; + *pIsFrom = false; + } + } + if (auto it = m_aBookmarkToWord.find(sLookup); it != m_aBookmarkToWord.end()) + return it->second; + + OUString sRet + = INetURLObject::encode(sLookup.replace(' ', '_'), // Spaces are prohibited in bookmark name + INetURLObject::PART_REL_SEGMENT_EXTRA, + INetURLObject::EncodeMechanism::All, RTL_TEXTENCODING_ASCII_US); + // Unicode letters are allowed + sRet = INetURLObject::decode(sRet, INetURLObject::DecodeMechanism::Unambiguous, + RTL_TEXTENCODING_UTF8); + + /*#i15387#*/ + // Word has 40 character limit for bookmarks: [MS-OE376] Part 4 Sect. 2.13.6.2, bookmarkStart + if (sRet.getLength() > 40) + { + // Generate a unique bookmark name + sRet = sRet.copy(0, 40); + for (sal_uInt32 n = 1; n; ++n) + { + if (m_aWordBookmarks.find(sRet) == m_aWordBookmarks.end()) + break; + auto num = OUString::number(n, 36); + sRet = sRet.subView(0, 40 - num.length) + num; + } + } + + m_aBookmarkToWord[sLookup] = sRet; + m_aWordBookmarks.insert(sRet); + return sRet; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |