summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2014-12-30 10:46:26 +0100
committerAndras Timar <andras.timar@collabora.com>2015-01-05 19:01:43 +0100
commit4ec2e1d30bdab5ce9f4dbf53269a9a8d4af51a59 (patch)
tree96de02bf6327747aa9bfc9b3f212d6a0d544f527 /sw
parent1cea71c84a07ce84efd44578538faddea0708cfb (diff)
i#93570 DOC import: tokenize PlcfAtnBkf and PlcfAtnBkl
So that later SwWW8ImplReader can read these structures in a way similar to bookmarks. (cherry picked from commit 677fdd4fa235466649911042577bc4980d42deb6) Conflicts: sw/source/filter/ww8/ww8scan.hxx Change-Id: I8e5bc804832b944336701ac12fe6cb50e17c6b94
Diffstat (limited to 'sw')
-rw-r--r--sw/source/filter/ww8/ww8scan.cxx141
-rw-r--r--sw/source/filter/ww8/ww8scan.hxx39
2 files changed, 176 insertions, 4 deletions
diff --git a/sw/source/filter/ww8/ww8scan.cxx b/sw/source/filter/ww8/ww8scan.cxx
index 28525bde172c..af36b28668ff 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 95711aea890d..a3bdf7861e89 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 (WW8PLCFx_SubDoc*)pFtn->pPLCFx; }
WW8PLCFx_SubDoc* GetAtn() const { return (WW8PLCFx_SubDoc*)pAnd->pPLCFx; }
WW8PLCFx_Book* GetBook() const { return (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 )