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