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