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