Hi, I have submitted a patch for review:
https://gerrit.libreoffice.org/3082 To pull it, you can do: git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/82/3082/1 solve fdo#62805 move m_pCurrentBuffer to RTFParserState Change-Id: Ied16ee1704d35c6bd0368b26a210131b60bc91a3 --- M writerfilter/source/rtftok/rtfdocumentimpl.cxx M writerfilter/source/rtftok/rtfdocumentimpl.hxx 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 4fbb6cc..d2fb17f 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -255,7 +255,6 @@ m_aTableBuffer(), m_aSuperBuffer(), m_aShapetextBuffer(), - m_pCurrentBuffer(0), m_bHasFootnote(false), m_pSuperstream(0), m_nHeaderFooterPositions(), @@ -438,7 +437,7 @@ if (m_bNeedPap) { m_bNeedPap = false; // reset early, so we can avoid recursion when calling ourselves - if (!m_pCurrentBuffer) + if (!m_aStates.top().pCurrentBuffer) { writerfilter::Reference<Properties>::Pointer_t const pParagraphProperties( getProperties(m_aStates.top().aParagraphAttributes, m_aStates.top().aParagraphSprms) @@ -466,14 +465,14 @@ else { RTFValue::Pointer_t pValue(new RTFValue(m_aStates.top().aParagraphAttributes, m_aStates.top().aParagraphSprms)); - m_pCurrentBuffer->push_back(make_pair(BUFFER_PROPS, pValue)); + m_aStates.top().pCurrentBuffer->push_back(make_pair(BUFFER_PROPS, pValue)); } } } void RTFDocumentImpl::runProps() { - if (!m_pCurrentBuffer) + if (!m_aStates.top().pCurrentBuffer) { writerfilter::Reference<Properties>::Pointer_t const pProperties = getProperties(m_aStates.top().aCharacterAttributes, m_aStates.top().aCharacterSprms); Mapper().props(pProperties); @@ -481,7 +480,7 @@ else { RTFValue::Pointer_t pValue(new RTFValue(m_aStates.top().aCharacterAttributes, m_aStates.top().aCharacterSprms)); - m_pCurrentBuffer->push_back(make_pair(BUFFER_PROPS, pValue)); + m_aStates.top().pCurrentBuffer->push_back(make_pair(BUFFER_PROPS, pValue)); } } @@ -840,7 +839,7 @@ } writerfilter::Reference<Properties>::Pointer_t const pProperties(new RTFReferenceProperties(aAttributes, aSprms)); checkFirstRun(); - if (!m_pCurrentBuffer) + if (!m_aStates.top().pCurrentBuffer) { Mapper().props(pProperties); // Make sure we don't loose these properties with a too early reset. @@ -849,7 +848,7 @@ else { RTFValue::Pointer_t pValue(new RTFValue(aAttributes, aSprms)); - m_pCurrentBuffer->push_back(make_pair(BUFFER_PROPS, pValue)); + m_aStates.top().pCurrentBuffer->push_back(make_pair(BUFFER_PROPS, pValue)); } return 0; } @@ -949,7 +948,7 @@ void RTFDocumentImpl::singleChar(sal_uInt8 nValue, bool bRunProps) { sal_uInt8 sValue[] = { nValue }; - if (!m_pCurrentBuffer) + if (!m_aStates.top().pCurrentBuffer) { Mapper().startCharacterGroup(); // Should we send run properties? @@ -960,10 +959,10 @@ } else { - m_pCurrentBuffer->push_back(make_pair(BUFFER_STARTRUN, RTFValue::Pointer_t())); + m_aStates.top().pCurrentBuffer->push_back(make_pair(BUFFER_STARTRUN, RTFValue::Pointer_t())); RTFValue::Pointer_t pValue(new RTFValue(*sValue)); - m_pCurrentBuffer->push_back(make_pair(BUFFER_TEXT, pValue)); - m_pCurrentBuffer->push_back(make_pair(BUFFER_ENDRUN, RTFValue::Pointer_t())); + m_aStates.top().pCurrentBuffer->push_back(make_pair(BUFFER_TEXT, pValue)); + m_aStates.top().pCurrentBuffer->push_back(make_pair(BUFFER_ENDRUN, RTFValue::Pointer_t())); } } @@ -1110,31 +1109,31 @@ return; } - if (!m_pCurrentBuffer && m_aStates.top().nDestinationState != DESTINATION_FOOTNOTE) + if (!m_aStates.top().pCurrentBuffer && m_aStates.top().nDestinationState != DESTINATION_FOOTNOTE) Mapper().startCharacterGroup(); - else if (m_pCurrentBuffer) + else if (m_aStates.top().pCurrentBuffer) { RTFValue::Pointer_t pValue; - m_pCurrentBuffer->push_back(make_pair(BUFFER_STARTRUN, pValue)); + m_aStates.top().pCurrentBuffer->push_back(make_pair(BUFFER_STARTRUN, pValue)); } if (m_aStates.top().nDestinationState == DESTINATION_NORMAL || m_aStates.top().nDestinationState == DESTINATION_FIELDRESULT || m_aStates.top().nDestinationState == DESTINATION_SHAPETEXT) runProps(); - if (!m_pCurrentBuffer) + if (!m_aStates.top().pCurrentBuffer) Mapper().utext(reinterpret_cast<sal_uInt8 const*>(rString.getStr()), rString.getLength()); else { RTFValue::Pointer_t pValue(new RTFValue(rString)); - m_pCurrentBuffer->push_back(make_pair(BUFFER_UTEXT, pValue)); + m_aStates.top().pCurrentBuffer->push_back(make_pair(BUFFER_UTEXT, pValue)); } m_bNeedCr = true; - if (!m_pCurrentBuffer && m_aStates.top().nDestinationState != DESTINATION_FOOTNOTE) + if (!m_aStates.top().pCurrentBuffer && m_aStates.top().nDestinationState != DESTINATION_FOOTNOTE) Mapper().endCharacterGroup(); - else if(m_pCurrentBuffer) + else if(m_aStates.top().pCurrentBuffer) { RTFValue::Pointer_t pValue; - m_pCurrentBuffer->push_back(make_pair(BUFFER_ENDRUN, pValue)); + m_aStates.top().pCurrentBuffer->push_back(make_pair(BUFFER_ENDRUN, pValue)); } } @@ -1290,7 +1289,7 @@ break; case RTF_SHPINST: // Don't try to support shapes inside tables for now. - if (m_pCurrentBuffer != &m_aTableBuffer) + if (m_aStates.top().pCurrentBuffer != &m_aTableBuffer) m_aStates.top().nDestinationState = DESTINATION_SHAPEINSTRUCTION; else m_aStates.top().nDestinationState = DESTINATION_SKIP; @@ -1344,8 +1343,8 @@ nId = NS_rtf::LN_endnote; m_bHasFootnote = true; - if (m_pCurrentBuffer == &m_aSuperBuffer) - m_pCurrentBuffer = 0; + if (m_aStates.top().pCurrentBuffer == &m_aSuperBuffer) + m_aStates.top().pCurrentBuffer = 0; bool bCustomMark = false; OUString aCustomMark; while (m_aSuperBuffer.size()) @@ -1416,7 +1415,7 @@ dispatchFlag(RTF_PARD); m_bNeedPap = true; OSL_ENSURE(!m_aShapetextBuffer.size(), "shapetext buffer is not empty"); - m_pCurrentBuffer = &m_aShapetextBuffer; + m_aStates.top().pCurrentBuffer = &m_aShapetextBuffer; break; case RTF_FORMFIELD: if (m_aStates.top().nDestinationState == DESTINATION_FIELDINSTRUCTION) @@ -1464,7 +1463,7 @@ m_aStates.top().nDestinationState = DESTINATION_OBJECT; // check if the object is in a special container (e.g. a table) - if (!m_pCurrentBuffer) + if (!m_aStates.top().pCurrentBuffer) { // the object is in a table or another container. // Don't try to treate it as an OLE object (fdo#53594). @@ -1476,7 +1475,7 @@ break; case RTF_OBJDATA: // check if the object is in a special container (e.g. a table) - if (m_pCurrentBuffer) + if (m_aStates.top().pCurrentBuffer) { // the object is in a table or another container. // Use the \result (RTF_RESULT) element of the object instead, @@ -1696,7 +1695,7 @@ checkNeedPap(); if (bNeedPap) runProps(); - if (!m_pCurrentBuffer) + if (!m_aStates.top().pCurrentBuffer) { parBreak(); // Not in table? Reset max width. @@ -1705,7 +1704,7 @@ else if (m_aStates.top().nDestinationState != DESTINATION_SHAPETEXT) { RTFValue::Pointer_t pValue; - m_pCurrentBuffer->push_back(make_pair(BUFFER_PAR, pValue)); + m_aStates.top().pCurrentBuffer->push_back(make_pair(BUFFER_PAR, pValue)); } // but don't emit properties yet, since they may change till the first text token arrives m_bNeedPap = true; @@ -2129,9 +2128,9 @@ // Trivial paragraph flags switch (nKeyword) { - case RTF_KEEP: if (m_pCurrentBuffer != &m_aTableBuffer) nParam = NS_sprm::LN_PFKeep; break; - case RTF_KEEPN: if (m_pCurrentBuffer != &m_aTableBuffer) nParam = NS_sprm::LN_PFKeepFollow; break; - case RTF_INTBL: m_pCurrentBuffer = &m_aTableBuffer; nParam = NS_sprm::LN_PFInTable; break; + case RTF_KEEP: if (m_aStates.top().pCurrentBuffer != &m_aTableBuffer) nParam = NS_sprm::LN_PFKeep; break; + case RTF_KEEPN: if (m_aStates.top().pCurrentBuffer != &m_aTableBuffer) nParam = NS_sprm::LN_PFKeepFollow; break; + case RTF_INTBL: m_aStates.top().pCurrentBuffer = &m_aTableBuffer; nParam = NS_sprm::LN_PFInTable; break; case RTF_PAGEBB: nParam = NS_sprm::LN_PFPageBreakBefore; break; default: break; } @@ -2176,7 +2175,7 @@ m_aStates.top().aParagraphSprms = m_aDefaultState.aParagraphSprms; m_aStates.top().aParagraphAttributes = m_aDefaultState.aParagraphAttributes; if (m_aStates.top().nDestinationState != DESTINATION_SHAPETEXT) - m_pCurrentBuffer = 0; + m_aStates.top().pCurrentBuffer = 0; } m_aStates.top().resetFrame(); break; @@ -2370,8 +2369,8 @@ break; case RTF_SUPER: { - if (!m_pCurrentBuffer) - m_pCurrentBuffer = &m_aSuperBuffer; + if (!m_aStates.top().pCurrentBuffer) + m_aStates.top().pCurrentBuffer = &m_aSuperBuffer; RTFValue::Pointer_t pValue(new RTFValue("superscript")); m_aStates.top().aCharacterSprms.set(NS_ooxml::LN_EG_RPrBase_vertAlign, pValue); } @@ -2383,10 +2382,10 @@ } break; case RTF_NOSUPERSUB: - if (m_pCurrentBuffer == &m_aSuperBuffer) + if (m_aStates.top().pCurrentBuffer == &m_aSuperBuffer) { replayBuffer(m_aSuperBuffer); - m_pCurrentBuffer = 0; + m_aStates.top().pCurrentBuffer = 0; } m_aStates.top().aCharacterSprms.erase(NS_ooxml::LN_EG_RPrBase_vertAlign); break; @@ -2712,7 +2711,7 @@ { m_bNeedPap = true; // Don't try to support text frames inside tables for now. - if (m_pCurrentBuffer != &m_aTableBuffer) + if (m_aStates.top().pCurrentBuffer != &m_aTableBuffer) m_aStates.top().aFrame.setSprm(nId, nParam); return 0; } @@ -3753,9 +3752,6 @@ case DESTINATION_PICT: resolvePict(true); break; - case DESTINATION_SHAPETEXT: - m_pCurrentBuffer = 0; // Just disable buffering, don't empty it yet. - break; case DESTINATION_FORMFIELDNAME: { RTFValue::Pointer_t pValue(new RTFValue(m_aStates.top().aDestinationText.makeStringAndClear())); @@ -4280,11 +4276,13 @@ else if (m_xDocumentProperties.is()) m_xDocumentProperties->setTitle(aState.aDestinationText.makeStringAndClear()); } - if (m_pCurrentBuffer == &m_aSuperBuffer) + if (aState.pCurrentBuffer == &m_aSuperBuffer) { + OSL_ASSERT(m_aStates.top().pCurrentBuffer == 0); + if (!m_bHasFootnote) replayBuffer(m_aSuperBuffer); - m_pCurrentBuffer = 0; + m_bHasFootnote = false; } if (m_aStates.size()) @@ -4397,7 +4395,8 @@ nDay(0), nHour(0), nMinute(0), - nCurrentStyleIndex(-1) + nCurrentStyleIndex(-1), + pCurrentBuffer(0) { } diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx index 5ced019..a96ad9a 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx @@ -407,6 +407,9 @@ /// Same as the int value of NS_rtf::LN_ISTD in aParagraphAttributes, for performance reasons. int nCurrentStyleIndex; + + /// Points to the active buffer, if there is one. + RTFBuffer_t* pCurrentBuffer; }; class RTFTokenizer; @@ -540,8 +543,6 @@ RTFBuffer_t m_aSuperBuffer; /// Buffered shape text. RTFBuffer_t m_aShapetextBuffer; - /// Points to the active buffer, if there is one. - RTFBuffer_t* m_pCurrentBuffer; bool m_bHasFootnote; /// Superstream of this substream. -- To view, visit https://gerrit.libreoffice.org/3082 To unsubscribe, visit https://gerrit.libreoffice.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ied16ee1704d35c6bd0368b26a210131b60bc91a3 Gerrit-PatchSet: 1 Gerrit-Project: core Gerrit-Branch: master Gerrit-Owner: Maxime de Roucy <mdero...@linagora.com> _______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice