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