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