LCOV - code coverage report
Current view: top level - sw/source/filter/ww8 - ww8scan.hxx (source / functions) Hit Total Coverage
Test: commit 0e63ca4fde4e446f346e35849c756a30ca294aab Lines: 98 111 88.3 %
Date: 2014-04-11 Functions: 72 81 88.9 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #ifndef INCLUDED_SW_SOURCE_FILTER_WW8_WW8SCAN_HXX
      21             : #define INCLUDED_SW_SOURCE_FILTER_WW8_WW8SCAN_HXX
      22             : 
      23             : #ifndef LONG_MAX
      24             : #include <limits.h>
      25             : #endif
      26             : #include <stack>
      27             : #include <vector>
      28             : #include <list>
      29             : #include <algorithm>
      30             : #include <tools/solar.h>
      31             : #include <tools/stream.hxx>
      32             : #include "rtl/ustring.hxx"
      33             : #include "hash_wrap.hxx"
      34             : #include "sortedarray.hxx"
      35             : 
      36             : #include "ww8struc.hxx"
      37             : #include <types.hxx>
      38             : 
      39             : #include <unomid.h>
      40             : 
      41             : //--Line below which the code has meaningful comments
      42             : 
      43             : //Commonly used string literals for stream and storage names in word docs
      44             : namespace SL
      45             : {
      46             : #   define DEFCONSTSTRINGARRAY(X) extern const char a##X[sizeof("" #X "")]
      47             :     DEFCONSTSTRINGARRAY(ObjectPool);
      48             :     DEFCONSTSTRINGARRAY(1Table);
      49             :     DEFCONSTSTRINGARRAY(0Table);
      50             :     DEFCONSTSTRINGARRAY(Data);
      51             :     DEFCONSTSTRINGARRAY(CheckBox);
      52             :     DEFCONSTSTRINGARRAY(ListBox);
      53             :     DEFCONSTSTRINGARRAY(TextBox);
      54             :     DEFCONSTSTRINGARRAY(TextField);
      55             :     DEFCONSTSTRINGARRAY(MSMacroCmds);
      56             : }
      57             : 
      58             : struct SprmInfo
      59             : {
      60             :     sal_uInt16 nId;         ///< A ww8 sprm is hardcoded as 16bits
      61             :     unsigned int nLen : 6;
      62             :     unsigned int nVari : 2;
      63             : };
      64             : 
      65             : struct SprmInfoHash
      66             : {
      67     1358334 :     size_t operator()(const SprmInfo &a) const
      68             :     {
      69     1358334 :         return a.nId;
      70             :     }
      71             : };
      72             : 
      73             : typedef ww::WrappedHash<SprmInfo, SprmInfoHash> wwSprmSearcher;
      74             : typedef ww::WrappedHash<sal_uInt16> wwSprmSequence;
      75             : 
      76             : /**
      77             :     wwSprmParser knows how to take a sequence of bytes and split it up into
      78             :     sprms and their arguments
      79             : */
      80             : class wwSprmParser
      81             : {
      82             : private:
      83             :     ww::WordVersion meVersion;
      84             :     sal_uInt8 mnDelta;
      85             :     const wwSprmSearcher *mpKnownSprms;
      86             :     static const wwSprmSearcher* GetWW8SprmSearcher();
      87             :     static const wwSprmSearcher* GetWW6SprmSearcher();
      88             :     static const wwSprmSearcher* GetWW2SprmSearcher();
      89             : 
      90             :     SprmInfo GetSprmInfo(sal_uInt16 nId) const;
      91             : 
      92             :     sal_uInt8 SprmDataOfs(sal_uInt16 nId) const;
      93             : 
      94             :     enum SprmType {L_FIX=0, L_VAR=1, L_VAR2=2};
      95             : 
      96             : public:
      97             :     //7- ids are very different to 8+ ones
      98             :     wwSprmParser(ww::WordVersion eVersion);
      99             :     /// Return the SPRM id at the beginning of this byte sequence
     100             :     sal_uInt16 GetSprmId(const sal_uInt8* pSp) const;
     101             : 
     102             :     sal_uInt16 GetSprmSize(sal_uInt16 nId, const sal_uInt8* pSprm) const;
     103             : 
     104             :     /// Get known len of a sprms head, the bytes of the sprm id + any bytes
     105             :     /// reserved to hold a variable length
     106             :     sal_uInt16 DistanceToData(sal_uInt16 nId) const;
     107             : 
     108             :     /// Get len of a sprms data area, ignoring the bytes of the sprm id and
     109             :     /// ignoring any len bytes. Reports the remaining data after those bytes
     110             :     sal_uInt16 GetSprmTailLen(sal_uInt16 nId, const sal_uInt8 * pSprm) const;
     111             : 
     112             :     /// The minimum acceptable sprm len possible for this type of parser
     113      625619 :     int MinSprmLen() const { return (IsSevenMinus(meVersion)) ? 2 : 3; }
     114             : 
     115             :     /// Returns the offset to data of the first sprm of id nId, 0
     116             :     //  if not found. nLen must be the <= length of pSprms
     117             :     sal_uInt8* findSprmData(sal_uInt16 nId, sal_uInt8* pSprms, sal_uInt16 nLen)
     118             :         const;
     119             : };
     120             : 
     121             : //Read a Pascal-style, i.e. single byte string length followed
     122             : //by string contents
     123           0 : inline OUString read_uInt8_PascalString(SvStream& rStrm, rtl_TextEncoding eEnc)
     124             : {
     125           0 :     return read_uInt8_lenPrefixed_uInt8s_ToOUString(rStrm, eEnc);
     126             : }
     127             : 
     128        3259 : inline OUString read_uInt16_PascalString(SvStream& rStrm)
     129             : {
     130        3259 :     return read_uInt16_lenPrefixed_uInt16s_ToOUString(rStrm);
     131             : }
     132             : 
     133             : //Belt and Braces strings, i.e. Pascal-style strings followed by
     134             : //null termination, Spolsky calls them "fucked strings" FWIW
     135             : //http://www.joelonsoftware.com/articles/fog0000000319.html
     136             : OUString read_uInt8_BeltAndBracesString(SvStream& rStrm, rtl_TextEncoding eEnc);
     137             : OUString read_uInt16_BeltAndBracesString(SvStream& rStrm);
     138             : 
     139             : //--Line abovewhich the code has meaningful comments
     140             : 
     141             : class  WW8Fib;
     142             : class  WW8ScannerBase;
     143             : class  WW8PLCFspecial;
     144             : struct WW8PLCFxDesc;
     145             : class  WW8PLCFx_PCD;
     146             : 
     147             : /**
     148             :  reads array of strings (see MS documentation: STring TaBle stored in File)
     149             :  returns NOT the original pascal strings but an array of converted char*
     150             : 
     151             :  attention: the *extra data* of each string are SKIPPED and ignored
     152             :  */
     153             : void WW8ReadSTTBF(bool bVer8, SvStream& rStrm, sal_uInt32 nStart, sal_Int32 nLen,
     154             :     sal_uInt16 nExtraLen, rtl_TextEncoding eCS, ::std::vector<OUString> &rArray,
     155             :     ::std::vector<ww::bytes>* pExtraArray = 0, ::std::vector<OUString>* pValueArray = 0);
     156             : 
     157             : struct WW8FieldDesc
     158             : {
     159             :     long nLen;              ///< Gesamtlaenge ( zum Text ueberlesen )
     160             :     WW8_CP nSCode;          ///< Anfang Befehlscode
     161             :     WW8_CP nLCode;          ///< Laenge
     162             :     WW8_CP nSRes;           ///< Anfang Ergebnis
     163             :     WW8_CP nLRes;           ///< Laenge ( == 0, falls kein Ergebnis )
     164             :     sal_uInt16 nId;             ///< WW-Id fuer Felder
     165             :     sal_uInt8 nOpt;              ///< WW-Flags ( z.B.: vom User geaendert )
     166             :     bool bCodeNest:1;       ///< Befehl rekursiv verwendet
     167             :     bool bResNest:1;        ///< Befehl in Resultat eingefuegt
     168             : };
     169             : 
     170             : struct WW8PLCFxSave1
     171             : {
     172             :     sal_uLong nPLCFxPos;
     173             :     sal_uLong nPLCFxPos2;       ///< fuer PLCF_Cp_Fkp: PieceIter-Pos
     174             :     long nPLCFxMemOfs;
     175             :     WW8_CP nStartCp;        ///< for cp based iterator like PAP and CHP
     176             :     long nCpOfs;
     177             :     WW8_FC nStartFC;
     178             :     WW8_CP nAttrStart;
     179             :     WW8_CP nAttrEnd;
     180             :     bool bLineEnd;
     181             : };
     182             : 
     183             : /**
     184             :     u.a. fuer Felder, also genausoviele Attr wie Positionen,
     185             :     falls Ctor-Param bNoEnd = false
     186             : */
     187             : class WW8PLCFspecial        // Iterator fuer PLCFs
     188             : {
     189             : private:
     190             :     sal_Int32* pPLCF_PosArray;  ///< Pointer auf Pos-Array und auf ganze Struktur
     191             :     sal_uInt8*  pPLCF_Contents;  ///< Pointer auf Inhalts-Array-Teil des Pos-Array
     192             :     long nIMax;             ///< Anzahl der Elemente
     193             :     long nIdx;              ///< Merker, wo wir gerade sind
     194             :     sal_uInt32 nStru;
     195             : 
     196             : public:
     197             :     WW8PLCFspecial(SvStream* pSt, sal_uInt32 nFilePos, sal_uInt32 nPLCF,
     198             :         sal_uInt32 nStruct);
     199         163 :     ~WW8PLCFspecial() { delete[] pPLCF_PosArray; }
     200         618 :     long GetIdx() const { return nIdx; }
     201         354 :     void SetIdx( long nI ) { nIdx = nI; }
     202          96 :     long GetIMax() const { return nIMax; }
     203             :     bool SeekPos(long nPos);            // geht ueber FC- bzw. CP-Wert
     204             :                                         // bzw. naechste groesseren Wert
     205             :     bool SeekPosExact(long nPos);
     206         176 :     sal_Int32 Where() const
     207         176 :         { return ( nIdx >= nIMax ) ? SAL_MAX_INT32 : pPLCF_PosArray[nIdx]; }
     208             :     bool Get(WW8_CP& rStart, void*& rpValue) const;
     209             :     bool GetData(long nIdx, WW8_CP& rPos, void*& rpValue) const;
     210             : 
     211          45 :     const void* GetData( long nInIdx ) const
     212             :     {
     213          45 :         return ( nInIdx >= nIMax ) ? 0
     214          45 :             : (const void*)&pPLCF_Contents[nInIdx * nStru];
     215             :     }
     216          24 :     sal_Int32 GetPos( long nInIdx ) const
     217          24 :         { return ( nInIdx >= nIMax ) ? SAL_MAX_INT32 : pPLCF_PosArray[nInIdx]; }
     218             : 
     219         507 :     void advance()
     220             :     {
     221         507 :         if (nIdx <= nIMax)
     222         507 :             ++nIdx;
     223         507 :     }
     224             : };
     225             : 
     226             : /** simple Iterator for SPRMs */
     227             : class WW8SprmIter
     228             : {
     229             : private:
     230             :     const wwSprmParser &mrSprmParser;
     231             :     // these members will be updated
     232             :     const sal_uInt8* pSprms; // remaining part of the SPRMs ( == start of akt. SPRM)
     233             :     const sal_uInt8* pAktParams; // start of akt. SPRM's parameters
     234             :     sal_uInt16 nAktId;
     235             :     sal_uInt16 nAktSize;
     236             : 
     237             :     long nRemLen;   // length of remaining SPRMs (including akt. SPRM)
     238             : 
     239             :     void UpdateMyMembers();
     240             : 
     241             : public:
     242             :     explicit WW8SprmIter( const sal_uInt8* pSprms_, long nLen_,
     243             :         const wwSprmParser &rSprmParser);
     244             :     void  SetSprms( const sal_uInt8* pSprms_, long nLen_ );
     245             :     const sal_uInt8* FindSprm(sal_uInt16 nId);
     246             :     void  advance();
     247      384892 :     const sal_uInt8* GetSprms() const
     248      384892 :         { return ( pSprms && (0 < nRemLen) ) ? pSprms : 0; }
     249       24532 :     const sal_uInt8* GetAktParams() const { return pAktParams; }
     250      332793 :     sal_uInt16 GetAktId() const { return nAktId; }
     251             : 
     252             : private:
     253             :     //No copying
     254             :     WW8SprmIter(const WW8SprmIter&);
     255             :     WW8SprmIter& operator=(const WW8SprmIter&);
     256             : };
     257             : 
     258             : /* u.a. fuer FKPs auf normale Attr., also ein Attr weniger als Positionen */
     259             : class WW8PLCF                       // Iterator fuer PLCFs
     260             : {
     261             : private:
     262             :     WW8_CP* pPLCF_PosArray; // Pointer auf Pos-Array und auf ganze Struktur
     263             :     sal_uInt8* pPLCF_Contents;   // Pointer auf Inhalts-Array-Teil des Pos-Array
     264             :     sal_Int32 nIMax;            // Anzahl der Elemente
     265             :     sal_Int32 nIdx;
     266             :     int nStru;
     267             : 
     268             :     void ReadPLCF(SvStream& rSt, WW8_FC nFilePos, sal_uInt32 nPLCF);
     269             : 
     270             :     /*
     271             :         Falls im Dok ein PLC fehlt und die FKPs solo dastehen,
     272             :         machen wir uns hiermit einen PLC:
     273             :     */
     274             :     void GeneratePLCF(SvStream& rSt, sal_Int32 nPN, sal_Int32 ncpN);
     275             : 
     276             :     void MakeFailedPLCF();
     277             : 
     278             : public:
     279             :     WW8PLCF(SvStream& rSt, WW8_FC nFilePos, sal_Int32 nPLCF, int nStruct,
     280             :         WW8_CP nStartPos = -1);
     281             : 
     282             :     /*
     283             :         folgender Ctor generiert ggfs. einen PLC aus nPN und ncpN
     284             :     */
     285             :     WW8PLCF(SvStream& rSt, WW8_FC nFilePos, sal_Int32 nPLCF, int nStruct,
     286             :         WW8_CP nStartPos, sal_Int32 nPN, sal_Int32 ncpN);
     287             : 
     288         265 :     ~WW8PLCF(){ delete[] pPLCF_PosArray; }
     289        2197 :     sal_Int32 GetIdx() const { return nIdx; }
     290        2447 :     void SetIdx( sal_Int32 nI ) { nIdx = nI; }
     291           1 :     sal_Int32 GetIMax() const { return nIMax; }
     292             :     bool SeekPos(WW8_CP nPos);
     293             :     WW8_CP Where() const;
     294             :     bool Get(WW8_CP& rStart, WW8_CP& rEnd, void*& rpValue) const;
     295        5955 :     void advance() { if( nIdx < nIMax ) ++nIdx; }
     296             : 
     297          16 :     const void* GetData( sal_Int32 nInIdx ) const
     298             :     {
     299          16 :         return ( nInIdx >= nIMax ) ? 0 :
     300          16 :             (const void*)&pPLCF_Contents[nInIdx * nStru];
     301             :     }
     302             : };
     303             : 
     304             : /* for Piece Table (.i.e. FastSave Table) */
     305             : class WW8PLCFpcd
     306             : {
     307             :     friend class WW8PLCFpcd_Iter;
     308             : 
     309             :     sal_Int32* pPLCF_PosArray;  // Pointer auf Pos-Array und auf ganze Struktur
     310             :     sal_uInt8*  pPLCF_Contents;  // Pointer auf Inhalts-Array-Teil des Pos-Array
     311             :     long nIMax;
     312             :     sal_uInt32 nStru;
     313             : 
     314             : public:
     315             :     WW8PLCFpcd(SvStream* pSt, sal_uInt32 nFilePos, sal_uInt32 nPLCF,
     316             :         sal_uInt32 nStruct);
     317          71 :     ~WW8PLCFpcd(){ delete[] pPLCF_PosArray; }
     318             : };
     319             : 
     320             : /* mehrere WW8PLCFpcd_Iter koennen auf die gleiche WW8PLCFpcd zeigen !!!  */
     321             : class WW8PLCFpcd_Iter
     322             : {
     323             : private:
     324             :     WW8PLCFpcd& rPLCF;
     325             :     long nIdx;
     326             : 
     327             :     //No copying
     328             :     WW8PLCFpcd_Iter(const WW8PLCFpcd_Iter&);
     329             :     WW8PLCFpcd_Iter& operator=(const WW8PLCFpcd_Iter&);
     330             : 
     331             : public:
     332             :     WW8PLCFpcd_Iter( WW8PLCFpcd& rPLCFpcd, long nStartPos = -1 );
     333       40136 :     long GetIdx() const { return nIdx; }
     334       33464 :     void SetIdx( long nI ) { nIdx = nI; }
     335        1705 :     long GetIMax() const { return rPLCF.nIMax; }
     336             :     bool SeekPos(long nPos);
     337             :     sal_Int32 Where() const;
     338             :     bool Get(WW8_CP& rStart, WW8_CP& rEnd, void*& rpValue) const;
     339        1092 :     void advance()
     340             :     {
     341        1092 :         if( nIdx < rPLCF.nIMax )
     342        1092 :             ++nIdx;
     343        1092 :     }
     344             : };
     345             : 
     346             : // PLCF-Typ:
     347             : enum ePLCFT{ CHP=0, PAP, SEP, /*HED, FNR, ENR,*/ PLCF_END };
     348             : 
     349             : //Its hardcoded that eFTN be the first one: A very poor hack, needs to be fixed
     350             : enum eExtSprm { eFTN = 256, eEDN = 257, eFLD = 258, eBKN = 259, eAND = 260 };
     351             : 
     352             : /*
     353             :     pure virtual:
     354             : */
     355             : class WW8PLCFx              // virtueller Iterator fuer Piece Table Exceptions
     356             : {
     357             : private:
     358             :     ww::WordVersion meVer;  // Version number of FIB
     359             :     bool bIsSprm;           // PLCF von Sprms oder von anderem ( Footnote, ... )
     360             :     WW8_FC nStartFc;
     361             :     bool bDirty;
     362             : 
     363             :     //No copying
     364             :     WW8PLCFx(const WW8PLCFx&);
     365             :     WW8PLCFx& operator=(const WW8PLCFx&);
     366             : 
     367             : public:
     368        1448 :     WW8PLCFx(ww::WordVersion eVersion, bool bSprm)
     369             :         : meVer(eVersion)
     370             :         , bIsSprm(bSprm)
     371             :         , nStartFc(-1)
     372        1448 :         , bDirty(false)
     373             :     {
     374        1448 :     }
     375        1448 :     virtual ~WW8PLCFx() {}
     376      187995 :     bool IsSprm() const { return bIsSprm; }
     377             :     virtual sal_uLong GetIdx() const = 0;
     378             :     virtual void SetIdx( sal_uLong nIdx ) = 0;
     379             :     virtual sal_uLong GetIdx2() const;
     380             :     virtual void SetIdx2( sal_uLong nIdx );
     381             :     virtual bool SeekPos(WW8_CP nCpPos) = 0;
     382             :     virtual WW8_FC Where() = 0;
     383             :     virtual void GetSprms( WW8PLCFxDesc* p );
     384             :     virtual long GetNoSprms( WW8_CP& rStart, WW8_CP&, sal_Int32& rLen );
     385             :     virtual void advance() = 0;
     386           0 :     virtual sal_uInt16 GetIstd() const { return 0xffff; }
     387             :     virtual void Save( WW8PLCFxSave1& rSave ) const;
     388             :     virtual void Restore( const WW8PLCFxSave1& rSave );
     389       87971 :     ww::WordVersion GetFIBVersion() const { return meVer; }
     390       40005 :     void SetStartFc( WW8_FC nFc ) { nStartFc = nFc; }
     391        8866 :     WW8_FC GetStartFc() const { return nStartFc; }
     392       32368 :     void SetDirty(bool bIn) {bDirty=bIn;}
     393       38545 :     bool GetDirty() const {return bDirty;}
     394             : };
     395             : 
     396         426 : class WW8PLCFx_PCDAttrs : public WW8PLCFx
     397             : {
     398             : private:
     399             :     WW8PLCFpcd_Iter* pPcdI;
     400             :     WW8PLCFx_PCD* pPcd;
     401             :     sal_uInt8** const pGrpprls;      // Attribute an Piece-Table
     402             :     SVBT32 aShortSprm;          // mini storage: can contain ONE sprm with
     403             :                                 // 1 byte param
     404             :     sal_uInt16 nGrpprls;            // Attribut Anzahl davon
     405             : 
     406             :     //No copying
     407             :     WW8PLCFx_PCDAttrs(const WW8PLCFx_PCDAttrs&);
     408             :     WW8PLCFx_PCDAttrs& operator=(const WW8PLCFx_PCDAttrs&);
     409             : 
     410             : public:
     411             :     WW8PLCFx_PCDAttrs(ww::WordVersion eVersion, WW8PLCFx_PCD* pPLCFx_PCD,
     412             :         const WW8ScannerBase* pBase );
     413             :     virtual sal_uLong GetIdx() const SAL_OVERRIDE;
     414             :     virtual void SetIdx( sal_uLong nI ) SAL_OVERRIDE;
     415             :     virtual bool SeekPos(WW8_CP nCpPos) SAL_OVERRIDE;
     416             :     virtual WW8_FC Where() SAL_OVERRIDE;
     417             :     virtual void GetSprms( WW8PLCFxDesc* p ) SAL_OVERRIDE;
     418             :     virtual void advance() SAL_OVERRIDE;
     419             : 
     420       30606 :     WW8PLCFpcd_Iter* GetIter() const { return pPcdI; }
     421             : };
     422             : 
     423             : class WW8PLCFx_PCD : public WW8PLCFx            // Iterator fuer Piece Table
     424             : {
     425             : private:
     426             :     WW8PLCFpcd_Iter* pPcdI;
     427             :     bool bVer67;
     428             :     WW8_CP nClipStart;
     429             : 
     430             :     //No copying
     431             :     WW8PLCFx_PCD(const WW8PLCFx_PCD&);
     432             :     WW8PLCFx_PCD& operator=(const WW8PLCFx_PCD&);
     433             : 
     434             : public:
     435             :     WW8PLCFx_PCD(ww::WordVersion eVersion, WW8PLCFpcd* pPLCFpcd,
     436             :         WW8_CP nStartCp, bool bVer67P);
     437             :     virtual ~WW8PLCFx_PCD();
     438             :     virtual sal_uLong GetIMax() const;
     439             :     virtual sal_uLong GetIdx() const SAL_OVERRIDE;
     440             :     virtual void SetIdx( sal_uLong nI ) SAL_OVERRIDE;
     441             :     virtual bool SeekPos(WW8_CP nCpPos) SAL_OVERRIDE;
     442             :     virtual WW8_FC Where() SAL_OVERRIDE;
     443             :     virtual long GetNoSprms( WW8_CP& rStart, WW8_CP&, sal_Int32& rLen ) SAL_OVERRIDE;
     444             :     virtual void advance() SAL_OVERRIDE;
     445             :     WW8_CP AktPieceStartFc2Cp( WW8_FC nStartPos );
     446             :     WW8_FC AktPieceStartCp2Fc( WW8_CP nCp );
     447             :     void AktPieceFc2Cp(WW8_CP& rStartPos, WW8_CP& rEndPos,
     448             :         const WW8ScannerBase *pSBase);
     449         213 :     WW8PLCFpcd_Iter* GetPLCFIter() { return pPcdI; }
     450       10742 :     void SetClipStart(WW8_CP nIn) { nClipStart = nIn; }
     451       15883 :     WW8_CP GetClipStart() { return nClipStart; }
     452             : 
     453      177937 :     static sal_Int32 TransformPieceAddress(long nfc, bool& bIsUnicodeAddress)
     454             :     {
     455      177937 :         bIsUnicodeAddress = 0 == (0x40000000 & nfc);
     456      177937 :         return bIsUnicodeAddress ?  nfc : (nfc & 0x3fffFFFF) / 2;
     457             :     }
     458             : };
     459             : 
     460             : /**
     461             :  Iterator for Piece Table Exceptions of Fkps
     462             :  works only with FCs, not with CPs !  ( Low-Level )
     463             : */
     464             : class WW8PLCFx_Fc_FKP : public WW8PLCFx
     465             : {
     466             : public:
     467        1013 :     class WW8Fkp        // Iterator for Formatted Disk Page
     468             :     {
     469             :     private:
     470             :         class Entry
     471             :         {
     472             :         public:
     473             :             WW8_FC mnFC;
     474             : 
     475             :             sal_uInt8* mpData;
     476             :             sal_uInt16 mnLen;
     477             :             sal_uInt16 mnIStd; // only for Fkp.Papx (actualy Style-Nr)
     478             :             bool mbMustDelete;
     479             : 
     480       12927 :             explicit Entry(WW8_FC nFC) : mnFC(nFC), mpData(0), mnLen(0),
     481       12927 :                 mnIStd(0), mbMustDelete(false) {}
     482             :             Entry(const Entry &rEntry);
     483             :             ~Entry();
     484             :             bool operator<(const Entry& rEntry) const;
     485             :             Entry& operator=(const Entry& rEntry);
     486             :         };
     487             : 
     488             :         sal_uInt8 maRawData[512];
     489             :         std::vector<Entry> maEntries;
     490             : 
     491             :         long nItemSize;     // entweder 1 Byte oder ein komplettes BX
     492             : 
     493             :         // Offset in Stream where last read of 52 bytes took place
     494             :         long nFilePos;
     495             :         sal_uInt8 mnIdx;         // Pos-Merker
     496             :         ePLCFT ePLCF;
     497             :         sal_uInt8 mnIMax;         // Anzahl der Eintraege
     498             : 
     499             :         wwSprmParser maSprmParser;
     500             : 
     501             :         //Fill in an Entry with sanity testing
     502             :         void FillEntry(Entry &rEntry, sal_Size nDataOffset, sal_uInt16 nLen);
     503             : 
     504             :     public:
     505             :         WW8Fkp (ww::WordVersion eVersion, SvStream* pFKPStrm,
     506             :             SvStream* pDataStrm, long _nFilePos, long nItemSiz, ePLCFT ePl,
     507             :             WW8_FC nStartFc = -1);
     508             :         void Reset(WW8_FC nPos);
     509       52342 :         long GetFilePos() const { return nFilePos; }
     510        1948 :         sal_uInt8 GetIdx() const { return mnIdx; }
     511             :         bool SetIdx(sal_uInt8 nI);
     512             :         bool SeekPos(WW8_FC nFc);
     513       20481 :         WW8_FC Where() const
     514             :         {
     515       20481 :             return (mnIdx < mnIMax) ? maEntries[mnIdx].mnFC : WW8_FC_MAX;
     516             :         }
     517           0 :         void advance()
     518             :         {
     519           0 :             if (mnIdx < mnIMax)
     520           0 :                 ++mnIdx;
     521           0 :         }
     522             :         sal_uInt8* Get( WW8_FC& rStart, WW8_FC& rEnd, sal_Int32& rLen ) const;
     523        8121 :         sal_uInt16 GetIstd() const { return maEntries[mnIdx].mnIStd; }
     524             : 
     525             :         /*
     526             :             liefert einen echten Pointer auf das Sprm vom Typ nId,
     527             :             falls ein solches im Fkp drin ist.
     528             :         */
     529             :         sal_uInt8* GetLenAndIStdAndSprms(sal_Int32& rLen) const;
     530             : 
     531             :         /*
     532             :             ruft GetLenAndIStdAndSprms() auf...
     533             :         */
     534             :         const sal_uInt8* HasSprm( sal_uInt16 nId );
     535             :         bool HasSprm(sal_uInt16 nId, std::vector<const sal_uInt8 *> &rResult);
     536             : 
     537           0 :         const wwSprmParser &GetSprmParser() const { return maSprmParser; }
     538             :     };
     539             : 
     540             : private:
     541             :     SvStream* pFKPStrm;         // Input-File
     542             :     SvStream* pDataStrm;        // Input-File
     543             :     WW8PLCF* pPLCF;
     544             :     WW8Fkp* pFkp;
     545             : 
     546             :     /*
     547             :         Keep a cache of eMaxCache entries of previously seen pFkps, which
     548             :         speeds up considerably table parsing and load save plcfs for what turn
     549             :         out to be small text frames, which frames generally are
     550             : 
     551             :         size      : cache hits
     552             :         cache all : 19168 pap, 48 chp
     553             :         == 100    : 19166 pap, 48 chp
     554             :         == 50     : 18918 pap, 48 chp
     555             :         == 10     : 18549 pap, 47 chp
     556             :         == 5      : 18515 pap, 47 chp
     557             :     */
     558             :     typedef std::list<WW8Fkp*>::iterator myiter;
     559             :     std::list<WW8Fkp*> maFkpCache;
     560             :     enum Limits {eMaxCache = 5};
     561             : 
     562             :     bool NewFkp();
     563             : 
     564             :     //No copying
     565             :     WW8PLCFx_Fc_FKP(const WW8PLCFx_Fc_FKP&);
     566             :     WW8PLCFx_Fc_FKP& operator=(const WW8PLCFx_Fc_FKP&);
     567             : 
     568             : protected:
     569             :     ePLCFT ePLCF;
     570             :     WW8PLCFx_PCDAttrs* pPCDAttrs;
     571             : 
     572             : public:
     573             :     WW8PLCFx_Fc_FKP( SvStream* pSt, SvStream* pTblSt, SvStream* pDataSt,
     574             :         const WW8Fib& rFib, ePLCFT ePl, WW8_FC nStartFcL );
     575             :     virtual ~WW8PLCFx_Fc_FKP();
     576             :     virtual sal_uLong GetIdx() const SAL_OVERRIDE;
     577             :     virtual void SetIdx( sal_uLong nIdx ) SAL_OVERRIDE;
     578             :     virtual bool SeekPos(WW8_FC nFcPos) SAL_OVERRIDE;
     579             :     virtual WW8_FC Where() SAL_OVERRIDE;
     580             :     sal_uInt8* GetSprmsAndPos( WW8_FC& rStart, WW8_FC& rEnd, sal_Int32& rLen );
     581             :     virtual void advance() SAL_OVERRIDE;
     582             :     virtual sal_uInt16 GetIstd() const SAL_OVERRIDE;
     583             :     void GetPCDSprms( WW8PLCFxDesc& rDesc );
     584             :     const sal_uInt8* HasSprm( sal_uInt16 nId );
     585             :     bool HasSprm(sal_uInt16 nId, std::vector<const sal_uInt8 *> &rResult);
     586       20482 :     bool HasFkp() const { return (0 != pFkp); }
     587             : };
     588             : 
     589             : /// Iterator fuer Piece Table Exceptions of Fkps arbeitet auf CPs (High-Level)
     590             : class WW8PLCFx_Cp_FKP : public WW8PLCFx_Fc_FKP
     591             : {
     592             : private:
     593             :     const WW8ScannerBase& rSBase;
     594             :     WW8PLCFx_PCD* pPcd;
     595             :     WW8PLCFpcd_Iter *pPieceIter;
     596             :     WW8_CP nAttrStart, nAttrEnd;
     597             :     sal_uInt8 bLineEnd : 1;
     598             :     sal_uInt8 bComplex : 1;
     599             : 
     600             :     //No copying
     601             :     WW8PLCFx_Cp_FKP(const WW8PLCFx_Cp_FKP&);
     602             :     WW8PLCFx_Cp_FKP& operator=(const WW8PLCFx_Cp_FKP&);
     603             : 
     604             : public:
     605             :     WW8PLCFx_Cp_FKP( SvStream* pSt, SvStream* pTblSt, SvStream* pDataSt,
     606             :         const WW8ScannerBase& rBase,  ePLCFT ePl );
     607             :     virtual ~WW8PLCFx_Cp_FKP();
     608             :     void ResetAttrStartEnd();
     609             :     sal_uLong GetPCDIMax() const;
     610             :     sal_uLong GetPCDIdx() const;
     611             :     void SetPCDIdx( sal_uLong nIdx );
     612             :     virtual sal_uLong GetIdx2() const SAL_OVERRIDE;
     613             :     virtual void  SetIdx2( sal_uLong nIdx ) SAL_OVERRIDE;
     614             :     virtual bool SeekPos(WW8_CP nCpPos) SAL_OVERRIDE;
     615             :     virtual WW8_CP Where() SAL_OVERRIDE;
     616             :     virtual void GetSprms( WW8PLCFxDesc* p ) SAL_OVERRIDE;
     617             :     virtual void advance() SAL_OVERRIDE;
     618             :     virtual void Save( WW8PLCFxSave1& rSave ) const SAL_OVERRIDE;
     619             :     virtual void Restore( const WW8PLCFxSave1& rSave ) SAL_OVERRIDE;
     620             : };
     621             : 
     622             : /// Iterator for Piece Table Exceptions of Sepx
     623             : class WW8PLCFx_SEPX : public WW8PLCFx
     624             : {
     625             : private:
     626             :     wwSprmParser maSprmParser;
     627             :     SvStream* pStrm;
     628             :     WW8PLCF* pPLCF;
     629             :     sal_uInt8* pSprms;
     630             :     sal_uInt16 nArrMax;
     631             :     sal_uInt16 nSprmSiz;
     632             : 
     633             :     //no copying
     634             :     WW8PLCFx_SEPX(const WW8PLCFx_SEPX&);
     635             :     WW8PLCFx_SEPX& operator=(const WW8PLCFx_SEPX&);
     636             : 
     637             : public:
     638             :     WW8PLCFx_SEPX( SvStream* pSt, SvStream* pTblxySt, const WW8Fib& rFib,
     639             :         WW8_CP nStartCp );
     640             :     virtual ~WW8PLCFx_SEPX();
     641             :     virtual sal_uLong GetIdx() const SAL_OVERRIDE;
     642             :     virtual void SetIdx( sal_uLong nIdx ) SAL_OVERRIDE;
     643             :     long GetIMax() const { return ( pPLCF ) ? pPLCF->GetIMax() : 0; }
     644             :     virtual bool SeekPos(WW8_CP nCpPos) SAL_OVERRIDE;
     645             :     virtual WW8_FC Where() SAL_OVERRIDE;
     646             :     virtual void GetSprms( WW8PLCFxDesc* p ) SAL_OVERRIDE;
     647             :     virtual void advance() SAL_OVERRIDE;
     648             :     const sal_uInt8* HasSprm( sal_uInt16 nId ) const;
     649             :     const sal_uInt8* HasSprm( sal_uInt16 nId, sal_uInt8 n2nd ) const;
     650             :     const sal_uInt8* HasSprm( sal_uInt16 nId, const sal_uInt8* pOtherSprms,
     651             :         long nOtherSprmSiz ) const;
     652             :     bool Find4Sprms(sal_uInt16 nId1, sal_uInt16 nId2, sal_uInt16 nId3, sal_uInt16 nId4,
     653             :                     sal_uInt8*& p1,   sal_uInt8*& p2,   sal_uInt8*& p3,   sal_uInt8*& p4 ) const;
     654             : };
     655             : 
     656             : /// Iterator fuer Fuss-/Endnoten und Anmerkungen
     657             : class WW8PLCFx_SubDoc : public WW8PLCFx
     658             : {
     659             : private:
     660             :     WW8PLCF* pRef;
     661             :     WW8PLCF* pTxt;
     662             : 
     663             :     //No copying
     664             :     WW8PLCFx_SubDoc(const WW8PLCFx_SubDoc&);
     665             :     WW8PLCFx_SubDoc& operator=(const WW8PLCFx_SubDoc&);
     666             : 
     667             : public:
     668             :     WW8PLCFx_SubDoc(SvStream* pSt, ww::WordVersion eVersion, WW8_CP nStartCp,
     669             :     long nFcRef, long nLenRef, long nFcTxt, long nLenTxt, long nStruc = 0);
     670             :     virtual ~WW8PLCFx_SubDoc();
     671             :     virtual sal_uLong GetIdx() const SAL_OVERRIDE;
     672             :     virtual void SetIdx( sal_uLong nIdx ) SAL_OVERRIDE;
     673             :     virtual bool SeekPos(WW8_CP nCpPos) SAL_OVERRIDE;
     674             :     virtual WW8_FC Where() SAL_OVERRIDE;
     675             : 
     676             :     // liefert Reference Descriptoren
     677          16 :     const void* GetData( long nIdx = -1 ) const
     678             :     {
     679          16 :         return pRef ? pRef->GetData( -1L == nIdx ? pRef->GetIdx() : nIdx ) : 0;
     680             :     }
     681             : 
     682             :     //liefert Angabe, wo Kopf und Fusszeilen-Text zu finden ist
     683             :     bool Get(long& rStart, void*& rpValue) const;
     684             :     virtual void GetSprms(WW8PLCFxDesc* p) SAL_OVERRIDE;
     685             :     virtual void advance() SAL_OVERRIDE;
     686         146 :     long Count() const { return ( pRef ) ? pRef->GetIMax() : 0; }
     687             : };
     688             : 
     689             : /// Iterator for fields
     690             : class WW8PLCFx_FLD : public WW8PLCFx
     691             : {
     692             : private:
     693             :     WW8PLCFspecial* pPLCF;
     694             :     const WW8Fib& rFib;
     695             :     //No copying
     696             :     WW8PLCFx_FLD(const WW8PLCFx_FLD&);
     697             :     WW8PLCFx_FLD& operator=(const WW8PLCFx_FLD &);
     698             : 
     699             : public:
     700             :     WW8PLCFx_FLD(SvStream* pSt, const WW8Fib& rMyFib, short nType);
     701             :     virtual ~WW8PLCFx_FLD();
     702             :     virtual sal_uLong GetIdx() const SAL_OVERRIDE;
     703             :     virtual void SetIdx( sal_uLong nIdx ) SAL_OVERRIDE;
     704             :     virtual bool SeekPos(WW8_CP nCpPos) SAL_OVERRIDE;
     705             :     virtual WW8_FC Where() SAL_OVERRIDE;
     706             :     virtual void GetSprms(WW8PLCFxDesc* p) SAL_OVERRIDE;
     707             :     virtual void advance() SAL_OVERRIDE;
     708             :     bool StartPosIsFieldStart();
     709             :     bool EndPosIsFieldEnd(WW8_CP&);
     710             :     bool GetPara(long nIdx, WW8FieldDesc& rF);
     711             : };
     712             : 
     713             : enum eBookStatus { BOOK_NORMAL = 0, BOOK_IGNORE = 0x1, BOOK_FIELD = 0x2 };
     714             : 
     715             : /// Iterator for Booknotes
     716             : class WW8PLCFx_Book : public WW8PLCFx
     717             : {
     718             : private:
     719             :     WW8PLCFspecial* pBook[2];           // Start and End Position
     720             :     ::std::vector<OUString> aBookNames;   // Name
     721             :     eBookStatus* pStatus;
     722             :     long nIMax;                         // Number of Booknotes
     723             :     sal_uInt16 nIsEnd;
     724             :     sal_Int32 nBookmarkId; // counter incremented by GetUniqueBookmarkName.
     725             : 
     726             :     //No copying
     727             :     WW8PLCFx_Book(const WW8PLCFx_Book&);
     728             :     WW8PLCFx_Book& operator=(const WW8PLCFx_Book&);
     729             : 
     730             : public:
     731             :     WW8PLCFx_Book(SvStream* pTblSt,const WW8Fib& rFib);
     732             :     virtual ~WW8PLCFx_Book();
     733           0 :     long GetIMax() const { return nIMax; }
     734             :     virtual sal_uLong GetIdx() const SAL_OVERRIDE;
     735             :     virtual void SetIdx( sal_uLong nI ) SAL_OVERRIDE;
     736             :     virtual sal_uLong GetIdx2() const SAL_OVERRIDE;
     737             :     virtual void SetIdx2( sal_uLong nIdx ) SAL_OVERRIDE;
     738             :     virtual bool SeekPos(WW8_CP nCpPos) SAL_OVERRIDE;
     739             :     virtual WW8_FC Where() SAL_OVERRIDE;
     740             :     virtual long GetNoSprms( WW8_CP& rStart, WW8_CP& rEnd, sal_Int32& rLen ) SAL_OVERRIDE;
     741             :     virtual void advance() SAL_OVERRIDE;
     742             :     const OUString* GetName() const;
     743           0 :     WW8_CP GetStartPos() const
     744           0 :         { return ( nIsEnd ) ? WW8_CP_MAX : pBook[0]->Where(); }
     745             :     long GetLen() const;
     746          34 :     bool GetIsEnd() const { return nIsEnd ? true : false; }
     747             :     long GetHandle() const;
     748             :     void SetStatus( sal_uInt16 nIndex, eBookStatus eStat );
     749             :     bool MapName(OUString& rName);
     750             :     OUString GetBookmark(long nStart,long nEnd, sal_uInt16 &nIndex);
     751             :     eBookStatus GetStatus() const;
     752             :     OUString GetUniqueBookmarkName(const OUString &rSuggestedName);
     753             : };
     754             : 
     755             : /*
     756             :     hiermit arbeiten wir draussen:
     757             : */
     758             : struct WW8PLCFManResult
     759             : {
     760             :     WW8_CP nCpPos;      // Attribut-Anfangsposition
     761             :     long nMemLen;       // Laenge dazu
     762             :     long nCp2OrIdx;     // footnote-textpos oder Index in PLCF
     763             :     WW8_CP nAktCp;      // wird nur vom Aufrufer benutzt
     764             :     const sal_uInt8* pMemPos;// Mem-Pos fuer Sprms
     765             :     sal_uInt16 nSprmId;     // Sprm-Id ( 0 = ungueltige Id -> ueberspringen! )
     766             :                         // (2..255) oder Pseudo-Sprm-Id (256..260)
     767             :                         // bzw. ab Winword-Ver8 die Sprm-Id (800..)
     768             :     sal_uInt8 nFlags;        // Absatz- oder Section-Anfang
     769             : };
     770             : 
     771             : enum ManMaskTypes
     772             : {
     773             :     MAN_MASK_NEW_PAP = 1,       // neue Zeile
     774             :     MAN_MASK_NEW_SEP = 2        // neue Section
     775             : };
     776             : 
     777             : enum ManTypes // enums for PLCFMan-ctor
     778             : {
     779             :     MAN_MAINTEXT = 0, MAN_FTN = 1, MAN_EDN = 2, MAN_HDFT = 3, MAN_AND = 4,
     780             :     MAN_TXBX = 5, MAN_TXBX_HDFT = 6
     781             : };
     782             : 
     783             : /*
     784             :     hiermit arbeitet der Manager drinnen:
     785             : */
     786             : struct WW8PLCFxDesc
     787             : {
     788             :     WW8PLCFx* pPLCFx;
     789             :     ::std::stack<sal_uInt16>* pIdStk;  // Speicher fuer Attr-Id fuer Attr-Ende(n)
     790             :     const sal_uInt8* pMemPos;// wo liegen die Sprm(s)
     791             :     long nOrigSprmsLen;
     792             : 
     793             :     WW8_CP nStartPos;
     794             :     WW8_CP nEndPos;
     795             : 
     796             :     WW8_CP nOrigStartPos;
     797             :     WW8_CP nOrigEndPos;   // The ending character position of a paragraph is
     798             :                           // always one before the end reported in the FKP,
     799             :                           // also a character run that ends on the same location
     800             :                           // as the paragraph mark is adjusted to end just before
     801             :                           // the paragraph mark so as to handle their close
     802             :                           // first. The value being used to determing where the
     803             :                           // properties end is in nEndPos, but the original
     804             :                           // unadjusted end character position is important as
     805             :                           // it can be used as the beginning cp of the next set
     806             :                           // of properties
     807             : 
     808             :     WW8_CP nCp2OrIdx;     // wo liegen die NoSprm(s)
     809             :     sal_Int32 nSprmsLen;  // wie viele Bytes fuer weitere Sprms / Laenge Fussnote
     810             :     long nCpOfs;          // fuer Offset Header .. Footnote
     811             :     bool bFirstSprm;      // fuer Erkennung erster Sprm einer Gruppe
     812             :     bool bRealLineEnd;    // false bei Pap-Piece-Ende
     813             :     void Save( WW8PLCFxSave1& rSave ) const;
     814             :     void Restore( const WW8PLCFxSave1& rSave );
     815             :     //With nStartPos set to WW8_CP_MAX then in the case of a pap or chp
     816             :     //GetSprms will not search for the sprms, but instead take the
     817             :     //existing ones.
     818       50927 :     WW8PLCFxDesc()
     819             :         : pIdStk(0)
     820             :         , pMemPos(0)
     821             :         , nOrigSprmsLen(0)
     822             :         , nStartPos(WW8_CP_MAX)
     823             :         , nEndPos(WW8_CP_MAX)
     824             :         , nOrigStartPos(WW8_CP_MAX)
     825             :         , nOrigEndPos(WW8_CP_MAX)
     826             :         , nCp2OrIdx(WW8_CP_MAX)
     827             :         , nSprmsLen(0)
     828             :         , nCpOfs(0)
     829             :         , bFirstSprm(false)
     830       50927 :         , bRealLineEnd(false)
     831             :     {
     832       50927 :     }
     833             :     void ReduceByOffset();
     834             : };
     835             : 
     836             : #ifndef DUMP
     837             : 
     838             : struct WW8PLCFxSaveAll;
     839             : class WW8PLCFMan
     840             : {
     841             : public:
     842             :     enum WW8PLCFManLimits {MAN_ANZ_PLCF = 10};
     843             : 
     844             : private:
     845             :     wwSprmParser maSprmParser;
     846             :     long nCpO;                      // Origin Cp -- the basis for nNewCp
     847             : 
     848             :     WW8_CP nLineEnd;                // zeigt *hinter* das <CR>
     849             :     long nLastWhereIdxCp;           // last result of WhereIdx()
     850             :     sal_uInt16 nPLCF;                   // so viele PLCFe werden verwaltet
     851             :     ManTypes nManType;
     852             :     bool mbDoingDrawTextBox;        //Normally we adjust the end of attributes
     853             :                                     //so that the end of a paragraph occurs
     854             :                                     //before the para end mark, but for
     855             :                                     //drawboxes we want the true offsets
     856             : 
     857             :     WW8PLCFxDesc aD[MAN_ANZ_PLCF];
     858             :     WW8PLCFxDesc *pChp, *pPap, *pSep, *pFld, *pFtn, *pEdn, *pBkm, *pPcd,
     859             :         *pPcdA, *pAnd;
     860             :     WW8PLCFspecial *pFdoa, *pTxbx, *pTxbxBkd,*pMagicTables, *pSubdocs;
     861             :     sal_uInt8* pExtendedAtrds;
     862             : 
     863             :     const WW8Fib* pWwFib;
     864             : 
     865             :     sal_uInt16 WhereIdx(bool* pbStart=0, long* pPos=0) const;
     866             :     void AdjustEnds(WW8PLCFxDesc& rDesc);
     867             :     void GetNewSprms(WW8PLCFxDesc& rDesc);
     868             :     void GetNewNoSprms(WW8PLCFxDesc& rDesc);
     869             :     void GetSprmStart(short nIdx, WW8PLCFManResult* pRes) const;
     870             :     void GetSprmEnd(short nIdx, WW8PLCFManResult* pRes) const;
     871             :     void GetNoSprmStart(short nIdx, WW8PLCFManResult* pRes) const;
     872             :     void GetNoSprmEnd(short nIdx, WW8PLCFManResult* pRes) const;
     873             :     void AdvSprm(short nIdx, bool bStart);
     874             :     void AdvNoSprm(short nIdx, bool bStart);
     875             :     sal_uInt16 GetId(const WW8PLCFxDesc* p ) const;
     876             : 
     877             : public:
     878             :     WW8PLCFMan(WW8ScannerBase* pBase, ManTypes nType, long nStartCp,
     879             :         bool bDoingDrawTextBox = false);
     880             :     ~WW8PLCFMan();
     881             : 
     882             :     /*
     883             :         Where fragt, an welcher naechsten Position sich irgendein
     884             :         Attr aendert...
     885             :     */
     886             :     WW8_CP Where() const;
     887             : 
     888             :     bool Get(WW8PLCFManResult* pResult) const;
     889             :     void advance();
     890             :     sal_uInt16 GetColl() const; // index of actual Style
     891             :     WW8PLCFx_FLD* GetFld() const;
     892           0 :     WW8PLCFx_SubDoc* GetEdn() const { return (WW8PLCFx_SubDoc*)pEdn->pPLCFx; }
     893           2 :     WW8PLCFx_SubDoc* GetFtn() const { return (WW8PLCFx_SubDoc*)pFtn->pPLCFx; }
     894          15 :     WW8PLCFx_SubDoc* GetAtn() const { return (WW8PLCFx_SubDoc*)pAnd->pPLCFx; }
     895          36 :     WW8PLCFx_Book* GetBook() const { return (WW8PLCFx_Book*)pBkm->pPLCFx; }
     896       91535 :     long GetCpOfs() const { return pChp->nCpOfs; }  // for Header/Footer...
     897             : 
     898             :     /* fragt, ob *aktueller Absatz* einen Sprm diesen Typs hat */
     899             :     const sal_uInt8* HasParaSprm( sal_uInt16 nId ) const;
     900             : 
     901             :     /* fragt, ob *aktueller Textrun* einen Sprm diesen Typs hat */
     902             :     const sal_uInt8* HasCharSprm( sal_uInt16 nId ) const;
     903             :     bool HasCharSprm(sal_uInt16 nId, std::vector<const sal_uInt8 *> &rResult) const;
     904             : 
     905        3502 :     WW8PLCFx_Cp_FKP* GetChpPLCF() const
     906        3502 :         { return (WW8PLCFx_Cp_FKP*)pChp->pPLCFx; }
     907        4437 :     WW8PLCFx_Cp_FKP* GetPapPLCF() const
     908        4437 :         { return (WW8PLCFx_Cp_FKP*)pPap->pPLCFx; }
     909         202 :     WW8PLCFx_SEPX* GetSepPLCF() const
     910         202 :         { return (WW8PLCFx_SEPX*)pSep->pPLCFx; }
     911        3654 :     WW8PLCFxDesc* GetPap() const { return pPap; }
     912             :     bool TransferOpenSprms(std::stack<sal_uInt16> &rStack);
     913             :     void SeekPos( long nNewCp );
     914             :     void SaveAllPLCFx( WW8PLCFxSaveAll& rSave ) const;
     915             :     void RestoreAllPLCFx( const WW8PLCFxSaveAll& rSave );
     916          85 :     WW8PLCFspecial* GetFdoa() const { return pFdoa; }
     917          86 :     WW8PLCFspecial* GetTxbx() const { return pTxbx; }
     918          80 :     WW8PLCFspecial* GetTxbxBkd() const { return pTxbxBkd; }
     919         108 :     WW8PLCFspecial* GetMagicTables() const { return pMagicTables; }
     920          86 :     WW8PLCFspecial* GetWkbPLCF() const { return pSubdocs; }
     921          15 :     sal_uInt8* GetExtendedAtrds() const { return pExtendedAtrds; }
     922         170 :     ManTypes GetManType() const { return nManType; }
     923       85551 :     bool GetDoingDrawTextBox() const { return mbDoingDrawTextBox; }
     924             : };
     925             : 
     926             : struct WW8PLCFxSaveAll
     927             : {
     928             :     WW8PLCFxSave1 aS[WW8PLCFMan::MAN_ANZ_PLCF];
     929             : };
     930             : 
     931             : #endif // !DUMP
     932             : 
     933             : class WW8ScannerBase
     934             : {
     935             : friend WW8PLCFx_PCDAttrs::WW8PLCFx_PCDAttrs(ww::WordVersion eVersion,
     936             :     WW8PLCFx_PCD* pPLCFx_PCD, const WW8ScannerBase* pBase );
     937             : friend WW8PLCFx_Cp_FKP::WW8PLCFx_Cp_FKP( SvStream*, SvStream*, SvStream*,
     938             :     const WW8ScannerBase&, ePLCFT );
     939             : 
     940             : #ifndef DUMP
     941             : friend WW8PLCFMan::WW8PLCFMan(WW8ScannerBase*, ManTypes, long, bool);
     942             : friend class SwWW8FltControlStack;
     943             : #endif
     944             : 
     945             : private:
     946             :     WW8Fib* pWw8Fib;
     947             :     WW8PLCFx_Cp_FKP*  pChpPLCF;         // Character-Attrs
     948             :     WW8PLCFx_Cp_FKP*  pPapPLCF;         // Para-Attrs
     949             :     WW8PLCFx_SEPX*    pSepPLCF;         // Section-Attrs
     950             :     WW8PLCFx_SubDoc*  pFtnPLCF;         // Footnotes
     951             :     WW8PLCFx_SubDoc*  pEdnPLCF;         // EndNotes
     952             :     WW8PLCFx_SubDoc*  pAndPLCF;         // Anmerkungen
     953             :     WW8PLCFx_FLD*     pFldPLCF;         // Fields in Main Text
     954             :     WW8PLCFx_FLD*     pFldHdFtPLCF;     // Fields in Header / Footer
     955             :     WW8PLCFx_FLD*     pFldTxbxPLCF;     // Fields in Textboxes in Main Text
     956             :     WW8PLCFx_FLD*     pFldTxbxHdFtPLCF; // Fields in Textboxes in Header / Footer
     957             :     WW8PLCFx_FLD*     pFldFtnPLCF;      // Fields in Footnotes
     958             :     WW8PLCFx_FLD*     pFldEdnPLCF;      // Fields in Endnotes
     959             :     WW8PLCFx_FLD*     pFldAndPLCF;      // Fields in Anmerkungen
     960             :     WW8PLCFspecial*   pMainFdoa;        // Graphic Primitives in Main Text
     961             :     WW8PLCFspecial*   pHdFtFdoa;        // Graphic Primitives in Header / Footer
     962             :     WW8PLCFspecial*   pMainTxbx;        // Textboxen in Main Text
     963             :     WW8PLCFspecial*   pMainTxbxBkd;     // Break-Deskriptoren fuer diese
     964             :     WW8PLCFspecial*   pHdFtTxbx;        // TextBoxen in Header / Footer
     965             :     WW8PLCFspecial*   pHdFtTxbxBkd;     // Break-Deskriptoren fuer diese
     966             :     WW8PLCFspecial*   pMagicTables;     // Break-Deskriptoren fuer diese
     967             :     WW8PLCFspecial*   pSubdocs;         // subdoc references in master document
     968             :     sal_uInt8*        pExtendedAtrds;   // Extended ATRDs
     969             :     WW8PLCFx_Book*    pBook;            // Bookmarks
     970             : 
     971             :     WW8PLCFpcd*         pPiecePLCF; // fuer FastSave ( Basis-PLCF ohne Iterator )
     972             :     WW8PLCFpcd_Iter*    pPieceIter; // fuer FastSave ( Iterator dazu )
     973             :     WW8PLCFx_PCD*       pPLCFx_PCD;     // dito
     974             :     WW8PLCFx_PCDAttrs*  pPLCFx_PCDAttrs;
     975             :     sal_uInt8**         pPieceGrpprls;  // Attribute an Piece-Table
     976             :     sal_uInt16          nPieceGrpprls;  // Anzahl davon
     977             : 
     978             :     WW8PLCFpcd* OpenPieceTable( SvStream* pStr, const WW8Fib* pWwF );
     979             :     void DeletePieceTable();
     980             : 
     981             : public:
     982             :     WW8ScannerBase( SvStream* pSt, SvStream* pTblSt, SvStream* pDataSt,
     983             :         WW8Fib* pWwF );
     984             :     ~WW8ScannerBase();
     985          73 :     bool AreThereFootnotes() const { return pFtnPLCF->Count() > 0; };
     986          73 :     bool AreThereEndnotes()  const { return pEdnPLCF->Count() > 0; };
     987             : 
     988             :     //If you use WW8Fc2Cp you are almost certainly doing the wrong thing
     989             :     //when it comes to fastsaved files, avoid like the plague. For export
     990             :     //given that we never write fastsaved files you can use it, otherwise
     991             :     //I will beat you with a stick
     992             :     WW8_CP WW8Fc2Cp(WW8_FC nFcPos) const ;
     993             :     WW8_FC WW8Cp2Fc(WW8_CP nCpPos, bool* pIsUnicode = 0,
     994             :         WW8_CP* pNextPieceCp = 0, bool* pTestFlag = 0) const;
     995             : 
     996             :     sal_Int32 WW8ReadString(SvStream& rStrm, OUString& rStr, WW8_CP nAktStartCp,
     997             :         long nTotalLen, rtl_TextEncoding eEnc ) const;
     998             : 
     999             : };
    1000             : 
    1001             : /** FIB - the File Information Block
    1002             : 
    1003             :     The FIB contains a "magic word" and pointers to the various other parts of
    1004             :     the file, as well as information about the length of the file.
    1005             :     The FIB starts at the beginning of the file.
    1006             : */
    1007             : class WW8Fib
    1008             : {
    1009             : private:
    1010             :     sal_Unicode nNumDecimalSep;
    1011             : 
    1012             : public:
    1013             :     /**
    1014             :         Program-Version asked for by us:
    1015             :         in Ctor we check if it matches the value of nFib
    1016             : 
    1017             :         6 == "WinWord 6 or WinWord 95",
    1018             :         7 == "only WinWord 95"
    1019             :         8 == "WinWord 97 or newer"
    1020             :     */
    1021             :     sal_uInt8 nVersion;
    1022             :     /*
    1023             :         error status
    1024             :     */
    1025             :     sal_uLong nFibError;
    1026             :     /*
    1027             :         vom Ctor aus dem FIB gelesene Daten
    1028             :         (entspricht nur ungefaehr der tatsaechlichen Struktur
    1029             :          des Winword-FIB)
    1030             :     */
    1031             :     sal_uInt16 wIdent;      // 0x0 int magic number
    1032             :     /*
    1033             :         File Information Block (FIB) values:
    1034             :         WinWord 1.0 = 33
    1035             :         WinWord 2.0 = 45
    1036             :         WinWord 6.0c for 16bit = 101
    1037             :         Word 6/32 bit = 104
    1038             :         Word 95 = 104
    1039             :         Word 97 = 193
    1040             :         Word 2000 = 217
    1041             :         Word 2002 = 257
    1042             :         Word 2003 = 268
    1043             :         Word 2007 = 274
    1044             :     */
    1045             :     sal_uInt16 nFib;        // 0x2 FIB version written
    1046             :     sal_uInt16 nProduct;    // 0x4 product version written by
    1047             :     sal_Int16 lid;          // 0x6 language stamp---localized version;
    1048             :     WW8_PN pnNext;          // 0x8
    1049             : 
    1050             :     bool fDot :1;     // 0xa 0001
    1051             :     bool fGlsy :1;
    1052             :     bool fComplex :1; // 0004 when 1, file is in complex, fast-saved format.
    1053             :     bool fHasPic :1;  // 0008 file contains 1 or more pictures
    1054             :     sal_uInt16 cQuickSaves :4; // 00F0 count of times file was quicksaved
    1055             :     bool fEncrypted :1; //0100 1 if file is encrypted, 0 if not
    1056             :     bool fWhichTblStm :1; //0200 When 0, this fib refers to the table stream
    1057             :     bool fReadOnlyRecommended :1;
    1058             :     bool fWriteReservation :1;
    1059             :                                                     // named "0Table", when 1, this fib refers to the
    1060             :                                                     // table stream named "1Table". Normally, a file
    1061             :                                                     // will have only one table stream, but under unusual
    1062             :                                                     // circumstances a file may have table streams with
    1063             :                                                     // both names. In that case, this flag must be used
    1064             :                                                     // to decide which table stream is valid.
    1065             : 
    1066             :     bool fExtChar :1; // 1000 =1, when using extended character set in file
    1067             :     bool fFarEast :1; // 4000 =1, probably, when far-East language vaiants of Word is used to create a file #i90932#
    1068             : 
    1069             :     bool fObfuscated :1; // 8000=1. specifies whether the document is obfuscated using XOR obfuscation. otherwise this bit MUST be ignored.
    1070             : 
    1071             :     sal_uInt16 nFibBack;    // 0xc
    1072             :     sal_uInt16 nHash;       // 0xe  file encrypted hash
    1073             :     sal_uInt16 nKey;        // 0x10  file encrypted key
    1074             :     sal_uInt8 envr;         // 0x12 environment in which file was created
    1075             :                                     //      0 created by Win Word / 1 created by Mac Word
    1076             :     bool fMac              :1;          // 0x13 when 1, this file was last saved in the Mac environment
    1077             :     bool fEmptySpecial     :1;
    1078             :     bool fLoadOverridePage :1;
    1079             :     bool fFuturesavedUndo  :1;
    1080             :     bool fWord97Saved      :1;
    1081             :     bool fWord2000Saved    :1;
    1082             :     sal_uInt8 :2;
    1083             : 
    1084             :     sal_uInt16 chse;        // 0x14 default extended character set id for text in document stream. (overidden by chp.chse)
    1085             :                         //      0 = ANSI  / 256 Macintosh character set.
    1086             :     sal_uInt16 chseTables;  // 0x16 default extended character set id for text in
    1087             :                         //      internal data structures: 0 = ANSI, 256 = Macintosh
    1088             :     WW8_FC fcMin;           // 0x18 file offset of first character of text
    1089             :     WW8_FC fcMac;           // 0x1c file offset of last character of text + 1
    1090             : 
    1091             :     // Einschub fuer WW8 *****************************************************
    1092             :     sal_uInt16 csw;             // Count of fields in the array of "shorts"
    1093             : 
    1094             :     // Marke: "rgsw" Beginning of the array of shorts
    1095             :     sal_uInt16 wMagicCreated;   // unique number Identifying the File's creator
    1096             :                                 // 0x6A62 is the creator ID for Word and is reserved.
    1097             :                                 // Other creators should choose a different value.
    1098             :     sal_uInt16 wMagicRevised;   // identifies the File's last modifier
    1099             :     sal_uInt16 wMagicCreatedPrivate; // private data
    1100             :     sal_uInt16 wMagicRevisedPrivate; // private data
    1101             : 
    1102             :     sal_Int16  lidFE; // Language id if document was written by Far East version
    1103             :                       // of Word (i.e. FIB.fFarEast is on)
    1104             :     sal_uInt16 clw; // Number of fields in the array of longs
    1105             : 
    1106             :     // Ende des Einschubs fuer WW8 *******************************************
    1107             : 
    1108             :     // Marke: "rglw" Beginning of the array of longs
    1109             :     WW8_FC cbMac;           // 0x20 file offset of last byte written to file + 1.
    1110             : 
    1111             :     // WW8_FC u4[4];        // 0x24
    1112             :     WW8_CP ccpText;         // 0x34 length of main document text stream
    1113             :     WW8_CP ccpFtn;          // 0x38 length of footnote subdocument text stream
    1114             :     WW8_CP ccpHdr;          // 0x3c length of header subdocument text stream
    1115             :     WW8_CP ccpMcr;          // 0x40 length of macro subdocument text stream
    1116             :     WW8_CP ccpAtn;          // 0x44 length of annotation subdocument text stream
    1117             :     WW8_CP ccpEdn;          // 0x48 length of endnote subdocument text stream
    1118             :     WW8_CP ccpTxbx;         // 0x4c length of textbox subdocument text stream
    1119             :     WW8_CP ccpHdrTxbx;      // 0x50 length of header textbox subdocument text stream
    1120             : 
    1121             :     // Einschub fuer WW8 *****************************************************
    1122             :     sal_Int32  pnFbpChpFirst; // when there was insufficient memory for Word to expand
    1123             :                               // the PLCFbte at save time, the PLCFbte is written
    1124             :                               // to the file in a linked list of 512-byte pieces
    1125             :                               // starting with this pn.
    1126             :     sal_Int32  pnFbpPapFirst; // when there was insufficient memory for Word to expand
    1127             :                               // the PLCFbte at save time, the PLCFbte is written to
    1128             :                               // the file in a linked list of 512-byte pieces
    1129             :                               // starting with this pn
    1130             : 
    1131             :     sal_Int32  pnFbpLvcFirst; // when there was insufficient memory for Word to expand
    1132             :                               // the PLCFbte at save time, the PLCFbte is written to
    1133             :                               // the file in a linked list of 512-byte pieces
    1134             :                               // starting with this pn
    1135             :     sal_Int32  pnLvcFirst; // the page number of the lowest numbered page in the
    1136             :                            // document that records LVC FKP information
    1137             :     sal_Int32  cpnBteLvc;  // count of LVC FKPs recorded in file. In non-complex
    1138             :                            // files if the number of entries in the PLCFbtePapx is
    1139             :                            // less than this, the PLCFbtePapx is incomplete.
    1140             :     sal_Int32  fcIslandFirst;   // ?
    1141             :     sal_Int32  fcIslandLim;     // ?
    1142             :     sal_uInt16 cfclcb; // Number of fields in the array of FC/LCB pairs.
    1143             : 
    1144             :     // Ende des Einschubs fuer WW8 *******************************************
    1145             : 
    1146             :     // Marke: "rgfclcb" Beginning of array of FC/LCB pairs.
    1147             :     WW8_FC fcStshfOrig;     // file offset of original allocation for STSH in table
    1148             :                                                 // stream. During fast save Word will attempt to reuse
    1149             :                                                 // this allocation if STSH is small enough to fit.
    1150             :     sal_Int32 lcbStshfOrig; // 0x5c count of bytes of original STSH allocation
    1151             :     WW8_FC fcStshf;         // 0x60 file offset of STSH in file.
    1152             :     sal_Int32 lcbStshf;     // 0x64 count of bytes of current STSH allocation
    1153             :     WW8_FC fcPlcffndRef;    // 0x68 file offset of footnote reference PLCF.
    1154             :     sal_Int32 lcbPlcffndRef;    // 0x6c count of bytes of footnote reference PLCF
    1155             :                         //      == 0 if no footnotes defined in document.
    1156             : 
    1157             :     WW8_FC fcPlcffndTxt;    // 0x70 file offset of footnote text PLCF.
    1158             :     sal_Int32 lcbPlcffndTxt;    // 0x74 count of bytes of footnote text PLCF.
    1159             :                         //      == 0 if no footnotes defined in document
    1160             : 
    1161             :     WW8_FC fcPlcfandRef;    // 0x78 file offset of annotation reference PLCF.
    1162             :     sal_Int32 lcbPlcfandRef;    // 0x7c count of bytes of annotation reference PLCF.
    1163             : 
    1164             :     WW8_FC fcPlcfandTxt;    // 0x80 file offset of annotation text PLCF.
    1165             :     sal_Int32 lcbPlcfandTxt;    // 0x84 count of bytes of the annotation text PLCF
    1166             : 
    1167             :     WW8_FC fcPlcfsed;       // 8x88 file offset of section descriptor PLCF.
    1168             :     sal_Int32 lcbPlcfsed;   // 0x8c count of bytes of section descriptor PLCF.
    1169             : 
    1170             :     WW8_FC fcPlcfpad;       // 0x90 file offset of paragraph descriptor PLCF
    1171             :     sal_Int32 lcbPlcfpad;   // 0x94 count of bytes of paragraph descriptor PLCF.
    1172             :                         // ==0 if file was never viewed in Outline view.
    1173             :                         // Should not be written by third party creators
    1174             : 
    1175             :     WW8_FC fcPlcfphe;       // 0x98 file offset of PLCF of paragraph heights.
    1176             :     sal_Int32 lcbPlcfphe;   // 0x9c count of bytes of paragraph height PLCF.
    1177             :                         // ==0 when file is non-complex.
    1178             : 
    1179             :     WW8_FC fcSttbfglsy;     // 0xa0 file offset of glossary string table.
    1180             :     sal_Int32 lcbSttbfglsy; // 0xa4 count of bytes of glossary string table.
    1181             :                         //      == 0 for non-glossary documents.
    1182             :                         //      !=0 for glossary documents.
    1183             : 
    1184             :     WW8_FC fcPlcfglsy;      // 0xa8 file offset of glossary PLCF.
    1185             :     sal_Int32 lcbPlcfglsy;  // 0xac count of bytes of glossary PLCF.
    1186             :                         //      == 0 for non-glossary documents.
    1187             :                         //      !=0 for glossary documents.
    1188             : 
    1189             :     WW8_FC fcPlcfhdd;       // 0xb0 byte offset of header PLCF.
    1190             :     sal_Int32 lcbPlcfhdd;   // 0xb4 count of bytes of header PLCF.
    1191             :                         //      == 0 if document contains no headers
    1192             : 
    1193             :     WW8_FC fcPlcfbteChpx;   // 0xb8 file offset of character property bin table.PLCF.
    1194             :     sal_Int32 lcbPlcfbteChpx;// 0xbc count of bytes of character property bin table PLCF.
    1195             : 
    1196             :     WW8_FC fcPlcfbtePapx;   // 0xc0 file offset of paragraph property bin table.PLCF.
    1197             :     sal_Int32 lcbPlcfbtePapx;// 0xc4 count of bytes of paragraph  property bin table PLCF.
    1198             : 
    1199             :     WW8_FC fcPlcfsea;       // 0xc8 file offset of PLCF reserved for private use. The SEA is 6 bytes long.
    1200             :     sal_Int32 lcbPlcfsea;   // 0xcc count of bytes of private use PLCF.
    1201             : 
    1202             :     WW8_FC fcSttbfffn;      // 0xd0 file offset of font information STTBF. See the FFN file structure definition.
    1203             :     sal_Int32 lcbSttbfffn;  // 0xd4 count of bytes in sttbfffn.
    1204             : 
    1205             :     WW8_FC fcPlcffldMom;    // 0xd8 offset in doc stream to the PLCF of field positions in the main document.
    1206             :     sal_Int32 lcbPlcffldMom;    // 0xdc
    1207             : 
    1208             :     WW8_FC fcPlcffldHdr;    // 0xe0 offset in doc stream to the PLCF of field positions in the header subdocument.
    1209             :     sal_Int32 lcbPlcffldHdr;    // 0xe4
    1210             : 
    1211             :     WW8_FC fcPlcffldFtn;    // 0xe8 offset in doc stream to the PLCF of field positions in the footnote subdocument.
    1212             :     sal_Int32 lcbPlcffldFtn;    // 0xec
    1213             : 
    1214             :     WW8_FC fcPlcffldAtn;    // 0xf0 offset in doc stream to the PLCF of field positions in the annotation subdocument.
    1215             :     sal_Int32 lcbPlcffldAtn;    // 0xf4
    1216             : 
    1217             :     WW8_FC fcPlcffldMcr;    // 0xf8 offset in doc stream to the PLCF of field positions in the macro subdocument.
    1218             :     sal_Int32 lcbPlcffldMcr;    // 9xfc
    1219             : 
    1220             :     WW8_FC fcSttbfbkmk; // 0x100 offset in document stream of the STTBF that records bookmark names in the main document
    1221             :     sal_Int32 lcbSttbfbkmk; // 0x104
    1222             : 
    1223             :     WW8_FC fcPlcfbkf;   // 0x108 offset in document stream of the PLCF that records the beginning CP offsets of bookmarks in the main document. See BKF
    1224             :     sal_Int32 lcbPlcfbkf;   // 0x10c
    1225             : 
    1226             :     WW8_FC fcPlcfbkl;   // 0x110 offset in document stream of the PLCF that records the ending CP offsets of bookmarks recorded in the main document. See the BKL structure definition.
    1227             :     sal_Int32 lcbPlcfbkl;   // 0x114 sal_Int32
    1228             : 
    1229             :     WW8_FC fcCmds;      // 0x118 FC
    1230             :     sal_Int32 lcbCmds;      // 0x11c
    1231             : 
    1232             :     WW8_FC fcPlcfmcr;       // 0x120 FC
    1233             :     sal_Int32 lcbPlcfmcr;       // 0x124
    1234             : 
    1235             :     WW8_FC fcSttbfmcr;  // 0x128 FC
    1236             :     sal_Int32 lcbSttbfmcr;  // 0x12c
    1237             : 
    1238             :     WW8_FC fcPrDrvr;        // 0x130 file offset of the printer driver information (names of drivers, port etc...)
    1239             :     sal_Int32 lcbPrDrvr;        // 0x134 count of bytes of the printer driver information (names of drivers, port etc...)
    1240             : 
    1241             :     WW8_FC fcPrEnvPort; // 0x138 file offset of the print environment in portrait mode.
    1242             :     sal_Int32 lcbPrEnvPort; // 0x13c count of bytes of the print environment in portrait mode.
    1243             : 
    1244             :     WW8_FC fcPrEnvLand; // 0x140 file offset of the print environment in landscape mode.
    1245             :     sal_Int32 lcbPrEnvLand; // 0x144 count of bytes of the print environment in landscape mode.
    1246             : 
    1247             :     WW8_FC fcWss;       // 0x148 file offset of Window Save State data structure. See WSS.
    1248             :     sal_Int32 lcbWss;       // 0x14c count of bytes of WSS. ==0 if unable to store the window state.
    1249             : 
    1250             :     WW8_FC fcDop;       // 0x150 file offset of document property data structure.
    1251             :     sal_uInt32 lcbDop;       // 0x154 count of bytes of document properties.
    1252             :         // cbDOP is 84 when nFib < 103
    1253             : 
    1254             :     WW8_FC fcSttbfAssoc;    // 0x158 offset to STTBF of associated strings. See STTBFASSOC.
    1255             :     sal_Int32 lcbSttbfAssoc; // 0x15C
    1256             : 
    1257             :     WW8_FC fcClx;           // 0x160 file  offset of beginning of information for complex files.
    1258             :     sal_Int32 lcbClx;       // 0x164 count of bytes of complex file information. 0 if file is non-complex.
    1259             : 
    1260             :     WW8_FC fcPlcfpgdFtn;    // 0x168 file offset of page descriptor PLCF for footnote subdocument.
    1261             :     sal_Int32 lcbPlcfpgdFtn;    // 0x16C count of bytes of page descriptor PLCF for footnote subdocument.
    1262             :                         //  ==0 if document has not been paginated. The length of the PGD is 8 bytes.
    1263             : 
    1264             :     WW8_FC fcAutosaveSource;    // 0x170 file offset of the name of the original file.
    1265             :     sal_Int32 lcbAutosaveSource;    // 0x174 count of bytes of the name of the original file.
    1266             : 
    1267             :     WW8_FC fcGrpStAtnOwners;    // 0x178 group of strings recording the names of the owners of annotations
    1268             :     sal_Int32 lcbGrpStAtnOwners;    // 0x17C count of bytes of the group of strings
    1269             : 
    1270             :     WW8_FC fcSttbfAtnbkmk;  // 0x180 file offset of the sttbf that records names of bookmarks in the annotation subdocument
    1271             :     sal_Int32 lcbSttbfAtnbkmk;  // 0x184 length in bytes of the sttbf that records names of bookmarks in the annotation subdocument
    1272             : 
    1273             :     // Ende des Einschubs fuer WW67 ******************************************
    1274             : 
    1275             :     WW8_FC fcPlcfdoaMom;    // 0x192 file offset of the  FDOA (drawn object) PLCF for main document.
    1276             :                         //  ==0 if document has no drawn objects. The length of the FDOA is 6 bytes.
    1277             :                         // ab Ver8 unused
    1278             :     sal_Int32 lcbPlcfdoaMom;    // 0x196 length in bytes of the FDOA PLCF of the main document
    1279             :                                                 // ab Ver8 unused
    1280             :     WW8_FC fcPlcfdoaHdr;    // 0x19A file offset of the  FDOA (drawn object) PLCF for the header document.
    1281             :                         //  ==0 if document has no drawn objects. The length of the FDOA is 6 bytes.
    1282             :                         // ab Ver8 unused
    1283             :     sal_Int32 lcbPlcfdoaHdr;    // 0x19E length in bytes of the FDOA PLCF of the header document
    1284             :                                                 // ab Ver8 unused
    1285             : 
    1286             :     WW8_FC fcPlcfspaMom;        // offset in table stream of the FSPA PLCF for main document.
    1287             :                                                 // == 0 if document has no office art objects
    1288             :                                                         // war in Ver67 nur leere Reserve
    1289             :     sal_Int32 lcbPlcfspaMom;        // length in bytes of the FSPA PLCF of the main document
    1290             :                                                         // war in Ver67 nur leere Reserve
    1291             :     WW8_FC fcPlcfspaHdr;        // offset in table stream of the FSPA PLCF for header document.
    1292             :                                                 // == 0 if document has no office art objects
    1293             :                                                         // war in Ver67 nur leere Reserve
    1294             :     sal_Int32 lcbPlcfspaHdr;        // length in bytes of the FSPA PLCF of the header document
    1295             :                                                         // war in Ver67 nur leere Reserve
    1296             : 
    1297             :     WW8_FC fcPlcfAtnbkf;    // 0x1B2 file offset of BKF (bookmark first) PLCF of the annotation subdocument
    1298             :     sal_Int32 lcbPlcfAtnbkf;    // 0x1B6 length in bytes of BKF (bookmark first) PLCF of the annotation subdocument
    1299             : 
    1300             :     WW8_FC fcPlcfAtnbkl;    // 0x1BA file offset of BKL (bookmark last) PLCF of the annotation subdocument
    1301             :     sal_Int32 lcbPlcfAtnbkl;    // 0x1BE length in bytes of BKL (bookmark first) PLCF of the annotation subdocument
    1302             : 
    1303             :     WW8_FC fcPms;       // 0x1C2 file offset of PMS (Print Merge State) information block
    1304             :     sal_Int32 lcbPMS;       // 0x1C6 length in bytes of PMS
    1305             : 
    1306             :     WW8_FC fcFormFldSttbf;  // 0x1CA file offset of form field Sttbf which contains strings used in form field dropdown controls
    1307             :     sal_Int32 lcbFormFldSttbf;  // 0x1CE length in bytes of form field Sttbf
    1308             : 
    1309             :     WW8_FC fcPlcfendRef;    // 0x1D2 file offset of PLCFendRef which points to endnote references in the main document stream
    1310             :     sal_Int32 lcbPlcfendRef;    // 0x1D6
    1311             : 
    1312             :     WW8_FC fcPlcfendTxt;    // 0x1DA file offset of PLCFendRef which points to endnote text  in the endnote document
    1313             :                         //       stream which corresponds with the PLCFendRef
    1314             :     sal_Int32 lcbPlcfendTxt;    // 0x1DE
    1315             : 
    1316             :     WW8_FC fcPlcffldEdn;    // 0x1E2 offset to PLCF of field positions in the endnote subdoc
    1317             :     sal_Int32 lcbPlcffldEdn;    // 0x1E6
    1318             : 
    1319             :     WW8_FC  fcPlcfpgdEdn;   // 0x1EA offset to PLCF of page boundaries in the endnote subdoc.
    1320             :     sal_Int32 lcbPlcfpgdEdn;        // 0x1EE
    1321             : 
    1322             :     WW8_FC fcDggInfo;           // offset in table stream of the office art object table data.
    1323             :                                                 // The format of office art object table data is found in a separate document.
    1324             :                                                         // war in Ver67 nur leere Reserve
    1325             :     sal_Int32 lcbDggInfo;           // length in bytes of the office art object table data
    1326             :                                                         // war in Ver67 nur leere Reserve
    1327             : 
    1328             :     WW8_FC fcSttbfRMark;        // 0x1fa offset to STTBF that records the author abbreviations...
    1329             :     sal_Int32 lcbSttbfRMark;        // 0x1fe
    1330             :     WW8_FC fcSttbfCaption;  // 0x202 offset to STTBF that records caption titles...
    1331             :     sal_Int32 lcbSttbfCaption;  // 0x206
    1332             :     WW8_FC fcSttbAutoCaption;   // offset in table stream to the STTBF that records the object names and
    1333             :                                                         // indices into the caption STTBF for objects which get auto captions.
    1334             :     sal_Int32 lcbSttbAutoCaption;   // 0x20e
    1335             : 
    1336             :     WW8_FC fcPlcfwkb;       // 0x212 offset to PLCF that describes the boundaries of contributing documents...
    1337             :     sal_Int32 lcbPlcfwkb;       // 0x216
    1338             : 
    1339             :     WW8_FC fcPlcfspl;       // offset in table stream of PLCF (of SPLS structures) that records spell check state
    1340             :                                                         // war in Ver67 nur leere Reserve
    1341             :     sal_Int32 lcbPlcfspl;                   // war in Ver67 nur leere Reserve
    1342             : 
    1343             :     WW8_FC fcPlcftxbxTxt;   // 0x222 ...PLCF of beginning CP in the text box subdoc
    1344             :     sal_Int32 lcbPlcftxbxTxt;   // 0x226
    1345             :     WW8_FC fcPlcffldTxbx;   // 0x22a ...PLCF of field boundaries recorded in the textbox subdoc.
    1346             :     sal_Int32 lcbPlcffldTxbx;   // 0x22e
    1347             :     WW8_FC fcPlcfHdrtxbxTxt;// 0x232 ...PLCF of beginning CP in the header text box subdoc
    1348             :     sal_Int32 lcbPlcfHdrtxbxTxt;// 0x236
    1349             :     WW8_FC fcPlcffldHdrTxbx;// 0x23a ...PLCF of field boundaries recorded in the header textbox subdoc.
    1350             :     sal_Int32 lcbPlcffldHdrTxbx;// 0x23e
    1351             :     WW8_FC fcStwUser;
    1352             :     sal_uInt32 lcbStwUser;
    1353             :     WW8_FC fcSttbttmbd;
    1354             :     sal_uInt32 lcbSttbttmbd;
    1355             : 
    1356             :     WW8_FC fcSttbFnm;       // 0x02da offset in the table stream of masters subdocument names
    1357             :     sal_Int32 lcbSttbFnm;       // 0x02de length
    1358             : 
    1359             :     /*
    1360             :         spezielle Listenverwaltung fuer WW8
    1361             :     */
    1362             :     WW8_FC fcPlcfLst;       // 0x02e2 offset in the table stream of list format information.
    1363             :     sal_Int32 lcbPlcfLst;       // 0x02e6 length
    1364             :     WW8_FC fcPlfLfo;        // 0x02ea offset in the table stream of list format override information.
    1365             :     sal_Int32 lcbPlfLfo;        // 0x02ee length
    1366             :     /*
    1367             :         spezielle Break-Verwaltung fuer Text-Box-Stories in WW8
    1368             :     */
    1369             :     WW8_FC fcPlcftxbxBkd;   // 0x02f2 PLCF fuer TextBox-Break-Deskriptoren im Maintext
    1370             :     sal_Int32 lcbPlcftxbxBkd;   // 0x02f6
    1371             :     WW8_FC fcPlcfHdrtxbxBkd;// 0x02fa PLCF fuer TextBox-Break-Deskriptoren im Header-/Footer-Bereich
    1372             :     sal_Int32 lcbPlcfHdrtxbxBkd;// 0x02fe
    1373             : 
    1374             :     // 0x302 - 372 == ignore
    1375             :     /*
    1376             :         ListNames (skip to here!)
    1377             :     */
    1378             :     WW8_FC fcSttbListNames;// 0x0372 PLCF for Listname Table
    1379             :     sal_Int32 lcbSttbListNames;// 0x0376
    1380             : 
    1381             :     WW8_FC fcPlcfTch;
    1382             :     sal_Int32 lcbPlcfTch;
    1383             : 
    1384             :     // 0x38A - 41A == ignore
    1385             :     WW8_FC fcAtrdExtra;
    1386             :     sal_uInt32 lcbAtrdExtra;
    1387             : 
    1388             :     // 0x422 - 0x4D4 == ignore
    1389             :     WW8_FC fcHplxsdr;    //bizarrely, word xp seems to require this set to shows dates from AtrdExtra
    1390             :     sal_uInt32 lcbHplxsdr;
    1391             : 
    1392             :     /*
    1393             :         General-Varaiblen, die fuer Ver67 und Ver8 verwendet werden,
    1394             :         obwohl sie in der jeweiligen DATEI verschiedene Groesse haben:
    1395             :     */
    1396             :     sal_Int32 pnChpFirst;
    1397             :     sal_Int32 pnPapFirst;
    1398             :     sal_Int32 cpnBteChp;
    1399             :     sal_Int32 cpnBtePap;
    1400             :     /*
    1401             :         The actual nFib, moved here because some readers assumed
    1402             :         they couldn't read any format with nFib > some constant
    1403             :     */
    1404             :     sal_uInt16 nFib_actual; // 0x05bc #i56856#
    1405             :     /*
    1406             :         nun wird lediglich noch ein Ctor benoetigt
    1407             :     */
    1408             :     WW8Fib( SvStream& rStrm, sal_uInt8 nWantedVersion,sal_uInt32 nOffset=0 );
    1409             : 
    1410             :     /* leider falsch, man braucht auch noch einen fuer den Export */
    1411             :     WW8Fib( sal_uInt8 nVersion = 6, bool bDot = false );
    1412             :     bool WriteHeader(SvStream& rStrm);
    1413             :     bool Write(SvStream& rStrm);
    1414             :     static rtl_TextEncoding GetFIBCharset(sal_uInt16 chs);
    1415             :     ww::WordVersion GetFIBVersion() const;
    1416             :     WW8_CP GetBaseCp(ManTypes nType) const;
    1417             :     sal_Unicode getNumDecimalSep() const;
    1418             : };
    1419             : 
    1420             : class WW8Style
    1421             : {
    1422             : protected:
    1423             :     WW8Fib& rFib;
    1424             :     SvStream& rSt;
    1425             : 
    1426             :     sal_uInt16  cstd;                      // Count of styles in stylesheet
    1427             :     sal_uInt16  cbSTDBaseInFile;           // Length of STD Base as stored in a file
    1428             :     sal_uInt16  fStdStylenamesWritten : 1; // Are built-in stylenames stored?
    1429             :     sal_uInt16  : 15;                      // Spare flags
    1430             :     sal_uInt16  stiMaxWhenSaved;           // Max sti known when file was written
    1431             :     sal_uInt16  istdMaxFixedWhenSaved;     // How many fixed-index istds are there?
    1432             :     sal_uInt16  nVerBuiltInNamesWhenSaved; // Current version of built-in stylenames
    1433             :     // ftc used by StandardChpStsh for this document
    1434             :     sal_uInt16  ftcAsci;
    1435             :     // CJK ftc used by StandardChpStsh for this document
    1436             :     sal_uInt16  ftcFE;
    1437             :     // CTL/Other ftc used by StandardChpStsh for this document
    1438             :     sal_uInt16  ftcOther;
    1439             :     // CTL ftc used by StandardChpStsh for this document
    1440             :     sal_uInt16  ftcBi;
    1441             : 
    1442             :     //No copying
    1443             :     WW8Style(const WW8Style&);
    1444             :     WW8Style& operator=(const WW8Style&);
    1445             : 
    1446             : public:
    1447             :     WW8Style( SvStream& rSt, WW8Fib& rFibPara );
    1448             :     WW8_STD* Read1STDFixed( short& rSkip, short* pcbStd );
    1449             :     WW8_STD* Read1Style( short& rSkip, OUString* pString, short* pcbStd );
    1450          84 :     sal_uInt16 GetCount() const { return cstd; }
    1451             : };
    1452             : 
    1453             : class WW8Fonts
    1454             : {
    1455             : protected:
    1456             :     WW8_FFN* pFontA;    // Array of Pointers to Font Description
    1457             :     sal_uInt16 nMax;        // Array-Size
    1458             : 
    1459             : public:
    1460             :     WW8Fonts( SvStream& rSt, WW8Fib& rFib );
    1461          73 :     ~WW8Fonts() { delete[] pFontA; }
    1462             :     const WW8_FFN* GetFont( sal_uInt16 nNum ) const;
    1463           0 :     sal_uInt16 GetMax() const { return nMax; }
    1464             : };
    1465             : 
    1466             : typedef sal_uInt8 HdFtFlags;
    1467             : namespace nsHdFtFlags
    1468             : {
    1469             :     const HdFtFlags WW8_HEADER_EVEN     = 0x01;
    1470             :     const HdFtFlags WW8_HEADER_ODD      = 0x02;
    1471             :     const HdFtFlags WW8_FOOTER_EVEN     = 0x04;
    1472             :     const HdFtFlags WW8_FOOTER_ODD      = 0x08;
    1473             :     const HdFtFlags WW8_HEADER_FIRST    = 0x10;
    1474             :     const HdFtFlags WW8_FOOTER_FIRST    = 0x20;
    1475             : }
    1476             : 
    1477             : /// Document Properties
    1478             : class WW8Dop
    1479             : {
    1480             : public:
    1481             :     /* Error Status */
    1482             :     sal_uLong nDopError;
    1483             :     /*
    1484             :     Corresponds only roughly to the actual structure of the Winword DOP,
    1485             :     the winword FIB version matters to what exists.
    1486             :     */
    1487             :     // Initialisier-Dummy:
    1488             :     sal_uInt8    nDataStart;
    1489             : 
    1490             :     bool        fFacingPages : 1;   // 1 when facing pages should be printed
    1491             : 
    1492             :     bool        fWidowControl : 1;  //a: orig 97 docs say
    1493             :                                     //    1 when widow control is in effect. 0 when widow control disabled.
    1494             :                                     //b: MS-DOC: Word Binary File Format (.doc) Structure Specification 2008 says
    1495             :                                     //    B - unused1 (1 bit): Undefined and MUST be ignored.
    1496             : 
    1497             :     bool        fPMHMainDoc : 1;    // 1 when doc is a main doc for Print Merge Helper, 0 when not; default=0
    1498             :     sal_uInt16  grfSuppression : 2; // 0 Default line suppression storage; 0= form letter line suppression; 1= no line suppression; default=0
    1499             :     sal_uInt16  fpc : 2;            // 1 footnote position code: 0 as endnotes, 1 at bottom of page, 2 immediately beneath text
    1500             :     sal_uInt16  : 1;                // 0 unused
    1501             : 
    1502             :     sal_uInt16  grpfIhdt : 8;           // 0 specification of document headers and footers. See explanation under Headers and Footers topic.
    1503             : 
    1504             :     sal_uInt16  rncFtn : 2;         // 0 restart index for footnotes, 0 don't restart note numbering, 1 section, 2 page
    1505             :     sal_uInt16  nFtn : 14;          // 1 initial footnote number for document
    1506             :     bool        fOutlineDirtySave : 1; // when 1, indicates that information in the hPLCFpad should be refreshed since outline has been dirtied
    1507             :     sal_uInt16  : 7;                //   reserved
    1508             :     bool        fOnlyMacPics : 1;   //   when 1, Word believes all pictures recorded in the document were created on a Macintosh
    1509             :     bool        fOnlyWinPics : 1;   //   when 1, Word believes all pictures recorded in the document were created in Windows
    1510             :     bool        fLabelDoc : 1;      //   when 1, document was created as a print merge labels document
    1511             :     bool        fHyphCapitals : 1;  //   when 1, Word is allowed to hyphenate words that are capitalized. When 0, capitalized may not be hyphenated
    1512             :     bool        fAutoHyphen : 1;    //   when 1, Word will hyphenate newly typed text as a background task
    1513             :     bool        fFormNoFields : 1;
    1514             :     bool        fLinkStyles : 1;    //   when 1, Word will merge styles from its template
    1515             :     bool        fRevMarking : 1;    //   when 1, Word will mark revisions as the document is edited
    1516             :     bool        fBackup : 1;        //   always make backup when document saved when 1.
    1517             :     bool        fExactCWords : 1;
    1518             :     bool        fPagHidden : 1;
    1519             :     bool        fPagResults : 1;
    1520             :     bool        fLockAtn : 1;       //   when 1, annotations are locked for editing
    1521             :     bool        fMirrorMargins : 1; //   swap margins on left/right pages when 1.
    1522             :     bool        fReadOnlyRecommended : 1;// user has recommended that this doc be opened read-only when 1
    1523             :     bool        fDfltTrueType : 1;  //   when 1, use TrueType fonts by default (flag obeyed only when doc was created by WinWord 2.x)
    1524             :     bool        fPagSuppressTopSpacing : 1;//when 1, file created with SUPPRESSTOPSPACING=YES in win.ini. (flag obeyed only when doc was created by WinWord 2.x).
    1525             :     bool        fProtEnabled : 1;   //   when 1, document is protected from edit operations
    1526             :     bool        fDispFormFldSel : 1;//   when 1, restrict selections to occur only within form fields
    1527             :     bool        fRMView : 1;        //   when 1, show revision markings on screen
    1528             :     bool        fRMPrint : 1;       //   when 1, print revision marks when document is printed
    1529             :     bool        fWriteReservation : 1;
    1530             :     bool        fLockRev : 1;       //   when 1, the current revision marking state is locked
    1531             :     bool        fEmbedFonts : 1;    //   when 1, document contains embedded True Type fonts
    1532             :     //    compatability options
    1533             :     bool       copts_fNoTabForInd : 1;          //    when 1, don't add automatic tab stops for hanging indent
    1534             :     bool       copts_fNoSpaceRaiseLower : 1;        //    when 1, don't add extra space for raised or lowered characters
    1535             :     bool       copts_fSupressSpbfAfterPgBrk : 1;    // when 1, supress the paragraph Space Before and Space After options after a page break
    1536             :     bool       copts_fWrapTrailSpaces : 1;      //    when 1, wrap trailing spaces at the end of a line to the next line
    1537             :     bool       copts_fMapPrintTextColor : 1;        //    when 1, print colors as black on non-color printers
    1538             :     bool       copts_fNoColumnBalance : 1;      //    when 1, don't balance columns for Continuous Section starts
    1539             :     bool       copts_fConvMailMergeEsc : 1;
    1540             :     bool       copts_fSupressTopSpacing : 1;        //    when 1, supress extra line spacing at top of page
    1541             :     bool       copts_fOrigWordTableRules : 1;   //    when 1, combine table borders like Word 5.x for the Macintosh
    1542             :     bool       copts_fTransparentMetafiles : 1; //    when 1, don't blank area between metafile pictures
    1543             :     bool       copts_fShowBreaksInFrames : 1;   //    when 1, show hard page or column breaks in frames
    1544             :     bool       copts_fSwapBordersFacingPgs : 1; //    when 1, swap left and right pages on odd facing pages
    1545             :     bool       copts_fExpShRtn : 1;             //    when 1, expand character spaces on the line ending SHIFT+RETURN  // #i56856#
    1546             : 
    1547             :     sal_Int16  dxaTab;              //      720 twips - default tab width
    1548             :     sal_uInt16 wSpare;
    1549             :     sal_uInt16 dxaHotZ;             //      width of hyphenation hot zone measured in twips
    1550             :     sal_uInt16 cConsecHypLim;       //      number of lines allowed to have consecutive hyphens
    1551             :     sal_uInt16 wSpare2;             //      reserved
    1552             :     sal_Int32  dttmCreated;         //      DTTM date and time document was created
    1553             :     sal_Int32  dttmRevised;         //      DTTM date and time document was last revised
    1554             :     sal_Int32  dttmLastPrint;       //      DTTM date and time document was last printed
    1555             :     sal_Int16  nRevision;           //      number of times document has been revised since its creation
    1556             :     sal_Int32  tmEdited;            //      time document was last edited
    1557             :     sal_Int32  cWords;              //      count of words tallied by last Word Count execution
    1558             :     sal_Int32  cCh;                 //      count of characters tallied by last Word Count execution
    1559             :     sal_Int16  cPg;                 //      count of pages tallied by last Word Count execution
    1560             :     sal_Int32  cParas;              //      count of paragraphs tallied by last Word Count execution
    1561             :     sal_uInt16 rncEdn : 2;          //      restart endnote number code: 0 don't restart endnote numbering, 1 section, 2 page
    1562             :     sal_uInt16 nEdn : 14;           //      beginning endnote number
    1563             :     sal_uInt16 epc : 2;             //      endnote position code: 0 at end of section, 3 at end of document
    1564             : 
    1565             :     bool       fPrintFormData : 1;  //      only print data inside of form fields
    1566             :     bool       fSaveFormData : 1;   //      only save document data that is inside of a form field.
    1567             :     bool       fShadeFormData : 1;  //      shade form fields
    1568             :     sal_uInt16 : 2;                 //      reserved
    1569             :     bool       fWCFtnEdn : 1;       //      when 1, include footnotes and endnotes in word count
    1570             :     sal_Int32   cLines;             //      count of lines tallied by last Word Count operation
    1571             :     sal_Int32   cWordsFtnEnd;       //      count of words in footnotes and endnotes tallied by last Word Count operation
    1572             :     sal_Int32   cChFtnEdn;          //      count of characters in footnotes and endnotes tallied by last Word Count operation
    1573             :     sal_Int16   cPgFtnEdn;          //      count of pages in footnotes and endnotes tallied by last Word Count operation
    1574             :     sal_Int32   cParasFtnEdn;       //      count of paragraphs in footnotes and endnotes tallied by last Word Count operation
    1575             :     sal_Int32   cLinesFtnEdn;       //      count of paragraphs in footnotes and endnotes tallied by last Word Count operation
    1576             :     sal_Int32   lKeyProtDoc;        //      document protection password key, only valid if dop.fProtEnabled, dop.fLockAtn or dop.fLockRev are 1.
    1577             :     sal_uInt16  wvkSaved : 3;       //      document view kind: 0 Normal view, 1 Outline view, 2 Page View
    1578             :     sal_uInt16  wScaleSaved : 9;    ///< Specifies the zoom percentage that was in use when the document was saved.
    1579             :     sal_uInt16  zkSaved : 2;
    1580             :     bool        fRotateFontW6 : 1;
    1581             :     bool        iGutterPos : 1 ;
    1582             : 
    1583             :     // hier sollte bei nFib < 103   Schluss sein, sonst ist Datei fehlerhaft!
    1584             : 
    1585             :     /*
    1586             :         bei nFib >= 103 gehts weiter:
    1587             :     */
    1588             :     bool       fNoTabForInd : 1;                      // see above in compatability options
    1589             :     bool       fNoSpaceRaiseLower : 1;                // see above
    1590             :     bool       fSupressSpbfAfterPageBreak : 1;        // see above
    1591             :     bool       fWrapTrailSpaces : 1;                  // see above
    1592             :     bool       fMapPrintTextColor : 1;                // see above
    1593             :     bool       fNoColumnBalance : 1;                  // see above
    1594             :     bool       fConvMailMergeEsc : 1;                 // see above
    1595             :     bool       fSupressTopSpacing : 1;                // see above
    1596             :     bool       fOrigWordTableRules : 1;               // see above
    1597             :     bool       fTransparentMetafiles : 1;             // see above
    1598             :     bool       fShowBreaksInFrames : 1;               // see above
    1599             :     bool       fSwapBordersFacingPgs : 1;             // see above
    1600             :     bool       fCompatabilityOptions_Unknown1_13 : 1; // #i78591#
    1601             :     bool       fExpShRtn : 1;                         // #i78591# and #i56856#
    1602             :     bool       fCompatabilityOptions_Unknown1_15 : 1; // #i78591#
    1603             :     bool       fCompatabilityOptions_Unknown1_16 : 1; // #i78591#
    1604             :     bool       fSuppressTopSpacingMac5 : 1;           // Suppress extra line spacing at top
    1605             :                                                       // of page like MacWord 5.x
    1606             :     bool       fTruncDxaExpand : 1;                    // Expand/Condense by whole number of points
    1607             :     bool       fPrintBodyBeforeHdr : 1;               // Print body text before header/footer
    1608             :     bool       fNoLeading : 1;                        // Don't add extra spacebetween rows of text
    1609             :     bool       fCompatabilityOptions_Unknown1_21 : 1; // #i78591#
    1610             :     bool       fMWSmallCaps : 1;                     // Use larger small caps like MacWord 5.x
    1611             :     bool       fCompatabilityOptions_Unknown1_23 : 1; // #i78591#
    1612             :     bool       fCompatabilityOptions_Unknown1_24 : 1; // #i78591#
    1613             :     bool       fCompatabilityOptions_Unknown1_25 : 1; // #i78591#
    1614             :     bool       fCompatabilityOptions_Unknown1_26 : 1; // #i78591#
    1615             :     bool       fCompatabilityOptions_Unknown1_27 : 1; // #i78591#
    1616             :     bool       fCompatabilityOptions_Unknown1_28 : 1; // #i78591#
    1617             :     bool       fCompatabilityOptions_Unknown1_29 : 1; // #i78591#
    1618             :     bool       fCompatabilityOptions_Unknown1_30 : 1; // #i78591#
    1619             :     bool       fCompatabilityOptions_Unknown1_31 : 1; // #i78591#
    1620             :     bool       fUsePrinterMetrics : 1;                //The magic option
    1621             : 
    1622             :     // hier sollte bei nFib <= 105  Schluss sein, sonst ist Datei fehlerhaft!
    1623             : 
    1624             :     /*
    1625             :         bei nFib > 105 gehts weiter:
    1626             :     */
    1627             :     sal_Int16   adt;                  // Autoformat Document Type:
    1628             :                                       // 0 for normal.
    1629             :                                       // 1 for letter, and
    1630             :                                       // 2 for email.
    1631             :     WW8DopTypography doptypography;   // see WW8STRUC.HXX
    1632             :     WW8_DOGRID dogrid;                // see WW8STRUC.HXX
    1633             :     sal_uInt16 : 1;                   // reserved
    1634             :     sal_uInt16 lvl : 4;               // Which outline levels are showing in outline view
    1635             :     sal_uInt16 : 4;                   // reserved
    1636             :     bool       fHtmlDoc : 1;          // This file is based upon an HTML file
    1637             :     sal_uInt16 : 1;                   // reserved
    1638             :     bool       fSnapBorder : 1;       // Snap table and page borders to page border
    1639             :     bool       fIncludeHeader : 1;    // Place header inside page border
    1640             :     bool       fIncludeFooter : 1;    // Place footer inside page border
    1641             :     bool       fForcePageSizePag : 1; // Are we in online view
    1642             :     bool       fMinFontSizePag : 1;   // Are we auto-promoting fonts to >= hpsZoonFontPag?
    1643             :     bool       fHaveVersions : 1;     // versioning is turned on
    1644             :     bool       fAutoVersion : 1;      // autoversioning is enabled
    1645             :     sal_uInt16 : 14;                  // reserved
    1646             :     // Skip 12 Bytes here: ASUMI
    1647             :     sal_Int32 cChWS;
    1648             :     sal_Int32 cChWSFtnEdn;
    1649             :     sal_Int32 grfDocEvents;
    1650             :     // Skip 4+30+8 Bytes here
    1651             :     sal_Int32 cDBC;
    1652             :     sal_Int32 cDBCFtnEdn;
    1653             :     // Skip 4 Bytes here
    1654             :     sal_Int16 nfcFtnRef;
    1655             :     sal_Int16 nfcEdnRef;
    1656             :     sal_Int16 hpsZoonFontPag;
    1657             :     sal_Int16 dywDispPag;
    1658             : 
    1659             :     bool       fCompatabilityOptions_Unknown2_1 : 1;  // #i78591#
    1660             :     bool       fCompatabilityOptions_Unknown2_2 : 1;  // #i78591#
    1661             :     bool       fDontUseHTMLAutoSpacing : 1;
    1662             :     bool       fCompatabilityOptions_Unknown2_4 : 1;  // #i78591#
    1663             :     bool       fCompatabilityOptions_Unknown2_5 : 1;  // #i78591#
    1664             :     bool       fCompatabilityOptions_Unknown2_6 : 1;  // #i78591#
    1665             :     bool       fCompatabilityOptions_Unknown2_7 : 1;  // #i78591#
    1666             :     bool       fCompatabilityOptions_Unknown2_8 : 1;  // #i78591#
    1667             :     bool       fCompatabilityOptions_Unknown2_9 : 1;  // #i78591#
    1668             :     bool       fCompatabilityOptions_Unknown2_10 : 1; // #i78591#
    1669             :     bool       fCompatabilityOptions_Unknown2_11 : 1; // #i78591#
    1670             :     bool       fCompatabilityOptions_Unknown2_12 : 1; // #i78591#
    1671             :     bool       fCompatabilityOptions_Unknown2_13 : 1; // #i78591#
    1672             :     bool       fCompatabilityOptions_Unknown2_14 : 1; // #i78591#
    1673             :     bool       fCompatabilityOptions_Unknown2_15 : 1; // #i78591#
    1674             :     bool       fCompatabilityOptions_Unknown2_16 : 1; // #i78591#
    1675             :     bool       fCompatabilityOptions_Unknown2_17 : 1; // #i78591#
    1676             :     bool       fCompatabilityOptions_Unknown2_18 : 1; // #i78591#
    1677             :     bool       fCompatabilityOptions_Unknown2_19 : 1; // #i78591#
    1678             :     bool       fCompatabilityOptions_Unknown2_20 : 1; // #i78591#
    1679             :     bool       fCompatabilityOptions_Unknown2_21 : 1; // #i78591#
    1680             :     bool       fCompatabilityOptions_Unknown2_22 : 1; // #i78591#
    1681             :     bool       fCompatabilityOptions_Unknown2_23 : 1; // #i78591#
    1682             :     bool       fCompatabilityOptions_Unknown2_24 : 1; // #i78591#
    1683             :     bool       fCompatabilityOptions_Unknown2_25 : 1; // #i78591#
    1684             :     bool       fCompatabilityOptions_Unknown2_26 : 1; // #i78591#
    1685             :     bool       fCompatabilityOptions_Unknown2_27 : 1; // #i78591#
    1686             :     bool       fCompatabilityOptions_Unknown2_28 : 1; // #i78591#
    1687             :     bool       fCompatabilityOptions_Unknown2_29 : 1; // #i78591#
    1688             :     bool       fCompatabilityOptions_Unknown2_30 : 1; // #i78591#
    1689             :     bool       fCompatabilityOptions_Unknown2_31 : 1; // #i78591#
    1690             :     bool       fCompatabilityOptions_Unknown2_32 : 1; // #i78591#
    1691             : 
    1692             :     sal_uInt16 fUnknown3 : 15;
    1693             :     bool       fUseBackGroundInAllmodes : 1;
    1694             : 
    1695             :     bool       fDoNotEmbedSystemFont : 1;
    1696             :     bool       fWordCompat : 1;
    1697             :     bool       fLiveRecover : 1;
    1698             :     bool       fEmbedFactoids : 1;
    1699             :     bool       fFactoidXML : 1;
    1700             :     bool       fFactoidAllDone : 1;
    1701             :     bool       fFolioPrint : 1;
    1702             :     bool       fReverseFolio : 1;
    1703             :     sal_uInt16 iTextLineEnding : 3;
    1704             :     bool       fHideFcc : 1;
    1705             :     bool       fAcetateShowMarkup : 1;
    1706             :     bool       fAcetateShowAtn : 1;
    1707             :     bool       fAcetateShowInsDel : 1;
    1708             :     bool       fAcetateShowProps : 1;
    1709             : 
    1710             :     // 2. Initialisier-Dummy:
    1711             :     sal_uInt8 nDataEnd;
    1712             : 
    1713             :     bool bUseThaiLineBreakingRules;
    1714             : 
    1715             :     /* Constructor for importing, needs to know the version of word used */
    1716             :     WW8Dop(SvStream& rSt, sal_Int16 nFib, sal_Int32 nPos, sal_uInt32 nSize);
    1717             : 
    1718             :     /* Constructs default DOP suitable for exporting */
    1719             :     WW8Dop();
    1720             :     bool Write(SvStream& rStrm, WW8Fib& rFib) const;
    1721             : 
    1722             : public:
    1723             :     sal_uInt32 GetCompatabilityOptions() const;
    1724             :     void SetCompatabilityOptions(sal_uInt32 a32Bit);
    1725             :     // i#78591#
    1726             :     sal_uInt32 GetCompatabilityOptions2() const;
    1727             :     void SetCompatabilityOptions2(sal_uInt32 a32Bit);
    1728             : };
    1729             : 
    1730          32 : class WW8PLCF_HdFt
    1731             : {
    1732             : private:
    1733             :     WW8PLCF aPLCF;
    1734             :     long nTextOfs;
    1735             :     short nIdxOffset;
    1736             : 
    1737             : public:
    1738             :     WW8PLCF_HdFt( SvStream* pSt, WW8Fib& rFib, WW8Dop& rDop );
    1739             :     bool GetTextPos(sal_uInt8 grpfIhdt, sal_uInt8 nWhich, WW8_CP& rStart, long& rLen);
    1740             :     bool GetTextPosExact(short nIdx, WW8_CP& rStart, long& rLen);
    1741             :     void UpdateIndex( sal_uInt8 grpfIhdt );
    1742             : };
    1743             : 
    1744             : void SwapQuotesInField(OUString &rFmt);
    1745             : 
    1746             : Word2CHPX ReadWord2Chpx(SvStream &rSt, sal_Size nOffset, sal_uInt8 nSize);
    1747             : std::vector<sal_uInt8> ChpxToSprms(const Word2CHPX &rChpx);
    1748             : 
    1749             : bool checkSeek(SvStream &rSt, sal_uInt32 nOffset)
    1750             :     SAL_WARN_UNUSED_RESULT;
    1751             : 
    1752             : bool checkRead(SvStream &rSt, void *pDest, sal_uInt32 nLength)
    1753             :     SAL_WARN_UNUSED_RESULT;
    1754             : 
    1755             : //MS has a (slightly) inaccurate view of how many twips
    1756             : //are in the default letter size of a page
    1757             : const sal_uInt16 lLetterWidth = 12242;
    1758             : const sal_uInt16 lLetterHeight = 15842;
    1759             : 
    1760             : #ifdef OSL_BIGENDIAN
    1761             : void swapEndian(sal_Unicode *pString);
    1762             : #endif
    1763             : 
    1764             : #endif
    1765             : 
    1766             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10