diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2014-12-30 10:46:26 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2014-12-30 19:04:25 +0100 |
commit | 677fdd4fa235466649911042577bc4980d42deb6 (patch) | |
tree | 0931ee50b666eb40cf3320d6da3e29b9a2dc6da9 /sw | |
parent | 271722d923610d128a358528e64d7233641ea0dc (diff) |
i#93570 DOC import: tokenize PlcfAtnBkf and PlcfAtnBkl
So that later SwWW8ImplReader can read these structures in a way similar
to bookmarks.
Change-Id: I8e5bc804832b944336701ac12fe6cb50e17c6b94
Diffstat (limited to 'sw')
-rw-r--r-- | sw/source/filter/ww8/ww8scan.cxx | 141 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8scan.hxx | 39 |
2 files changed, 176 insertions, 4 deletions
diff --git a/sw/source/filter/ww8/ww8scan.cxx b/sw/source/filter/ww8/ww8scan.cxx index dbc1de53304f..3c5675a92551 100644 --- a/sw/source/filter/ww8/ww8scan.cxx +++ b/sw/source/filter/ww8/ww8scan.cxx @@ -1752,6 +1752,7 @@ WW8ScannerBase::WW8ScannerBase( SvStream* pSt, SvStream* pTblSt, } pBook = new WW8PLCFx_Book(pTblSt, *pWwFib); + pAtnBook = new WW8PLCFx_AtnBook(pTblSt, *pWwFib); } WW8ScannerBase::~WW8ScannerBase() @@ -4234,6 +4235,138 @@ const OUString* WW8PLCFx_Book::GetName() const return pRet; } +WW8PLCFx_AtnBook::WW8PLCFx_AtnBook(SvStream* pTblSt, const WW8Fib& rFib) + : WW8PLCFx(rFib.GetFIBVersion(), /*bSprm=*/false), + m_bIsEnd(false) +{ + if (!rFib.fcPlcfAtnbkf || !rFib.lcbPlcfAtnbkf || !rFib.fcPlcfAtnbkl || !rFib.lcbPlcfAtnbkl) + { + m_pBook[0] = m_pBook[1] = 0; + nIMax = 0; + } + else + { + m_pBook[0] = new WW8PLCFspecial(pTblSt, rFib.fcPlcfAtnbkf, rFib.lcbPlcfAtnbkf, 4); + m_pBook[1] = new WW8PLCFspecial(pTblSt, rFib.fcPlcfAtnbkl, rFib.lcbPlcfAtnbkl, 0); + + nIMax = m_pBook[0]->GetIMax(); + if (m_pBook[1]->GetIMax() < nIMax) + nIMax = m_pBook[1]->GetIMax(); + } +} + +WW8PLCFx_AtnBook::~WW8PLCFx_AtnBook() +{ + delete m_pBook[1]; + delete m_pBook[0]; +} + +sal_uInt32 WW8PLCFx_AtnBook::GetIdx() const +{ + return nIMax ? m_pBook[0]->GetIdx() : 0; +} + +void WW8PLCFx_AtnBook::SetIdx( sal_uLong nI ) +{ + if( nIMax ) + m_pBook[0]->SetIdx( nI ); +} + +sal_uLong WW8PLCFx_AtnBook::GetIdx2() const +{ + if (nIMax) + return m_pBook[1]->GetIdx() | ( m_bIsEnd ? 0x80000000 : 0 ); + else + return 0; +} + +void WW8PLCFx_AtnBook::SetIdx2( sal_uLong nI ) +{ + if( nIMax ) + { + m_pBook[1]->SetIdx( nI & 0x7fffffff ); + m_bIsEnd = static_cast<bool>(( nI >> 31 ) & 1); + } +} + +bool WW8PLCFx_AtnBook::SeekPos(WW8_CP nCpPos) +{ + if (!m_pBook[0]) + return false; + + bool bOk = m_pBook[0]->SeekPosExact(nCpPos); + bOk &= m_pBook[1]->SeekPosExact(nCpPos); + m_bIsEnd = false; + + return bOk; +} + +WW8_CP WW8PLCFx_AtnBook::Where() +{ + return m_pBook[static_cast<int>(m_bIsEnd)]->Where(); +} + +long WW8PLCFx_AtnBook::GetNoSprms( WW8_CP& rStart, WW8_CP& rEnd, sal_Int32& rLen ) +{ + void* pData; + rEnd = WW8_CP_MAX; + rLen = 0; + + if (!m_pBook[0] || !m_pBook[1] || !nIMax || (m_pBook[static_cast<int>(m_bIsEnd)]->GetIdx()) >= nIMax) + { + rStart = rEnd = WW8_CP_MAX; + return -1; + } + + (void)m_pBook[static_cast<int>(m_bIsEnd)]->Get(rStart, pData); + return m_pBook[static_cast<int>(m_bIsEnd)]->GetIdx(); +} + +void WW8PLCFx_AtnBook::advance() +{ + if( m_pBook[0] && m_pBook[1] && nIMax ) + { + (*m_pBook[static_cast<int>(m_bIsEnd)]).advance(); + + sal_uLong l0 = m_pBook[0]->Where(); + sal_uLong l1 = m_pBook[1]->Where(); + if( l0 < l1 ) + m_bIsEnd = false; + else if( l1 < l0 ) + m_bIsEnd = true; + else + { + const void * p = m_pBook[0]->GetData(m_pBook[0]->GetIdx()); + long nPairFor = (p == NULL)? 0L : SVBT16ToShort(*((SVBT16*) p)); + if (nPairFor == m_pBook[1]->GetIdx()) + m_bIsEnd = false; + else + m_bIsEnd = !m_bIsEnd; + } + } +} + +sal_uInt16 WW8PLCFx_AtnBook::getHandle() const +{ + if (!m_pBook[0] || !m_pBook[1]) + return LONG_MAX; + + if (m_bIsEnd) + return m_pBook[1]->GetIdx(); + else + { + if (const void* p = m_pBook[0]->GetData(m_pBook[0]->GetIdx())) + return SVBT16ToShort(*(static_cast<const SVBT16*>(p))); + else + return LONG_MAX; + } +} + +bool WW8PLCFx_AtnBook::getIsEnd() const +{ + return m_bIsEnd; +} + #ifndef DUMP // Am Ende eines Absatzes reichen bei WW6 die Attribute bis hinter das <CR>. @@ -4374,12 +4507,14 @@ WW8PLCFMan::WW8PLCFMan(WW8ScannerBase* pBase, ManTypes nType, long nStartCp, pChp = &aD[7]; pPap = &aD[8]; pSep = &aD[9]; + pAtnBkm = &aD[10]; pSep->pPLCFx = pBase->pSepPLCF; pFtn->pPLCFx = pBase->pFtnPLCF; pEdn->pPLCFx = pBase->pEdnPLCF; pBkm->pPLCFx = pBase->pBook; pAnd->pPLCFx = pBase->pAndPLCF; + pAtnBkm->pPLCFx = pBase->pAtnBook; } else @@ -4397,7 +4532,7 @@ WW8PLCFMan::WW8PLCFMan(WW8ScannerBase* pBase, ManTypes nType, long nStartCp, pPap = &aD[5]; pSep = &aD[6]; // Dummy - pAnd = pFtn = pEdn = 0; // unbenutzt bei SpezText + pAnd = pAtnBkm = pFtn = pEdn = 0; // unbenutzt bei SpezText } pChp->pPLCFx = pBase->pChpPLCF; @@ -4674,6 +4809,8 @@ void WW8PLCFMan::GetNoSprmStart( short nIdx, WW8PLCFManResult* pRes ) const pRes->nSprmId = eEDN; else if( p == pBkm ) pRes->nSprmId = eBKN; + else if (p == pAtnBkm) + pRes->nSprmId = eATNBKN; else if( p == pAnd ) pRes->nSprmId = eAND; else if( p == pPcd ) @@ -4692,6 +4829,8 @@ void WW8PLCFMan::GetNoSprmEnd( short nIdx, WW8PLCFManResult* pRes ) const if( &aD[nIdx] == pBkm ) pRes->nSprmId = eBKN; + else if (&aD[nIdx] == pAtnBkm) + pRes->nSprmId = eATNBKN; else if( &aD[nIdx] == pPcd ) { //We slave the piece table attributes to the piece table, the piece diff --git a/sw/source/filter/ww8/ww8scan.hxx b/sw/source/filter/ww8/ww8scan.hxx index dd3638b35714..3c363362429b 100644 --- a/sw/source/filter/ww8/ww8scan.hxx +++ b/sw/source/filter/ww8/ww8scan.hxx @@ -364,7 +364,7 @@ public: enum ePLCFT{ CHP=0, PAP, SEP, /*HED, FNR, ENR,*/ PLCF_END }; //Its hardcoded that eFTN be the first one: A very poor hack, needs to be fixed -enum eExtSprm { eFTN = 256, eEDN = 257, eFLD = 258, eBKN = 259, eAND = 260 }; +enum eExtSprm { eFTN = 256, eEDN = 257, eFLD = 258, eBKN = 259, eAND = 260, eATNBKN = 261 }; /* pure virtual: @@ -769,6 +769,37 @@ public: OUString GetUniqueBookmarkName(const OUString &rSuggestedName); }; +/// Handles the import of PlcfAtnBkf and PlcfAtnBkl: start / end position of annotation marks. +class WW8PLCFx_AtnBook : public WW8PLCFx +{ +private: + /// Start and end positions. + WW8PLCFspecial* m_pBook[2]; + /// Number of annotation marks + sal_Int32 nIMax; + bool m_bIsEnd; + + //No copying + WW8PLCFx_AtnBook(const WW8PLCFx_AtnBook&); + WW8PLCFx_AtnBook& operator=(const WW8PLCFx_AtnBook&); + +public: + WW8PLCFx_AtnBook(SvStream* pTblSt,const WW8Fib& rFib); + virtual ~WW8PLCFx_AtnBook(); + virtual sal_uInt32 GetIdx() const SAL_OVERRIDE; + virtual void SetIdx( sal_uLong nI ) SAL_OVERRIDE; + virtual sal_uLong GetIdx2() const SAL_OVERRIDE; + virtual void SetIdx2( sal_uLong nIdx ) SAL_OVERRIDE; + virtual bool SeekPos(WW8_CP nCpPos) SAL_OVERRIDE; + virtual WW8_FC Where() SAL_OVERRIDE; + virtual long GetNoSprms( WW8_CP& rStart, WW8_CP& rEnd, sal_Int32& rLen ) SAL_OVERRIDE; + virtual void advance() SAL_OVERRIDE; + + /// Handle is the unique ID of an annotation mark. + sal_uInt16 getHandle() const; + bool getIsEnd() const; +}; + /* hiermit arbeiten wir draussen: */ @@ -857,7 +888,7 @@ struct WW8PLCFxSaveAll; class WW8PLCFMan { public: - enum WW8PLCFManLimits {MAN_ANZ_PLCF = 10}; + enum WW8PLCFManLimits {MAN_ANZ_PLCF = 11}; private: wwSprmParser maSprmParser; @@ -874,7 +905,7 @@ private: WW8PLCFxDesc aD[MAN_ANZ_PLCF]; WW8PLCFxDesc *pChp, *pPap, *pSep, *pFld, *pFtn, *pEdn, *pBkm, *pPcd, - *pPcdA, *pAnd; + *pPcdA, *pAnd, *pAtnBkm; WW8PLCFspecial *pFdoa, *pTxbx, *pTxbxBkd,*pMagicTables, *pSubdocs; sal_uInt8* pExtendedAtrds; @@ -911,6 +942,7 @@ public: WW8PLCFx_SubDoc* GetFtn() const { return static_cast<WW8PLCFx_SubDoc*>(pFtn->pPLCFx); } WW8PLCFx_SubDoc* GetAtn() const { return static_cast<WW8PLCFx_SubDoc*>(pAnd->pPLCFx); } WW8PLCFx_Book* GetBook() const { return static_cast<WW8PLCFx_Book*>(pBkm->pPLCFx); } + WW8PLCFx_AtnBook* GetAtnBook() const { return static_cast<WW8PLCFx_AtnBook*>(pAtnBkm->pPLCFx); } long GetCpOfs() const { return pChp->nCpOfs; } // for Header/Footer... /* fragt, ob *aktueller Absatz* einen Sprm diesen Typs hat */ @@ -989,6 +1021,7 @@ private: WW8PLCFspecial* pSubdocs; // subdoc references in master document sal_uInt8* pExtendedAtrds; // Extended ATRDs WW8PLCFx_Book* pBook; // Bookmarks + WW8PLCFx_AtnBook* pAtnBook; // Annotationmarks WW8PLCFpcd* pPiecePLCF; // fuer FastSave ( Basis-PLCF ohne Iterator ) WW8PLCFpcd_Iter* pPieceIter; // fuer FastSave ( Iterator dazu ) |