xref: /trunk/main/sw/source/filter/ww8/dump/ww8scan.hxx (revision 914d351e5f5b84e4342a86d6ab8d4aca7308b9bd)
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 #ifndef _WW8SCAN_HXX
25 #define _WW8SCAN_HXX
26 
27 
28 #ifndef LONG_MAX
29 #include <limits.h>
30 #endif
31 #ifndef _SAL_TYPES_H
32 #include <sal/types.h>
33 #endif
34 #include <tools/solar.h>        // UINTXX
35 #ifndef _TABLE_HXX //autogen
36 #include <tools/table.hxx>
37 #endif
38 #include <tools/datetime.hxx>
39 #include <tools/stream.hxx>
40 #include <tools/string.hxx>
41 
42 
43 #define _SVSTDARR_STRINGS
44 #include <svl/svstdarr.hxx>
45 
46 #ifndef WW8STRUC_HXX
47 #include <ww8struc.hxx>     // FIB, STSHI, STD
48 #endif
49 
50 #include <ww8scan.hxx>
51 
52 using namespace nsHdFtFlags;
53 
54 
55 #ifndef DELETEZ
56 #define DELETEZ( p ) ( delete( p ), p = 0 )
57 #endif
58 
59 
60 //class SvStream;
61 class  UShortStk;
62 class  WW8Fib;
63 class  WW8ScannerBase;
64 class  WW8PLCFspecial;
65 struct WW8PLCFxDesc;
66 class  WW8PLCFx_PCD;
67 class  SvUShortsSort;
68 
69 
70 String WW8ReadPString( SvStream& rStrm, rtl_TextEncoding eEnc,
71                        sal_Bool bAtEndSeekRel1 = sal_True );
72 
73 // Folgende Methode liest einen 2-byter-UNICODE-String ein:
74 // - falls bAtEndSeekRel1 gesetzt ist, wird am Ende genau EIN Byte uebersprungen,
75 // - falls nChars (die Zeichen-Anzahl, NICHT die Byte-Anzahl) nicht gesetzt ist,
76 //   wird das erste sal_uInt16 als Lannengenangabe interpretiert,
77 //   ansonsten als erstes String-Zeichen genommen.
78 String WW8Read_xstz(SvStream& rStrm,
79                     sal_uInt16 nChars,
80                     sal_Bool   bAtEndSeekRel1);
81 
82 
83 // read array of strings (see MS documentation: STring TaBle stored in File)
84 // returns NOT the original pascal strings but an array of converted char*
85 //
86 // attention: the *extra data* of each string are SKIPPED and ignored
87 
88 /*  to be optimized like this:    */
89 void WW8ReadSTTBF(  sal_Bool bVer8, SvStream& rStrm,
90                     sal_uInt32 nStart, sal_Int32 nLen, sal_uInt16 nSkip,
91                     rtl_TextEncoding eCS,
92                     SvStrings &rArray, SvStrings* pExtraArray = 0 );
93 
94 
95 
96 sal_uInt16 WW8GetSprmId(        sal_uInt8 nVersion, sal_uInt8* pSp,   sal_uInt8*   pDelta = 0 );
97 short WW8GetSprmSizeNetto(  sal_uInt8 nVersion, sal_uInt8* pSprm, sal_uInt16* pId );
98 short WW8GetSprmSizeBrutto( sal_uInt8 nVersion, sal_uInt8* pSprm, sal_uInt16* pId );
99 sal_uInt8 WW8SprmDataOfs( sal_uInt16 nId );
100 
101 struct WW8FieldDesc
102 {
103     long nLen;              // Gesamtlaenge ( zum Text ueberlesen )
104     WW8_CP nSCode;           // Anfang Befehlscode
105     long nLCode;            // Laenge
106     WW8_CP nSRes;           // Anfang Ergebnis
107     long nLRes;             // Laenge ( == 0, falls kein Ergebnis )
108     sal_uInt16 nId;             // WW-Id fuer Felder
109     sal_uInt8 nOpt;             // WW-Flags ( z.B.: vom User geaendert )
110     sal_Bool bCodeNest:1;       // Befehl rekursiv verwendet
111     sal_Bool bResNest:1;        // Befehl in Resultat eingefuegt
112 };
113 
114 sal_Bool WW8GetFieldPara( sal_uInt8 nVersion, WW8PLCFspecial& rPLCF, WW8FieldDesc& rF );
115 
116 
117 struct WW8PLCFxSave1
118 {
119     sal_uLong nPLCFxPos;
120     sal_uLong nPLCFxPos2;       // fuer PLCF_Cp_Fkp: PieceIter-Pos
121     long nPLCFxMemOfs;
122     WW8_CP nAttrStart;
123     WW8_CP nAttrEnd;
124     sal_Bool   bLineEnd;
125 };
126 
127 
128 /*
129     u.a. fuer Felder, also genausoviele Attr wie Positionen,
130     falls Ctor-Param bNoEnd = false
131 */
132 class WW8PLCFspecial        // Iterator fuer PLCFs
133 {
134     sal_Int32* pPLCF_PosArray;  // Pointer auf Pos-Array und auf ganze Struktur
135     sal_uInt8*  pPLCF_Contents; // Pointer auf Inhalts-Array-Teil des Pos-Array
136     long nIMax;         // Anzahl der Elemente
137     long nIdx;          // Merker, wo wir gerade sind
138     long nStru;
139 
140 public:
141     WW8PLCFspecial( SvStream* pSt, long nFilePos, long nPLCF,
142           long nStruct, long nStartPos = -1, sal_Bool bNoEnd = sal_False );
~WW8PLCFspecial()143     ~WW8PLCFspecial(){ delete( pPLCF_PosArray ); pPLCF_PosArray = 0; }
GetIdx() const144     sal_uLong GetIdx() const { return (sal_uLong)nIdx; }
SetIdx(sal_uLong nI)145     void SetIdx( sal_uLong nI ) { nIdx = (long)nI; }    // geht ueber Nummer
GetIMax()146     long GetIMax(){ return nIMax; }
147     sal_Bool SeekPos( long nPos );          // geht ueber FC- bzw. CP-Wert
148                                                                     // bzw. naechste groesseren Wert
149     sal_Bool SeekPosExact( long nPos );
Where()150     long Where() { return ( nIdx >= nIMax ) ? LONG_MAX : pPLCF_PosArray[nIdx]; }
151     sal_Bool Get( long& rStart, void*& rpValue );
152     sal_Bool GetData( long nIdx, long& rPos, void*& rpValue );
153 
GetData(long nIdx) const154     const void* GetData( long nIdx ) const {
155         return ( nIdx >= nIMax ) ? 0 : (const void*)&pPLCF_Contents[nIdx * nStru]; }
GetPos(long nIdx)156     long GetPos( long nIdx ){
157         return ( nIdx >= nIMax ) ? LONG_MAX : pPLCF_PosArray[nIdx]; }
158 
operator ++(int)159     WW8PLCFspecial& operator ++( int ) { nIdx++; return *this; }
operator --(int)160     WW8PLCFspecial& operator --( int ) { nIdx--; return *this; }
161 };
162 
163 
164 
165 
166 /*
167     simple Iterator for SPRMs
168 */
169 class WW8SprmIter
170 {
171     // these members will be updated
172     sal_uInt8*  pSprms;     // remaining part of the SPRMs ( == start of akt. SPRM)
173     sal_uInt8*  pAktParams; // start of akt. SPRM's parameters
174     sal_uInt16  nAktId;
175     short   nAktSizeBrutto;
176 
177     // these members will *not* be updated by UpdateMyMembers()
178     sal_uInt8    nVersion;
179     sal_uInt8    nDelta;
180     short   nRemLen;    // length of remaining SPRMs (including akt. SPRM)
181 
182     void UpdateMyMembers();
183 public:
184     WW8SprmIter( sal_uInt8* pSprms_, short nLen_, sal_uInt8 nVersion_ );
185     void   SetSprms( sal_uInt8* pSprms_, short nLen_ );
186     sal_uInt8*  operator ++( int );
GetSprms() const187     sal_uInt8*  GetSprms()     const { return ( pSprms && (0 < nRemLen) )
188                                 ? pSprms
189                                 : 0; }
GetAktParams() const190     sal_uInt8*  GetAktParams() const { return pAktParams; }
GetAktId() const191     sal_uInt16 GetAktId()     const { return nAktId; }
192 };
193 
194 
195 
196 /*
197     u.a. fuer FKPs auf normale Attr., also ein Attr weniger als Positionen
198 */
199 class WW8PLCF                       // Iterator fuer PLCFs
200 {
201     sal_Int32* pPLCF_PosArray;  // Pointer auf Pos-Array und auf ganze Struktur
202     sal_uInt8* pPLCF_Contents;      // Pointer auf Inhalts-Array-Teil des Pos-Array
203     long nIMax;                         // Anzahl der Elemente
204     long nIdx;
205     long nStru;
206 
207     void ReadPLCF( SvStream* pSt, long nFilePos, long nPLCF );
208 
209     /*
210         Falls im Dok ein PLC fehlt und die FKPs solo dastehen,
211         machen wir uns hiermit einen PLC:
212     */
213     void GeneratePLCF( SvStream* pSt, long nPN, long ncpN );
214 
215 public:
216     WW8PLCF( SvStream* pSt, long nFilePos, long nPLCF,
217         long nStruct, long nStartPos = -1 );
218 
219     /*
220         folgender Ctor generiert ggfs. einen PLC aus nPN und ncpN
221     */
222     WW8PLCF( SvStream* pSt, long nFilePos, long nPLCF,
223         long nStruct, long nStartPos, long nPN, long ncpN );
224 
~WW8PLCF()225     ~WW8PLCF(){ delete( pPLCF_PosArray ); pPLCF_PosArray = 0; }
GetIdx() const226     sal_uLong GetIdx() const { return (sal_uLong)nIdx; }
SetIdx(sal_uLong nI)227     void SetIdx( sal_uLong nI ) { nIdx = (long)nI; }
GetIMax()228     long GetIMax(){ return nIMax; }
229     sal_Bool SeekPos( long nPos );
230     long Where();
231     sal_Bool Get( long& rStart, long& rEnd, void*& rpValue );
operator ++(int)232     WW8PLCF& operator ++( int ) { if( nIdx < nIMax ) nIdx++; return *this; }
233 
GetData(long nIdx) const234     const void* GetData( long nIdx ) const {
235         return ( nIdx >= nIMax ) ? 0 : (const void*)&pPLCF_Contents[nIdx * nStru]; }
236 };
237 
238 
239 DECLARE_TABLE( WW8Pcd_FC_sortArr, sal_Int32 )
240 
241 
242 /*
243     fuer Piece Table (bei Schnellspeicherung)
244 */
245 class WW8PLCFpcd
246 {
247 friend class WW8PLCFpcd_Iter;
248     WW8Pcd_FC_sortArr aFC_sort; // sorted PCD entries by FC
249     sal_Int32* pPLCF_PosArray;  // Pointer auf Pos-Array und auf ganze Struktur
250     sal_uInt8*  pPLCF_Contents; // Pointer auf Inhalts-Array-Teil des Pos-Array
251     long nIMax;
252     long nStru;
253 
254 public:
255     WW8PLCFpcd( SvStream* pSt, long nFilePos, long nPLCF, long nStruct );
~WW8PLCFpcd()256     ~WW8PLCFpcd(){ delete( pPLCF_PosArray ); }
257     sal_uLong FindIdx( WW8_FC nFC ) const;
258 };
259 
260 /*
261     mehrere WW8PLCFpcd_Iter koennen auf die gleiche WW8PLCFpcd zeigen !!!
262 */
263 class WW8PLCFpcd_Iter
264 {
265     WW8PLCFpcd& rPLCF;
266     long nIdx;
267 
268 public:
269     WW8PLCFpcd_Iter( WW8PLCFpcd& rPLCFpcd, long nStartPos = -1 );
270 //  ~WW8PLCFpcd_Iter() {}
GetIdx() const271     sal_uLong GetIdx() const { return (sal_uLong)nIdx; }
SetIdx(sal_uLong nI)272     void SetIdx( sal_uLong nI ) { nIdx = (long)nI; }
GetIMax()273     long GetIMax(){ return rPLCF.nIMax; }
274     sal_Bool SeekPos( long nPos );
275 //  sal_Bool SeekMaxMainFC( WW8Fib& rWwF, long& rMaxPosData );
276     long Where();
277     sal_Bool Get( long& rStart, long& rEnd, void*& rpValue );
FindIdx(WW8_FC nFC) const278     sal_uLong FindIdx( WW8_FC nFC ) const { return rPLCF.FindIdx( nFC ); }
operator ++(int)279     WW8PLCFpcd_Iter& operator ++( int ) { if( nIdx < rPLCF.nIMax ) nIdx++; return *this; }
280 };
281 
282 // PLCF-Typ:
283 enum ePLCFT{ CHP=0, PAP, SEP, /*HED, FNR, ENR,*/ PLCF_END };
284 
285 /*
286     pure virtual:
287 */
288 class WW8PLCFx              // virtueller Iterator fuer Piece Table Exceptions
289 {
290     sal_uInt8 nVersion;             // Versionsnummer des FIB
291     sal_Bool bIsSprm;               // PLCF von Sprms oder von anderem ( Footnote, ... )
292 
293 public:
WW8PLCFx(sal_uInt8 nFibVersion,sal_Bool bSprm)294     WW8PLCFx( sal_uInt8 nFibVersion, sal_Bool bSprm )
295         { bIsSprm = bSprm; nVersion = nFibVersion; }
~WW8PLCFx()296     virtual ~WW8PLCFx() {}
IsSprm()297     sal_Bool IsSprm() { return bIsSprm; }
298     virtual sal_uLong GetIdx() const = 0;
299     virtual void SetIdx( sal_uLong nIdx ) = 0;
300     virtual sal_uLong GetIdx2() const;
301     virtual void SetIdx2( sal_uLong nIdx );
302     virtual sal_Bool SeekPos( WW8_CP nCpPos ) = 0;
303     virtual long Where() = 0;
304 //  virtual sal_uInt8* GetSprms( long& rStart, long& rEnd, long& rLen );
305     virtual void GetSprms( WW8PLCFxDesc* p );
306     virtual long GetNoSprms( long& rStart, long&, long& rLen );
307     virtual WW8PLCFx& operator ++( int ) = 0;
GetIstd() const308     virtual sal_uInt16 GetIstd() const { return 0xffff; }
309     virtual void Save(          WW8PLCFxSave1& rSave ) const;
310     virtual void Restore( const WW8PLCFxSave1& rSave );
GetVersion() const311     sal_uInt8 GetVersion() const { return nVersion; }
312 };
313 
314 enum eCutT { CUT_NONE = 0, CUT_START, CUT_END, CUT_BOTH };
315 
316 class WW8PLCFx_PCDAttrs : public WW8PLCFx
317 {
318     WW8PLCFpcd_Iter* pPcdI;
319     WW8PLCFx_PCD* pPcd;
320     sal_uInt8** pGrpprls;           // Attribute an Piece-Table
321     SVBT32 aShortSprm;          // mini storage: can contain ONE sprm with
322                                 // 1 byte param
323     sal_uInt16 nGrpprls;            // Attribut Anzahl davon
324 
325 public:
326     WW8PLCFx_PCDAttrs( sal_uInt8 nVersion, WW8PLCFx_PCD* pPLCFx_PCD, WW8ScannerBase* pBase );
327     virtual ~WW8PLCFx_PCDAttrs();
328     virtual sal_uLong GetIdx() const;
329     virtual void SetIdx( sal_uLong nI );
330     virtual sal_Bool SeekPos( WW8_CP nCpPos );
331     virtual long Where();
332     virtual void GetSprms( WW8PLCFxDesc* p );
333     virtual WW8PLCFx& operator ++( int );
334 
GetIter() const335     WW8PLCFpcd_Iter* GetIter() const { return pPcdI; }
336 };
337 
338 class WW8PLCFx_PCD : public WW8PLCFx            // Iterator fuer Piece Table
339 {
340     WW8PLCFpcd_Iter* pPcdI;
341     sal_Bool bVer67;
342 
343 public:
344     WW8PLCFx_PCD( sal_uInt8 nVersion, WW8PLCFpcd* pPLCFpcd, WW8_CP nStartCp, sal_Bool bVer67P );
345     virtual ~WW8PLCFx_PCD();
346     virtual sal_uLong GetIMax() const;
347     virtual sal_uLong GetIdx() const;
348     virtual void SetIdx( sal_uLong nI );
349     virtual sal_Bool SeekPos( WW8_CP nCpPos );
350     virtual long Where();
351 //  virtual void GetSprms( WW8PLCFxDesc* p );
352     virtual long GetNoSprms( long& rStart, long&, long& rLen );
353     virtual WW8PLCFx& operator ++( int );
354     WW8_CP AktPieceStartFc2Cp( WW8_FC nStartPos );
355     WW8_FC AktPieceStartCp2Fc( WW8_CP nCp );
356     eCutT AktPieceFc2Cp( long& rStartPos, long& rEndPos );
GetPLCFIter()357     WW8PLCFpcd_Iter* GetPLCFIter() { return pPcdI; }
358 
TransformPieceAddress(long nfc,sal_Bool & bIsUnicodeAddress)359     static sal_Int32 TransformPieceAddress(long nfc, sal_Bool& bIsUnicodeAddress)
360     {
361         bIsUnicodeAddress = 0 == (0x40000000 & nfc);
362         return bIsUnicodeAddress
363             ?  nfc
364             : (nfc & 0x3fffFFFF) / 2;
365     }
IsVersion67() const366     sal_Bool IsVersion67() const { return bVer67; }
367 };
368 
369 
370 class WW8PLCFx_Fc_FKP : public WW8PLCFx     // Iterator fuer Piece Table Exceptions of Fkps
371                                 // arbeitet nur auf FCs, nicht auf CPs !
372                                 // ( Low-Level )
373 {
374 
375 
376         class WW8Fkp        // Iterator fuer Formatted Disk Page
377         {
378             struct WW8Grpprl
379             {
380                 sal_uInt8*  pData;
381                 sal_uInt16 nLen;
382                 sal_uInt16 nIStd; // nur bei Fkp.Papx gueltig (aktuelle Style-Nr)
383                 sal_Bool   bMustDelete;
384             };
385 
386             WW8Grpprl* pGrpprl;     // Pointer of Meta Array (pointing
387 
388             sal_uInt8* pFkp;            // gesamter Fkp
389 
390             long nItemSize;     // entweder 1 Byte oder ein komplettes BX
391             long nFilePos;      // Offset in Stream where last read of 52 bytes took place
392             short nIdx;         // Pos-Merker
393             ePLCFT ePLCF;
394             sal_uInt8 nIMax;        // Anzahl der Eintraege
395             sal_uInt8 nVersion;
396 
397         public:
398             WW8Fkp( sal_uInt8 nFibVer, SvStream* pFKPStrm, SvStream* pDataStrm,
399                     long _nFilePos, long nItemSiz,
400                     ePLCFT ePl, WW8_FC nStartFc = -1 );
401             ~WW8Fkp();
GetFilePos() const402             long GetFilePos() const { return nFilePos; }
GetIdx() const403             sal_uLong GetIdx() const { return (sal_uLong)nIdx; }
404             void SetIdx( sal_uLong nI );
405             sal_Bool SeekPos( long nPos );
Where()406             WW8_FC Where() { return (  nIdx<nIMax)
407                                      ? ((WW8_FC*)pFkp)[nIdx]
408                                      : LONG_MAX; }
operator ++(int)409             WW8Fkp& operator ++( int ) { if( nIdx < nIMax ) nIdx++;
410                                          return *this; }
411             sal_uInt8* Get( WW8_FC& rStart, WW8_FC& rEnd, short& rLen );
GetIstd() const412             sal_uInt16 GetIstd() const { return pGrpprl[ nIdx ].nIStd; }
413 
414             /*
415                 liefert einen echten Pointer auf das Sprm vom Typ nId,
416                 falls ein solches im Fkp drin ist.
417             */
418             sal_uInt8* GetLenAndIStdAndSprms(short& rLen);
419 
420             /*
421                 ruft GetLenAndIStdAndSprms() auf...
422             */
423             sal_uInt8* HasSprm( sal_uInt16 nId );
424 
425             sal_uLong GetParaHeight() const;    // fuer Header/Footer bei Papx-Fkps
426 
GetVersion() const427             sal_uInt8 GetVersion() const { return nVersion; }
428         };
429 
430 
431     WW8PLCFx_PCDAttrs* pPCDAttrs;
432     SvStream* pFKPStrm;         // Input-File
433     SvStream* pDataStrm;        // Input-File
434     WW8PLCF* pPLCF;
435     WW8Fkp* pFkp;
436     WW8_FC nStartFc;
437 
438     sal_Bool NewFkp();
439 
440 protected:
441     ePLCFT ePLCF;
442 
443 public:
444     WW8PLCFx_Fc_FKP( SvStream* pSt, SvStream* pTblSt, SvStream* pDataSt,
445                      WW8Fib& rFib, ePLCFT ePl, WW8_FC nStartFcL,
446                      WW8PLCFx_PCDAttrs* pPLCFx_PCD );
447     virtual ~WW8PLCFx_Fc_FKP();
448     virtual sal_uLong GetIdx() const;
449     virtual void SetIdx( sal_uLong nIdx );
450     virtual sal_Bool SeekPos( WW8_FC nFcPos );
451     virtual WW8_FC Where();
452     sal_uInt8* GetSprms( WW8_FC& rStart, WW8_FC& rEnd, long& rLen );
453     virtual WW8PLCFx& operator ++( int );
454     virtual sal_uInt16 GetIstd() const;
455     void GetPCDSprms( WW8PLCFxDesc& rDesc );
456     sal_uInt8* HasSprm( sal_uInt16 nId );
457     sal_uLong GetParaHeight() const;
HasFkp()458     sal_Bool HasFkp() { return (0 != pFkp); }
459 };
460 
461 // Iterator fuer Piece Table Exceptions of Fkps arbeitet auf CPs (High-Level)
462 class WW8PLCFx_Cp_FKP : public WW8PLCFx_Fc_FKP
463 {
464     const WW8ScannerBase& rSBase;
465     WW8PLCFx_PCD* pPcd;
466     WW8_CP nAttrStart, nAttrEnd;
467     sal_Bool bLineEnd : 1;
468     sal_Bool bComplex : 1;
469 
470     void SearchParaEnd( long nOldEndCp );
471 
472 public:
473     WW8PLCFx_Cp_FKP( SvStream* pSt, SvStream* pTblSt, SvStream* pDataSt, const WW8ScannerBase&
474                         rBase,  ePLCFT ePl );
475     virtual ~WW8PLCFx_Cp_FKP();
476     void ResetAttrStartEnd();
477     sal_uLong GetPCDIMax() const;
478     sal_uLong GetPCDIdx() const;
479     void SetPCDIdx( sal_uLong nIdx );
480     virtual sal_uLong GetIdx2() const;
481     virtual void  SetIdx2( sal_uLong nIdx );
482     virtual sal_Bool SeekPos( WW8_CP nCpPos );
483     virtual WW8_CP Where();
484     virtual void GetSprms( WW8PLCFxDesc* p );
485     virtual WW8PLCFx& operator ++( int );
486     virtual void Save(          WW8PLCFxSave1& rSave ) const;
487     virtual void Restore( const WW8PLCFxSave1& rSave );
488 };
489 
490 
491 
492 class WW8PLCFx_SEPX : public WW8PLCFx           // Iterator fuer Piece Table Exceptions of Sepx
493 {
494     SvStream* pStrm;
495     WW8PLCF* pPLCF;
496     sal_uInt8* pSprms;
497     sal_uInt16 nArrMax;
498     sal_uInt16 nSprmSiz;
499 
500 public:
501     WW8PLCFx_SEPX( SvStream* pSt, SvStream* pTblxySt, WW8Fib& rFib, WW8_CP nStartCp );
502     virtual ~WW8PLCFx_SEPX();
503     virtual sal_uLong GetIdx() const;
504     virtual void SetIdx( sal_uLong nIdx );
GetIMax() const505     long GetIMax() const { return ( pPLCF ) ? pPLCF->GetIMax() : 0; }
506     virtual sal_Bool SeekPos( WW8_CP nCpPos );
507     virtual long Where();
508     virtual void GetSprms( WW8PLCFxDesc* p );
509     virtual WW8PLCFx& operator ++( int );
510     sal_uInt8* HasSprm( sal_uInt16 nId ) const;
511     sal_uInt8* HasSprm( sal_uInt16 nId, sal_uInt8 n2nd ) const;
512     sal_uInt8* HasSprm( sal_uInt16 nId, sal_uInt8* pOtherSprms, long nOtherSprmSiz ) const;
513     sal_Bool Find4Sprms(sal_uInt16 nId1, sal_uInt16 nId2, sal_uInt16 nId3, sal_uInt16 nId4,
514                     sal_uInt8*& p1,   sal_uInt8*& p2,   sal_uInt8*& p3,   sal_uInt8*& p4 ) const;
515     sal_Bool CompareSprms( sal_uInt8* pOtherSprms,
516                        long nOtherSprmSiz,
517                        const SvUShortsSort* pIgnoreSprms = 0 ) const;
518 };
519 
520 // Iterator fuer Fuss-/Endnoten und Anmerkungen
521 class WW8PLCFx_SubDoc : public WW8PLCFx
522 {
523     WW8PLCF* pRef;
524     WW8PLCF* pTxt;
525 
526 public:
527     WW8PLCFx_SubDoc( SvStream* pSt, sal_uInt8 nVersion, WW8_CP nStartCp,
528                     long nFcRef, long nLenRef,
529                     long nFcTxt, long nLenTxt, long nStruc = 0 );
530     virtual ~WW8PLCFx_SubDoc();
531     virtual sal_uLong GetIdx() const;
532     virtual void SetIdx( sal_uLong nIdx );
533     virtual sal_Bool SeekPos( WW8_CP nCpPos );
534     virtual long Where();
535 
536     // liefert Reference Descriptoren
GetData(long nIdx=-1) const537     const void* GetData( long nIdx = -1 ) const
538         {
539             return pRef ? pRef->GetData( -1L == nIdx ? pRef->GetIdx()
540                                                      : nIdx ) : 0;
541         }
542 
543     /*
544         liefert Angabe, wo Kopf und Fusszeilen-Text zu finden ist
545     */
546     sal_Bool Get( long& rStart, void*& rpValue );
547     virtual long GetNoSprms( long& rStart, long&, long& rLen );
548     virtual WW8PLCFx& operator ++( int );
Count()549     long Count() { return ( pRef ) ? pRef->GetIMax() : 0; }
550 };
551 
552 class WW8PLCFx_FLD : public WW8PLCFx            // Iterator fuer Fuss- und Endnoten
553 {
554     WW8PLCFspecial* pPLCF;
555     WW8Fib& rFib;
556 
557 public:
558     WW8PLCFx_FLD( SvStream* pSt, WW8Fib& rMyFib, short nType, WW8_CP nStartCp );
559     virtual ~WW8PLCFx_FLD();
560     virtual sal_uLong GetIdx() const;
561     virtual void SetIdx( sal_uLong nIdx );
562     virtual sal_Bool SeekPos( WW8_CP nCpPos );
563     virtual long Where();
564     virtual long GetNoSprms( long& rStart, long&, long& rLen );
565     virtual WW8PLCFx& operator ++( int );
566     sal_Bool GetPara( long nIdx, WW8FieldDesc& rF );
567 };
568 
569 enum eBookStatus { BOOK_NORMAL = 0, BOOK_IGNORE = 0x1, BOOK_ONLY_REF = 0x2 };
570 
571 class WW8PLCFx_Book : public WW8PLCFx           // Iterator fuer Booknotes
572 {
573     WW8PLCFspecial* pBook[2];           // Start- und EndPosition
574     SvStrings aBookNames;               // Name
575     eBookStatus* pStatus;
576     long nIMax;                         // Anzahl der Booknotes
577     sal_uInt16 nIsEnd;
578 public:
579     WW8PLCFx_Book( SvStream* pSt, SvStream* pTblSt, WW8Fib& rFib, WW8_CP nStartCp );
580     virtual ~WW8PLCFx_Book();
GetIMax()581     long GetIMax(){ return nIMax; }
582     virtual sal_uLong GetIdx() const;
583     virtual void SetIdx( sal_uLong nI );
584     virtual sal_uLong GetIdx2() const;
585     virtual void SetIdx2( sal_uLong nIdx );
586     virtual sal_Bool SeekPos( WW8_CP nCpPos );
587     virtual long Where();
588     virtual long GetNoSprms( long& rStart, long& rEnd, long& rLen );
589     virtual WW8PLCFx& operator ++( int );
GetName() const590     const String* GetName() const
591         { return ( !nIsEnd && ( (long)(pBook[0]->GetIdx()) < nIMax ) )
592                         ? aBookNames[ pBook[0]->GetIdx() ]
593                         : 0;
594         }
GetStartPos() const595     WW8_CP GetStartPos() const
596         { return ( nIsEnd ) ? LONG_MAX : pBook[0]->Where(); }
597     long GetLen() const;
GetIsEnd() const598     sal_Bool GetIsEnd() const { return ( nIsEnd ) ? sal_True : sal_False; }
599     long GetHandle() const;
600     sal_Bool SetStatus( WW8_CP nStartRegion, WW8_CP nEndRegion, const String& rName,
601                     eBookStatus eStat );
602     eBookStatus GetStatus() const;
603 };
604 
605 /*
606     hiermit arbeiten wir draussen:
607 */
608 struct WW8PLCFManResult
609 {
610     WW8_CP nCpPos;      // Attribut-Anfangsposition
611     long nMemLen;       // Laenge dazu
612     long nCp2OrIdx;     // footnote-textpos oder Index in PLCF
613     WW8_CP nAktCp;      // wird nur vom Aufrufer benutzt
614     sal_uInt8* pMemPos;     // Mem-Pos fuer Sprms
615     sal_uInt16 nSprmId;     // Sprm-Id ( 0 = ungueltige Id -> ueberspringen! )
616                                         // (2..255) oder Pseudo-Sprm-Id (256..260)
617                                         // bzw. ab Winword-Ver8 die Sprm-Id (800..)
618     sal_uInt8 nFlags;       // Absatz- oder Section-Anfang
619 };
620 
621 #define MAN_ANZ_PLCF 12
622 
623 #define MAN_MASK_NEW_PAP 1      // neue Zeile
624 #define MAN_MASK_NEW_SEP 2      // neue Section
625 
626 
627 #define MAN_MAINTEXT 0          // Defines fuer PLCFMan-ctor
628 #define MAN_FTN 1
629 #define MAN_EDN 2
630 #define MAN_HDFT 3
631 #define MAN_AND 4
632 #define MAN_TXBX 5
633 #define MAN_TXBX_HDFT 6
634 
635 struct WW8PLCFxSaveAll
636 {
637     WW8PLCFxSave1 aS[MAN_ANZ_PLCF];
638 };
639 
640 /*
641     hiermit arbeitet der Manager drinnen:
642 */
643 struct WW8PLCFxDesc
644 {
645     WW8PLCFx* pPLCFx;
646     UShortStk* pIdStk;// Speicher fuer Attr-Id fuer Attr-Ende(n)
647     sal_uInt8* pMemPos;     // wo liegen die Sprm(s)
648     long nStartPos;
649     long nEndPos;
650     long nCp2OrIdx;     // wo liegen die NoSprm(s)
651     long nSprmsLen;     // wie viele Bytes fuer weitere Sprms / Laenge Fussnote
652     long nCpOfs;        // fuer Offset Header .. Footnote
653     sal_Bool bFirstSprm;    // fuer Erkennung erster Sprm einer Gruppe
654     sal_Bool bRealLineEnd;  // sal_False bei Pap-Piece-Ende
655     void Save(          WW8PLCFxSave1& rSave ) const;
656     void Restore( const WW8PLCFxSave1& rSave );
657 };
658 
659 
660 #ifndef DUMP
661 
662 class WW8PLCFMan
663 {
664     long nCpO;      // Origin Cp -- the basis for nNewCp
665 
666     long nLineEnd;                  // zeigt *hinter* das <CR>
667     long nLastWhereIdxCp;           // last result of WhereIdx()
668     sal_uInt16 nPLCF;                   // so viele PLCFe werden verwaltet
669     short nManType;
670 
671     WW8PLCFxDesc aD[MAN_ANZ_PLCF];
672     WW8PLCFxDesc *pChp, *pPap, *pSep, *pFld, *pFldTxbx, *pFldTxbxHdft,
673                  *pFtn, *pEdn,
674                  *pBkm, *pPcd, *pPcdA, *pAnd;
675     WW8PLCFspecial *pFdoa, *pTxbx, *pTxbxBkd;
676 
677     WW8Fib* pWwFib;
678     sal_uInt16* pNoAttrScan; // Attribute komplett(!) ignorieren, die ueber n CPs
679                         // aufgespannt sind; z.B. bei Char #7 (Zellen-/Zeilenende)
680 
681     short WhereIdx( sal_Bool* pbStart, long* pPos );
682     void AdjustEnds(    WW8PLCFxDesc& rDesc );
683     void GetNewSprms(   WW8PLCFxDesc& rDesc );
684     void GetNewNoSprms( WW8PLCFxDesc& rDesc );
685     void GetSprmStart( short nIdx, WW8PLCFManResult* pRes );
686     void GetSprmEnd( short nIdx, WW8PLCFManResult* pRes );
687     void GetNoSprmStart( short nIdx, WW8PLCFManResult* pRes );
688     void GetNoSprmEnd( short nIdx, WW8PLCFManResult* pRes );
689     void AdvSprm(   short nIdx, sal_Bool bStart );
690     void AdvNoSprm( short nIdx, sal_Bool bStart );
691 
692 public:
693     WW8PLCFMan( WW8ScannerBase* pBase, short nType, long nStartCp );
694     ~WW8PLCFMan();
695 
696     /*
697         Where fragt, an welcher naechsten Position sich irgendein
698         Attr aendert...
699     */
700     long Where();
701 
702     sal_Bool Get( WW8PLCFManResult* pResult );
703     WW8PLCFMan& operator ++( int );
704     sal_uInt16 GetColl() const; // liefert aktuellen Style
705     WW8PLCFx_FLD* GetFld() const;
GetEdn() const706     WW8PLCFx_SubDoc* GetEdn() const { return (WW8PLCFx_SubDoc*)pEdn->pPLCFx; }
GetFtn() const707     WW8PLCFx_SubDoc* GetFtn() const { return (WW8PLCFx_SubDoc*)pFtn->pPLCFx; }
GetAtn() const708     WW8PLCFx_SubDoc* GetAtn() const { return (WW8PLCFx_SubDoc*)pAnd->pPLCFx; }
GetBook() const709     WW8PLCFx_Book* GetBook() const { return (WW8PLCFx_Book*)pBkm->pPLCFx; }
GetCpOfs() const710     long GetCpOfs() const { return pChp->nCpOfs; }  // fuer Header/Footer...
711 
712     /*
713         fragt, ob *aktueller Absatz* einen Sprm diesen Typs hat
714     */
715     sal_uInt8* HasParaSprm( sal_uInt16 nId ) const;
716 
717     /*
718         fragt, ob *aktueller Textrun* einen Sprm diesen Typs hat
719     */
720     sal_uInt8* HasCharSprm( sal_uInt16 nId ) const;
721 
GetChpPLCF()722     WW8PLCFx_Cp_FKP* GetChpPLCF(){ return (WW8PLCFx_Cp_FKP*)pChp->pPLCFx; }
GetPapPLCF()723     WW8PLCFx_Cp_FKP* GetPapPLCF(){ return (WW8PLCFx_Cp_FKP*)pPap->pPLCFx; }
GetSepPLCF()724     WW8PLCFx_SEPX* GetSepPLCF(){   return (WW8PLCFx_SEPX*)pSep->pPLCFx; }
GetPap()725     WW8PLCFxDesc* GetPap(){ return pPap; }
726     void SeekPos( long nNewCp );
727     void SaveAllPLCFx(                   WW8PLCFxSaveAll& rSave ) const;
728     void RestoreAllPLCFx(          const WW8PLCFxSaveAll& rSave );
GetFdoa()729     WW8PLCFspecial* GetFdoa()   { return pFdoa;     }
GetTxbx()730     WW8PLCFspecial* GetTxbx()   { return pTxbx;     }
GetTxbxBkd()731     WW8PLCFspecial* GetTxbxBkd(){ return pTxbxBkd;  }
GetManType()732     short GetManType() { return nManType; }
733 };
734 
735 #endif // !DUMP
736 
737 class WW8ScannerBase
738 {
739 friend WW8PLCFx_PCDAttrs::WW8PLCFx_PCDAttrs( sal_uInt8 nVersion, WW8PLCFx_PCD* pPLCFx_PCD, WW8ScannerBase* pBase );
740 friend WW8PLCFx_Cp_FKP::WW8PLCFx_Cp_FKP( SvStream*, SvStream*, SvStream*,
741                                         const WW8ScannerBase&, ePLCFT );
742 
743 #ifdef DUMP
744 friend static void DumpPLCFText( WW8_FC nPos, long nLen, long nOfs, sal_Char* pName,
745                                 WW8ScannerBase* pBase );
746 friend static void DumpFtnShort( short nId, long nPos, long nFieldLen );
747 #else
748 friend WW8PLCFMan::WW8PLCFMan( WW8ScannerBase*, short, long );
749 friend class SwWw8ImplReader;
750 #endif
751 
752     WW8Fib* pWw8Fib;
753     WW8PLCFx_Cp_FKP*  pChpPLCF;         // Character-Attrs
754     WW8PLCFx_Cp_FKP*  pPapPLCF;         // Para-Attrs
755     WW8PLCFx_SEPX*    pSepPLCF;         // Section-Attrs
756     WW8PLCFx_SubDoc*  pFtnPLCF;         // Footnotes
757     WW8PLCFx_SubDoc*  pEdnPLCF;         // EndNotes
758     WW8PLCFx_SubDoc*  pAndPLCF;         // Anmerkungen
759     WW8PLCFx_FLD*     pFldPLCF;         // Fields in Main Text
760     WW8PLCFx_FLD*     pFldHdFtPLCF;     // Fields in Header / Footer
761     WW8PLCFx_FLD*     pFldTxbxPLCF;     // Fields in Textboxes in Main Text
762     WW8PLCFx_FLD*     pFldTxbxHdFtPLCF; // Fields in Textboxes in Header / Footer
763     WW8PLCFx_FLD*     pFldFtnPLCF;      // Fields in Footnotes
764     WW8PLCFx_FLD*     pFldEdnPLCF;      // Fields in Endnotes
765     WW8PLCFx_FLD*     pFldAndPLCF;      // Fields in Anmerkungen
766     WW8PLCFspecial*   pMainFdoa;        // Graphic Primitives in Main Text
767     WW8PLCFspecial*   pHdFtFdoa;        // Graphic Primitives in Header / Footer
768     WW8PLCFspecial*   pMainTxbx;        // Textboxen in Main Text
769     WW8PLCFspecial*   pMainTxbxBkd;     // Break-Deskriptoren fuer diese
770     WW8PLCFspecial*   pHdFtTxbx;        // TextBoxen in Header / Footer
771     WW8PLCFspecial*   pHdFtTxbxBkd;     // Break-Deskriptoren fuer diese
772     WW8PLCFx_Book*    pBook;            // Bookmarks
773 
774     WW8PLCFpcd*         pPiecePLCF; // fuer FastSave ( Basis-PLCF ohne Iterator )
775     WW8PLCFpcd_Iter*    pPieceIter; // fuer FastSave ( Iterator dazu )
776     WW8PLCFx_PCD*       pPLCFx_PCD;     // dito
777     WW8PLCFx_PCDAttrs*  pPLCFx_PCDAttrs;
778     sal_uInt8**                 pPieceGrpprls;  // Attribute an Piece-Table
779     sal_uInt16              nPieceGrpprls;  // Anzahl davon
780     sal_uInt16              nNoAttrScan;    // Attribute komplett(!) ignorieren, die ueber n CPs
781                                         // aufgespannt sind; z.B. bei Char #7 (Zellen-/Zeilenende)
782 
783     WW8PLCFpcd* OpenPieceTable( SvStream* pStr, WW8Fib* pWwF );
784     void DeletePieceTable();
785 
786 public:
787     WW8ScannerBase( SvStream* pSt, SvStream* pTblSt, SvStream* pDataSt,
788                     WW8Fib* pWwF );
789     ~WW8ScannerBase();
AreThereFootnotes()790     sal_Bool AreThereFootnotes() { return pFtnPLCF->Count() > 0; };
AreThereEndnotes()791     sal_Bool AreThereEndnotes()  { return pEdnPLCF->Count() > 0; };
792     static DateTime WW8DTTM2DateTime(long lDTTM);
793 
794     WW8_CP WW8Fc2Cp( WW8_FC nFcPos ) const ;
795     WW8_FC WW8Cp2Fc( WW8_CP nCpPos, sal_Bool* pIsUnicode = 0,
796                      WW8_CP* pNextPieceCp = 0, sal_Bool* pTestFlag = 0 ) const;
SetNoAttrScan(sal_uInt16 nValue)797     void SetNoAttrScan( sal_uInt16 nValue ) { nNoAttrScan = nValue; };
798 
799     sal_uInt16 WW8ReadString( SvStream& rStrm, String& rStr,
800                             WW8_CP nAktStartCp, long nTotalLen,
801                             rtl_TextEncoding eEnc ) const;
802 };
803 
804 
805 
806 /** FIB - File Information Block
807 */
808 class WW8Fib
809 {
810 public:
811     /*
812         von uns verlangte Programm-Version:
813         in Ctor wird geprueft, ob sie zu nFib passt
814     */
815     sal_uInt8 nVersion; // 6 steht fuer "WinWord 6 oder WinWord 95",
816                                     // 7 steht fuer "nur WinWord 95"
817                                     // 8 steht fuer "nur WinWord 97"
818     /*
819         Fehlerstatus
820     */
821     sal_uLong nFibError;
822     /*
823         vom Ctor aus dem FIB gelesene Daten
824         (entspricht nur ungefaehr der tatsaechlichen Struktur
825          des Winword-FIB)
826     */
827     sal_uInt16 wIdent;      // 0x0 int magic number
828     sal_uInt16 nFib;        // 0x2 FIB version written
829     sal_uInt16 nProduct;    // 0x4 product version written by
830     sal_Int16 lid;          // 0x6 language stamp---localized version;
831     WW8_PN pnNext;          // 0x8
832 
833     sal_uInt16 fDot :1;     // 0xa 0001
834     sal_uInt16 fGlsy :1;
835     sal_uInt16 fComplex :1; // 0004 when 1, file is in complex, fast-saved format.
836     sal_uInt16 fHasPic :1;  // 0008 file contains 1 or more pictures
837     sal_uInt16 cQuickSaves :4; // 00F0 count of times file was quicksaved
838     sal_uInt16 fEncrypted :1; //0100 1 if file is encrypted, 0 if not
839     sal_uInt16 fWhichTblStm :1; //0200 When 0, this fib refers to the table stream
840                                                     // named "0Table", when 1, this fib refers to the
841                                                     // table stream named "1Table". Normally, a file
842                                                     // will have only one table stream, but under unusual
843                                                     // circumstances a file may have table streams with
844                                                     // both names. In that case, this flag must be used
845                                                     // to decide which table stream is valid.
846     // sal_uInt16 u1 :2;
847     sal_uInt16 fExtChar :1; // 1000 =1, when using extended character set in file
848     // sal_uInt16 u2 :3;
849 
850     sal_uInt16 nFibBack;    // 0xc
851     sal_Int16 lKey1;            // 0xe  file encrypted key, only valid if fEncrypted.
852     sal_Int16 lKey2;            // 0x10  key in 2 Portionen wg. Misalignment
853     sal_uInt8 envr;         // 0x12 environment in which file was created
854                                     //      0 created by Win Word / 1 created by Mac Word
855     sal_uInt8 fMac              :1;         // 0x13 when 1, this file was last saved in the Mac environment
856     sal_uInt8 fEmptySpecial     :1;
857     sal_uInt8 fLoadOverridePage :1;
858     sal_uInt8 fFuturesavedUndo  :1;
859     sal_uInt8 fWord97Saved      :1;
860     sal_uInt8 :3;
861 
862     sal_uInt16 chse;        // 0x14 default extended character set id for text in document stream. (overidden by chp.chse)
863                         //      0 = ANSI  / 256 Macintosh character set.
864     sal_uInt16 chseTables;  // 0x16 default extended character set id for text in
865                         //      internal data structures: 0 = ANSI, 256 = Macintosh
866     WW8_FC fcMin;           // 0x18 file offset of first character of text
867     WW8_FC fcMac;           // 0x1c file offset of last character of text + 1
868 
869     // Einschub fuer WW8 *****************************************************
870     sal_uInt16 csw;             // Count of fields in the array of "shorts"
871 
872     // Marke: "rgsw" Beginning of the array of shorts
873     sal_uInt16 wMagicCreated;                   // unique number Identifying the File's creator
874                                                                 // 0x6A62 is the creator ID for Word and is reserved.
875                                                                 // Other creators should choose a different value.
876     sal_uInt16 wMagicRevised;                   // identifies the File's last modifier
877   sal_uInt16 wMagicCreatedPrivate;  // private data
878     sal_uInt16 wMagicRevisedPrivate;    // private data
879     /*
880     sal_Int16  pnFbpChpFirst_W6;            // not used
881     sal_Int16  pnChpFirst_W6;                   // not used
882     sal_Int16  cpnBteChp_W6;                    // not used
883     sal_Int16  pnFbpPapFirst_W6;            // not used
884     sal_Int16  pnPapFirst_W6;                   // not used
885     sal_Int16  cpnBtePap_W6;                    // not used
886     sal_Int16  pnFbpLvcFirst_W6;            // not used
887     sal_Int16  pnLvcFirst_W6;                   // not used
888     sal_Int16  cpnBteLvc_W6;                    // not used
889     */
890     sal_Int16  lidFE;                                   // Language id if document was written by Far East version
891                                                                 // of Word (i.e. FIB.fFarEast is on)
892     sal_uInt16 clw;                                     // Number of fields in the array of longs
893 
894     // Ende des Einschubs fuer WW8 *******************************************
895 
896     // Marke: "rglw" Beginning of the array of longs
897     WW8_FC cbMac;           // 0x20 file offset of last byte written to file + 1.
898 
899     // WW8_FC u4[4];            // 0x24
900     WW8_CP ccpText;         // 0x34 length of main document text stream
901     WW8_CP ccpFtn;          // 0x38 length of footnote subdocument text stream
902     WW8_CP ccpHdr;          // 0x3c length of header subdocument text stream
903     WW8_CP ccpMcr;          // 0x40 length of macro subdocument text stream
904     WW8_CP ccpAtn;          // 0x44 length of annotation subdocument text stream
905     WW8_CP ccpEdn;          // 0x48 length of endnote subdocument text stream
906     WW8_CP ccpTxbx;         // 0x4c length of textbox subdocument text stream
907     WW8_CP ccpHdrTxbx;      // 0x50 length of header textbox subdocument text stream
908 
909     // Einschub fuer WW8 *****************************************************
910     sal_Int32  pnFbpChpFirst;   // when there was insufficient memory for Word to expand
911                                                 // the PLCFbte at save time, the PLCFbte is written
912                                                 // to the file in a linked list of 512-byte pieces
913                                                 // starting with this pn.
914     /*
915     // folgende Felder existieren zwar so in der Datei,
916     // wir benutzen jedoch unten deklarierte General-Variablen
917     // fuer Ver67 und Ver8 gemeinsam.
918     sal_Int32  pnChpFirst;      // the page number of the lowest numbered page in the
919                                                         // document that records CHPX FKP information
920     sal_Int32  cpnBteChp;           // count of CHPX FKPs recorded in file. In non-complex
921                                                         // files if the number of entries in the PLCFbteChpx
922                                                         // is less than this, the PLCFbteChpx is incomplete.
923     */
924     sal_Int32  pnFbpPapFirst;   // when there was insufficient memory for Word to expand
925                                                 // the PLCFbte at save time, the PLCFbte is written to
926                                                 // the file in a linked list of 512-byte pieces
927                                                 // starting with this pn
928     /*
929     // folgende Felder existieren zwar so in der Datei,
930     // wir benutzen jedoch unten deklarierte General-Variablen
931     // fuer Ver67 und Ver8 gemeinsam.
932     sal_Int32  pnPapFirst;      // the page number of the lowest numbered page in the
933                                                         // document that records PAPX FKP information
934     sal_Int32  cpnBtePap;       // count of PAPX FKPs recorded in file. In non-complex
935                                                         // files if the number of entries in the PLCFbtePapx is
936                                                         // less than this, the PLCFbtePapx is incomplete.
937     */
938     sal_Int32  pnFbpLvcFirst;   // when there was insufficient memory for Word to expand
939                                                 // the PLCFbte at save time, the PLCFbte is written to
940                                                 // the file in a linked list of 512-byte pieces
941                                                 // starting with this pn
942     sal_Int32  pnLvcFirst;          // the page number of the lowest numbered page in the
943                                                 // document that records LVC FKP information
944     sal_Int32  cpnBteLvc;           // count of LVC FKPs recorded in file. In non-complex
945                                                 // files if the number of entries in the PLCFbtePapx is
946                                                 // less than this, the PLCFbtePapx is incomplete.
947     sal_Int32  fcIslandFirst;   // ?
948     sal_Int32  fcIslandLim;     // ?
949     sal_uInt16 cfclcb;              // Number of fields in the array of FC/LCB pairs.
950 
951     // Ende des Einschubs fuer WW8 *******************************************
952 
953     // Marke: "rgfclcb" Beginning of array of FC/LCB pairs.
954     WW8_FC fcStshfOrig;     // file offset of original allocation for STSH in table
955                                                 // stream. During fast save Word will attempt to reuse
956                                                 // this allocation if STSH is small enough to fit.
957     sal_Int32 lcbStshfOrig; // 0x5c count of bytes of original STSH allocation
958     WW8_FC fcStshf;         // 0x60 file offset of STSH in file.
959     sal_Int32 lcbStshf;     // 0x64 count of bytes of current STSH allocation
960     WW8_FC fcPlcffndRef;    // 0x68 file offset of footnote reference PLCF.
961     sal_Int32 lcbPlcffndRef;    // 0x6c count of bytes of footnote reference PLCF
962                         //      == 0 if no footnotes defined in document.
963 
964     WW8_FC fcPlcffndTxt;    // 0x70 file offset of footnote text PLCF.
965     sal_Int32 lcbPlcffndTxt;    // 0x74 count of bytes of footnote text PLCF.
966                         //      == 0 if no footnotes defined in document
967 
968     WW8_FC fcPlcfandRef;    // 0x78 file offset of annotation reference PLCF.
969     sal_Int32 lcbPlcfandRef;    // 0x7c count of bytes of annotation reference PLCF.
970 
971     WW8_FC fcPlcfandTxt;    // 0x80 file offset of annotation text PLCF.
972     sal_Int32 lcbPlcfandTxt;    // 0x84 count of bytes of the annotation text PLCF
973 
974     WW8_FC fcPlcfsed;       // 8x88 file offset of section descriptor PLCF.
975     sal_Int32 lcbPlcfsed;   // 0x8c count of bytes of section descriptor PLCF.
976 
977     WW8_FC fcPlcfpad;       // 0x90 file offset of paragraph descriptor PLCF
978     sal_Int32 lcbPlcfpad;   // 0x94 count of bytes of paragraph descriptor PLCF.
979                         // ==0 if file was never viewed in Outline view.
980                         // Should not be written by third party creators
981 
982     WW8_FC fcPlcfphe;       // 0x98 file offset of PLCF of paragraph heights.
983     sal_Int32 lcbPlcfphe;   // 0x9c count of bytes of paragraph height PLCF.
984                         // ==0 when file is non-complex.
985 
986     WW8_FC fcSttbfglsy;     // 0xa0 file offset of glossary string table.
987     sal_Int32 lcbSttbfglsy; // 0xa4 count of bytes of glossary string table.
988                         //      == 0 for non-glossary documents.
989                         //      !=0 for glossary documents.
990 
991     WW8_FC fcPlcfglsy;      // 0xa8 file offset of glossary PLCF.
992     sal_Int32 lcbPlcfglsy;  // 0xac count of bytes of glossary PLCF.
993                         //      == 0 for non-glossary documents.
994                         //      !=0 for glossary documents.
995 
996     WW8_FC fcPlcfhdd;       // 0xb0 byte offset of header PLCF.
997     sal_Int32 lcbPlcfhdd;   // 0xb4 count of bytes of header PLCF.
998                         //      == 0 if document contains no headers
999 
1000     WW8_FC fcPlcfbteChpx;   // 0xb8 file offset of character property bin table.PLCF.
1001     sal_Int32 lcbPlcfbteChpx;// 0xbc count of bytes of character property bin table PLCF.
1002 
1003     WW8_FC fcPlcfbtePapx;   // 0xc0 file offset of paragraph property bin table.PLCF.
1004     sal_Int32 lcbPlcfbtePapx;// 0xc4 count of bytes of paragraph  property bin table PLCF.
1005 
1006     WW8_FC fcPlcfsea;       // 0xc8 file offset of PLCF reserved for private use. The SEA is 6 bytes long.
1007     sal_Int32 lcbPlcfsea;   // 0xcc count of bytes of private use PLCF.
1008 
1009     WW8_FC fcSttbfffn;      // 0xd0 file offset of font information STTBF. See the FFN file structure definition.
1010     sal_Int32 lcbSttbfffn;  // 0xd4 count of bytes in sttbfffn.
1011 
1012     WW8_FC fcPlcffldMom;    // 0xd8 offset in doc stream to the PLCF of field positions in the main document.
1013     sal_Int32 lcbPlcffldMom;    // 0xdc
1014 
1015     WW8_FC fcPlcffldHdr;    // 0xe0 offset in doc stream to the PLCF of field positions in the header subdocument.
1016     sal_Int32 lcbPlcffldHdr;    // 0xe4
1017 
1018     WW8_FC fcPlcffldFtn;    // 0xe8 offset in doc stream to the PLCF of field positions in the footnote subdocument.
1019     sal_Int32 lcbPlcffldFtn;    // 0xec
1020 
1021     WW8_FC fcPlcffldAtn;    // 0xf0 offset in doc stream to the PLCF of field positions in the annotation subdocument.
1022     sal_Int32 lcbPlcffldAtn;    // 0xf4
1023 
1024     WW8_FC fcPlcffldMcr;    // 0xf8 offset in doc stream to the PLCF of field positions in the macro subdocument.
1025     sal_Int32 lcbPlcffldMcr;    // 9xfc
1026 
1027     WW8_FC fcSttbfbkmk; // 0x100 offset in document stream of the STTBF that records bookmark names in the main document
1028     sal_Int32 lcbSttbfbkmk; // 0x104
1029 
1030     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
1031     sal_Int32 lcbPlcfbkf;   // 0x10c
1032 
1033     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.
1034     sal_Int32 lcbPlcfbkl;   // 0x114 sal_Int32
1035 
1036     WW8_FC fcCmds;      // 0x118 FC
1037     sal_Int32 lcbCmds;      // 0x11c
1038 
1039     WW8_FC fcPlcfmcr;       // 0x120 FC
1040     sal_Int32 lcbPlcfmcr;       // 0x124
1041 
1042     WW8_FC fcSttbfmcr;  // 0x128 FC
1043     sal_Int32 lcbSttbfmcr;  // 0x12c
1044 
1045     WW8_FC fcPrDrvr;        // 0x130 file offset of the printer driver information (names of drivers, port etc...)
1046     sal_Int32 lcbPrDrvr;        // 0x134 count of bytes of the printer driver information (names of drivers, port etc...)
1047 
1048     WW8_FC fcPrEnvPort; // 0x138 file offset of the print environment in portrait mode.
1049     sal_Int32 lcbPrEnvPort; // 0x13c count of bytes of the print environment in portrait mode.
1050 
1051     WW8_FC fcPrEnvLand; // 0x140 file offset of the print environment in landscape mode.
1052     sal_Int32 lcbPrEnvLand; // 0x144 count of bytes of the print environment in landscape mode.
1053 
1054     WW8_FC fcWss;       // 0x148 file offset of Window Save State data structure. See WSS.
1055     sal_Int32 lcbWss;       // 0x14c count of bytes of WSS. ==0 if unable to store the window state.
1056 
1057     WW8_FC fcDop;       // 0x150 file offset of document property data structure.
1058     sal_Int32 lcbDop;       // 0x154 count of bytes of document properties.
1059         // cbDOP is 84 when nFib < 103
1060 
1061 
1062     WW8_FC fcSttbfAssoc;    // 0x158 offset to STTBF of associated strings. See STTBFASSOC.
1063     sal_Int32 cbSttbfAssoc; // 0x15C
1064 
1065     WW8_FC fcClx;           // 0x160 file  offset of beginning of information for complex files.
1066     sal_Int32 lcbClx;       // 0x164 count of bytes of complex file information. 0 if file is non-complex.
1067 
1068     WW8_FC fcPlcfpgdFtn;    // 0x168 file offset of page descriptor PLCF for footnote subdocument.
1069     sal_Int32 lcbPlcfpgdFtn;    // 0x16C count of bytes of page descriptor PLCF for footnote subdocument.
1070                         //  ==0 if document has not been paginated. The length of the PGD is 8 bytes.
1071 
1072     WW8_FC fcAutosaveSource;    // 0x170 file offset of the name of the original file.
1073     sal_Int32 lcbAutosaveSource;    // 0x174 count of bytes of the name of the original file.
1074 
1075     WW8_FC fcGrpStAtnOwners;    // 0x178 group of strings recording the names of the owners of annotations
1076     sal_Int32 lcbGrpStAtnOwners;    // 0x17C count of bytes of the group of strings
1077 
1078     WW8_FC fcSttbfAtnbkmk;  // 0x180 file offset of the sttbf that records names of bookmarks in the annotation subdocument
1079     sal_Int32 lcbSttbfAtnbkmk;  // 0x184 length in bytes of the sttbf that records names of bookmarks in the annotation subdocument
1080 
1081     // Einschubs fuer WW67 ***************************************************
1082 
1083     // sal_Int16 wSpare4Fib;    // Reserve, muss hier nicht deklariert werden
1084 
1085     /*
1086     // folgende Felder existieren zwar so in der Datei,
1087     // wir benutzen jedoch unten deklarierte General-Variablen
1088     // fuer Ver67 und Ver8 gemeinsam.
1089     WW8_PN pnChpFirst;  // the page number of the lowest numbered page in
1090                                                         // the document that records CHPX FKP information
1091     WW8_PN pnPapFirst;  // the page number of the lowest numbered page in
1092                                                         // the document that records PAPX FKP information
1093 
1094     WW8_PN cpnBteChp;       // count of CHPX FKPs recorded in file. In non-complex
1095                                                         // files if the number of entries in the PLCFbteChpx is
1096                                                         // less than this, the PLCFbteChpx  is incomplete.
1097     WW8_PN cpnBtePap;       // count of PAPX FKPs recorded in file. In non-complex
1098                                                         // files if the number of entries in the PLCFbtePapx is
1099                                                         // less than this, the PLCFbtePapx  is incomplete.
1100     */
1101 
1102     // Ende des Einschubs fuer WW67 ******************************************
1103 
1104     WW8_FC fcPlcfdoaMom;    // 0x192 file offset of the  FDOA (drawn object) PLCF for main document.
1105                         //  ==0 if document has no drawn objects. The length of the FDOA is 6 bytes.
1106                         // ab Ver8 unused
1107     sal_Int32 lcbPlcfdoaMom;    // 0x196 length in bytes of the FDOA PLCF of the main document
1108                                                 // ab Ver8 unused
1109     WW8_FC fcPlcfdoaHdr;    // 0x19A file offset of the  FDOA (drawn object) PLCF for the header document.
1110                         //  ==0 if document has no drawn objects. The length of the FDOA is 6 bytes.
1111                         // ab Ver8 unused
1112     sal_Int32 lcbPlcfdoaHdr;    // 0x19E length in bytes of the FDOA PLCF of the header document
1113                                                 // ab Ver8 unused
1114 
1115     WW8_FC fcPlcfspaMom;        // offset in table stream of the FSPA PLCF for main document.
1116                                                 // == 0 if document has no office art objects
1117                                                         // war in Ver67 nur leere Reserve
1118     sal_Int32 lcbPlcfspaMom;        // length in bytes of the FSPA PLCF of the main document
1119                                                         // war in Ver67 nur leere Reserve
1120     WW8_FC fcPlcfspaHdr;        // offset in table stream of the FSPA PLCF for header document.
1121                                                 // == 0 if document has no office art objects
1122                                                         // war in Ver67 nur leere Reserve
1123     sal_Int32 lcbPlcfspaHdr;        // length in bytes of the FSPA PLCF of the header document
1124                                                         // war in Ver67 nur leere Reserve
1125 
1126     WW8_FC fcPlcfAtnbkf;    // 0x1B2 file offset of BKF (bookmark first) PLCF of the annotation subdocument
1127     sal_Int32 lcbPlcfAtnbkf;    // 0x1B6 length in bytes of BKF (bookmark first) PLCF of the annotation subdocument
1128 
1129     WW8_FC fcPlcfAtnbkl;    // 0x1BA file offset of BKL (bookmark last) PLCF of the annotation subdocument
1130     sal_Int32 lcbPlcfAtnbkl;    // 0x1BE length in bytes of BKL (bookmark first) PLCF of the annotation subdocument
1131 
1132     WW8_FC fcPms;       // 0x1C2 file offset of PMS (Print Merge State) information block
1133     sal_Int32 lcbPMS;       // 0x1C6 length in bytes of PMS
1134 
1135     WW8_FC fcFormFldSttbf;  // 0x1CA file offset of form field Sttbf which contains strings used in form field dropdown controls
1136     sal_Int32 lcbFormFldSttbf;  // 0x1CE length in bytes of form field Sttbf
1137 
1138     WW8_FC fcPlcfendRef;    // 0x1D2 file offset of PLCFendRef which points to endnote references in the main document stream
1139     sal_Int32 lcbPlcfendRef;    // 0x1D6
1140 
1141     WW8_FC fcPlcfendTxt;    // 0x1DA file offset of PLCFendRef which points to endnote text  in the endnote document
1142                         //       stream which corresponds with the PLCFendRef
1143     sal_Int32 lcbPlcfendTxt;    // 0x1DE
1144 
1145     WW8_FC fcPlcffldEdn;    // 0x1E2 offset to PLCF of field positions in the endnote subdoc
1146     sal_Int32 lcbPlcffldEdn;    // 0x1E6
1147 
1148     WW8_FC  fcPlcfpgdEdn;   // 0x1EA offset to PLCF of page boundaries in the endnote subdoc.
1149     sal_Int32 lcbPlcfpgdEdn;        // 0x1EE
1150 
1151 
1152     WW8_FC fcDggInfo;           // offset in table stream of the office art object table data.
1153                                                 // The format of office art object table data is found in a separate document.
1154                                                         // war in Ver67 nur leere Reserve
1155     sal_Int32 lcbDggInfo;           // length in bytes of the office art object table data
1156                                                         // war in Ver67 nur leere Reserve
1157 
1158     WW8_FC fcSttbfRMark;        // 0x1fa offset to STTBF that records the author abbreviations...
1159     sal_Int32 lcbSttbfRMark;        // 0x1fe
1160     WW8_FC fcSttbfCaption;  // 0x202 offset to STTBF that records caption titles...
1161     sal_Int32 lcbSttbfCaption;  // 0x206
1162     WW8_FC fcSttbAutoCaption;   // offset in table stream to the STTBF that records the object names and
1163                                                         // indices into the caption STTBF for objects which get auto captions.
1164     sal_Int32 lcbSttbAutoCaption;   // 0x20e
1165 
1166     WW8_FC fcPlcfwkb;       // 0x212 offset to PLCF that describes the boundaries of contributing documents...
1167     sal_Int32 lcbPlcfwkb;       // 0x216
1168 
1169     WW8_FC fcPlcfspl;       // offset in table stream of PLCF (of SPLS structures) that records spell check state
1170                                                         // war in Ver67 nur leere Reserve
1171     sal_Int32 lcbPlcfspl;                   // war in Ver67 nur leere Reserve
1172 
1173     WW8_FC fcPlcftxbxTxt;   // 0x222 ...PLCF of beginning CP in the text box subdoc
1174     sal_Int32 lcbPlcftxbxTxt;   // 0x226
1175     WW8_FC fcPlcffldTxbx;   // 0x22a ...PLCF of field boundaries recorded in the textbox subdoc.
1176     sal_Int32 lcbPlcffldTxbx;   // 0x22e
1177     WW8_FC fcPlcfHdrtxbxTxt;// 0x232 ...PLCF of beginning CP in the header text box subdoc
1178     sal_Int32 lcbPlcfHdrtxbxTxt;// 0x236
1179     WW8_FC fcPlcffldHdrTxbx;// 0x23a ...PLCF of field boundaries recorded in the header textbox subdoc.
1180     sal_Int32 lcbPlcffldHdrTxbx;// 0x23e
1181 
1182     /*
1183         spezielle Listenverwaltung fuer WW8
1184     */
1185     WW8_FC fcPlcfLst;       // 0x02e2 offset in the table stream of list format information.
1186     sal_Int32 lcbPlcfLst;       // 0x02e6 length
1187     WW8_FC fcPlfLfo;        // 0x02ea offset in the table stream of list format override information.
1188     sal_Int32 lcbPlfLfo;        // 0x02ee length
1189     /*
1190         spezielle Break-Verwaltung fuer Text-Box-Stories in WW8
1191     */
1192     WW8_FC fcPlcftxbxBkd;   // 0x02f2 PLCF fuer TextBox-Break-Deskriptoren im Maintext
1193     sal_Int32 lcbPlcftxbxBkd;   // 0x02f6
1194     WW8_FC fcPlcfHdrtxbxBkd;// 0x02fa PLCF fuer TextBox-Break-Deskriptoren im Header-/Footer-Bereich
1195     sal_Int32 lcbPlcfHdrtxbxBkd;// 0x02fe
1196 
1197     // 0x302 - 372 == ignore
1198     /*
1199         ListNames (skip to here!)
1200     */
1201     WW8_FC fcSttbListNames;// 0x0372 PLCF for Listname Table
1202     sal_Int32 lcbSttbListNames;// 0x0376
1203     /*
1204         General-Varaiblen, die fuer Ver67 und Ver8 verwendet werden,
1205         obwohl sie in der jeweiligen DATEI verschiedene Groesse haben:
1206     */
1207     sal_Int32 pnChpFirst;
1208     sal_Int32 pnPapFirst;
1209     sal_Int32 cpnBteChp;
1210     sal_Int32 cpnBtePap;
1211     /*
1212         nun wird lediglich noch ein Ctor benoetigt
1213     */
1214     WW8Fib( SvStream& rStrm, sal_uInt8 nWantedVersion,sal_uInt32 nOffset=0 );
1215 
1216     /* leider falsch, man braucht auch noch einen fuer den Export */
1217     WW8Fib( sal_uInt8 nVersion = 6 );
1218     sal_Bool Write( SvStream& rStrm );
1219 };
1220 
1221 
1222 class WW8Style
1223 {
1224 protected:
1225     WW8Fib& rFib;
1226     SvStream& rSt;
1227     long nStyleStart;
1228     long nStyleLen;
1229 //  WW8_STSHI* pStishi;
1230 
1231     sal_uInt16  cstd;                               // Count of styles in stylesheet
1232     sal_uInt16  cbSTDBaseInFile;        // Length of STD Base as stored in a file
1233     sal_uInt16  fStdStylenamesWritten : 1;  // Are built-in stylenames stored?
1234     sal_uInt16  : 15;                   // Spare flags
1235     sal_uInt16  stiMaxWhenSaved;        // Max sti known when this file was written
1236     sal_uInt16  istdMaxFixedWhenSaved;  // How many fixed-index istds are there?
1237     sal_uInt16  nVerBuiltInNamesWhenSaved;  // Current version of built-in stylenames
1238     sal_uInt16  ftcStandardChpStsh;     // ftc used by StandardChpStsh for this document
1239 
1240 public:
1241     WW8Style( SvStream& rSt, WW8Fib& rFibPara );
1242 //  ~WW8Style(){ delete( pStishi ); pStishi = 0; }
1243     WW8_STD* Read1STDFixed( short& rSkip, short* pcbStd );
1244     WW8_STD* Read1Style( short& rSkip, String* pString, short* pcbStd );
GetCount() const1245     const sal_uInt16 GetCount() const { return cstd; }
1246 };
1247 
1248 
1249 class WW8Fonts
1250 {
1251 protected:
1252     WW8_FFN* pFontA;        // Array of Pointers to Font Description
1253     // Hilfs-Vari
1254     sal_uInt16 nMax;        // Array-Groesse
1255 public:
1256     WW8Fonts( SvStream& rSt, WW8Fib& rFib );
~WW8Fonts()1257     ~WW8Fonts(){ if( pFontA ) delete [] pFontA; }
1258     const WW8_FFN* GetFont( sal_uInt16 nNum ) const;
GetMax() const1259     sal_uInt16 GetMax() const { return nMax; }
1260 };
1261 
1262 
1263 /** Document Properties
1264 */
1265 class WW8Dop
1266 {
1267 public:
1268     /*
1269         Fehlerstatus
1270     */
1271     sal_uLong nDopError;
1272     /*
1273         vom Ctor aus dem FIB gelesene Daten
1274         (entspricht nur ungefaehr der tatsaechlichen Struktur
1275          des Winword-FIB)
1276     */
1277     // Initialisier-Dummy:
1278     sal_uInt8    nDataStart;
1279     //-------------------------
1280     sal_uInt16  fFacingPages : 1;   // 1 when facing pages should be printed
1281     sal_uInt16  fWidowControl : 1;  // 1 when widow control is in effect. 0 when widow control disabled.
1282     sal_uInt16  fPMHMainDoc : 1;    // 1 when doc is a main doc for Print Merge Helper, 0 when not; default=0
1283     sal_uInt16  grfSuppression : 2; // 0 Default line suppression storage; 0= form letter line suppression; 1= no line suppression; default=0
1284     sal_uInt16  fpc : 2;            // 1 footnote position code: 0 as endnotes, 1 at bottom of page, 2 immediately beneath text
1285     sal_uInt16  : 1;                // 0 unused
1286     //-------------------------
1287     sal_uInt16  grpfIhdt : 8;           // 0 specification of document headers and footers. See explanation under Headers and Footers topic.
1288     //-------------------------
1289     sal_uInt16  rncFtn : 2;         // 0 restart index for footnotes, 0 don't restart note numbering, 1 section, 2 page
1290     sal_uInt16  nFtn : 14;          // 1 initial footnote number for document
1291     sal_uInt16  fOutlineDirtySave : 1; // when 1, indicates that information in the hPLCFpad should be refreshed since outline has been dirtied
1292     sal_uInt16  : 7;                //   reserved
1293     sal_uInt16  fOnlyMacPics : 1;   //   when 1, Word believes all pictures recorded in the document were created on a Macintosh
1294     sal_uInt16  fOnlyWinPics : 1;   //   when 1, Word believes all pictures recorded in the document were created in Windows
1295     sal_uInt16  fLabelDoc : 1;      //   when 1, document was created as a print merge labels document
1296     sal_uInt16  fHyphCapitals : 1;  //   when 1, Word is allowed to hyphenate words that are capitalized. When 0, capitalized may not be hyphenated
1297     sal_uInt16  fAutoHyphen : 1;    //   when 1, Word will hyphenate newly typed text as a background task
1298     sal_uInt16  fFormNoFields : 1;
1299     sal_uInt16  fLinkStyles : 1;    //   when 1, Word will merge styles from its template
1300     sal_uInt16  fRevMarking : 1;    //   when 1, Word will mark revisions as the document is edited
1301     sal_uInt16  fBackup : 1;        //   always make backup when document saved when 1.
1302     sal_uInt16  fExactCWords : 1;
1303     sal_uInt16  fPagHidden : 1;     //
1304     sal_uInt16  fPagResults : 1;
1305     sal_uInt16  fLockAtn : 1;       //   when 1, annotations are locked for editing
1306     sal_uInt16  fMirrorMargins : 1; //   swap margins on left/right pages when 1.
1307     sal_uInt16  fReadOnlyRecommended : 1;// user has recommended that this doc be opened read-only when 1
1308     sal_uInt16  fDfltTrueType : 1;  //   when 1, use TrueType fonts by default (flag obeyed only when doc was created by WinWord 2.x)
1309     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).
1310     sal_uInt16  fProtEnabled : 1;   //   when 1, document is protected from edit operations
1311     sal_uInt16  fDispFormFldSel : 1;//   when 1, restrict selections to occur only within form fields
1312     sal_uInt16  fRMView : 1;        //   when 1, show revision markings on screen
1313     sal_uInt16  fRMPrint : 1;       //   when 1, print revision marks when document is printed
1314     sal_uInt16  fWriteReservation : 1;
1315     sal_uInt16  fLockRev : 1;       //   when 1, the current revision marking state is locked
1316     sal_uInt16  fEmbedFonts : 1;    //   when 1, document contains embedded True Type fonts
1317     //    compatibility options
1318     sal_uInt16 copts_fNoTabForInd : 1;          //    when 1, don�t add automatic tab stops for hanging indent
1319     sal_uInt16 copts_fNoSpaceRaiseLower : 1;        //    when 1, don�t add extra space for raised or lowered characters
1320     sal_uInt16 copts_fSupressSpbfAfterPgBrk : 1;    // when 1, suppress the paragraph Space Before and Space After options after a page break
1321     sal_uInt16 copts_fWrapTrailSpaces : 1;      //    when 1, wrap trailing spaces at the end of a line to the next line
1322     sal_uInt16 copts_fMapPrintTextColor : 1;        //    when 1, print colors as black on non-color printers
1323     sal_uInt16 copts_fNoColumnBalance : 1;      //    when 1, don�t balance columns for Continuous Section starts
1324     sal_uInt16 copts_fConvMailMergeEsc : 1;
1325     sal_uInt16 copts_fSupressTopSpacing : 1;        //    when 1, suppress extra line spacing at top of page
1326     sal_uInt16 copts_fOrigWordTableRules : 1;   //    when 1, combine table borders like Word 5.x for the Macintosh
1327     sal_uInt16 copts_fTransparentMetafiles : 1; //    when 1, don�t blank area between metafile pictures
1328     sal_uInt16 copts_fShowBreaksInFrames : 1;   //    when 1, show hard page or column breaks in frames
1329     sal_uInt16 copts_fSwapBordersFacingPgs : 1; //    when 1, swap left and right pages on odd facing pages
1330 
1331     sal_Int16  dxaTab;              // 720 twips    default tab width
1332     sal_uInt16 wSpare;              //
1333     sal_uInt16 dxaHotZ;         //      width of hyphenation hot zone measured in twips
1334     sal_uInt16 cConsecHypLim;       //      number of lines allowed to have consecutive hyphens
1335     sal_uInt16 wSpare2;         //      reserved
1336     sal_Int32   dttmCreated;        // DTTM date and time document was created
1337     sal_Int32   dttmRevised;        // DTTM date and time document was last revised
1338     sal_Int32   dttmLastPrint;      // DTTM date and time document was last printed
1339     sal_Int16   nRevision;          //      number of times document has been revised since its creation
1340     sal_Int32   tmEdited;           //      time document was last edited
1341     sal_Int32   cWords;             //      count of words tallied by last Word Count execution
1342     sal_Int32   cCh;                //      count of characters tallied by last Word Count execution
1343     sal_Int16   cPg;                //      count of pages tallied by last Word Count execution
1344     sal_Int32   cParas;             //      count of paragraphs tallied by last Word Count execution
1345     sal_uInt16 rncEdn : 2;          //      restart endnote number code: 0 don�t restart endnote numbering, 1 section, 2 page
1346     sal_uInt16 nEdn : 14;           //      beginning endnote number
1347     sal_uInt16 epc : 2;         //      endnote position code: 0 at end of section, 3 at end of document
1348     // sal_uInt16 nfcFtnRef : 4;        //      number format code for auto footnotes: 0 Arabic, 1 Upper case Roman, 2 Lower case Roman
1349                                 //      3 Upper case Letter, 4 Lower case Letter
1350                                 // ersetzt durch gleichlautendes Feld unten
1351     // sal_uInt16 nfcEdnRef : 4;        //      number format code for auto endnotes: 0 Arabic, 1 Upper case Roman, 2 Lower case Roman
1352                                 //      3 Upper case Letter, 4 Lower case Letter
1353                                 // ersetzt durch gleichlautendes Feld unten
1354     sal_uInt16 fPrintFormData : 1;  //      only print data inside of form fields
1355     sal_uInt16 fSaveFormData : 1;   //      only save document data that is inside of a form field.
1356     sal_uInt16 fShadeFormData : 1;  //      shade form fields
1357     sal_uInt16 : 2;             //      reserved
1358     sal_uInt16 fWCFtnEdn : 1;       //      when 1, include footnotes and endnotes in word count
1359     sal_Int32   cLines;             //      count of lines tallied by last Word Count operation
1360     sal_Int32   cWordsFtnEnd;       //      count of words in footnotes and endnotes tallied by last Word Count operation
1361     sal_Int32   cChFtnEdn;          //      count of characters in footnotes and endnotes tallied by last Word Count operation
1362     sal_Int16   cPgFtnEdn;          //      count of pages in footnotes and endnotes tallied by last Word Count operation
1363     sal_Int32   cParasFtnEdn;       //      count of paragraphs in footnotes and endnotes tallied by last Word Count operation
1364     sal_Int32   cLinesFtnEdn;       //      count of paragraphs in footnotes and endnotes tallied by last Word Count operation
1365     sal_Int32   lKeyProtDoc;        //      document protection password key, only valid if dop.fProtEnabled, dop.fLockAtn or dop.fLockRev are 1.
1366     sal_uInt16  wvkSaved : 3;       //      document view kind: 0 Normal view, 1 Outline view, 2 Page View
1367     sal_uInt16  wScaleSaved : 9;    //
1368     sal_uInt16  zkSaved : 2;
1369 
1370     // hier sollte bei nFib < 103   Schluss sein, sonst ist Datei fehlerhaft!
1371 
1372     /*
1373         bei nFib >= 103 gehts weiter:
1374     */
1375     sal_uInt32 fNoTabForInd                             :1; // see above in compatibility options
1376     sal_uInt32 fNoSpaceRaiseLower                   :1; // see above
1377     sal_uInt32 fSupressSpbfAfterPageBreak   :1; // see above
1378     sal_uInt32 fWrapTrailSpaces                     :1; // see above
1379     sal_uInt32 fMapPrintTextColor                   :1; // see above
1380     sal_uInt32 fNoColumnBalance                     :1; // see above
1381     sal_uInt32 fConvMailMergeEsc                    :1; // see above
1382     sal_uInt32 fSupressTopSpacing                   :1; // see above
1383     sal_uInt32 fOrigWordTableRules              :1; // see above
1384     sal_uInt32 fTransparentMetafiles            :1; // see above
1385     sal_uInt32 fShowBreaksInFrames              :1; // see above
1386     sal_uInt32 fSwapBordersFacingPgs            :1; // see above
1387     sal_uInt32                                                      :4; // reserved
1388     sal_uInt32 fSuppressTopSpacingMac5      :1; // Suppress extra line spacing at top
1389                                                                                 // of page like MacWord 5.x
1390     sal_uInt32 fTruncDxaExpand                      :1; // Expand/Condense by whole number of points
1391     sal_uInt32 fPrintBodyBeforeHdr              :1; // Print body text before header/footer
1392     sal_uInt32 fNoLeading                                   :1; // Don't add extra spacebetween rows of text
1393     sal_uInt32                                                      :1; // reserved
1394     sal_uInt32 fMWSmallCaps                             :1; // Use larger small caps like MacWord 5.x
1395     sal_uInt32                                                   :10;// reserved
1396 
1397     // hier sollte bei nFib <= 105  Schluss sein, sonst ist Datei fehlerhaft!
1398 
1399     /*
1400         bei nFib > 105 gehts weiter:
1401     */
1402     sal_Int16   adt;                            // Autoformat Document Type:
1403                                                     // 0 for normal. 1 for letter, and 2 for email.
1404     WW8_DOPTYPOGRAPHY doptypography;    // siehe WW8STRUC.HXX
1405     WW8_DOGRID        dogrid;                   // siehe WW8STRUC.HXX
1406     sal_uInt16                      :1; // reserved
1407     sal_uInt16 lvl                  :4; // Which outline levels are showing in outline view
1408     sal_uInt16                      :4; // reserved
1409     sal_uInt16 fHtmlDoc             :1; // This file is based upon an HTML file
1410     sal_uInt16                      :1; // reserved
1411     sal_uInt16 fSnapBorder          :1; // Snap table and page borders to page border
1412     sal_uInt16 fIncludeHeader       :1; // Place header inside page border
1413     sal_uInt16 fIncludeFooter       :1; // Place footer inside page border
1414     sal_uInt16 fForcePageSizePag    :1; // Are we in online view
1415     sal_uInt16 fMinFontSizePag      :1; // Are we auto-promoting
1416                                                                 // fonts to >= hpsZoonFontPag?
1417     sal_uInt16 fHaveVersions            :1; // versioning is turned on
1418     sal_uInt16 fAutoVersion             :1; // autoversioning is enabled
1419     sal_uInt16                                   :14;   // reserved
1420     // hier 12 Byte ueberspringen: ASUMI
1421     sal_Int32 cChWS;
1422     sal_Int32 cChWSFtnEdn;
1423     sal_Int32 grfDocEvents;
1424     // hier 4+30+8 Bytes ueberspringen
1425     sal_Int32 cDBC;
1426     sal_Int32 cDBCFtnEdn;
1427     // hier 4 Bytes ueberspringen
1428     sal_Int16 nfcFtnRef;
1429     sal_Int16 nfcEdnRef;
1430     sal_Int16 hpsZoonFontPag;
1431     sal_Int16 dywDispPag;
1432 
1433     // 2. Initialisier-Dummy:
1434     sal_uInt8    nDataEnd;
1435 
1436     /*
1437         nun wird lediglich noch ein Ctor benoetigt,
1438         dem die FIB-Nummer uebergeben werden muss
1439     */
1440     WW8Dop( SvStream& rSt, sal_Int16 nFib, sal_Int32 nPos, sal_Int32 nSize );
1441 
1442     /* leider falsch, man braucht auch noch einen fuer den Export */
1443     WW8Dop();
1444     sal_Bool Write( SvStream& rStrm, WW8Fib& rFib );
1445 };
1446 
1447 
WW8SkipOdd(SvStream * pSt)1448 inline short WW8SkipOdd(SvStream* pSt )
1449 {
1450 #if defined HP9000 || defined SINIX
1451     short bRet = pSt->Tell() & 0x1;
1452     if (bRet) {
1453         sal_uInt8 c;
1454         pSt->Read( &c, 1 );
1455     }
1456     return bRet;
1457 #else
1458     if ( pSt->Tell() & 0x1 ){
1459         sal_uInt8 c;
1460         pSt->Read( &c, 1 );
1461         return 1;
1462     }
1463     return 0;
1464 #endif
1465 }
1466 
1467 
1468 class WW8PLCF_HdFt
1469 {
1470     WW8PLCF aPLCF;
1471     long nTextOfs;
1472     short nIdxOffset;
1473 
1474 public:
1475     WW8PLCF_HdFt( SvStream* pSt, WW8Fib& rFib, WW8Dop& rDop );
1476 //  ~WW8PLCF_HdFt() {}
1477     sal_Bool GetTextPos( sal_uInt8 grpfIhdt, sal_uInt8 nWhich, WW8_CP& rStart, long& rLen );
1478     sal_Bool GetTextPosExact( short nIdx, WW8_CP& rStart, long& rLen );
1479     void UpdateIndex( sal_uInt8 grpfIhdt );
1480 };
1481 
1482 
1483 #endif
1484