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