sw/source/filter/ww8/ww8par.cxx | 34 ++-- sw/source/filter/ww8/ww8par.hxx | 2 sw/source/filter/ww8/ww8par2.cxx | 69 +++++---- sw/source/filter/ww8/ww8par2.hxx | 2 sw/source/filter/ww8/ww8par3.cxx | 49 +++--- sw/source/filter/ww8/ww8par4.cxx | 10 - sw/source/filter/ww8/ww8par5.cxx | 4 sw/source/filter/ww8/ww8par6.cxx | 277 ++++++++++++++++++++++----------------- sw/source/filter/ww8/ww8scan.cxx | 123 ++++++++++------- sw/source/filter/ww8/ww8scan.hxx | 43 ++++-- 10 files changed, 357 insertions(+), 256 deletions(-)
New commits: commit b897cc4dfc7111eb8dfd5d8aa8c970f21ab035d6 Author: Caolán McNamara <caol...@redhat.com> Date: Mon Apr 10 21:10:57 2017 +0100 consistently track amount of buffers remaining Change-Id: Ib9746a045edf2146b8cc3bd69124ab74462df094 Reviewed-on: https://gerrit.libreoffice.org/36405 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Caolán McNamara <caol...@redhat.com> Tested-by: Caolán McNamara <caol...@redhat.com> diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx index 831082c032a3..93bcea47f060 100644 --- a/sw/source/filter/ww8/ww8par.cxx +++ b/sw/source/filter/ww8/ww8par.cxx @@ -2534,7 +2534,7 @@ bool SwWW8ImplReader::ProcessSpecial(bool &rbReSync, WW8_CP nStartCp) OSL_ENSURE(m_nInTable >= 0,"nInTable < 0!"); // TabRowEnd - bool bTableRowEnd = (m_pPlcxMan->HasParaSprm(m_bVer67 ? 25 : 0x2417) != nullptr ); + bool bTableRowEnd = (m_pPlcxMan->HasParaSprm(m_bVer67 ? 25 : 0x2417).pSprm != nullptr); // Unfortunately, for every paragraph we need to check first whether // they contain a sprm 29 (0x261B), which starts an APO. @@ -2565,12 +2565,12 @@ bool SwWW8ImplReader::ProcessSpecial(bool &rbReSync, WW8_CP nStartCp) sal_uInt8 nCellLevel = 0; if (m_bVer67) - nCellLevel = int(nullptr != m_pPlcxMan->HasParaSprm(24)); + nCellLevel = int(nullptr != m_pPlcxMan->HasParaSprm(24).pSprm); else { - nCellLevel = int(nullptr != m_pPlcxMan->HasParaSprm(0x2416)); + nCellLevel = int(nullptr != m_pPlcxMan->HasParaSprm(0x2416).pSprm); if (!nCellLevel) - nCellLevel = int(nullptr != m_pPlcxMan->HasParaSprm(0x244B)); + nCellLevel = int(nullptr != m_pPlcxMan->HasParaSprm(0x244B).pSprm); } do { @@ -2584,8 +2584,9 @@ bool SwWW8ImplReader::ProcessSpecial(bool &rbReSync, WW8_CP nStartCp) WW8PLCFx_Cp_FKP* pPap = m_pPlcxMan->GetPapPLCF(); WW8_CP nMyStartCp=nStartCp; - if (const sal_uInt8 *pLevel = m_pPlcxMan->HasParaSprm(0x6649)) - nCellLevel = *pLevel; + SprmResult aLevel = m_pPlcxMan->HasParaSprm(0x6649); + if (aLevel.pSprm && aLevel.nRemainingData >= 1) + nCellLevel = *aLevel.pSprm; bool bHasRowEnd = SearchRowEnd(pPap, nMyStartCp, (m_nInTable<nCellLevel?m_nInTable:nCellLevel-1)); @@ -2617,8 +2618,9 @@ bool SwWW8ImplReader::ProcessSpecial(bool &rbReSync, WW8_CP nStartCp) // Test for Anl (Numbering) and process all events in the right order if( m_bAnl && !bTableRowEnd ) { - const sal_uInt8* pSprm13 = m_pPlcxMan->HasParaSprm( 13 ); - if( pSprm13 ) + SprmResult aSprm13 = m_pPlcxMan->HasParaSprm(13); + const sal_uInt8* pSprm13 = aSprm13.pSprm; + if (pSprm13 && aSprm13.nRemainingData >= 1) { // Still Anl left? sal_uInt8 nT = static_cast< sal_uInt8 >(GetNumType( *pSprm13 )); if( ( nT != WW8_Pause && nT != m_nWwNumType ) // Anl change @@ -4018,20 +4020,20 @@ bool SwWW8ImplReader::ReadText(WW8_CP nStartCp, WW8_CP nTextLen, ManTypes nType) // If we have found a dropcap store the textnode pPreviousNode = m_pPaM->GetNode().GetTextNode(); - const sal_uInt8 *pDCS; - + SprmResult aDCS; if (m_bVer67) - pDCS = m_pPlcxMan->GetPapPLCF()->HasSprm(46); + aDCS = m_pPlcxMan->GetPapPLCF()->HasSprm(46); else - pDCS = m_pPlcxMan->GetPapPLCF()->HasSprm(0x442C); + aDCS = m_pPlcxMan->GetPapPLCF()->HasSprm(0x442C); - if (pDCS) - nDropLines = (*pDCS) >> 3; + if (aDCS.pSprm && aDCS.nRemainingData >= 1) + nDropLines = (*aDCS.pSprm) >> 3; else // There is no Drop Cap Specifier hence no dropcap pPreviousNode = nullptr; - if (const sal_uInt8 *pDistance = m_pPlcxMan->GetPapPLCF()->HasSprm(0x842F)) - nDistance = SVBT16ToShort( pDistance ); + SprmResult aDistance = m_pPlcxMan->GetPapPLCF()->HasSprm(0x842F); + if (aDistance.pSprm && aDistance.nRemainingData >= 2) + nDistance = SVBT16ToShort(aDistance.pSprm); else nDistance = 0; diff --git a/sw/source/filter/ww8/ww8par.hxx b/sw/source/filter/ww8/ww8par.hxx index 95481dc9622b..9c3d471f645b 100644 --- a/sw/source/filter/ww8/ww8par.hxx +++ b/sw/source/filter/ww8/ww8par.hxx @@ -164,7 +164,7 @@ private: std::vector<WW8LSTInfo* > maLSTInfos; std::vector<std::unique_ptr<WW8LFOInfo>> m_LFOInfos;// D. from PLF LFO, sorted exactly like in the WW8 Stream sal_uInt16 nUniqueList; // current number for creating unique list names - sal_uInt8* GrpprlHasSprm(sal_uInt16 nId, sal_uInt8& rSprms, sal_uInt8 nLen); + SprmResult GrpprlHasSprm(sal_uInt16 nId, sal_uInt8& rSprms, sal_uInt8 nLen); WW8LSTInfo* GetLSTByListId( sal_uInt32 nIdLst ) const; //the rParaSprms returns back the original word paragraph indent //sprms which are attached to this numbering level diff --git a/sw/source/filter/ww8/ww8par2.cxx b/sw/source/filter/ww8/ww8par2.cxx index f9252ad0423b..6e488a1328bc 100644 --- a/sw/source/filter/ww8/ww8par2.cxx +++ b/sw/source/filter/ww8/ww8par2.cxx @@ -466,11 +466,13 @@ bool SwWW8ImplReader::SearchRowEnd(WW8PLCFx_Cp_FKP* pPap, WW8_CP &rStartCp, { if (pPap->Where() != WW8_CP_MAX) { - const sal_uInt8* pB = pPap->HasSprm(TabRowSprm(nLevel)); - if (pB && *pB == 1) + SprmResult aSprmRes = pPap->HasSprm(TabRowSprm(nLevel)); + const sal_uInt8* pB = aSprmRes.pSprm; + if (pB && aSprmRes.nRemainingData >= 1 && *pB == 1) { - const sal_uInt8 *pLevel = nullptr; - if (nullptr != (pLevel = pPap->HasSprm(0x6649))) + aSprmRes = pPap->HasSprm(0x6649); + const sal_uInt8 *pLevel = aSprmRes.pSprm; + if (pLevel && aSprmRes.nRemainingData >= 1) { if (nLevel + 1 == *pLevel) return true; @@ -537,10 +539,11 @@ ApoTestResults SwWW8ImplReader::TestApo(int nCellLevel, bool bTableRowEnd, to see if we are still in that frame. */ - aRet.m_bHasSprm37 = m_pPlcxMan->HasParaSprm( m_bVer67 ? 37 : 0x2423 ); - const sal_uInt8 *pSrpm29 = m_pPlcxMan->HasParaSprm( m_bVer67 ? 29 : 0x261B ); + aRet.m_bHasSprm37 = m_pPlcxMan->HasParaSprm(m_bVer67 ? 37 : 0x2423).pSprm != nullptr; + SprmResult aSrpm29 = m_pPlcxMan->HasParaSprm(m_bVer67 ? 29 : 0x261B); + const sal_uInt8 *pSrpm29 = aSrpm29.pSprm; aRet.m_bHasSprm29 = pSrpm29 != nullptr; - aRet.m_nSprm29 = pSrpm29 ? *pSrpm29 : 0; + aRet.m_nSprm29 = (pSrpm29 && aSrpm29.nRemainingData >= 1) ? *pSrpm29 : 0; // Is there some frame data here bool bNowApo = aRet.HasFrame() || pTopLevelTable; @@ -1005,7 +1008,7 @@ void SwWW8ImplReader::StartAnl(const sal_uInt8* pSprm13) SwNumRule *pNumRule = m_aANLDRules.GetNumRule(m_nWwNumType); // check for COL numbering: - const sal_uInt8* pS12 = nullptr;// sprmAnld + SprmResult aS12; // sprmAnld OUString sNumRule; if (m_pTableDesc) @@ -1019,8 +1022,8 @@ void SwWW8ImplReader::StartAnl(const sal_uInt8* pSprm13) else { // this is ROW numbering ? - pS12 = m_pPlcxMan->HasParaSprm(m_bVer67 ? 12 : NS_sprm::LN_PAnld); // sprmAnld - if (pS12 && 0 != reinterpret_cast<WW8_ANLD const *>(pS12)->fNumberAcross) + aS12 = m_pPlcxMan->HasParaSprm(m_bVer67 ? 12 : NS_sprm::LN_PAnld); // sprmAnld + if (aS12.pSprm && aS12.nRemainingData >= sal_Int32(sizeof(WW8_ANLD)) && 0 != reinterpret_cast<WW8_ANLD const *>(aS12.pSprm)->fNumberAcross) sNumRule.clear(); } } @@ -1046,9 +1049,9 @@ void SwWW8ImplReader::StartAnl(const sal_uInt8* pSprm13) } if (m_pTableDesc) { - if (!pS12) - pS12 = m_pPlcxMan->HasParaSprm(m_bVer67 ? 12 : NS_sprm::LN_PAnld); // sprmAnld - if (!pS12 || !reinterpret_cast<WW8_ANLD const *>(pS12)->fNumberAcross) + if (!aS12.pSprm) + aS12 = m_pPlcxMan->HasParaSprm(m_bVer67 ? 12 : NS_sprm::LN_PAnld); // sprmAnld + if (!aS12.pSprm || aS12.nRemainingData < sal_Int32(sizeof(WW8_ANLD)) || !reinterpret_cast<WW8_ANLD const *>(aS12.pSprm)->fNumberAcross) m_pTableDesc->SetNumRuleName(pNumRule->GetName()); } } @@ -1083,8 +1086,9 @@ void SwWW8ImplReader::NextAnlLine(const sal_uInt8* pSprm13) { // not defined yet // sprmAnld o. 0 - const sal_uInt8* pS12 = m_pPlcxMan->HasParaSprm(m_bVer67 ? 12 : NS_sprm::LN_PAnld); - SetAnld(pNumRule, reinterpret_cast<WW8_ANLD const *>(pS12), m_nSwNumLevel, false); + SprmResult aS12 = m_pPlcxMan->HasParaSprm(m_bVer67 ? 12 : NS_sprm::LN_PAnld); + if (aS12.nRemainingData >= sal_Int32(sizeof(WW8_ANLD))) + SetAnld(pNumRule, reinterpret_cast<WW8_ANLD const *>(aS12.pSprm), m_nSwNumLevel, false); } } else if( *pSprm13 > 0 && *pSprm13 <= MAXLEVEL ) // range WW:1..9 -> SW:0..8 @@ -1107,8 +1111,9 @@ void SwWW8ImplReader::NextAnlLine(const sal_uInt8* pSprm13) else // no Olst -> use Anld { // sprmAnld - const sal_uInt8* pS12 = m_pPlcxMan->HasParaSprm(m_bVer67 ? 12 : NS_sprm::LN_PAnld); - SetAnld(pNumRule, reinterpret_cast<WW8_ANLD const *>(pS12), m_nSwNumLevel, false); + SprmResult aS12 = m_pPlcxMan->HasParaSprm(m_bVer67 ? 12 : NS_sprm::LN_PAnld); + if (aS12.nRemainingData >= sal_Int32(sizeof(WW8_ANLD))) + SetAnld(pNumRule, reinterpret_cast<WW8_ANLD const *>(aS12.pSprm), m_nSwNumLevel, false); } } } @@ -1656,17 +1661,17 @@ void WW8TabBandDesc::setcelldefaults(WW8_TCell *pCells, short nCols) memset( pCells, 0, nCols * sizeof( WW8_TCell ) ); } -const sal_uInt8 *HasTabCellSprm(WW8PLCFx_Cp_FKP* pPap, bool bVer67) +namespace { - const sal_uInt8 *pParams; - if (bVer67) - pParams = pPap->HasSprm(24); - else + SprmResult HasTabCellSprm(WW8PLCFx_Cp_FKP* pPap, bool bVer67) { - if (nullptr == (pParams = pPap->HasSprm(0x244B))) - pParams = pPap->HasSprm(0x2416); + if (bVer67) + return pPap->HasSprm(24); + SprmResult aRes = pPap->HasSprm(0x244B); + if (aRes.pSprm == nullptr) + aRes = pPap->HasSprm(0x2416); + return aRes; } - return pParams; } enum wwTableSprm @@ -2054,11 +2059,13 @@ WW8TabDesc::WW8TabDesc(SwWW8ImplReader* pIoClass, WW8_CP nStartCp) : } //Are we still in a table cell - const sal_uInt8* pParams = HasTabCellSprm(pPap, bOldVer); - const sal_uInt8 *pLevel = pPap->HasSprm(0x6649); + SprmResult aParamsRes = HasTabCellSprm(pPap, bOldVer); + const sal_uInt8* pParams = aParamsRes.pSprm; + SprmResult aLevelRes = pPap->HasSprm(0x6649); + const sal_uInt8 *pLevel = aLevelRes.pSprm; // InTable - if (!pParams || (1 != *pParams) || - (pLevel && (*pLevel <= m_pIo->m_nInTable))) + if (!pParams || aParamsRes.nRemainingData < 1 || (1 != *pParams) || + (pLevel && aLevelRes.nRemainingData >= 1 && (*pLevel <= m_pIo->m_nInTable))) { break; } @@ -3663,10 +3670,10 @@ const SwFormat* SwWW8ImplReader::GetStyleWithOrgWWName( OUString& rName ) const // class WW8RStyle -const sal_uInt8* WW8RStyle::HasParaSprm( sal_uInt16 nId ) const +SprmResult WW8RStyle::HasParaSprm(sal_uInt16 nId) const { if( !pParaSprms || !nSprmsLen ) - return nullptr; + return SprmResult(); return maSprmParser.findSprmData(nId, pParaSprms, nSprmsLen); } diff --git a/sw/source/filter/ww8/ww8par2.hxx b/sw/source/filter/ww8/ww8par2.hxx index 3e9b6db04103..f2c98070d24e 100644 --- a/sw/source/filter/ww8/ww8par2.hxx +++ b/sw/source/filter/ww8/ww8par2.hxx @@ -130,7 +130,7 @@ public: WW8RStyle( WW8Fib& rFib, SwWW8ImplReader* pI ); void Import(); void PostProcessStyles(); - const sal_uInt8* HasParaSprm( sal_uInt16 nId ) const; + SprmResult HasParaSprm(sal_uInt16 nId) const; }; class WW8FlySet: public SfxItemSet diff --git a/sw/source/filter/ww8/ww8par3.cxx b/sw/source/filter/ww8/ww8par3.cxx index b033133b5953..bb1287fe45d0 100644 --- a/sw/source/filter/ww8/ww8par3.cxx +++ b/sw/source/filter/ww8/ww8par3.cxx @@ -439,7 +439,7 @@ WW8LFOInfo::WW8LFOInfo(const WW8LFO& rLFO) // Helper methods // find Sprm-Parameter-Data, if Sprm is included in Grpprl -sal_uInt8* WW8ListManager::GrpprlHasSprm(sal_uInt16 nId, sal_uInt8& rSprms, +SprmResult WW8ListManager::GrpprlHasSprm(sal_uInt16 nId, sal_uInt8& rSprms, sal_uInt8 nLen) { return maSprmParser.findSprmData(nId, &rSprms, nLen); @@ -563,34 +563,39 @@ bool WW8ListManager::ReadLVL(SwNumFormat& rNumFormat, SfxItemSet*& rpItemSet, if (aLVL.nLenGrpprlPapx != rSt.ReadBytes(&aGrpprlPapx, aLVL.nLenGrpprlPapx)) return false; // "sprmPDxaLeft" pap.dxaLeft;dxa;word; - sal_uInt8* pSprm; - if ( - (nullptr != (pSprm = GrpprlHasSprm(0x840F,aGrpprlPapx[0],aLVL.nLenGrpprlPapx))) || - (nullptr != (pSprm = GrpprlHasSprm(0x845E,aGrpprlPapx[0],aLVL.nLenGrpprlPapx))) - ) + SprmResult aSprm; + + aSprm = GrpprlHasSprm(0x840F,aGrpprlPapx[0],aLVL.nLenGrpprlPapx); + if (!aSprm.pSprm) + aSprm = GrpprlHasSprm(0x845E,aGrpprlPapx[0],aLVL.nLenGrpprlPapx); + + if (aSprm.pSprm && aSprm.nRemainingData >= 2) { - sal_uInt8 *pBegin = pSprm-2; + const sal_uInt8 *pBegin = aSprm.pSprm - 2; for(int i=0;i<4;++i) rParaSprms.push_back(*pBegin++); - short nDxaLeft = SVBT16ToShort( pSprm ); + short nDxaLeft = SVBT16ToShort(aSprm.pSprm); aLVL.nDxaLeft = (0 < nDxaLeft) ? (sal_uInt16)nDxaLeft : (sal_uInt16)(-nDxaLeft); } // "sprmPDxaLeft1" pap.dxaLeft1;dxa;word; - if ( - (nullptr != (pSprm = GrpprlHasSprm(0x8411,aGrpprlPapx[0],aLVL.nLenGrpprlPapx)) ) || - (nullptr != (pSprm = GrpprlHasSprm(0x8460,aGrpprlPapx[0],aLVL.nLenGrpprlPapx)) ) - ) + aSprm = GrpprlHasSprm(0x8411,aGrpprlPapx[0],aLVL.nLenGrpprlPapx); + if (!aSprm.pSprm) + aSprm = GrpprlHasSprm(0x8460,aGrpprlPapx[0],aLVL.nLenGrpprlPapx); + + if (aSprm.pSprm && aSprm.nRemainingData >= 2) { - sal_uInt8 *pBegin = pSprm-2; + const sal_uInt8 *pBegin = aSprm.pSprm - 2; for(int i=0;i<4;++i) rParaSprms.push_back(*pBegin++); - aLVL.nDxaLeft1 = SVBT16ToShort( pSprm ); + aLVL.nDxaLeft1 = SVBT16ToShort(aSprm.pSprm); } // #i86652# - read tab setting - if(nullptr != (pSprm = GrpprlHasSprm(0xC615,aGrpprlPapx[0],aLVL.nLenGrpprlPapx)) ) + aSprm = GrpprlHasSprm(0xC615,aGrpprlPapx[0],aLVL.nLenGrpprlPapx); + const sal_uInt8* pSprm = aSprm.pSprm; + if (pSprm && aSprm.nRemainingData >= 5) { bool bDone = false; if (*(pSprm-1) == 5) @@ -664,15 +669,15 @@ bool WW8ListManager::ReadLVL(SwNumFormat& rNumFormat, SfxItemSet*& rpItemSet, return false; //For i120928,parse the graphic info of bullets - sal_uInt8 *pSprmWhichPis = GrpprlHasSprm(NS_sprm::sprmCPbiIBullet, aGrpprlChpx[0],aLVL.nLenGrpprlChpx); - sal_uInt8 *pSprmIsPicBullet = GrpprlHasSprm(NS_sprm::sprmCPbiGrf, aGrpprlChpx[0],aLVL.nLenGrpprlChpx); - if (pSprmWhichPis) + SprmResult aSprmWhichPis = GrpprlHasSprm(NS_sprm::sprmCPbiIBullet, aGrpprlChpx[0],aLVL.nLenGrpprlChpx); + SprmResult aSprmIsPicBullet = GrpprlHasSprm(NS_sprm::sprmCPbiGrf, aGrpprlChpx[0],aLVL.nLenGrpprlChpx); + if (aSprmWhichPis.pSprm && aSprmWhichPis.nRemainingData >= 1) { - nWitchPicIsBullet = *pSprmWhichPis; + nWitchPicIsBullet = *aSprmWhichPis.pSprm; } - if (pSprmIsPicBullet) + if (aSprmIsPicBullet.pSprm && aSprmIsPicBullet.nRemainingData >= 1) { - bIsPicBullet = (*pSprmIsPicBullet) & 0x0001; + bIsPicBullet = (*aSprmIsPicBullet.pSprm) & 0x0001; } // create new Itemset for character attributes @@ -2053,7 +2058,7 @@ void SwWW8ImplReader::Read_LFOPosition(sal_uInt16, const sal_uInt8* pData, m_nListLevel = WW8ListManager::nMaxLevel; } } - else if (m_pPlcxMan && m_pPlcxMan->HasParaSprm(NS_sprm::LN_PAnld)) + else if (m_pPlcxMan && m_pPlcxMan->HasParaSprm(NS_sprm::LN_PAnld).pSprm) { /* #i8114# Horrific backwards compatible ww7- lists in ww8+ diff --git a/sw/source/filter/ww8/ww8par4.cxx b/sw/source/filter/ww8/ww8par4.cxx index a34427f880aa..b090f15106f2 100644 --- a/sw/source/filter/ww8/ww8par4.cxx +++ b/sw/source/filter/ww8/ww8par4.cxx @@ -485,23 +485,23 @@ void SwWW8ImplReader::Read_CRevisionMark(RedlineType_t eType, * of the change, (possibly a word bug) so we must use the "get a full * list" variant of HasCharSprm and take the last one as the true one. */ - std::vector<const sal_uInt8 *> aResult; + std::vector<SprmResult> aResult; bool bIns = (nsRedlineType_t::REDLINE_INSERT == eType); if( m_bVer67 ) { m_pPlcxMan->HasCharSprm(69, aResult); - pSprmCIbstRMark = aResult.empty() ? nullptr : aResult.back(); + pSprmCIbstRMark = (aResult.empty() || aResult.back().nRemainingData < 2) ? nullptr : aResult.back().pSprm; aResult.clear(); m_pPlcxMan->HasCharSprm(70, aResult); - pSprmCDttmRMark = aResult.empty() ? nullptr : aResult.back(); + pSprmCDttmRMark = (aResult.empty() || aResult.back().nRemainingData < 4) ? nullptr : aResult.back().pSprm; } else { m_pPlcxMan->HasCharSprm( bIns ? 0x4804 : 0x4863, aResult); - pSprmCIbstRMark = aResult.empty() ? nullptr : aResult.back(); + pSprmCIbstRMark = (aResult.empty() || aResult.back().nRemainingData < 2) ? nullptr : aResult.back().pSprm; aResult.clear(); m_pPlcxMan->HasCharSprm( bIns ? 0x6805 : NS_sprm::sprmCDttmRMarkDel, aResult); - pSprmCDttmRMark = aResult.empty() ? nullptr : aResult.back(); + pSprmCDttmRMark = (aResult.empty() || aResult.back().nRemainingData < 4) ? nullptr : aResult.back().pSprm; } } diff --git a/sw/source/filter/ww8/ww8par5.cxx b/sw/source/filter/ww8/ww8par5.cxx index 493c18bb4d4f..3c254f99dc71 100644 --- a/sw/source/filter/ww8/ww8par5.cxx +++ b/sw/source/filter/ww8/ww8par5.cxx @@ -437,8 +437,8 @@ short SwWW8ImplReader::GetTimeDatePara(OUString& rStr, sal_uInt32& rFormat, bool bRTL = false; if (m_pPlcxMan && !m_bVer67) { - const sal_uInt8 *pResult = m_pPlcxMan->HasCharSprm(0x85A); - if (pResult && *pResult) + SprmResult aResult = m_pPlcxMan->HasCharSprm(0x85A); + if (aResult.pSprm && aResult.nRemainingData >= 1 && *aResult.pSprm) bRTL = true; } RES_CHRATR eLang = bRTL ? RES_CHRATR_CTL_LANGUAGE : RES_CHRATR_LANGUAGE; diff --git a/sw/source/filter/ww8/ww8par6.cxx b/sw/source/filter/ww8/ww8par6.cxx index 339350f54750..ae0b67c52613 100644 --- a/sw/source/filter/ww8/ww8par6.cxx +++ b/sw/source/filter/ww8/ww8par6.cxx @@ -139,22 +139,25 @@ inline sal_uInt32 MSRoundTweak(sal_uInt32 x) // (except OLST which stays a normal attribute) static short ReadSprm( const WW8PLCFx_SEPX* pSep, sal_uInt16 nId, short nDefaultVal ) { - const sal_uInt8* pS = pSep->HasSprm( nId ); // sprm here? - short nVal = ( pS ) ? SVBT16ToShort( pS ) : nDefaultVal; + SprmResult aRes = pSep->HasSprm(nId); // sprm here? + const sal_uInt8* pS = aRes.pSprm; + short nVal = (pS && aRes.nRemainingData >= 2) ? SVBT16ToShort(pS) : nDefaultVal; return nVal; } static sal_uInt16 ReadUSprm( const WW8PLCFx_SEPX* pSep, sal_uInt16 nId, short nDefaultVal ) { - const sal_uInt8* pS = pSep->HasSprm( nId ); // sprm here? - sal_uInt16 nVal = ( pS ) ? SVBT16ToShort( pS ) : nDefaultVal; + SprmResult aRes = pSep->HasSprm(nId); // sprm here? + const sal_uInt8* pS = aRes.pSprm; + sal_uInt16 nVal = (pS && aRes.nRemainingData >= 2) ? SVBT16ToShort(pS) : nDefaultVal; return nVal; } static sal_uInt8 ReadBSprm( const WW8PLCFx_SEPX* pSep, sal_uInt16 nId, sal_uInt8 nDefaultVal ) { - const sal_uInt8* pS = pSep->HasSprm( nId ); // sprm here? - sal_uInt8 nVal = pS ? *pS : nDefaultVal; + SprmResult aRes = pSep->HasSprm(nId); // sprm here? + const sal_uInt8* pS = aRes.pSprm; + sal_uInt8 nVal = (pS && aRes.nRemainingData >= 1) ? *pS : nDefaultVal; return nVal; } @@ -886,7 +889,9 @@ void wwSectionManager::CreateSep(const long nTextPos, bool /*bMustHaveBreak*/) // 2 New page // 3 Even page // 4 Odd page - if (const sal_uInt8* pSprmBkc = pSep->HasSprm(pIds[0])) + SprmResult aRes = pSep->HasSprm(pIds[0]); + const sal_uInt8* pSprmBkc = aRes.pSprm; + if (pSprmBkc && aRes.nRemainingData >= 1) aNewSection.maSep.bkc = *pSprmBkc; } @@ -936,20 +941,22 @@ void wwSectionManager::CreateSep(const long nTextPos, bool /*bMustHaveBreak*/) for ( sal_uInt8 nColumn = 0; nColumn < nColumnCount; ++nColumn ) { //sprmSDxaColWidth - const sal_uInt8* pSW = pSep->HasSprm( nColumnWidthSprmId, nColumn ); + SprmResult aSWRes = pSep->HasSprm(nColumnWidthSprmId, nColumn); + const sal_uInt8* pSW = aSWRes.pSprm; OSL_ENSURE( pSW, "+Sprm 136 (resp. 0xF203) (ColWidth) missing" ); - sal_uInt16 nWidth = pSW ? SVBT16ToShort(pSW + 1) : 1440; + sal_uInt16 nWidth = (pSW && aSWRes.nRemainingData >= 3) ? SVBT16ToShort(pSW + 1) : 1440; aNewSection.maSep.rgdxaColumnWidthSpacing[++nColumnDataIdx] = nWidth; if ( nColumn < nColumnCount - 1 ) { //sprmSDxaColSpacing - const sal_uInt8* pSD = pSep->HasSprm( nColumnSpacingSprmId, nColumn ); + SprmResult aSDRes = pSep->HasSprm(nColumnSpacingSprmId, nColumn); + const sal_uInt8* pSD = aSDRes.pSprm; OSL_ENSURE( pSD, "+Sprm 137 (resp. 0xF204) (Colspacing) missing" ); - if( pSD ) + if (pSD && aSDRes.nRemainingData >= 3) { nWidth = SVBT16ToShort(pSD + 1); aNewSection.maSep.rgdxaColumnWidthSpacing[++nColumnDataIdx] = nWidth; @@ -997,7 +1004,7 @@ void wwSectionManager::CreateSep(const long nTextPos, bool /*bMustHaveBreak*/) /*sprmSDzaGutter*/ 0xB025, /*sprmSFPgnRestart*/ 0x3011, /*sprmSPgnStart97*/ 0x501C, - /*sprmSDmBinFirst*/ 0x5007, + /*sprmSDmBinFirst*/ 0x5007, /*sprmSDmBinOther*/ 0x5008 }; @@ -1036,19 +1043,27 @@ void wwSectionManager::CreateSep(const long nTextPos, bool /*bMustHaveBreak*/) aNewSection.maSep.pgnStart = ReadUSprm( pSep, pIds[7], 0 ); + SprmResult aRes; + if (eVer >= ww::eWW6) { - if (const sal_uInt8* p = pSep->HasSprm( (eVer <= ww::eWW7 ? 132 : 0x3001) )) - aNewSection.maSep.iHeadingPgn = *p; + aRes = pSep->HasSprm((eVer <= ww::eWW7 ? 132 : 0x3001)); + if (aRes.pSprm && aRes.nRemainingData >= 1) + aNewSection.maSep.iHeadingPgn = *aRes.pSprm; - if (const sal_uInt8* p = pSep->HasSprm( (eVer <= ww::eWW7 ? 131 : 0x3000) )) - aNewSection.maSep.cnsPgn = *p; + aRes = pSep->HasSprm((eVer <= ww::eWW7 ? 131 : 0x3000)); + if (aRes.pSprm && aRes.nRemainingData >= 1) + aNewSection.maSep.cnsPgn = *aRes.pSprm; } - if(const sal_uInt8* pSprmSDmBinFirst = pSep->HasSprm( pIds[8] )) + aRes = pSep->HasSprm(pIds[8]); + const sal_uInt8* pSprmSDmBinFirst = aRes.pSprm; + if (pSprmSDmBinFirst && aRes.nRemainingData >= 1) aNewSection.maSep.dmBinFirst = *pSprmSDmBinFirst; - if (const sal_uInt8* pSprmSDmBinOther = pSep->HasSprm( pIds[9] )) + aRes = pSep->HasSprm(pIds[9]); + const sal_uInt8* pSprmSDmBinOther = aRes.pSprm; + if (pSprmSDmBinOther && aRes.nRemainingData >= 1) aNewSection.maSep.dmBinOther = *pSprmSDmBinOther; static const sal_uInt16 nTop[] = { MM_250, 1440 }; @@ -1101,8 +1116,9 @@ void wwSectionManager::CreateSep(const long nTextPos, bool /*bMustHaveBreak*/) aNewSection.maSep.wTextFlow = ReadUSprm(pSep, 0x5033, 0); aNewSection.maSep.clm = ReadUSprm( pSep, 0x5032, 0 ); aNewSection.maSep.dyaLinePitch = ReadUSprm(pSep, 0x9031, 360); - if (const sal_uInt8* pS = pSep->HasSprm(0x7030)) - aNewSection.maSep.dxtCharSpace = SVBT32ToUInt32(pS); + aRes = pSep->HasSprm(0x7030); + if (aRes.pSprm && aRes.nRemainingData >= 4) + aNewSection.maSep.dxtCharSpace = SVBT32ToUInt32(aRes.pSprm); //sprmSPgbProp sal_uInt16 pgbProp = ReadSprm( pSep, 0x522F, 0 ); @@ -1115,17 +1131,21 @@ void wwSectionManager::CreateSep(const long nTextPos, bool /*bMustHaveBreak*/) } // check if Line Numbering must be activated or reset - if (const sal_uInt8* pSprmSNLnnMod = pSep->HasSprm( pIds[4] )) - aNewSection.maSep.nLnnMod = *pSprmSNLnnMod; + SprmResult aSprmSNLnnMod = pSep->HasSprm(pIds[4]); + if (aSprmSNLnnMod.pSprm && aSprmSNLnnMod.nRemainingData >= 1) + aNewSection.maSep.nLnnMod = *aSprmSNLnnMod.pSprm; - if (const sal_uInt8* pSprmSLnc = pSep->HasSprm( pIds[5] )) - aNewSection.maSep.lnc = *pSprmSLnc; + SprmResult aSprmSLnc = pSep->HasSprm(pIds[5]); + if (aSprmSLnc.pSprm && aSprmSLnc.nRemainingData >= 1) + aNewSection.maSep.lnc = *aSprmSLnc.pSprm; - if (const sal_uInt8* pSprmSDxaLnn = pSep->HasSprm( pIds[6] )) - aNewSection.maSep.dxaLnn = SVBT16ToShort( pSprmSDxaLnn ); + SprmResult aSprmSDxaLnn = pSep->HasSprm(pIds[6]); + if (aSprmSDxaLnn.pSprm && aSprmSDxaLnn.nRemainingData >= 2) + aNewSection.maSep.dxaLnn = SVBT16ToShort(aSprmSDxaLnn.pSprm); - if (const sal_uInt8* pSprmSLnnMin = pSep->HasSprm( pIds[7] )) - aNewSection.maSep.lnnMin = *pSprmSLnnMin; + SprmResult aSprmSLnnMin = pSep->HasSprm(pIds[7]); + if (aSprmSLnnMin.pSprm && aSprmSLnnMin.nRemainingData >= 1) + aNewSection.maSep.lnnMin = *aSprmSLnnMin.pSprm; if (eVer <= ww::eWW7) aNewSection.maSep.grpfIhdt = ReadBSprm(pSep, eVer <= ww::eWW2 ? 128 : 153, 0); @@ -1223,16 +1243,16 @@ void SwWW8ImplReader::CopyPageDescHdFt(const SwPageDesc* pOrgPageDesc, // Read BoRder Control structure // nBrcVer should be set to the version of the BRC record being read (6, 8 or 9) // This will be converted to the latest format (9). -static bool SetWW8_BRC(int nBrcVer, WW8_BRCVer9& rVar, const sal_uInt8* pS) +static bool SetWW8_BRC(int nBrcVer, WW8_BRCVer9& rVar, const sal_uInt8* pS, size_t nLen) { if( pS ) { - if ( nBrcVer == 9 ) + if (nBrcVer == 9 && nLen >= sizeof(WW8_BRCVer9)) rVar = *reinterpret_cast<const WW8_BRCVer9*>(pS); - else if( nBrcVer == 8 ) + else if (nBrcVer == 8 && nLen >= sizeof(WW8_BRC)) rVar = WW8_BRCVer9(*reinterpret_cast<const WW8_BRC*>(pS)); - else // nBrcVer == 6 + else if (nLen >= sizeof(WW8_BRCVer6)) // nBrcVer == 6 rVar = WW8_BRCVer9(WW8_BRC(*reinterpret_cast<const WW8_BRCVer6*>(pS))); } @@ -1251,24 +1271,24 @@ static sal_uInt8 lcl_ReadBorders(bool bVer67, WW8_BRCVer9* brc, WW8PLCFx_Cp_FKP* { if( !bVer67 ) { - sal_uInt8* pSprm[4]; + SprmResult aSprm[4]; - if( pSep->Find4Sprms( + if (pSep->Find4Sprms( NS_sprm::sprmSBrcTop80, NS_sprm::sprmSBrcLeft80, NS_sprm::sprmSBrcBottom80, NS_sprm::sprmSBrcRight80, - pSprm[0], pSprm[1], pSprm[2], pSprm[3] ) ) + aSprm[0], aSprm[1], aSprm[2], aSprm[3])) { for( int i = 0; i < 4; ++i ) - nBorder |= int(SetWW8_BRC( 8, brc[ i ], pSprm[ i ] ))<<i; + nBorder |= int(SetWW8_BRC(8, brc[i], aSprm[i].pSprm, aSprm[i].nRemainingData))<<i; } // Version 9 BRCs if present will override version 8 - if( pSep->Find4Sprms( + if (pSep->Find4Sprms( NS_sprm::sprmSBrcTop, NS_sprm::sprmSBrcLeft, NS_sprm::sprmSBrcBottom, NS_sprm::sprmSBrcRight, - pSprm[0], pSprm[1], pSprm[2], pSprm[3] ) ) + aSprm[0], aSprm[1], aSprm[2], aSprm[3])) { for( int i = 0; i < 4; ++i ) - nBorder |= int(SetWW8_BRC( 9, brc[ i ], pSprm[ i ] ))<<i; + nBorder |= int(SetWW8_BRC(9, brc[i], aSprm[i].pSprm, aSprm[i].nRemainingData))<<i; } } } @@ -1288,15 +1308,24 @@ static sal_uInt8 lcl_ReadBorders(bool bVer67, WW8_BRCVer9* brc, WW8PLCFx_Cp_FKP* if (bVer67) { for( int i = 0; i < 5; ++i ) - nBorder |= int(SetWW8_BRC( 6 , brc[ i ], pPap->HasSprm( aVer67Ids[ i ] )))<<i; + { + SprmResult aRes(pPap->HasSprm(aVer67Ids[i])); + nBorder |= int(SetWW8_BRC(6 , brc[i], aRes.pSprm, aRes.nRemainingData))<<i; + } } else { for( int i = 0; i < 5; ++i ) - nBorder |= int(SetWW8_BRC( 8 , brc[ i ], pPap->HasSprm( aVer8Ids[ i ] )))<<i; + { + SprmResult aRes(pPap->HasSprm(aVer8Ids[i])); + nBorder |= int(SetWW8_BRC(8 , brc[i], aRes.pSprm, aRes.nRemainingData))<<i; + } // Version 9 BRCs if present will override version 8 for( int i = 0; i < 5; ++i ) - nBorder |= int(SetWW8_BRC( 9 , brc[ i ], pPap->HasSprm( aVer9Ids[ i ] )))<<i; + { + SprmResult aRes(pPap->HasSprm(aVer9Ids[i])); + nBorder |= int(SetWW8_BRC(9 , brc[i], aRes.pSprm, aRes.nRemainingData))<<i; + } } } else if( pSty ) @@ -1304,15 +1333,24 @@ static sal_uInt8 lcl_ReadBorders(bool bVer67, WW8_BRCVer9* brc, WW8PLCFx_Cp_FKP* if (bVer67) { for( int i = 0; i < 5; ++i ) - nBorder |= int(SetWW8_BRC( 6 , brc[ i ], pSty->HasParaSprm( aVer67Ids[ i ] )))<<i; + { + SprmResult aRes(pSty->HasParaSprm(aVer67Ids[i])); + nBorder |= int(SetWW8_BRC(6 , brc[i], aRes.pSprm, aRes.nRemainingData))<<i; + } } else { for( int i = 0; i < 5; ++i ) - nBorder |= int(SetWW8_BRC( 8 , brc[ i ], pSty->HasParaSprm( aVer8Ids[ i ] )))<<i; + { + SprmResult aRes(pSty->HasParaSprm(aVer8Ids[i])); + nBorder |= int(SetWW8_BRC(8 , brc[i], aRes.pSprm, aRes.nRemainingData))<<i; + } // Version 9 BRCs if present will override version 8 for( int i = 0; i < 5; ++i ) - nBorder |= int(SetWW8_BRC( 9 , brc[ i ], pSty->HasParaSprm( aVer9Ids[ i ] )))<<i; + { + SprmResult aRes(pSty->HasParaSprm(aVer9Ids[i])); + nBorder |= int(SetWW8_BRC(9 , brc[i], aRes.pSprm, aRes.nRemainingData))<<i; + } } } else { @@ -1490,18 +1528,18 @@ static void FlySecur1(short& rSize, const bool bBorder) inline bool SetValSprm( sal_Int16* pVar, WW8PLCFx_Cp_FKP* pPap, sal_uInt16 nId ) { - const sal_uInt8* pS = pPap->HasSprm( nId ); - if( pS ) - *pVar = (sal_Int16)SVBT16ToShort( pS ); - return ( pS != nullptr ); + SprmResult aS = pPap->HasSprm(nId); + if (aS.pSprm && aS.nRemainingData >= 2) + *pVar = (sal_Int16)SVBT16ToShort(aS.pSprm); + return aS.pSprm != nullptr; } inline bool SetValSprm( sal_Int16* pVar, const WW8RStyle* pStyle, sal_uInt16 nId ) { - const sal_uInt8* pS = pStyle->HasParaSprm( nId ); - if( pS ) - *pVar = (sal_Int16)SVBT16ToShort( pS ); - return ( pS != nullptr ); + SprmResult aS = pStyle->HasParaSprm(nId); + if (aS.pSprm && aS.nRemainingData >= 2) + *pVar = (sal_Int16)SVBT16ToShort(aS.pSprm); + return aS.pSprm != nullptr; } /* @@ -1560,7 +1598,6 @@ bool WW8FlyPara::operator==(const WW8FlyPara& rSrc) const // Read for normal text void WW8FlyPara::Read(sal_uInt8 nOrigSp29, WW8PLCFx_Cp_FKP* pPap) { - const sal_uInt8* pS = nullptr; if( bVer67 ) { SetValSprm( &nSp26, pPap, 26 ); // X-position //sprmPDxaAbs @@ -1573,9 +1610,9 @@ void WW8FlyPara::Read(sal_uInt8 nOrigSp29, WW8PLCFx_Cp_FKP* pPap) SetValSprm( &nUpMgn, pPap, 48 ); // U-border //sprmPDyaFromText SetValSprm( &nLoMgn, pPap, 48 ); // D-border //sprmPDyaFromText - pS = pPap->HasSprm( 37 ); //sprmPWr - if( pS ) - nSp37 = *pS; + SprmResult aS = pPap->HasSprm(37); //sprmPWr + if (aS.pSprm && aS.nRemainingData >= 1) + nSp37 = *aS.pSprm; } else { @@ -1589,9 +1626,9 @@ void WW8FlyPara::Read(sal_uInt8 nOrigSp29, WW8PLCFx_Cp_FKP* pPap) SetValSprm( &nUpMgn, pPap, NS_sprm::sprmPDyaFromText ); // U-border SetValSprm( &nLoMgn, pPap, NS_sprm::sprmPDyaFromText ); // D-border - pS = pPap->HasSprm( NS_sprm::sprmPWr ); // wrapping - if( pS ) - nSp37 = *pS; + SprmResult aS = pPap->HasSprm(NS_sprm::sprmPWr); // wrapping + if (aS.pSprm && aS.nRemainingData >= 1) + nSp37 = *aS.pSprm; } if( ::lcl_ReadBorders( bVer67, brc, pPap )) // borders @@ -1642,10 +1679,10 @@ void WW8FlyPara::ReadFull(sal_uInt8 nOrigSp29, SwWW8ImplReader* pIo) // in APO ? //sprmPPc - const sal_uInt8* pS = pPap->HasSprm( bVer67 ? 29 : 0x261B ); + SprmResult aS = pPap->HasSprm( bVer67 ? 29 : 0x261B ); // no -> graphics Apo - if (!pS) + if (!aS.pSprm || aS.nRemainingData < 1) { bGrafApo = true; break; // end of APO @@ -1663,7 +1700,7 @@ void WW8FlyPara::ReadFull(sal_uInt8 nOrigSp29, SwWW8ImplReader* pIo) WW8FlyPara aF(bVer67, pNowStyleApo); // new FlaPara for comparison - aF.Read( *pS, pPap ); // WWPara for new Para + aF.Read(*aS.pSprm, pPap); // WWPara for new Para if( !( aF == *this ) ) // same APO? (or a new one?) bGrafApo = true; // no -> 1-line APO // -> graphics APO @@ -1678,7 +1715,6 @@ void WW8FlyPara::ReadFull(sal_uInt8 nOrigSp29, SwWW8ImplReader* pIo) // read for Apo definitions in Styledefs void WW8FlyPara::Read(sal_uInt8 nOrigSp29, WW8RStyle* pStyle) { - const sal_uInt8* pS = nullptr; if (bVer67) { SetValSprm( &nSp26, pStyle, 26 ); // X-position @@ -1691,9 +1727,9 @@ void WW8FlyPara::Read(sal_uInt8 nOrigSp29, WW8RStyle* pStyle) SetValSprm( &nUpMgn, pStyle, 48 ); // U-border SetValSprm( &nLoMgn, pStyle, 48 ); // D-border - pS = pStyle->HasParaSprm( 37 ); // wrapping - if( pS ) - nSp37 = *pS; + SprmResult aS = pStyle->HasParaSprm( 37 ); // wrapping + if (aS.pSprm && aS.nRemainingData >= 1) + nSp37 = *aS.pSprm; } else { @@ -1707,9 +1743,9 @@ void WW8FlyPara::Read(sal_uInt8 nOrigSp29, WW8RStyle* pStyle) SetValSprm( &nUpMgn, pStyle, 0x842E ); // U-border SetValSprm( &nLoMgn, pStyle, 0x842E ); // D-border - pS = pStyle->HasParaSprm( 0x2423 ); // wrapping - if( pS ) - nSp37 = *pS; + SprmResult aS = pStyle->HasParaSprm( 0x2423 ); // wrapping + if (aS.pSprm && aS.nRemainingData >= 1) + nSp37 = *aS.pSprm; } if (::lcl_ReadBorders(bVer67, brc, nullptr, pStyle)) // border @@ -1761,8 +1797,8 @@ WW8SwFlyPara::WW8SwFlyPara( SwPaM& rPaM, eSurround = ( rWW.nSp37 > 1 ) ? css::text::WrapTextMode_DYNAMIC : css::text::WrapTextMode_NONE; //#i119466 mapping "Around" wrap setting to "Parallel" for table - const bool bIsTable = rIo.m_pPlcxMan->HasParaSprm(0x2416); - if ( bIsTable && rWW.nSp37 == 2 ) + const bool bIsTable = rIo.m_pPlcxMan->HasParaSprm(0x2416).pSprm; + if (bIsTable && rWW.nSp37 == 2) eSurround = css::text::WrapTextMode_PARALLEL; /* @@ -2286,12 +2322,12 @@ bool SwWW8ImplReader::IsDropCap() WW8PLCFx_Cp_FKP *pPap = m_pPlcxMan ? m_pPlcxMan->GetPapPLCF() : nullptr; if (pPap) { - const sal_uInt8 *pDCS; + SprmResult aDCS; if (m_bVer67) - pDCS = pPap->HasSprm(46); + aDCS = pPap->HasSprm(46); else - pDCS = m_pPlcxMan->GetPapPLCF()->HasSprm(0x442C); - if(pDCS) + aDCS = m_pPlcxMan->GetPapPLCF()->HasSprm(0x442C); + if (aDCS.pSprm && aDCS.nRemainingData >= 2) { /* fdct short :3 0007 drop cap type @@ -2299,7 +2335,7 @@ bool SwWW8ImplReader::IsDropCap() 1 normal drop cap 2 drop cap in margin */ - short nDCS = SVBT16ToShort( pDCS ); + short nDCS = SVBT16ToShort(aDCS.pSprm); if (nDCS & 7) return true; } @@ -2871,10 +2907,10 @@ void SwWW8ImplReader::Read_BoldUsw( sal_uInt16 nId, const sal_uInt8* pData, shor SwWW8StyInf* pSI = GetStyle(m_nAktColl); if (m_pPlcxMan && eVersion > ww::eWW2) { - const sal_uInt8 *pCharIstd = + SprmResult aCharIstd = m_pPlcxMan->GetChpPLCF()->HasSprm(m_bVer67 ? 80 : 0x4A30); - if (pCharIstd) - pSI = GetStyle(SVBT16ToShort(pCharIstd)); + if (aCharIstd.pSprm && aCharIstd.nRemainingData >= 2) + pSI = GetStyle(SVBT16ToShort(aCharIstd.pSprm)); } if( m_pAktColl ) // StyleDef -> remember flags @@ -3038,10 +3074,10 @@ void SwWW8ImplReader::Read_BoldBiDiUsw(sal_uInt16 nId, const sal_uInt8* pData, SwWW8StyInf* pSI = GetStyle(m_nAktColl); if (m_pPlcxMan) { - const sal_uInt8 *pCharIstd = + SprmResult aCharIstd = m_pPlcxMan->GetChpPLCF()->HasSprm(m_bVer67 ? 80 : 0x4A30); - if (pCharIstd) - pSI = GetStyle(SVBT16ToShort(pCharIstd)); + if (aCharIstd.pSprm && aCharIstd.nRemainingData >= 2) + pSI = GetStyle(SVBT16ToShort(aCharIstd.pSprm)); } if (m_pAktColl && eVersion > ww::eWW2) // StyleDef -> remember flags @@ -3412,7 +3448,7 @@ void SwWW8ImplReader::Read_DoubleLine_Rotate( sal_uInt16, const sal_uInt8* pData void SwWW8ImplReader::Read_TextColor( sal_uInt16, const sal_uInt8* pData, short nLen ) { //Has newer colour variant, ignore this old variant - if (!m_bVer67 && m_pPlcxMan && m_pPlcxMan->GetChpPLCF()->HasSprm(NS_sprm::sprmCCv)) + if (!m_bVer67 && m_pPlcxMan && m_pPlcxMan->GetChpPLCF()->HasSprm(NS_sprm::sprmCCv).pSprm) return; if (nLen < 1) @@ -3894,7 +3930,7 @@ void SwWW8ImplReader::Read_FontKern( sal_uInt16, const sal_uInt8* , short nLen ) void SwWW8ImplReader::Read_CharShadow( sal_uInt16, const sal_uInt8* pData, short nLen ) { //Has newer colour variant, ignore this old variant - if (!m_bVer67 && m_pPlcxMan && m_pPlcxMan->GetChpPLCF()->HasSprm(0xCA71)) + if (!m_bVer67 && m_pPlcxMan && m_pPlcxMan->GetChpPLCF()->HasSprm(0xCA71).pSprm) return; if (nLen < 2) @@ -3981,9 +4017,9 @@ bool lcl_HasExplicitLeft(const WW8PLCFMan *pPlcxMan, bool bVer67) if (pPap) { if (bVer67) - return pPap->HasSprm(17); + return pPap->HasSprm(17).pSprm; else - return (pPap->HasSprm(0x840F) || pPap->HasSprm(0x845E)); + return (pPap->HasSprm(0x840F).pSprm || pPap->HasSprm(0x845E).pSprm); } return false; } @@ -4086,8 +4122,8 @@ void SwWW8ImplReader::Read_LR( sal_uInt16 nId, const sal_uInt8* pData, short nLe */ if (m_pPlcxMan && m_nAktColl < m_vColl.size() && m_vColl[m_nAktColl].m_bHasBrokenWW6List) { - const sal_uInt8 *pIsZeroed = m_pPlcxMan->GetPapPLCF()->HasSprm(0x460B); - if (pIsZeroed && *pIsZeroed == 0) + SprmResult aIsZeroed = m_pPlcxMan->GetPapPLCF()->HasSprm(0x460B); + if (aIsZeroed.pSprm && aIsZeroed.nRemainingData >= 1 && *aIsZeroed.pSprm == 0) { const SvxLRSpaceItem &rLR = ItemGet<SvxLRSpaceItem>(*(m_vColl[m_nAktColl].m_pFormat), @@ -4378,10 +4414,11 @@ void SwWW8ImplReader::Read_Justify( sal_uInt16, const sal_uInt8* pData, short nL bool SwWW8ImplReader::IsRightToLeft() { bool bRTL = false; - const sal_uInt8 *pDir = - m_pPlcxMan ? m_pPlcxMan->GetPapPLCF()->HasSprm(0x2441) : nullptr; - if (pDir) - bRTL = *pDir != 0; + SprmResult aDir; + if (m_pPlcxMan) + aDir = m_pPlcxMan->GetPapPLCF()->HasSprm(0x2441); + if (aDir.pSprm && aDir.nRemainingData >= 1) + bRTL = *aDir.pSprm != 0; else { const SvxFrameDirectionItem* pItem= @@ -4475,11 +4512,12 @@ void SwWW8ImplReader::Read_Emphasis( sal_uInt16, const sal_uInt8* pData, short n //there is use it, if there is not fall back to the currently set one. //Only the cjk language setting seems to matter to word, the western //one is ignored - const sal_uInt8 *pLang = - m_pPlcxMan ? m_pPlcxMan->GetChpPLCF()->HasSprm(0x486E) : nullptr; + SprmResult aLang; + if (m_pPlcxMan) + aLang = m_pPlcxMan->GetChpPLCF()->HasSprm(0x486E); - if (pLang) - nLang = SVBT16ToShort( pLang ); + if (aLang.pSprm && aLang.nRemainingData >= 2) + nLang = SVBT16ToShort(aLang.pSprm); else { nLang = static_cast<const SvxLanguageItem *>( @@ -4723,7 +4761,7 @@ void SwWW8Shade::SetShade(ColorData nFore, ColorData nBack, sal_uInt16 nIndex) void SwWW8ImplReader::Read_Shade( sal_uInt16, const sal_uInt8* pData, short nLen ) { - if (!m_bVer67 && m_pPlcxMan && m_pPlcxMan->GetPapPLCF()->HasSprm(0xC64D)) + if (!m_bVer67 && m_pPlcxMan && m_pPlcxMan->GetPapPLCF()->HasSprm(0xC64D).pSprm) return; if (nLen < 2) @@ -4894,7 +4932,7 @@ void SwWW8ImplReader::Read_CharBorder(sal_uInt16 nId, const sal_uInt8* pData, sh WW8_BRCVer9 aBrc; int nBrcVer = (nId == NS_sprm::sprmCBrc) ? 9 : (m_bVer67 ? 6 : 8); - SetWW8_BRC(nBrcVer, aBrc, pData); + SetWW8_BRC(nBrcVer, aBrc, pData, nLen); // Border style is none -> no border, no shadow if( editeng::ConvertBorderStyleFromWord(aBrc.brcType()) != SvxBorderLineStyle::NONE ) @@ -5048,30 +5086,37 @@ void SwWW8ImplReader::Read_ApoPPC( sal_uInt16, const sal_uInt8* pData, short ) bool SwWW8ImplReader::ParseTabPos(WW8_TablePos *pTabPos, WW8PLCFx_Cp_FKP* pPap) { bool bRet = false; - const sal_uInt8 *pRes=nullptr; memset(pTabPos, 0, sizeof(WW8_TablePos)); - if (nullptr != (pRes = pPap->HasSprm(0x360D))) + SprmResult aRes = pPap->HasSprm(0x360D); + if (aRes.pSprm && aRes.nRemainingData >= 1) { - pTabPos->nSp29 = *pRes; + pTabPos->nSp29 = *aRes.pSprm; pTabPos->nSp37 = 2; //Possible fail area, always parallel wrap - if (nullptr != (pRes = pPap->HasSprm(0x940E))) - pTabPos->nSp26 = SVBT16ToShort(pRes); - if (nullptr != (pRes = pPap->HasSprm(0x940F))) - pTabPos->nSp27 = SVBT16ToShort(pRes); - if (nullptr != (pRes = pPap->HasSprm(0x9410))) - pTabPos->nLeMgn = SVBT16ToShort(pRes); - if (nullptr != (pRes = pPap->HasSprm(0x941E))) - pTabPos->nRiMgn = SVBT16ToShort(pRes); - if (nullptr != (pRes = pPap->HasSprm(0x9411))) - pTabPos->nUpMgn = SVBT16ToShort(pRes); - if (nullptr != (pRes = pPap->HasSprm(0x941F))) - pTabPos->nLoMgn = SVBT16ToShort(pRes); + aRes = pPap->HasSprm(0x940E); + if (aRes.pSprm && aRes.nRemainingData >= 2) + pTabPos->nSp26 = SVBT16ToShort(aRes.pSprm); + aRes = pPap->HasSprm(0x940F); + if (aRes.pSprm && aRes.nRemainingData >= 2) + pTabPos->nSp27 = SVBT16ToShort(aRes.pSprm); + aRes = pPap->HasSprm(0x9410); + if (aRes.pSprm && aRes.nRemainingData >= 2) + pTabPos->nLeMgn = SVBT16ToShort(aRes.pSprm); + aRes = pPap->HasSprm(0x941E); + if (aRes.pSprm && aRes.nRemainingData >= 2) + pTabPos->nRiMgn = SVBT16ToShort(aRes.pSprm); + aRes = pPap->HasSprm(0x9411); + if (aRes.pSprm && aRes.nRemainingData >= 2) + pTabPos->nUpMgn = SVBT16ToShort(aRes.pSprm); + aRes = pPap->HasSprm(0x941F); + if (aRes.pSprm && aRes.nRemainingData >= 2) + pTabPos->nLoMgn = SVBT16ToShort(aRes.pSprm); bRet = true; } - if (nullptr != (pRes = pPap->HasSprm(NS_sprm::sprmTDefTable))) + aRes = pPap->HasSprm(NS_sprm::sprmTDefTable); + if (nullptr != aRes.pSprm) { WW8TabBandDesc aDesc; - aDesc.ReadDef(false, pRes); + aDesc.ReadDef(false, aRes.pSprm); int nTableWidth = aDesc.nCenter[aDesc.nWwCols] - aDesc.nCenter[0]; int nTextAreaWidth = m_aSectionManager.GetTextAreaWidth(); // If the table is wider than the text area, then don't create a fly diff --git a/sw/source/filter/ww8/ww8scan.cxx b/sw/source/filter/ww8/ww8scan.cxx index 66d2da14515d..f63e461b5a05 100644 --- a/sw/source/filter/ww8/ww8scan.cxx +++ b/sw/source/filter/ww8/ww8scan.cxx @@ -917,16 +917,20 @@ void WW8SprmIter::UpdateMyMembers() } } -const sal_uInt8* WW8SprmIter::FindSprm(sal_uInt16 nId) +SprmResult WW8SprmIter::FindSprm(sal_uInt16 nId) { while (GetSprms()) { if (GetAktId() == nId) - return GetAktParams(); // SPRM found! + { + sal_uInt16 nFixedLen = mrSprmParser.DistanceToData(nId); + sal_uInt16 nL = mrSprmParser.GetSprmSize(nId, GetSprms(), GetRemLen()); + return SprmResult(GetAktParams(), nL - nFixedLen); // SPRM found! + } advance(); } - return nullptr; // SPRM _not_ found + return SprmResult(); // SPRM _not_ found } // temporary test @@ -2723,10 +2727,10 @@ sal_uInt8* WW8PLCFx_Fc_FKP::WW8Fkp::GetLenAndIStdAndSprms(sal_Int32& rLen) const return maEntries[mnIdx].mpData; } -const sal_uInt8* WW8PLCFx_Fc_FKP::WW8Fkp::HasSprm( sal_uInt16 nId ) +SprmResult WW8PLCFx_Fc_FKP::WW8Fkp::HasSprm( sal_uInt16 nId ) { if (mnIdx >= mnIMax) - return nullptr; + return SprmResult(); sal_Int32 nLen; sal_uInt8* pSprms = GetLenAndIStdAndSprms( nLen ); @@ -2736,7 +2740,7 @@ const sal_uInt8* WW8PLCFx_Fc_FKP::WW8Fkp::HasSprm( sal_uInt16 nId ) } void WW8PLCFx_Fc_FKP::WW8Fkp::HasSprm(sal_uInt16 nId, - std::vector<const sal_uInt8 *> &rResult) + std::vector<SprmResult> &rResult) { if (mnIdx >= mnIMax) return; @@ -2749,7 +2753,11 @@ void WW8PLCFx_Fc_FKP::WW8Fkp::HasSprm(sal_uInt16 nId, while(aIter.GetSprms()) { if (aIter.GetAktId() == nId) - rResult.push_back(aIter.GetAktParams()); + { + sal_uInt16 nFixedLen = maSprmParser.DistanceToData(nId); + sal_uInt16 nL = maSprmParser.GetSprmSize(nId, aIter.GetSprms(), aIter.GetRemLen()); + rResult.push_back(SprmResult(aIter.GetAktParams(), nL - nFixedLen)); + } aIter.advance(); }; } @@ -3022,7 +3030,7 @@ void WW8PLCFx_Fc_FKP::GetPCDSprms( WW8PLCFxDesc& rDesc ) } } -const sal_uInt8* WW8PLCFx_Fc_FKP::HasSprm( sal_uInt16 nId ) +SprmResult WW8PLCFx_Fc_FKP::HasSprm(sal_uInt16 nId) { // const would be nicer, but for that, NewFkp() would need to be replaced or eliminated if( !pFkp ) @@ -3030,15 +3038,15 @@ const sal_uInt8* WW8PLCFx_Fc_FKP::HasSprm( sal_uInt16 nId ) OSL_FAIL( "+Motz: HasSprm: NewFkp needed ( no const possible )" ); // happens in BugDoc 31722 if( !NewFkp() ) - return nullptr; + return SprmResult(); } if (!pFkp) - return nullptr; + return SprmResult(); - const sal_uInt8* pRes = pFkp->HasSprm( nId ); + SprmResult aRes = pFkp->HasSprm(nId); - if( !pRes ) + if (!aRes.pSprm) { WW8PLCFxDesc aDesc; GetPCDSprms( aDesc ); @@ -3047,14 +3055,14 @@ const sal_uInt8* WW8PLCFx_Fc_FKP::HasSprm( sal_uInt16 nId ) { WW8SprmIter aIter(aDesc.pMemPos, aDesc.nSprmsLen, pFkp->GetSprmParser()); - pRes = aIter.FindSprm(nId); + aRes = aIter.FindSprm(nId); } } - return pRes; + return aRes; } -bool WW8PLCFx_Fc_FKP::HasSprm(sal_uInt16 nId, std::vector<const sal_uInt8 *> &rResult) +bool WW8PLCFx_Fc_FKP::HasSprm(sal_uInt16 nId, std::vector<SprmResult> &rResult) { // const would be nicer, but for that, NewFkp() would need to be replaced or eliminated if (!pFkp) @@ -3075,12 +3083,16 @@ bool WW8PLCFx_Fc_FKP::HasSprm(sal_uInt16 nId, std::vector<const sal_uInt8 *> &rR if (aDesc.pMemPos) { - WW8SprmIter aIter(aDesc.pMemPos, aDesc.nSprmsLen, - pFkp->GetSprmParser()); + const wwSprmParser &rSprmParser = pFkp->GetSprmParser(); + WW8SprmIter aIter(aDesc.pMemPos, aDesc.nSprmsLen, rSprmParser); while(aIter.GetSprms()) { if (aIter.GetAktId() == nId) - rResult.push_back(aIter.GetAktParams()); + { + sal_uInt16 nFixedLen = rSprmParser.DistanceToData(nId); + sal_uInt16 nL = rSprmParser.GetSprmSize(nId, aIter.GetSprms(), aIter.GetRemLen()); + rResult.push_back(SprmResult(aIter.GetAktParams(), nL - nFixedLen)); + } aIter.advance(); }; } @@ -3464,34 +3476,30 @@ void WW8PLCFx_SEPX::advance() pPLCF->advance(); } -const sal_uInt8* WW8PLCFx_SEPX::HasSprm( sal_uInt16 nId ) const +SprmResult WW8PLCFx_SEPX::HasSprm(sal_uInt16 nId) const { - return HasSprm( nId, pSprms, nSprmSiz); + return HasSprm(nId, pSprms, nSprmSiz); } -const sal_uInt8* WW8PLCFx_SEPX::HasSprm( sal_uInt16 nId, const sal_uInt8* pOtherSprms, +SprmResult WW8PLCFx_SEPX::HasSprm( sal_uInt16 nId, const sal_uInt8* pOtherSprms, long nOtherSprmSiz ) const { - const sal_uInt8 *pRet = nullptr; + SprmResult aRet; if (pPLCF) { WW8SprmIter aIter(pOtherSprms, nOtherSprmSiz, maSprmParser); - pRet = aIter.FindSprm(nId); + aRet = aIter.FindSprm(nId); } - return pRet; + return aRet; } bool WW8PLCFx_SEPX::Find4Sprms(sal_uInt16 nId1,sal_uInt16 nId2,sal_uInt16 nId3,sal_uInt16 nId4, - sal_uInt8*& p1, sal_uInt8*& p2, sal_uInt8*& p3, sal_uInt8*& p4) const + SprmResult& r1, SprmResult& r2, SprmResult& r3, SprmResult& r4) const { if( !pPLCF ) return false; bool bFound = false; - p1 = nullptr; - p2 = nullptr; - p3 = nullptr; - p4 = nullptr; sal_uInt8* pSp = pSprms; sal_uInt16 i=0; @@ -3499,30 +3507,42 @@ bool WW8PLCFx_SEPX::Find4Sprms(sal_uInt16 nId1,sal_uInt16 nId2,sal_uInt16 nId3,s { // Sprm found? const sal_uInt16 nAktId = maSprmParser.GetSprmId(pSp); + const sal_uInt16 x = maSprmParser.GetSprmSize(nAktId, pSp, nSprmSiz - i); bool bOk = true; if( nAktId == nId1 ) - p1 = pSp + maSprmParser.DistanceToData(nId1); + { + sal_uInt16 nFixedLen = maSprmParser.DistanceToData(nId1); + r1 = SprmResult(pSp + nFixedLen, x - nFixedLen); + } else if( nAktId == nId2 ) - p2 = pSp + maSprmParser.DistanceToData(nId2); + { + sal_uInt16 nFixedLen = maSprmParser.DistanceToData(nId2); + r2 = SprmResult(pSp + nFixedLen, x - nFixedLen); + } else if( nAktId == nId3 ) - p3 = pSp + maSprmParser.DistanceToData(nId3); + { + sal_uInt16 nFixedLen = maSprmParser.DistanceToData(nId3); + r3 = SprmResult(pSp + nFixedLen, x - nFixedLen); + } else if( nAktId == nId4 ) - p4 = pSp + maSprmParser.DistanceToData(nId4); + { + sal_uInt16 nFixedLen = maSprmParser.DistanceToData(nId4); + r4 = SprmResult(pSp + nFixedLen, x - nFixedLen); + } else bOk = false; bFound |= bOk; // increment pointer so that it points to next SPRM - const sal_uInt16 x = maSprmParser.GetSprmSize(nAktId, pSp, nSprmSiz - i); i += x; pSp += x; } return bFound; } -const sal_uInt8* WW8PLCFx_SEPX::HasSprm( sal_uInt16 nId, sal_uInt8 n2nd ) const +SprmResult WW8PLCFx_SEPX::HasSprm( sal_uInt16 nId, sal_uInt8 n2nd ) const { - if( !pPLCF ) - return nullptr; + if (!pPLCF) + return SprmResult(); sal_uInt8* pSp = pSprms; @@ -3531,19 +3551,23 @@ const sal_uInt8* WW8PLCFx_SEPX::HasSprm( sal_uInt16 nId, sal_uInt8 n2nd ) const { // Sprm found? const sal_uInt16 nAktId = maSprmParser.GetSprmId(pSp); + const sal_uInt16 x = maSprmParser.GetSprmSize(nAktId, pSp, nSprmSiz - i); if (nAktId == nId) { - sal_uInt8 *pRet = pSp + maSprmParser.DistanceToData(nId); - if (*pRet == n2nd) - return pRet; + sal_uInt16 nFixedLen = maSprmParser.DistanceToData(nId); + const sal_uInt8 *pRet = pSp + nFixedLen; + SprmResult aRet(pRet, x - nFixedLen); + if (aRet.nRemainingData >= 1 && *aRet.pSprm == n2nd) + { + return aRet; + } } // increment pointer so that it points to next SPRM - const sal_uInt16 x = maSprmParser.GetSprmSize(nAktId, pSp, nSprmSiz - i); i += x; pSp += x; } - return nullptr; // Sprm not found + return SprmResult(); // Sprm not found } WW8PLCFx_SubDoc::WW8PLCFx_SubDoc(SvStream* pSt, const WW8Fib& rFib, @@ -5219,18 +5243,18 @@ WW8PLCFx_FLD* WW8PLCFMan::GetField() const return static_cast<WW8PLCFx_FLD*>(m_pField->pPLCFx); } -const sal_uInt8* WW8PLCFMan::HasParaSprm( sal_uInt16 nId ) const +SprmResult WW8PLCFMan::HasParaSprm( sal_uInt16 nId ) const { return static_cast<WW8PLCFx_Cp_FKP*>(m_pPap->pPLCFx)->HasSprm( nId ); } -const sal_uInt8* WW8PLCFMan::HasCharSprm( sal_uInt16 nId ) const +SprmResult WW8PLCFMan::HasCharSprm( sal_uInt16 nId ) const { return static_cast<WW8PLCFx_Cp_FKP*>(m_pChp->pPLCFx)->HasSprm( nId ); } void WW8PLCFMan::HasCharSprm(sal_uInt16 nId, - std::vector<const sal_uInt8 *> &rResult) const + std::vector<SprmResult> &rResult) const { static_cast<WW8PLCFx_Cp_FKP*>(m_pChp->pPLCFx)->HasSprm(nId, rResult); } @@ -7971,7 +7995,7 @@ sal_uInt16 wwSprmParser::DistanceToData(sal_uInt16 nId) const return 1 + mnDelta + SprmDataOfs(nId); } -sal_uInt8* wwSprmParser::findSprmData(sal_uInt16 nId, sal_uInt8* pSprms, +SprmResult wwSprmParser::findSprmData(sal_uInt16 nId, sal_uInt8* pSprms, sal_uInt16 nLen) const { while (nLen >= MinSprmLen()) @@ -7987,7 +8011,10 @@ sal_uInt8* wwSprmParser::findSprmData(sal_uInt16 nId, sal_uInt8* pSprms, nSize << " vs " << nLen << "doc or parser is wrong"); if (nAktId == nId && bValid) // Sprm found - return pSprms + DistanceToData(nId); + { + sal_uInt16 nFixedLen = DistanceToData(nId); + return SprmResult(pSprms + nFixedLen, nSize - nFixedLen); + } //Clip to available size if wrong nSize = std::min(nSize, nLen); @@ -7995,7 +8022,7 @@ sal_uInt8* wwSprmParser::findSprmData(sal_uInt16 nId, sal_uInt8* pSprms, nLen -= nSize; } // Sprm not found - return nullptr; + return SprmResult(); } SEPr::SEPr() : diff --git a/sw/source/filter/ww8/ww8scan.hxx b/sw/source/filter/ww8/ww8scan.hxx index d2e96bb93df5..ab1fef0ee42c 100644 --- a/sw/source/filter/ww8/ww8scan.hxx +++ b/sw/source/filter/ww8/ww8scan.hxx @@ -97,6 +97,22 @@ private: class WW8Fib; +struct SprmResult +{ + const sal_uInt8* pSprm; + sal_Int32 nRemainingData; + SprmResult() + : pSprm(nullptr) + , nRemainingData(0) + { + } + SprmResult(const sal_uInt8* pInSprm, sal_Int32 nInRemainingData) + : pSprm(pInSprm) + , nRemainingData(nInRemainingData) + { + } +}; + /** wwSprmParser knows how to take a sequence of bytes and split it up into sprms and their arguments @@ -138,8 +154,7 @@ public: /// Returns the offset to data of the first sprm of id nId, 0 // if not found. nLen must be the <= length of pSprms - sal_uInt8* findSprmData(sal_uInt16 nId, sal_uInt8* pSprms, sal_uInt16 nLen) - const; + SprmResult findSprmData(sal_uInt16 nId, sal_uInt8* pSprms, sal_uInt16 nLen) const; }; //Read a Pascal-style, i.e. single byte string length followed @@ -267,7 +282,7 @@ public: explicit WW8SprmIter(const sal_uInt8* pSprms_, sal_Int32 nLen_, const wwSprmParser &rSprmParser); void SetSprms(const sal_uInt8* pSprms_, sal_Int32 nLen_); - const sal_uInt8* FindSprm(sal_uInt16 nId); + SprmResult FindSprm(sal_uInt16 nId); void advance(); const sal_uInt8* GetSprms() const { return ( pSprms && (0 < nRemLen) ) ? pSprms : nullptr; } @@ -555,8 +570,8 @@ public: /* calls GetLenAndIStdAndSprms()... */ - const sal_uInt8* HasSprm( sal_uInt16 nId ); - void HasSprm(sal_uInt16 nId, std::vector<const sal_uInt8 *> &rResult); + SprmResult HasSprm(sal_uInt16 nId); + void HasSprm(sal_uInt16 nId, std::vector<SprmResult> &rResult); const wwSprmParser &GetSprmParser() const { return maSprmParser; } }; @@ -604,8 +619,8 @@ public: virtual void advance() override; virtual sal_uInt16 GetIstd() const override; void GetPCDSprms( WW8PLCFxDesc& rDesc ); - const sal_uInt8* HasSprm( sal_uInt16 nId ); - bool HasSprm(sal_uInt16 nId, std::vector<const sal_uInt8 *> &rResult); + SprmResult HasSprm(sal_uInt16 nId); + bool HasSprm(sal_uInt16 nId, std::vector<SprmResult> &rResult); bool HasFkp() const { return (nullptr != pFkp); } }; @@ -663,12 +678,12 @@ public: virtual WW8_FC Where() override; virtual void GetSprms( WW8PLCFxDesc* p ) override; virtual void advance() override; - const sal_uInt8* HasSprm( sal_uInt16 nId ) const; - const sal_uInt8* HasSprm( sal_uInt16 nId, sal_uInt8 n2nd ) const; - const sal_uInt8* HasSprm( sal_uInt16 nId, const sal_uInt8* pOtherSprms, + SprmResult HasSprm( sal_uInt16 nId ) const; + SprmResult HasSprm( sal_uInt16 nId, sal_uInt8 n2nd ) const; + SprmResult HasSprm( sal_uInt16 nId, const sal_uInt8* pOtherSprms, long nOtherSprmSiz ) const; bool Find4Sprms(sal_uInt16 nId1, sal_uInt16 nId2, sal_uInt16 nId3, sal_uInt16 nId4, - sal_uInt8*& p1, sal_uInt8*& p2, sal_uInt8*& p3, sal_uInt8*& p4 ) const; + SprmResult& r1, SprmResult& r2, SprmResult& r3, SprmResult& r4) const; }; /// iterator for footnotes/endnotes and comments @@ -968,11 +983,11 @@ public: long GetCpOfs() const { return m_pChp->nCpOfs; } // for Header/Footer... /* asks, if *current paragraph* has an Sprm of this type */ - const sal_uInt8* HasParaSprm( sal_uInt16 nId ) const; + SprmResult HasParaSprm(sal_uInt16 nId) const; /* asks, if *current textrun* has an Sprm of this type */ - const sal_uInt8* HasCharSprm( sal_uInt16 nId ) const; - void HasCharSprm(sal_uInt16 nId, std::vector<const sal_uInt8 *> &rResult) const; + SprmResult HasCharSprm(sal_uInt16 nId) const; + void HasCharSprm(sal_uInt16 nId, std::vector<SprmResult> &rResult) const; WW8PLCFx_Cp_FKP* GetChpPLCF() const { return static_cast<WW8PLCFx_Cp_FKP*>(m_pChp->pPLCFx); }
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits