LCOV - code coverage report
Current view: top level - sw/source/filter/ww8 - ww8scan.hxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 89 105 84.8 %
Date: 2012-08-25 Functions: 69 80 86.2 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 29 52 55.8 %

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

Generated by: LCOV version 1.10