xref: /aoo4110/main/sw/source/filter/ww8/ww8scan.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sw.hxx"
26*b1cdbd2cSJim Jagielski /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */
27*b1cdbd2cSJim Jagielski #include "ww8scan.hxx"
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include <functional>
31*b1cdbd2cSJim Jagielski #include <algorithm>
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski #include <string.h>         // memset()
34*b1cdbd2cSJim Jagielski #include <rtl/tencinfo.h>
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski #ifdef DUMP
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski #define ERR_SWG_READ_ERROR 1234
39*b1cdbd2cSJim Jagielski #define ASSERT( a, b )
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski #else                       // dump
42*b1cdbd2cSJim Jagielski #include <swerror.h>        // ERR_WW6_...
43*b1cdbd2cSJim Jagielski #include <swtypes.hxx>      // DELETEZ
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski #endif                      // dump
46*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
47*b1cdbd2cSJim Jagielski #include <i18npool/lang.h>
48*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>    // Application  #i90932#
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski #include <stdio.h>
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski #define ASSERT_RET_ON_FAIL( aCon, aError, aRet ) \
53*b1cdbd2cSJim Jagielski     ASSERT(aCon, aError); \
54*b1cdbd2cSJim Jagielski     if (!(aCon)) \
55*b1cdbd2cSJim Jagielski         return aRet;
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski //-begin
58*b1cdbd2cSJim Jagielski namespace SL
59*b1cdbd2cSJim Jagielski {
60*b1cdbd2cSJim Jagielski #   define IMPLCONSTSTRINGARRAY(X) const char a##X[] = "" #X ""
61*b1cdbd2cSJim Jagielski     IMPLCONSTSTRINGARRAY(ObjectPool);
62*b1cdbd2cSJim Jagielski     IMPLCONSTSTRINGARRAY(1Table);
63*b1cdbd2cSJim Jagielski     IMPLCONSTSTRINGARRAY(0Table);
64*b1cdbd2cSJim Jagielski     IMPLCONSTSTRINGARRAY(Data);
65*b1cdbd2cSJim Jagielski     IMPLCONSTSTRINGARRAY(CheckBox);
66*b1cdbd2cSJim Jagielski     IMPLCONSTSTRINGARRAY(ListBox);
67*b1cdbd2cSJim Jagielski     IMPLCONSTSTRINGARRAY(TextBox);
68*b1cdbd2cSJim Jagielski     IMPLCONSTSTRINGARRAY(TextField);
69*b1cdbd2cSJim Jagielski     IMPLCONSTSTRINGARRAY(MSMacroCmds);
70*b1cdbd2cSJim Jagielski }
71*b1cdbd2cSJim Jagielski 
TestBeltAndBraces(const SvStream & rStrm)72*b1cdbd2cSJim Jagielski template<class C> bool wwString<C>::TestBeltAndBraces(const SvStream& rStrm)
73*b1cdbd2cSJim Jagielski {
74*b1cdbd2cSJim Jagielski     bool bRet = false;
75*b1cdbd2cSJim Jagielski     sal_uInt32 nOldPos = rStrm.Tell();
76*b1cdbd2cSJim Jagielski     SvStream &rMutableStrm = const_cast<SvStream &>(rStrm);
77*b1cdbd2cSJim Jagielski     sal_uInt32 nLen = rMutableStrm.Seek(STREAM_SEEK_TO_END);
78*b1cdbd2cSJim Jagielski     rMutableStrm.Seek(nOldPos);
79*b1cdbd2cSJim Jagielski     C nBelt;
80*b1cdbd2cSJim Jagielski     rMutableStrm >> nBelt;
81*b1cdbd2cSJim Jagielski     nBelt *= sizeof(C);
82*b1cdbd2cSJim Jagielski     if (nOldPos + sizeof(C) + nBelt + sizeof(C) <= nLen &&
83*b1cdbd2cSJim Jagielski         !rStrm.GetError() && !rStrm.IsEof())
84*b1cdbd2cSJim Jagielski     {
85*b1cdbd2cSJim Jagielski         rMutableStrm.SeekRel(nBelt);
86*b1cdbd2cSJim Jagielski         if (!rStrm.GetError())
87*b1cdbd2cSJim Jagielski         {
88*b1cdbd2cSJim Jagielski             C cBraces;
89*b1cdbd2cSJim Jagielski             rMutableStrm >> cBraces;
90*b1cdbd2cSJim Jagielski             if (!rMutableStrm.GetError() && cBraces == 0)
91*b1cdbd2cSJim Jagielski                 bRet = true;
92*b1cdbd2cSJim Jagielski         }
93*b1cdbd2cSJim Jagielski     }
94*b1cdbd2cSJim Jagielski     rMutableStrm.Seek(nOldPos);
95*b1cdbd2cSJim Jagielski     return bRet;
96*b1cdbd2cSJim Jagielski }
97*b1cdbd2cSJim Jagielski 
operator ==(const SprmInfo & rFirst,const SprmInfo & rSecond)98*b1cdbd2cSJim Jagielski inline bool operator==(const SprmInfo &rFirst, const SprmInfo &rSecond)
99*b1cdbd2cSJim Jagielski {
100*b1cdbd2cSJim Jagielski     return (rFirst.nId == rSecond.nId);
101*b1cdbd2cSJim Jagielski }
102*b1cdbd2cSJim Jagielski 
GetWW2SprmSearcher()103*b1cdbd2cSJim Jagielski const wwSprmSearcher *wwSprmParser::GetWW2SprmSearcher()
104*b1cdbd2cSJim Jagielski {
105*b1cdbd2cSJim Jagielski     //double lock me
106*b1cdbd2cSJim Jagielski     // WW7- Sprms
107*b1cdbd2cSJim Jagielski     static const SprmInfo aSprms[] =
108*b1cdbd2cSJim Jagielski     {
109*b1cdbd2cSJim Jagielski         {  0, 0, L_FIX}, // "Default-sprm",  wird uebersprungen
110*b1cdbd2cSJim Jagielski         {  2, 1, L_FIX}, // "sprmPIstd",  pap.istd (style code)
111*b1cdbd2cSJim Jagielski         {  3, 0, L_VAR}, // "sprmPIstdPermute pap.istd permutation
112*b1cdbd2cSJim Jagielski         {  4, 1, L_FIX}, // "sprmPIncLv1" pap.istddifference
113*b1cdbd2cSJim Jagielski         {  5, 1, L_FIX}, // "sprmPJc" pap.jc (justification)
114*b1cdbd2cSJim Jagielski         {  6, 1, L_FIX}, // "sprmPFSideBySide" pap.fSideBySide
115*b1cdbd2cSJim Jagielski         {  7, 1, L_FIX}, // "sprmPFKeep" pap.fKeep
116*b1cdbd2cSJim Jagielski         {  8, 1, L_FIX}, // "sprmPFKeepFollow " pap.fKeepFollow
117*b1cdbd2cSJim Jagielski         {  9, 1, L_FIX}, // "sprmPPageBreakBefore" pap.fPageBreakBefore
118*b1cdbd2cSJim Jagielski         { 10, 1, L_FIX}, // "sprmPBrcl" pap.brcl
119*b1cdbd2cSJim Jagielski         { 11, 1, L_FIX}, // "sprmPBrcp" pap.brcp
120*b1cdbd2cSJim Jagielski         { 12, 1, L_FIX}, // "sprmPNfcSeqNumb" pap.nfcSeqNumb
121*b1cdbd2cSJim Jagielski         { 13, 1, L_FIX}, // "sprmPNoSeqNumb" pap.nnSeqNumb
122*b1cdbd2cSJim Jagielski         { 14, 1, L_FIX}, // "sprmPFNoLineNumb" pap.fNoLnn
123*b1cdbd2cSJim Jagielski         { 15, 0, L_VAR}, // "?sprmPChgTabsPapx" pap.itbdMac, ...
124*b1cdbd2cSJim Jagielski         { 16, 2, L_FIX}, // "sprmPDxaRight" pap.dxaRight
125*b1cdbd2cSJim Jagielski         { 17, 2, L_FIX}, // "sprmPDxaLeft" pap.dxaLeft
126*b1cdbd2cSJim Jagielski         { 18, 2, L_FIX}, // "sprmPNest" pap.dxaLeft
127*b1cdbd2cSJim Jagielski         { 19, 2, L_FIX}, // "sprmPDxaLeft1" pap.dxaLeft1
128*b1cdbd2cSJim Jagielski         { 20, 2, L_FIX}, // "sprmPDyaLine" pap.lspd an LSPD
129*b1cdbd2cSJim Jagielski         { 21, 2, L_FIX}, // "sprmPDyaBefore" pap.dyaBefore
130*b1cdbd2cSJim Jagielski         { 22, 2, L_FIX}, // "sprmPDyaAfter" pap.dyaAfter
131*b1cdbd2cSJim Jagielski         { 23, 0, L_VAR}, // "?sprmPChgTabs" pap.itbdMac, pap.rgdxaTab, ...
132*b1cdbd2cSJim Jagielski         { 24, 1, L_FIX}, // "sprmPFInTable" pap.fInTable
133*b1cdbd2cSJim Jagielski         { 25, 1, L_FIX}, // "sprmPTtp" pap.fTtp
134*b1cdbd2cSJim Jagielski         { 26, 2, L_FIX}, // "sprmPDxaAbs" pap.dxaAbs
135*b1cdbd2cSJim Jagielski         { 27, 2, L_FIX}, // "sprmPDyaAbs" pap.dyaAbs
136*b1cdbd2cSJim Jagielski         { 28, 2, L_FIX}, // "sprmPDxaWidth" pap.dxaWidth
137*b1cdbd2cSJim Jagielski         { 29, 1, L_FIX}, // "sprmPPc" pap.pcHorz, pap.pcVert
138*b1cdbd2cSJim Jagielski         { 30, 2, L_FIX}, // "sprmPBrcTop10" pap.brcTop BRC10
139*b1cdbd2cSJim Jagielski         { 31, 2, L_FIX}, // "sprmPBrcLeft10" pap.brcLeft BRC10
140*b1cdbd2cSJim Jagielski         { 32, 2, L_FIX}, // "sprmPBrcBottom10" pap.brcBottom BRC10
141*b1cdbd2cSJim Jagielski         { 33, 2, L_FIX}, // "sprmPBrcRight10" pap.brcRight BRC10
142*b1cdbd2cSJim Jagielski         { 34, 2, L_FIX}, // "sprmPBrcBetween10" pap.brcBetween BRC10
143*b1cdbd2cSJim Jagielski         { 35, 2, L_FIX}, // "sprmPBrcBar10" pap.brcBar BRC10
144*b1cdbd2cSJim Jagielski         { 36, 2, L_FIX}, // "sprmPFromText10" pap.dxaFromText dxa
145*b1cdbd2cSJim Jagielski         { 37, 1, L_FIX}, // "sprmPWr" pap.wr wr
146*b1cdbd2cSJim Jagielski         { 38, 2, L_FIX}, // "sprmPBrcTop" pap.brcTop BRC
147*b1cdbd2cSJim Jagielski         { 39, 2, L_FIX}, // "sprmPBrcLeft" pap.brcLeft BRC
148*b1cdbd2cSJim Jagielski         { 40, 2, L_FIX}, // "sprmPBrcBottom" pap.brcBottom BRC
149*b1cdbd2cSJim Jagielski         { 41, 2, L_FIX}, // "sprmPBrcRight" pap.brcRight BRC
150*b1cdbd2cSJim Jagielski         { 42, 2, L_FIX}, // "sprmPBrcBetween" pap.brcBetween BRC
151*b1cdbd2cSJim Jagielski         { 43, 2, L_FIX}, // "sprmPBrcBar" pap.brcBar BRC word
152*b1cdbd2cSJim Jagielski         { 44, 1, L_FIX}, // "sprmPFNoAutoHyph" pap.fNoAutoHyph
153*b1cdbd2cSJim Jagielski         { 45, 2, L_FIX}, // "sprmPWHeightAbs" pap.wHeightAbs w
154*b1cdbd2cSJim Jagielski         { 46, 2, L_FIX}, // "sprmPDcs" pap.dcs DCS
155*b1cdbd2cSJim Jagielski         { 47, 2, L_FIX}, // "sprmPShd" pap.shd SHD
156*b1cdbd2cSJim Jagielski         { 48, 2, L_FIX}, // "sprmPDyaFromText" pap.dyaFromText dya
157*b1cdbd2cSJim Jagielski         { 49, 2, L_FIX}, // "sprmPDxaFromText" pap.dxaFromText dxa
158*b1cdbd2cSJim Jagielski         { 50, 1, L_FIX}, // "sprmPFBiDi" pap.fBiDi 0 or 1 byte
159*b1cdbd2cSJim Jagielski         { 51, 1, L_FIX}, // "sprmPFWidowControl" pap.fWidowControl 0 or 1 byte
160*b1cdbd2cSJim Jagielski         { 52, 0, L_FIX}, // "?sprmPRuler 52"
161*b1cdbd2cSJim Jagielski         { 53, 1, L_FIX}, // "sprmCFStrikeRM" chp.fRMarkDel 1 or 0 bit
162*b1cdbd2cSJim Jagielski         { 54, 1, L_FIX}, // "sprmCFRMark" chp.fRMark 1 or 0 bit
163*b1cdbd2cSJim Jagielski         { 55, 1, L_FIX}, // "sprmCFFldVanish" chp.fFldVanish 1 or 0 bit
164*b1cdbd2cSJim Jagielski         { 57, 0, L_VAR}, // "sprmCDefault" whole CHP
165*b1cdbd2cSJim Jagielski         { 58, 0, L_FIX}, // "sprmCPlain" whole CHP
166*b1cdbd2cSJim Jagielski         { 60, 1, L_FIX}, // "sprmCFBold" chp.fBold 0,1, 128, or 129
167*b1cdbd2cSJim Jagielski         { 61, 1, L_FIX}, // "sprmCFItalic" chp.fItalic 0,1, 128, or 129
168*b1cdbd2cSJim Jagielski         { 62, 1, L_FIX}, // "sprmCFStrike" chp.fStrike 0,1, 128, or 129
169*b1cdbd2cSJim Jagielski         { 63, 1, L_FIX}, // "sprmCFOutline" chp.fOutline 0,1, 128, or 129
170*b1cdbd2cSJim Jagielski         { 64, 1, L_FIX}, // "sprmCFShadow" chp.fShadow 0,1, 128, or 129
171*b1cdbd2cSJim Jagielski         { 65, 1, L_FIX}, // "sprmCFSmallCaps" chp.fSmallCaps 0,1, 128, or 129
172*b1cdbd2cSJim Jagielski         { 66, 1, L_FIX}, // "sprmCFCaps" chp.fCaps 0,1, 128, or 129
173*b1cdbd2cSJim Jagielski         { 67, 1, L_FIX}, // "sprmCFVanish" chp.fVanish 0,1, 128, or 129
174*b1cdbd2cSJim Jagielski         { 68, 2, L_FIX}, // "sprmCFtc" chp.ftc ftc word
175*b1cdbd2cSJim Jagielski         { 69, 1, L_FIX}, // "sprmCKul" chp.kul kul byte
176*b1cdbd2cSJim Jagielski         { 70, 3, L_FIX}, // "sprmCSizePos" chp.hps, chp.hpsPos
177*b1cdbd2cSJim Jagielski         { 71, 2, L_FIX}, // "sprmCDxaSpace" chp.dxaSpace dxa
178*b1cdbd2cSJim Jagielski         { 72, 2, L_FIX}, // "sprmCLid" chp.lid LID
179*b1cdbd2cSJim Jagielski         { 73, 1, L_FIX}, // "sprmCIco" chp.ico ico byte
180*b1cdbd2cSJim Jagielski         { 74, 1, L_FIX}, // "sprmCHps" chp.hps hps !word!
181*b1cdbd2cSJim Jagielski         { 75, 1, L_FIX}, // "sprmCHpsInc" chp.hps
182*b1cdbd2cSJim Jagielski         { 76, 1, L_FIX}, // "sprmCHpsPos" chp.hpsPos hps !word!
183*b1cdbd2cSJim Jagielski         { 77, 1, L_FIX}, // "sprmCHpsPosAdj" chp.hpsPos hps
184*b1cdbd2cSJim Jagielski         { 78, 0, L_VAR}, // "?sprmCMajority" chp.fBold, chp.fItalic, ...
185*b1cdbd2cSJim Jagielski         { 80, 1, L_FIX}, // "sprmCFBoldBi" chp.fBoldBi
186*b1cdbd2cSJim Jagielski         { 81, 1, L_FIX}, // "sprmCFItalicBi" chp.fItalicBi
187*b1cdbd2cSJim Jagielski         { 82, 2, L_FIX}, // "sprmCFtcBi" chp.ftcBi
188*b1cdbd2cSJim Jagielski         { 83, 2, L_FIX}, // "sprmClidBi" chp.lidBi
189*b1cdbd2cSJim Jagielski         { 84, 1, L_FIX}, // "sprmCIcoBi" chp.icoBi
190*b1cdbd2cSJim Jagielski         { 85, 1, L_FIX}, // "sprmCHpsBi" chp.hpsBi
191*b1cdbd2cSJim Jagielski         { 86, 1, L_FIX}, // "sprmCFBiDi" chp.fBiDi
192*b1cdbd2cSJim Jagielski         { 87, 1, L_FIX}, // "sprmCFDiacColor" chp.fDiacUSico
193*b1cdbd2cSJim Jagielski         { 94, 1, L_FIX}, // "sprmPicBrcl" pic.brcl brcl (see PIC definition)
194*b1cdbd2cSJim Jagielski         { 95,12, L_VAR}, // "sprmPicScale" pic.mx, pic.my, pic.dxaCropleft,
195*b1cdbd2cSJim Jagielski         { 96, 2, L_FIX}, // "sprmPicBrcTop" pic.brcTop BRC word
196*b1cdbd2cSJim Jagielski         { 97, 2, L_FIX}, // "sprmPicBrcLeft" pic.brcLeft BRC word
197*b1cdbd2cSJim Jagielski         { 98, 2, L_FIX}, // "sprmPicBrcBottom" pic.brcBottom BRC word
198*b1cdbd2cSJim Jagielski         { 99, 2, L_FIX}, // "sprmPicBrcRight" pic.brcRight BRC word
199*b1cdbd2cSJim Jagielski         {112, 1, L_FIX}, // "sprmSFRTLGutter", set to one if gutter is on
200*b1cdbd2cSJim Jagielski         {114, 1, L_FIX}, // "sprmSFBiDi" ;;;
201*b1cdbd2cSJim Jagielski         {115, 2, L_FIX}, // "sprmSDmBinFirst" sep.dmBinFirst  word
202*b1cdbd2cSJim Jagielski         {116, 2, L_FIX}, // "sprmSDmBinOther" sep.dmBinOther  word
203*b1cdbd2cSJim Jagielski         {117, 1, L_FIX}, // "sprmSBkc" sep.bkc bkc byte
204*b1cdbd2cSJim Jagielski         {118, 1, L_FIX}, // "sprmSFTitlePage" sep.fTitlePage 0 or 1 byte
205*b1cdbd2cSJim Jagielski         {119, 2, L_FIX}, // "sprmSCcolumns" sep.ccolM1 # of cols - 1 word
206*b1cdbd2cSJim Jagielski         {120, 2, L_FIX}, // "sprmSDxaColumns" sep.dxaColumns dxa word
207*b1cdbd2cSJim Jagielski         {121, 1, L_FIX}, // "sprmSFAutoPgn" sep.fAutoPgn obsolete byte
208*b1cdbd2cSJim Jagielski         {122, 1, L_FIX}, // "sprmSNfcPgn" sep.nfcPgn nfc byte
209*b1cdbd2cSJim Jagielski         {123, 2, L_FIX}, // "sprmSDyaPgn" sep.dyaPgn dya short
210*b1cdbd2cSJim Jagielski         {124, 2, L_FIX}, // "sprmSDxaPgn" sep.dxaPgn dya short
211*b1cdbd2cSJim Jagielski         {125, 1, L_FIX}, // "sprmSFPgnRestart" sep.fPgnRestart 0 or 1 byte
212*b1cdbd2cSJim Jagielski         {126, 1, L_FIX}, // "sprmSFEndnote" sep.fEndnote 0 or 1 byte
213*b1cdbd2cSJim Jagielski         {127, 1, L_FIX}, // "sprmSLnc" sep.lnc lnc byte
214*b1cdbd2cSJim Jagielski         {128, 1, L_FIX}, // "sprmSGprfIhdt" sep.grpfIhdt grpfihdt
215*b1cdbd2cSJim Jagielski         {129, 2, L_FIX}, // "sprmSNLnnMod" sep.nLnnMod non-neg int. word
216*b1cdbd2cSJim Jagielski         {130, 2, L_FIX}, // "sprmSDxaLnn" sep.dxaLnn dxa word
217*b1cdbd2cSJim Jagielski         {131, 2, L_FIX}, // "sprmSDyaHdrTop" sep.dyaHdrTop dya word
218*b1cdbd2cSJim Jagielski         {132, 2, L_FIX}, // "sprmSDyaHdrBottom" sep.dyaHdrBottom dya word
219*b1cdbd2cSJim Jagielski         {133, 1, L_FIX}, // "sprmSLBetween" sep.fLBetween 0 or 1 byte
220*b1cdbd2cSJim Jagielski         {134, 1, L_FIX}, // "sprmSVjc" sep.vjc vjc byte
221*b1cdbd2cSJim Jagielski         {135, 2, L_FIX}, // "sprmSLnnMin" sep.lnnMin lnn word
222*b1cdbd2cSJim Jagielski         {136, 2, L_FIX}, // "sprmSPgnStart" sep.pgnStart pgn word
223*b1cdbd2cSJim Jagielski         {137, 1, L_FIX}, // "sprmSBOrientation" sep.dmOrientPage dm byte
224*b1cdbd2cSJim Jagielski         {138, 1, L_FIX}, // "sprmSFFacingCol" ;;;
225*b1cdbd2cSJim Jagielski         {139, 2, L_FIX}, // "sprmSXaPage" sep.xaPage xa word
226*b1cdbd2cSJim Jagielski         {140, 2, L_FIX}, // "sprmSYaPage" sep.yaPage ya word
227*b1cdbd2cSJim Jagielski         {141, 2, L_FIX}, // "sprmSDxaLeft" sep.dxaLeft dxa word
228*b1cdbd2cSJim Jagielski         {142, 2, L_FIX}, // "sprmSDxaRight" sep.dxaRight dxa word
229*b1cdbd2cSJim Jagielski         {143, 2, L_FIX}, // "sprmSDyaTop" sep.dyaTop dya word
230*b1cdbd2cSJim Jagielski         {144, 2, L_FIX}, // "sprmSDyaBottom" sep.dyaBottom dya word
231*b1cdbd2cSJim Jagielski         {145, 2, L_FIX}, // "sprmSDzaGutter" sep.dzaGutter dza word
232*b1cdbd2cSJim Jagielski         {146, 2, L_FIX}, // "sprmTJc" tap.jc jc (low order byte is significant)
233*b1cdbd2cSJim Jagielski         {147, 2, L_FIX}, // "sprmTDxaLeft" tap.rgdxaCenter dxa word
234*b1cdbd2cSJim Jagielski         {148, 2, L_FIX}, // "sprmTDxaGapHalf" tap.dxaGapHalf, tap.rgdxaCenter
235*b1cdbd2cSJim Jagielski         {149, 1, L_FIX}, // "sprmTFBiDi" ;;;
236*b1cdbd2cSJim Jagielski         {152, 0, L_VAR}, // "sprmTDefTable10" tap.rgdxaCenter, tap.rgtc complex
237*b1cdbd2cSJim Jagielski         {153, 2, L_FIX}, // "sprmTDyaRowHeight" tap.dyaRowHeight dya word
238*b1cdbd2cSJim Jagielski         {154, 0, L_VAR2},// "sprmTDefTable" tap.rgtc complex
239*b1cdbd2cSJim Jagielski         {155, 1, L_VAR}, // "sprmTDefTableShd" tap.rgshd complex
240*b1cdbd2cSJim Jagielski         {157, 5, L_FIX}, // "sprmTSetBrc" tap.rgtc[].rgbrc complex 5 bytes
241*b1cdbd2cSJim Jagielski         {158, 4, L_FIX}, // "sprmTInsert" tap.rgdxaCenter,tap.rgtc complex
242*b1cdbd2cSJim Jagielski         {159, 2, L_FIX}, // "sprmTDelete" tap.rgdxaCenter, tap.rgtc complex
243*b1cdbd2cSJim Jagielski         {160, 4, L_FIX}, // "sprmTDxaCol" tap.rgdxaCenter complex
244*b1cdbd2cSJim Jagielski         {161, 2, L_FIX}, // "sprmTMerge" tap.fFirstMerged, tap.fMerged complex
245*b1cdbd2cSJim Jagielski         {162, 2, L_FIX}, // "sprmTSplit" tap.fFirstMerged, tap.fMerged complex
246*b1cdbd2cSJim Jagielski         {163, 5, L_FIX}, // "sprmTSetBrc10" tap.rgtc[].rgbrc complex 5 bytes
247*b1cdbd2cSJim Jagielski         {164, 4, L_FIX}, // "sprmTSetShd", tap.rgshd complex 4 bytes
248*b1cdbd2cSJim Jagielski     };
249*b1cdbd2cSJim Jagielski 
250*b1cdbd2cSJim Jagielski     static wwSprmSearcher aSprmSrch(aSprms, sizeof(aSprms) / sizeof(aSprms[0]));
251*b1cdbd2cSJim Jagielski     return &aSprmSrch;
252*b1cdbd2cSJim Jagielski };
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski 
GetWW6SprmSearcher()255*b1cdbd2cSJim Jagielski const wwSprmSearcher *wwSprmParser::GetWW6SprmSearcher()
256*b1cdbd2cSJim Jagielski {
257*b1cdbd2cSJim Jagielski     //double lock me
258*b1cdbd2cSJim Jagielski     // WW7- Sprms
259*b1cdbd2cSJim Jagielski     static const SprmInfo aSprms[] =
260*b1cdbd2cSJim Jagielski     {
261*b1cdbd2cSJim Jagielski         {  0, 0, L_FIX}, // "Default-sprm",  wird uebersprungen
262*b1cdbd2cSJim Jagielski         {  2, 2, L_FIX}, // "sprmPIstd",  pap.istd (style code)
263*b1cdbd2cSJim Jagielski         {  3, 3, L_VAR}, // "sprmPIstdPermute pap.istd permutation
264*b1cdbd2cSJim Jagielski         {  4, 1, L_FIX}, // "sprmPIncLv1" pap.istddifference
265*b1cdbd2cSJim Jagielski         {  5, 1, L_FIX}, // "sprmPJc" pap.jc (justification)
266*b1cdbd2cSJim Jagielski         {  6, 1, L_FIX}, // "sprmPFSideBySide" pap.fSideBySide
267*b1cdbd2cSJim Jagielski         {  7, 1, L_FIX}, // "sprmPFKeep" pap.fKeep
268*b1cdbd2cSJim Jagielski         {  8, 1, L_FIX}, // "sprmPFKeepFollow " pap.fKeepFollow
269*b1cdbd2cSJim Jagielski         {  9, 1, L_FIX}, // "sprmPPageBreakBefore" pap.fPageBreakBefore
270*b1cdbd2cSJim Jagielski         { 10, 1, L_FIX}, // "sprmPBrcl" pap.brcl
271*b1cdbd2cSJim Jagielski         { 11, 1, L_FIX}, // "sprmPBrcp" pap.brcp
272*b1cdbd2cSJim Jagielski         { 12, 0, L_VAR}, // "sprmPAnld" pap.anld (ANLD structure)
273*b1cdbd2cSJim Jagielski         { 13, 1, L_FIX}, // "sprmPNLvlAnm" pap.nLvlAnm nn
274*b1cdbd2cSJim Jagielski         { 14, 1, L_FIX}, // "sprmPFNoLineNumb" pap.fNoLnn
275*b1cdbd2cSJim Jagielski         { 15, 0, L_VAR}, // "?sprmPChgTabsPapx" pap.itbdMac, ...
276*b1cdbd2cSJim Jagielski         { 16, 2, L_FIX}, // "sprmPDxaRight" pap.dxaRight
277*b1cdbd2cSJim Jagielski         { 17, 2, L_FIX}, // "sprmPDxaLeft" pap.dxaLeft
278*b1cdbd2cSJim Jagielski         { 18, 2, L_FIX}, // "sprmPNest" pap.dxaLeft
279*b1cdbd2cSJim Jagielski         { 19, 2, L_FIX}, // "sprmPDxaLeft1" pap.dxaLeft1
280*b1cdbd2cSJim Jagielski         { 20, 4, L_FIX}, // "sprmPDyaLine" pap.lspd an LSPD
281*b1cdbd2cSJim Jagielski         { 21, 2, L_FIX}, // "sprmPDyaBefore" pap.dyaBefore
282*b1cdbd2cSJim Jagielski         { 22, 2, L_FIX}, // "sprmPDyaAfter" pap.dyaAfter
283*b1cdbd2cSJim Jagielski         { 23, 0, L_VAR}, // "?sprmPChgTabs" pap.itbdMac, pap.rgdxaTab, ...
284*b1cdbd2cSJim Jagielski         { 24, 1, L_FIX}, // "sprmPFInTable" pap.fInTable
285*b1cdbd2cSJim Jagielski         { 25, 1, L_FIX}, // "sprmPTtp" pap.fTtp
286*b1cdbd2cSJim Jagielski         { 26, 2, L_FIX}, // "sprmPDxaAbs" pap.dxaAbs
287*b1cdbd2cSJim Jagielski         { 27, 2, L_FIX}, // "sprmPDyaAbs" pap.dyaAbs
288*b1cdbd2cSJim Jagielski         { 28, 2, L_FIX}, // "sprmPDxaWidth" pap.dxaWidth
289*b1cdbd2cSJim Jagielski         { 29, 1, L_FIX}, // "sprmPPc" pap.pcHorz, pap.pcVert
290*b1cdbd2cSJim Jagielski         { 30, 2, L_FIX}, // "sprmPBrcTop10" pap.brcTop BRC10
291*b1cdbd2cSJim Jagielski         { 31, 2, L_FIX}, // "sprmPBrcLeft10" pap.brcLeft BRC10
292*b1cdbd2cSJim Jagielski         { 32, 2, L_FIX}, // "sprmPBrcBottom10" pap.brcBottom BRC10
293*b1cdbd2cSJim Jagielski         { 33, 2, L_FIX}, // "sprmPBrcRight10" pap.brcRight BRC10
294*b1cdbd2cSJim Jagielski         { 34, 2, L_FIX}, // "sprmPBrcBetween10" pap.brcBetween BRC10
295*b1cdbd2cSJim Jagielski         { 35, 2, L_FIX}, // "sprmPBrcBar10" pap.brcBar BRC10
296*b1cdbd2cSJim Jagielski         { 36, 2, L_FIX}, // "sprmPFromText10" pap.dxaFromText dxa
297*b1cdbd2cSJim Jagielski         { 37, 1, L_FIX}, // "sprmPWr" pap.wr wr
298*b1cdbd2cSJim Jagielski         { 38, 2, L_FIX}, // "sprmPBrcTop" pap.brcTop BRC
299*b1cdbd2cSJim Jagielski         { 39, 2, L_FIX}, // "sprmPBrcLeft" pap.brcLeft BRC
300*b1cdbd2cSJim Jagielski         { 40, 2, L_FIX}, // "sprmPBrcBottom" pap.brcBottom BRC
301*b1cdbd2cSJim Jagielski         { 41, 2, L_FIX}, // "sprmPBrcRight" pap.brcRight BRC
302*b1cdbd2cSJim Jagielski         { 42, 2, L_FIX}, // "sprmPBrcBetween" pap.brcBetween BRC
303*b1cdbd2cSJim Jagielski         { 43, 2, L_FIX}, // "sprmPBrcBar" pap.brcBar BRC word
304*b1cdbd2cSJim Jagielski         { 44, 1, L_FIX}, // "sprmPFNoAutoHyph" pap.fNoAutoHyph
305*b1cdbd2cSJim Jagielski         { 45, 2, L_FIX}, // "sprmPWHeightAbs" pap.wHeightAbs w
306*b1cdbd2cSJim Jagielski         { 46, 2, L_FIX}, // "sprmPDcs" pap.dcs DCS
307*b1cdbd2cSJim Jagielski         { 47, 2, L_FIX}, // "sprmPShd" pap.shd SHD
308*b1cdbd2cSJim Jagielski         { 48, 2, L_FIX}, // "sprmPDyaFromText" pap.dyaFromText dya
309*b1cdbd2cSJim Jagielski         { 49, 2, L_FIX}, // "sprmPDxaFromText" pap.dxaFromText dxa
310*b1cdbd2cSJim Jagielski         { 50, 1, L_FIX}, // "sprmPFLocked" pap.fLocked 0 or 1 byte
311*b1cdbd2cSJim Jagielski         { 51, 1, L_FIX}, // "sprmPFWidowControl" pap.fWidowControl 0 or 1 byte
312*b1cdbd2cSJim Jagielski         { 52, 0, L_FIX}, // "?sprmPRuler 52"
313*b1cdbd2cSJim Jagielski         { 64, 0, L_VAR}, // rtl property ?
314*b1cdbd2cSJim Jagielski         { 65, 1, L_FIX}, // "sprmCFStrikeRM" chp.fRMarkDel 1 or 0 bit
315*b1cdbd2cSJim Jagielski         { 66, 1, L_FIX}, // "sprmCFRMark" chp.fRMark 1 or 0 bit
316*b1cdbd2cSJim Jagielski         { 67, 1, L_FIX}, // "sprmCFFldVanish" chp.fFldVanish 1 or 0 bit
317*b1cdbd2cSJim Jagielski         { 68, 0, L_VAR}, // "sprmCPicLocation" chp.fcPic and chp.fSpec
318*b1cdbd2cSJim Jagielski         { 69, 2, L_FIX}, // "sprmCIbstRMark" chp.ibstRMark index into sttbRMark
319*b1cdbd2cSJim Jagielski         { 70, 4, L_FIX}, // "sprmCDttmRMark" chp.dttm DTTM long
320*b1cdbd2cSJim Jagielski         { 71, 1, L_FIX}, // "sprmCFData" chp.fData 1 or 0 bit
321*b1cdbd2cSJim Jagielski         { 72, 2, L_FIX}, // "sprmCRMReason" chp.idslRMReason an index to a table
322*b1cdbd2cSJim Jagielski         { 73, 3, L_FIX}, // "sprmCChse" chp.fChsDiff and chp.chse
323*b1cdbd2cSJim Jagielski         { 74, 0, L_VAR}, // "sprmCSymbol" chp.fSpec, chp.chSym and chp.ftcSym
324*b1cdbd2cSJim Jagielski         { 75, 1, L_FIX}, // "sprmCFOle2" chp.fOle2 1 or 0   bit
325*b1cdbd2cSJim Jagielski         { 77, 0, L_VAR}, // unknown
326*b1cdbd2cSJim Jagielski         { 79, 0, L_VAR}, // unknown
327*b1cdbd2cSJim Jagielski         { 80, 2, L_FIX}, // "sprmCIstd" chp.istd istd, see stylesheet definition
328*b1cdbd2cSJim Jagielski         { 81, 0, L_VAR}, // "sprmCIstdPermute" chp.istd permutation vector
329*b1cdbd2cSJim Jagielski         { 82, 0, L_VAR}, // "sprmCDefault" whole CHP
330*b1cdbd2cSJim Jagielski         { 83, 0, L_FIX}, // "sprmCPlain" whole CHP
331*b1cdbd2cSJim Jagielski         { 85, 1, L_FIX}, // "sprmCFBold" chp.fBold 0,1, 128, or 129
332*b1cdbd2cSJim Jagielski         { 86, 1, L_FIX}, // "sprmCFItalic" chp.fItalic 0,1, 128, or 129
333*b1cdbd2cSJim Jagielski         { 87, 1, L_FIX}, // "sprmCFStrike" chp.fStrike 0,1, 128, or 129
334*b1cdbd2cSJim Jagielski         { 88, 1, L_FIX}, // "sprmCFOutline" chp.fOutline 0,1, 128, or 129
335*b1cdbd2cSJim Jagielski         { 89, 1, L_FIX}, // "sprmCFShadow" chp.fShadow 0,1, 128, or 129
336*b1cdbd2cSJim Jagielski         { 90, 1, L_FIX}, // "sprmCFSmallCaps" chp.fSmallCaps 0,1, 128, or 129
337*b1cdbd2cSJim Jagielski         { 91, 1, L_FIX}, // "sprmCFCaps" chp.fCaps 0,1, 128, or 129
338*b1cdbd2cSJim Jagielski         { 92, 1, L_FIX}, // "sprmCFVanish" chp.fVanish 0,1, 128, or 129
339*b1cdbd2cSJim Jagielski         { 93, 2, L_FIX}, // "sprmCFtc" chp.ftc ftc word
340*b1cdbd2cSJim Jagielski         { 94, 1, L_FIX}, // "sprmCKul" chp.kul kul byte
341*b1cdbd2cSJim Jagielski         { 95, 3, L_FIX}, // "sprmCSizePos" chp.hps, chp.hpsPos
342*b1cdbd2cSJim Jagielski         { 96, 2, L_FIX}, // "sprmCDxaSpace" chp.dxaSpace dxa
343*b1cdbd2cSJim Jagielski         { 97, 2, L_FIX}, // "sprmCLid" chp.lid LID
344*b1cdbd2cSJim Jagielski         { 98, 1, L_FIX}, // "sprmCIco" chp.ico ico byte
345*b1cdbd2cSJim Jagielski         { 99, 2, L_FIX}, // "sprmCHps" chp.hps hps !word!
346*b1cdbd2cSJim Jagielski         {100, 1, L_FIX}, // "sprmCHpsInc" chp.hps
347*b1cdbd2cSJim Jagielski         {101, 2, L_FIX}, // "sprmCHpsPos" chp.hpsPos hps !word!
348*b1cdbd2cSJim Jagielski         {102, 1, L_FIX}, // "sprmCHpsPosAdj" chp.hpsPos hps
349*b1cdbd2cSJim Jagielski         {103, 0, L_VAR}, // "?sprmCMajority" chp.fBold, chp.fItalic, ...
350*b1cdbd2cSJim Jagielski         {104, 1, L_FIX}, // "sprmCIss" chp.iss iss
351*b1cdbd2cSJim Jagielski         {105, 0, L_VAR}, // "sprmCHpsNew50" chp.hps hps variable width
352*b1cdbd2cSJim Jagielski         {106, 0, L_VAR}, // "sprmCHpsInc1" chp.hps complex
353*b1cdbd2cSJim Jagielski         {107, 2, L_FIX}, // "sprmCHpsKern" chp.hpsKern hps
354*b1cdbd2cSJim Jagielski         {108, 0, L_VAR}, // "sprmCMajority50" chp.fBold, chp.fItalic, ...
355*b1cdbd2cSJim Jagielski         {109, 2, L_FIX}, // "sprmCHpsMul" chp.hps percentage to grow hps
356*b1cdbd2cSJim Jagielski         {110, 2, L_FIX}, // "sprmCCondHyhen" chp.ysri ysri
357*b1cdbd2cSJim Jagielski         {111, 2, L_FIX}, // rtl bold
358*b1cdbd2cSJim Jagielski         {112, 2, L_FIX}, // rtl italic
359*b1cdbd2cSJim Jagielski         {113, 0, L_VAR}, // rtl property ?
360*b1cdbd2cSJim Jagielski         {115, 0, L_VAR}, // rtl property ?
361*b1cdbd2cSJim Jagielski         {116, 0, L_VAR}, // unknown
362*b1cdbd2cSJim Jagielski         {117, 1, L_FIX}, // "sprmCFSpec" chp.fSpec  1 or 0 bit
363*b1cdbd2cSJim Jagielski         {118, 1, L_FIX}, // "sprmCFObj" chp.fObj 1 or 0 bit
364*b1cdbd2cSJim Jagielski         {119, 1, L_FIX}, // "sprmPicBrcl" pic.brcl brcl (see PIC definition)
365*b1cdbd2cSJim Jagielski         {120,12, L_VAR}, // "sprmPicScale" pic.mx, pic.my, pic.dxaCropleft,
366*b1cdbd2cSJim Jagielski         {121, 2, L_FIX}, // "sprmPicBrcTop" pic.brcTop BRC word
367*b1cdbd2cSJim Jagielski         {122, 2, L_FIX}, // "sprmPicBrcLeft" pic.brcLeft BRC word
368*b1cdbd2cSJim Jagielski         {123, 2, L_FIX}, // "sprmPicBrcBottom" pic.brcBottom BRC word
369*b1cdbd2cSJim Jagielski         {124, 2, L_FIX}, // "sprmPicBrcRight" pic.brcRight BRC word
370*b1cdbd2cSJim Jagielski         {131, 1, L_FIX}, // "sprmSScnsPgn" sep.cnsPgn cns byte
371*b1cdbd2cSJim Jagielski         {132, 1, L_FIX}, // "sprmSiHeadingPgn" sep.iHeadingPgn
372*b1cdbd2cSJim Jagielski         {133, 0, L_VAR}, // "sprmSOlstAnm" sep.olstAnm OLST variable length
373*b1cdbd2cSJim Jagielski         {136, 3, L_FIX}, // "sprmSDxaColWidth" sep.rgdxaColWidthSpacing complex
374*b1cdbd2cSJim Jagielski         {137, 3, L_FIX}, // "sprmSDxaColSpacing" sep.rgdxaColWidthSpacing
375*b1cdbd2cSJim Jagielski         {138, 1, L_FIX}, // "sprmSFEvenlySpaced" sep.fEvenlySpaced 1 or 0
376*b1cdbd2cSJim Jagielski         {139, 1, L_FIX}, // "sprmSFProtected" sep.fUnlocked 1 or 0 byte
377*b1cdbd2cSJim Jagielski         {140, 2, L_FIX}, // "sprmSDmBinFirst" sep.dmBinFirst  word
378*b1cdbd2cSJim Jagielski         {141, 2, L_FIX}, // "sprmSDmBinOther" sep.dmBinOther  word
379*b1cdbd2cSJim Jagielski         {142, 1, L_FIX}, // "sprmSBkc" sep.bkc bkc byte
380*b1cdbd2cSJim Jagielski         {143, 1, L_FIX}, // "sprmSFTitlePage" sep.fTitlePage 0 or 1 byte
381*b1cdbd2cSJim Jagielski         {144, 2, L_FIX}, // "sprmSCcolumns" sep.ccolM1 # of cols - 1 word
382*b1cdbd2cSJim Jagielski         {145, 2, L_FIX}, // "sprmSDxaColumns" sep.dxaColumns dxa word
383*b1cdbd2cSJim Jagielski         {146, 1, L_FIX}, // "sprmSFAutoPgn" sep.fAutoPgn obsolete byte
384*b1cdbd2cSJim Jagielski         {147, 1, L_FIX}, // "sprmSNfcPgn" sep.nfcPgn nfc byte
385*b1cdbd2cSJim Jagielski         {148, 2, L_FIX}, // "sprmSDyaPgn" sep.dyaPgn dya short
386*b1cdbd2cSJim Jagielski         {149, 2, L_FIX}, // "sprmSDxaPgn" sep.dxaPgn dya short
387*b1cdbd2cSJim Jagielski         {150, 1, L_FIX}, // "sprmSFPgnRestart" sep.fPgnRestart 0 or 1 byte
388*b1cdbd2cSJim Jagielski         {151, 1, L_FIX}, // "sprmSFEndnote" sep.fEndnote 0 or 1 byte
389*b1cdbd2cSJim Jagielski         {152, 1, L_FIX}, // "sprmSLnc" sep.lnc lnc byte
390*b1cdbd2cSJim Jagielski         {153, 1, L_FIX}, // "sprmSGprfIhdt" sep.grpfIhdt grpfihdt
391*b1cdbd2cSJim Jagielski         {154, 2, L_FIX}, // "sprmSNLnnMod" sep.nLnnMod non-neg int. word
392*b1cdbd2cSJim Jagielski         {155, 2, L_FIX}, // "sprmSDxaLnn" sep.dxaLnn dxa word
393*b1cdbd2cSJim Jagielski         {156, 2, L_FIX}, // "sprmSDyaHdrTop" sep.dyaHdrTop dya word
394*b1cdbd2cSJim Jagielski         {157, 2, L_FIX}, // "sprmSDyaHdrBottom" sep.dyaHdrBottom dya word
395*b1cdbd2cSJim Jagielski         {158, 1, L_FIX}, // "sprmSLBetween" sep.fLBetween 0 or 1 byte
396*b1cdbd2cSJim Jagielski         {159, 1, L_FIX}, // "sprmSVjc" sep.vjc vjc byte
397*b1cdbd2cSJim Jagielski         {160, 2, L_FIX}, // "sprmSLnnMin" sep.lnnMin lnn word
398*b1cdbd2cSJim Jagielski         {161, 2, L_FIX}, // "sprmSPgnStart" sep.pgnStart pgn word
399*b1cdbd2cSJim Jagielski         {162, 1, L_FIX}, // "sprmSBOrientation" sep.dmOrientPage dm byte
400*b1cdbd2cSJim Jagielski         {163, 0, L_FIX}, // "?SprmSBCustomize 163"
401*b1cdbd2cSJim Jagielski         {164, 2, L_FIX}, // "sprmSXaPage" sep.xaPage xa word
402*b1cdbd2cSJim Jagielski         {165, 2, L_FIX}, // "sprmSYaPage" sep.yaPage ya word
403*b1cdbd2cSJim Jagielski         {166, 2, L_FIX}, // "sprmSDxaLeft" sep.dxaLeft dxa word
404*b1cdbd2cSJim Jagielski         {167, 2, L_FIX}, // "sprmSDxaRight" sep.dxaRight dxa word
405*b1cdbd2cSJim Jagielski         {168, 2, L_FIX}, // "sprmSDyaTop" sep.dyaTop dya word
406*b1cdbd2cSJim Jagielski         {169, 2, L_FIX}, // "sprmSDyaBottom" sep.dyaBottom dya word
407*b1cdbd2cSJim Jagielski         {170, 2, L_FIX}, // "sprmSDzaGutter" sep.dzaGutter dza word
408*b1cdbd2cSJim Jagielski         {171, 2, L_FIX}, // "sprmSDMPaperReq" sep.dmPaperReq dm word
409*b1cdbd2cSJim Jagielski         {179, 0, L_VAR}, // rtl property ?
410*b1cdbd2cSJim Jagielski         {181, 0, L_VAR}, // rtl property ?
411*b1cdbd2cSJim Jagielski         {182, 2, L_FIX}, // "sprmTJc" tap.jc jc (low order byte is significant)
412*b1cdbd2cSJim Jagielski         {183, 2, L_FIX}, // "sprmTDxaLeft" tap.rgdxaCenter dxa word
413*b1cdbd2cSJim Jagielski         {184, 2, L_FIX}, // "sprmTDxaGapHalf" tap.dxaGapHalf, tap.rgdxaCenter
414*b1cdbd2cSJim Jagielski         {185, 1, L_FIX}, // "sprmTFCantSplit" tap.fCantSplit 1 or 0 byte
415*b1cdbd2cSJim Jagielski         {186, 1, L_FIX}, // "sprmTTableHeader" tap.fTableHeader 1 or 0 byte
416*b1cdbd2cSJim Jagielski         {187,12, L_FIX}, // "sprmTTableBorders" tap.rgbrcTable complex 12 bytes
417*b1cdbd2cSJim Jagielski         {188, 0, L_VAR}, // "sprmTDefTable10" tap.rgdxaCenter, tap.rgtc complex
418*b1cdbd2cSJim Jagielski         {189, 2, L_FIX}, // "sprmTDyaRowHeight" tap.dyaRowHeight dya word
419*b1cdbd2cSJim Jagielski         {190, 0, L_VAR2},// "sprmTDefTable" tap.rgtc complex
420*b1cdbd2cSJim Jagielski         {191, 1, L_VAR}, // "sprmTDefTableShd" tap.rgshd complex
421*b1cdbd2cSJim Jagielski         {192, 4, L_FIX}, // "sprmTTlp" tap.tlp TLP 4 bytes
422*b1cdbd2cSJim Jagielski         {193, 5, L_FIX}, // "sprmTSetBrc" tap.rgtc[].rgbrc complex 5 bytes
423*b1cdbd2cSJim Jagielski         {194, 4, L_FIX}, // "sprmTInsert" tap.rgdxaCenter,tap.rgtc complex
424*b1cdbd2cSJim Jagielski         {195, 2, L_FIX}, // "sprmTDelete" tap.rgdxaCenter, tap.rgtc complex
425*b1cdbd2cSJim Jagielski         {196, 4, L_FIX}, // "sprmTDxaCol" tap.rgdxaCenter complex
426*b1cdbd2cSJim Jagielski         {197, 2, L_FIX}, // "sprmTMerge" tap.fFirstMerged, tap.fMerged complex
427*b1cdbd2cSJim Jagielski         {198, 2, L_FIX}, // "sprmTSplit" tap.fFirstMerged, tap.fMerged complex
428*b1cdbd2cSJim Jagielski         {199, 5, L_FIX}, // "sprmTSetBrc10" tap.rgtc[].rgbrc complex 5 bytes
429*b1cdbd2cSJim Jagielski         {200, 4, L_FIX}, // "sprmTSetShd", tap.rgshd complex 4 bytes
430*b1cdbd2cSJim Jagielski         {207, 0, L_VAR}  // rtl property ?
431*b1cdbd2cSJim Jagielski     };
432*b1cdbd2cSJim Jagielski 
433*b1cdbd2cSJim Jagielski     static wwSprmSearcher aSprmSrch(aSprms, sizeof(aSprms) / sizeof(aSprms[0]));
434*b1cdbd2cSJim Jagielski     return &aSprmSrch;
435*b1cdbd2cSJim Jagielski };
436*b1cdbd2cSJim Jagielski 
GetWW8SprmSearcher()437*b1cdbd2cSJim Jagielski const wwSprmSearcher *wwSprmParser::GetWW8SprmSearcher()
438*b1cdbd2cSJim Jagielski {
439*b1cdbd2cSJim Jagielski     //double lock me
440*b1cdbd2cSJim Jagielski     //WW8+ Sprms
441*b1cdbd2cSJim Jagielski     static const SprmInfo aSprms[] =
442*b1cdbd2cSJim Jagielski     {
443*b1cdbd2cSJim Jagielski         {     0, 0, L_FIX}, // "Default-sprm"/ wird uebersprungen
444*b1cdbd2cSJim Jagielski         {0x4600, 2, L_FIX}, // "sprmPIstd" pap.istd;istd (style code);short;
445*b1cdbd2cSJim Jagielski         {0xC601, 0, L_VAR}, // "sprmPIstdPermute" pap.istd;permutation vector
446*b1cdbd2cSJim Jagielski         {0x2602, 1, L_FIX}, // "sprmPIncLvl" pap.istd, pap.lvl;difference
447*b1cdbd2cSJim Jagielski                             // between istd of base PAP and istd of PAP to be
448*b1cdbd2cSJim Jagielski                             // produced
449*b1cdbd2cSJim Jagielski         {0x2403, 1, L_FIX}, // "sprmPJc" pap.jc;jc (justification);byte;
450*b1cdbd2cSJim Jagielski         {0x2404, 1, L_FIX}, // "sprmPFSideBySide" pap.fSideBySide;0 or 1;byte;
451*b1cdbd2cSJim Jagielski         {0x2405, 1, L_FIX}, // "sprmPFKeep" pap.fKeep;0 or 1;byte;
452*b1cdbd2cSJim Jagielski         {0x2406, 1, L_FIX}, // "sprmPFKeepFollow" pap.fKeepFollow;0 or 1;byte;
453*b1cdbd2cSJim Jagielski         {0x2407, 1, L_FIX}, // "sprmPFPageBreakBefore" pap.fPageBreakBefore;
454*b1cdbd2cSJim Jagielski                             // 0 or 1
455*b1cdbd2cSJim Jagielski         {0x2408, 1, L_FIX}, // "sprmPBrcl" pap.brcl;brcl;byte;
456*b1cdbd2cSJim Jagielski         {0x2409, 1, L_FIX}, // "sprmPBrcp" pap.brcp;brcp;byte;
457*b1cdbd2cSJim Jagielski         {0x260A, 1, L_FIX}, // "sprmPIlvl" pap.ilvl;ilvl;byte;
458*b1cdbd2cSJim Jagielski         {0x460B, 2, L_FIX}, // "sprmPIlfo" pap.ilfo;ilfo (list index) ;short;
459*b1cdbd2cSJim Jagielski         {0x240C, 1, L_FIX}, // "sprmPFNoLineNumb" pap.fNoLnn;0 or 1;byte;
460*b1cdbd2cSJim Jagielski         {0xC60D, 0, L_VAR}, // "sprmPChgTabsPapx" pap.itbdMac, pap.rgdxaTab,
461*b1cdbd2cSJim Jagielski                             // pap.rgtbd;complex
462*b1cdbd2cSJim Jagielski         {0x840E, 2, L_FIX}, // "sprmPDxaRight" pap.dxaRight;dxa;word;
463*b1cdbd2cSJim Jagielski         {0x840F, 2, L_FIX}, // "sprmPDxaLeft" pap.dxaLeft;dxa;word;
464*b1cdbd2cSJim Jagielski         {0x4610, 2, L_FIX}, // "sprmPNest" pap.dxaLeft;dxa
465*b1cdbd2cSJim Jagielski         {0x8411, 2, L_FIX}, // "sprmPDxaLeft1" pap.dxaLeft1;dxa;word;
466*b1cdbd2cSJim Jagielski         {0x6412, 4, L_FIX}, // "sprmPDyaLine" pap.lspd;an LSPD, a long word
467*b1cdbd2cSJim Jagielski                             // structure consisting of a short of dyaLine
468*b1cdbd2cSJim Jagielski                             // followed by a short of fMultLinespace
469*b1cdbd2cSJim Jagielski         {0xA413, 2, L_FIX}, // "sprmPDyaBefore" pap.dyaBefore;dya;word;
470*b1cdbd2cSJim Jagielski         {0xA414, 2, L_FIX}, // "sprmPDyaAfter" pap.dyaAfter;dya;word;
471*b1cdbd2cSJim Jagielski         {0xC615, 0, L_VAR}, // "sprmPChgTabs" pap.itbdMac, pap.rgdxaTab,
472*b1cdbd2cSJim Jagielski                             // pap.rgtbd;complex
473*b1cdbd2cSJim Jagielski         {0x2416, 1, L_FIX}, // "sprmPFInTable" pap.fInTable;0 or 1;byte;
474*b1cdbd2cSJim Jagielski         {0x2417, 1, L_FIX}, // "sprmPFTtp" pap.fTtp;0 or 1;byte;
475*b1cdbd2cSJim Jagielski         {0x8418, 2, L_FIX}, // "sprmPDxaAbs" pap.dxaAbs;dxa;word;
476*b1cdbd2cSJim Jagielski         {0x8419, 2, L_FIX}, // "sprmPDyaAbs" pap.dyaAbs;dya;word;
477*b1cdbd2cSJim Jagielski         {0x841A, 2, L_FIX}, // "sprmPDxaWidth" pap.dxaWidth;dxa;word;
478*b1cdbd2cSJim Jagielski         {0x261B, 1, L_FIX}, // "sprmPPc" pap.pcHorz, pap.pcVert;complex
479*b1cdbd2cSJim Jagielski         {0x461C, 2, L_FIX}, // "sprmPBrcTop10" pap.brcTop;BRC10;word;
480*b1cdbd2cSJim Jagielski         {0x461D, 2, L_FIX}, // "sprmPBrcLeft10" pap.brcLeft;BRC10;word;
481*b1cdbd2cSJim Jagielski         {0x461E, 2, L_FIX}, // "sprmPBrcBottom10" pap.brcBottom;BRC10;word;
482*b1cdbd2cSJim Jagielski         {0x461F, 2, L_FIX}, // "sprmPBrcRight10" pap.brcRight;BRC10;word;
483*b1cdbd2cSJim Jagielski         {0x4620, 2, L_FIX}, // "sprmPBrcBetween10" pap.brcBetween;BRC10;word;
484*b1cdbd2cSJim Jagielski         {0x4621, 2, L_FIX}, // "sprmPBrcBar10" pap.brcBar;BRC10;word;
485*b1cdbd2cSJim Jagielski         {0x4622, 2, L_FIX}, // "sprmPDxaFromText10" pap.dxaFromText;dxa;word;
486*b1cdbd2cSJim Jagielski         {0x2423, 1, L_FIX}, // "sprmPWr" pap.wr;wr
487*b1cdbd2cSJim Jagielski         {0x6424, 4, L_FIX}, // "sprmPBrcTop" pap.brcTop;BRC;long;
488*b1cdbd2cSJim Jagielski         {0x6425, 4, L_FIX}, // "sprmPBrcLeft" pap.brcLeft;BRC;long;
489*b1cdbd2cSJim Jagielski         {0x6426, 4, L_FIX}, // "sprmPBrcBottom" pap.brcBottom;BRC;long;
490*b1cdbd2cSJim Jagielski         {0x6427, 4, L_FIX}, // "sprmPBrcRight" pap.brcRight;BRC;long;
491*b1cdbd2cSJim Jagielski         {0x6428, 4, L_FIX}, // "sprmPBrcBetween" pap.brcBetween;BRC;long;
492*b1cdbd2cSJim Jagielski         {0x6629, 4, L_FIX}, // "sprmPBrcBar" pap.brcBar;BRC;long;
493*b1cdbd2cSJim Jagielski         {0x242A, 1, L_FIX}, // "sprmPFNoAutoHyph" pap.fNoAutoHyph;0 or 1;byte;
494*b1cdbd2cSJim Jagielski         {0x442B, 2, L_FIX}, // "sprmPWHeightAbs" pap.wHeightAbs;w;word;
495*b1cdbd2cSJim Jagielski         {0x442C, 2, L_FIX}, // "sprmPDcs" pap.dcs;DCS;short;
496*b1cdbd2cSJim Jagielski         {0x442D, 2, L_FIX}, // "sprmPShd" pap.shd;SHD;word;
497*b1cdbd2cSJim Jagielski         {0x842E, 2, L_FIX}, // "sprmPDyaFromText" pap.dyaFromText;dya;word;
498*b1cdbd2cSJim Jagielski         {0x842F, 2, L_FIX}, // "sprmPDxaFromText" pap.dxaFromText;dxa;word;
499*b1cdbd2cSJim Jagielski         {0x2430, 1, L_FIX}, // "sprmPFLocked" pap.fLocked;0 or 1;byte;
500*b1cdbd2cSJim Jagielski         {0x2431, 1, L_FIX}, // "sprmPFWidowControl" pap.fWidowControl;0 or 1
501*b1cdbd2cSJim Jagielski         {0xC632, 0, L_VAR}, // "sprmPRuler" ;;variable length;
502*b1cdbd2cSJim Jagielski         {0x2433, 1, L_FIX}, // "sprmPFKinsoku" pap.fKinsoku;0 or 1;byte;
503*b1cdbd2cSJim Jagielski         {0x2434, 1, L_FIX}, // "sprmPFWordWrap" pap.fWordWrap;0 or 1;byte;
504*b1cdbd2cSJim Jagielski         {0x2435, 1, L_FIX}, // "sprmPFOverflowPunct" pap.fOverflowPunct;0 or 1
505*b1cdbd2cSJim Jagielski         {0x2436, 1, L_FIX}, // "sprmPFTopLinePunct" pap.fTopLinePunct;0 or 1
506*b1cdbd2cSJim Jagielski         {0x2437, 1, L_FIX}, // "sprmPFAutoSpaceDE" pap.fAutoSpaceDE;0 or 1
507*b1cdbd2cSJim Jagielski         {0x2438, 1, L_FIX}, // "sprmPFAutoSpaceDN" pap.fAutoSpaceDN;0 or 1
508*b1cdbd2cSJim Jagielski         {0x4439, 2, L_FIX}, // "sprmPWAlignFont" pap.wAlignFont;iFa
509*b1cdbd2cSJim Jagielski         {0x443A, 2, L_FIX}, // "sprmPFrameTextFlow" pap.fVertical pap.fBackward
510*b1cdbd2cSJim Jagielski                             // pap.fRotateFont;complex
511*b1cdbd2cSJim Jagielski         {0x243B, 1, L_FIX}, // "sprmPISnapBaseLine" obsolete: not applicable in
512*b1cdbd2cSJim Jagielski                             // Word97 and later versions;
513*b1cdbd2cSJim Jagielski         {0xC63E, 0, L_VAR}, // "sprmPAnld" pap.anld;;variable length;
514*b1cdbd2cSJim Jagielski         {0xC63F, 0, L_VAR}, // "sprmPPropRMark" pap.fPropRMark;complex
515*b1cdbd2cSJim Jagielski         {0x2640, 1, L_FIX}, // "sprmPOutLvl" pap.lvl;has no effect if pap.istd
516*b1cdbd2cSJim Jagielski                             // is < 1 or is > 9
517*b1cdbd2cSJim Jagielski         {0x2441, 1, L_FIX}, // "sprmPFBiDi" ;;byte;
518*b1cdbd2cSJim Jagielski         {0x2443, 1, L_FIX}, // "sprmPFNumRMIns" pap.fNumRMIns;1 or 0;bit;
519*b1cdbd2cSJim Jagielski         {0x2444, 1, L_FIX}, // "sprmPCrLf" ;;byte;
520*b1cdbd2cSJim Jagielski         {0xC645, 0, L_VAR}, // "sprmPNumRM" pap.numrm;;variable length;
521*b1cdbd2cSJim Jagielski         {0x6645, 4, L_FIX}, // "sprmPHugePapx" fc in the data stream to locate
522*b1cdbd2cSJim Jagielski                             // the huge grpprl
523*b1cdbd2cSJim Jagielski         {0x6646, 4, L_FIX}, // "sprmPHugePapx" fc in the data stream to locate
524*b1cdbd2cSJim Jagielski                             // the huge grpprl
525*b1cdbd2cSJim Jagielski         {0x2447, 1, L_FIX}, // "sprmPFUsePgsuSettings" pap.fUsePgsuSettings;
526*b1cdbd2cSJim Jagielski                             // 1 or 0
527*b1cdbd2cSJim Jagielski         {0x2448, 1, L_FIX}, // "sprmPFAdjustRight" pap.fAdjustRight;1 or 0;byte;
528*b1cdbd2cSJim Jagielski         {0x0800, 1, L_FIX}, // "sprmCFRMarkDel" chp.fRMarkDel;1 or 0;bit;
529*b1cdbd2cSJim Jagielski         {0x0801, 1, L_FIX}, // "sprmCFRMark" chp.fRMark;1 or 0;bit;
530*b1cdbd2cSJim Jagielski         {0x0802, 1, L_FIX}, // "sprmCFFldVanish" chp.fFldVanish;1 or 0;bit;
531*b1cdbd2cSJim Jagielski         {0x6A03, 4, L_FIX}, // "sprmCPicLocation" chp.fcPic and chp.fSpec;
532*b1cdbd2cSJim Jagielski         {0x4804, 2, L_FIX}, // "sprmCIbstRMark" chp.ibstRMark;index into
533*b1cdbd2cSJim Jagielski                             // sttbRMark
534*b1cdbd2cSJim Jagielski         {0x6805, 4, L_FIX}, // "sprmCDttmRMark" chp.dttmRMark;DTTM;long;
535*b1cdbd2cSJim Jagielski         {0x0806, 1, L_FIX}, // "sprmCFData" chp.fData;1 or 0;bit;
536*b1cdbd2cSJim Jagielski         {0x4807, 2, L_FIX}, // "sprmCIdslRMark" chp.idslRMReason;an index to a
537*b1cdbd2cSJim Jagielski                             // table of strings defined in Word 6.0
538*b1cdbd2cSJim Jagielski                             // executables;short;
539*b1cdbd2cSJim Jagielski         {0xEA08, 1, L_FIX}, // "sprmCChs" chp.fChsDiff and chp.chse;
540*b1cdbd2cSJim Jagielski         {0x6A09, 4, L_FIX}, // "sprmCSymbol" chp.fSpec, chp.xchSym and
541*b1cdbd2cSJim Jagielski                             // chp.ftcSym
542*b1cdbd2cSJim Jagielski         {0x080A, 1, L_FIX}, // "sprmCFOle2" chp.fOle2;1 or 0;bit;
543*b1cdbd2cSJim Jagielski         {0x480B, 0, L_FIX}, // "sprmCIdCharType" obsolete: not applicable in
544*b1cdbd2cSJim Jagielski                             // Word97 and later versions;;;
545*b1cdbd2cSJim Jagielski         {0x2A0C, 1, L_FIX}, // "sprmCHighlight" chp.fHighlight,
546*b1cdbd2cSJim Jagielski                             // chp.icoHighlight;ico (fHighlight is set to 1 iff
547*b1cdbd2cSJim Jagielski                             // ico is not 0)
548*b1cdbd2cSJim Jagielski         {0x680E, 4, L_FIX}, // "sprmCObjLocation" chp.fcObj;FC;long;
549*b1cdbd2cSJim Jagielski         {0x2A10, 0, L_FIX}, // "sprmCFFtcAsciSymb" ;;;
550*b1cdbd2cSJim Jagielski         {0x4A30, 2, L_FIX}, // "sprmCIstd" chp.istd;istd, see stylesheet def
551*b1cdbd2cSJim Jagielski         {0xCA31, 0, L_VAR}, // "sprmCIstdPermute" chp.istd;permutation vector
552*b1cdbd2cSJim Jagielski         {0x2A32, 0, L_VAR}, // "sprmCDefault" whole CHP;none;variable length;
553*b1cdbd2cSJim Jagielski         {0x2A33, 0, L_FIX}, // "sprmCPlain" whole CHP;none;0;
554*b1cdbd2cSJim Jagielski         {0x2A34, 1, L_FIX}, // "sprmCKcd" ;;;
555*b1cdbd2cSJim Jagielski         {0x0835, 1, L_FIX}, // "sprmCFBold" chp.fBold;0,1, 128, or 129
556*b1cdbd2cSJim Jagielski         {0x0836, 1, L_FIX}, // "sprmCFItalic" chp.fItalic;0,1, 128, or 129
557*b1cdbd2cSJim Jagielski         {0x0837, 1, L_FIX}, // "sprmCFStrike" chp.fStrike;0,1, 128, or 129
558*b1cdbd2cSJim Jagielski         {0x0838, 1, L_FIX}, // "sprmCFOutline" chp.fOutline;0,1, 128, or 129
559*b1cdbd2cSJim Jagielski         {0x0839, 1, L_FIX}, // "sprmCFShadow" chp.fShadow;0,1, 128, or 129
560*b1cdbd2cSJim Jagielski         {0x083A, 1, L_FIX}, // "sprmCFSmallCaps" chp.fSmallCaps;0,1, 128, or 129
561*b1cdbd2cSJim Jagielski         {0x083B, 1, L_FIX}, // "sprmCFCaps" chp.fCaps;0,1, 128, or 129
562*b1cdbd2cSJim Jagielski         {0x083C, 1, L_FIX}, // "sprmCFVanish" chp.fVanish;0,1, 128, or 129
563*b1cdbd2cSJim Jagielski         {0x4A3D, 2, L_FIX}, // "sprmCFtcDefault" ;ftc, only used internally
564*b1cdbd2cSJim Jagielski         {0x2A3E, 1, L_FIX}, // "sprmCKul" chp.kul;kul;byte;
565*b1cdbd2cSJim Jagielski         {0xEA3F, 3, L_FIX}, // "sprmCSizePos" chp.hps, chp.hpsPos;3 bytes;
566*b1cdbd2cSJim Jagielski         {0x8840, 2, L_FIX}, // "sprmCDxaSpace" chp.dxaSpace;dxa;word;
567*b1cdbd2cSJim Jagielski         {0x4A41, 2, L_FIX}, // "sprmCLid" ;only used internally never stored
568*b1cdbd2cSJim Jagielski         {0x2A42, 1, L_FIX}, // "sprmCIco" chp.ico;ico;byte;
569*b1cdbd2cSJim Jagielski         {0x4A43, 2, L_FIX}, // "sprmCHps" chp.hps;hps
570*b1cdbd2cSJim Jagielski         {0x2A44, 1, L_FIX}, // "sprmCHpsInc" chp.hps;
571*b1cdbd2cSJim Jagielski         {0x4845, 2, L_FIX}, // "sprmCHpsPos" chp.hpsPos;hps;short; (doc wrong)
572*b1cdbd2cSJim Jagielski         {0x2A46, 1, L_FIX}, // "sprmCHpsPosAdj" chp.hpsPos;hps
573*b1cdbd2cSJim Jagielski         {0xCA47, 0, L_VAR}, // "sprmCMajority" chp.fBold, chp.fItalic,
574*b1cdbd2cSJim Jagielski                             // chp.fSmallCaps, chp.fVanish, chp.fStrike,
575*b1cdbd2cSJim Jagielski                             // chp.fCaps, chp.rgftc, chp.hps, chp.hpsPos,
576*b1cdbd2cSJim Jagielski                             // chp.kul, chp.dxaSpace, chp.ico,
577*b1cdbd2cSJim Jagielski                             // chp.rglid;complex;variable length, length byte
578*b1cdbd2cSJim Jagielski                             // plus size of following grpprl;
579*b1cdbd2cSJim Jagielski         {0x2A48, 1, L_FIX}, // "sprmCIss" chp.iss;iss;byte;
580*b1cdbd2cSJim Jagielski         {0xCA49, 0, L_VAR}, // "sprmCHpsNew50" chp.hps;hps;variable width
581*b1cdbd2cSJim Jagielski         {0xCA4A, 0, L_VAR}, // "sprmCHpsInc1" chp.hps;complex
582*b1cdbd2cSJim Jagielski         {0x484B, 2, L_FIX}, // "sprmCHpsKern" chp.hpsKern;hps;short;
583*b1cdbd2cSJim Jagielski         {0xCA4C, 2, L_FIX}, // "sprmCMajority50" chp.fBold, chp.fItalic,
584*b1cdbd2cSJim Jagielski                             // chp.fSmallCaps, chp.fVanish, chp.fStrike,
585*b1cdbd2cSJim Jagielski                             // chp.fCaps, chp.ftc, chp.hps, chp.hpsPos, chp.kul,
586*b1cdbd2cSJim Jagielski                             // chp.dxaSpace, chp.ico,;complex
587*b1cdbd2cSJim Jagielski         {0x4A4D, 2, L_FIX}, // "sprmCHpsMul" chp.hps;percentage to grow hps
588*b1cdbd2cSJim Jagielski         {0x484E, 2, L_FIX}, // "sprmCYsri" chp.ysri;ysri;short;
589*b1cdbd2cSJim Jagielski         {0x4A4F, 2, L_FIX}, // "sprmCRgFtc0" chp.rgftc[0];ftc for ASCII text
590*b1cdbd2cSJim Jagielski         {0x4A50, 2, L_FIX}, // "sprmCRgFtc1" chp.rgftc[1];ftc for Far East text
591*b1cdbd2cSJim Jagielski         {0x4A51, 2, L_FIX}, // "sprmCRgFtc2" chp.rgftc[2];ftc for non-FE text
592*b1cdbd2cSJim Jagielski         {0x4852, 2, L_FIX}, // "sprmCCharScale"
593*b1cdbd2cSJim Jagielski         {0x2A53, 1, L_FIX}, // "sprmCFDStrike" chp.fDStrike;;byte;
594*b1cdbd2cSJim Jagielski         {0x0854, 1, L_FIX}, // "sprmCFImprint" chp.fImprint;1 or 0;bit;
595*b1cdbd2cSJim Jagielski         {0x0855, 1, L_FIX}, // "sprmCFSpec" chp.fSpec ;1 or 0;bit;
596*b1cdbd2cSJim Jagielski         {0x0856, 1, L_FIX}, // "sprmCFObj" chp.fObj;1 or 0;bit;
597*b1cdbd2cSJim Jagielski         {0xCA57, 0, L_VAR}, // "sprmCPropRMark" chp.fPropRMark,
598*b1cdbd2cSJim Jagielski                             // chp.ibstPropRMark, chp.dttmPropRMark;Complex
599*b1cdbd2cSJim Jagielski         {0x0858, 1, L_FIX}, // "sprmCFEmboss" chp.fEmboss;1 or 0;bit;
600*b1cdbd2cSJim Jagielski         {0x2859, 1, L_FIX}, // "sprmCSfxText" chp.sfxtText;text animation;byte;
601*b1cdbd2cSJim Jagielski         {0x085A, 1, L_FIX}, // "sprmCFBiDi" ;;;
602*b1cdbd2cSJim Jagielski         {0x085B, 1, L_FIX}, // "sprmCFDiacColor" ;;;
603*b1cdbd2cSJim Jagielski         {0x085C, 1, L_FIX}, // "sprmCFBoldBi" ;;;
604*b1cdbd2cSJim Jagielski         {0x085D, 1, L_FIX}, // "sprmCFItalicBi" ;;;
605*b1cdbd2cSJim Jagielski         {0x4A5E, 2, L_FIX},
606*b1cdbd2cSJim Jagielski         {0x485F, 2, L_FIX}, // "sprmCLidBi" ;;;
607*b1cdbd2cSJim Jagielski         {0x4A60, 1, L_FIX}, // "sprmCIcoBi" ;;;
608*b1cdbd2cSJim Jagielski         {0x4A61, 2, L_FIX}, // "sprmCHpsBi" ;;;
609*b1cdbd2cSJim Jagielski         {0xCA62, 0, L_VAR}, // "sprmCDispFldRMark" chp.fDispFldRMark,
610*b1cdbd2cSJim Jagielski                             // chp.ibstDispFldRMark, chp.dttmDispFldRMark ;
611*b1cdbd2cSJim Jagielski         {0x4863, 2, L_FIX}, // "sprmCIbstRMarkDel" chp.ibstRMarkDel;index into
612*b1cdbd2cSJim Jagielski                             // sttbRMark;short;
613*b1cdbd2cSJim Jagielski         {0x6864, 4, L_FIX}, // "sprmCDttmRMarkDel" chp.dttmRMarkDel;DTTM;long;
614*b1cdbd2cSJim Jagielski         {0x6865, 4, L_FIX}, // "sprmCBrc" chp.brc;BRC;long;
615*b1cdbd2cSJim Jagielski         {0x4866, 2, L_FIX}, // "sprmCShd" chp.shd;SHD;short;
616*b1cdbd2cSJim Jagielski         {0x4867, 2, L_FIX}, // "sprmCIdslRMarkDel" chp.idslRMReasonDel;an index
617*b1cdbd2cSJim Jagielski                             // to a table of strings defined in Word 6.0
618*b1cdbd2cSJim Jagielski                             // executables;short;
619*b1cdbd2cSJim Jagielski         {0x0868, 1, L_FIX}, // "sprmCFUsePgsuSettings"
620*b1cdbd2cSJim Jagielski                             // chp.fUsePgsuSettings;1 or 0
621*b1cdbd2cSJim Jagielski         {0x486B, 2, L_FIX}, // "sprmCCpg" ;;word;
622*b1cdbd2cSJim Jagielski         {0x486D, 2, L_FIX}, // "sprmCRgLid0" chp.rglid[0];LID: for non-FE text
623*b1cdbd2cSJim Jagielski         {0x486E, 2, L_FIX}, // "sprmCRgLid1" chp.rglid[1];LID: for Far East text
624*b1cdbd2cSJim Jagielski         {0x286F, 1, L_FIX}, // "sprmCIdctHint" chp.idctHint;IDCT:
625*b1cdbd2cSJim Jagielski         {0x2E00, 1, L_FIX}, // "sprmPicBrcl" pic.brcl;brcl (see PIC definition)
626*b1cdbd2cSJim Jagielski         {0xCE01, 0, L_VAR}, // "sprmPicScale" pic.mx, pic.my, pic.dxaCropleft,
627*b1cdbd2cSJim Jagielski                             // pic.dyaCropTop pic.dxaCropRight,
628*b1cdbd2cSJim Jagielski                             // pic.dyaCropBottom;Complex
629*b1cdbd2cSJim Jagielski         {0x6C02, 4, L_FIX}, // "sprmPicBrcTop" pic.brcTop;BRC;long;
630*b1cdbd2cSJim Jagielski         {0x6C03, 4, L_FIX}, // "sprmPicBrcLeft" pic.brcLeft;BRC;long;
631*b1cdbd2cSJim Jagielski         {0x6C04, 4, L_FIX}, // "sprmPicBrcBottom" pic.brcBottom;BRC;long;
632*b1cdbd2cSJim Jagielski         {0x6C05, 4, L_FIX}, // "sprmPicBrcRight" pic.brcRight;BRC;long;
633*b1cdbd2cSJim Jagielski         {0x3000, 1, L_FIX}, // "sprmScnsPgn" sep.cnsPgn;cns;byte;
634*b1cdbd2cSJim Jagielski         {0x3001, 1, L_FIX}, // "sprmSiHeadingPgn" sep.iHeadingPgn;heading number
635*b1cdbd2cSJim Jagielski                             // level;byte;
636*b1cdbd2cSJim Jagielski         {0xD202, 0, L_VAR}, // "sprmSOlstAnm" sep.olstAnm;OLST;variable length;
637*b1cdbd2cSJim Jagielski         {0xF203, 3, L_FIX}, // "sprmSDxaColWidth" sep.rgdxaColWidthSpacing;
638*b1cdbd2cSJim Jagielski         {0xF204, 3, L_FIX}, // "sprmSDxaColSpacing" sep.rgdxaColWidthSpacing;
639*b1cdbd2cSJim Jagielski                             // complex
640*b1cdbd2cSJim Jagielski         {0x3005, 1, L_FIX}, // "sprmSFEvenlySpaced" sep.fEvenlySpaced;1 or 0
641*b1cdbd2cSJim Jagielski         {0x3006, 1, L_FIX}, // "sprmSFProtected" sep.fUnlocked;1 or 0;byte;
642*b1cdbd2cSJim Jagielski         {0x5007, 2, L_FIX}, // "sprmSDmBinFirst" sep.dmBinFirst;;word;
643*b1cdbd2cSJim Jagielski         {0x5008, 2, L_FIX}, // "sprmSDmBinOther" sep.dmBinOther;;word;
644*b1cdbd2cSJim Jagielski         {0x3009, 1, L_FIX}, // "sprmSBkc" sep.bkc;bkc;byte;
645*b1cdbd2cSJim Jagielski         {0x300A, 1, L_FIX}, // "sprmSFTitlePage" sep.fTitlePage;0 or 1;byte;
646*b1cdbd2cSJim Jagielski         {0x500B, 2, L_FIX}, // "sprmSCcolumns" sep.ccolM1;# of cols - 1;word;
647*b1cdbd2cSJim Jagielski         {0x900C, 2, L_FIX}, // "sprmSDxaColumns" sep.dxaColumns;dxa;word;
648*b1cdbd2cSJim Jagielski         {0x300D, 1, L_FIX}, // "sprmSFAutoPgn" sep.fAutoPgn;obsolete;byte;
649*b1cdbd2cSJim Jagielski         {0x300E, 1, L_FIX}, // "sprmSNfcPgn" sep.nfcPgn;nfc;byte;
650*b1cdbd2cSJim Jagielski         {0xB00F, 2, L_FIX}, // "sprmSDyaPgn" sep.dyaPgn;dya;short;
651*b1cdbd2cSJim Jagielski         {0xB010, 2, L_FIX}, // "sprmSDxaPgn" sep.dxaPgn;dya;short;
652*b1cdbd2cSJim Jagielski         {0x3011, 1, L_FIX}, // "sprmSFPgnRestart" sep.fPgnRestart;0 or 1;byte;
653*b1cdbd2cSJim Jagielski         {0x3012, 1, L_FIX}, // "sprmSFEndnote" sep.fEndnote;0 or 1;byte;
654*b1cdbd2cSJim Jagielski         {0x3013, 1, L_FIX}, // "sprmSLnc" sep.lnc;lnc;byte;
655*b1cdbd2cSJim Jagielski         {0x3014, 1, L_FIX}, // "sprmSGprfIhdt" sep.grpfIhdt;grpfihdt
656*b1cdbd2cSJim Jagielski         {0x5015, 2, L_FIX}, // "sprmSNLnnMod" sep.nLnnMod;non-neg int.;word;
657*b1cdbd2cSJim Jagielski         {0x9016, 2, L_FIX}, // "sprmSDxaLnn" sep.dxaLnn;dxa;word;
658*b1cdbd2cSJim Jagielski         {0xB017, 2, L_FIX}, // "sprmSDyaHdrTop" sep.dyaHdrTop;dya;word;
659*b1cdbd2cSJim Jagielski         {0xB018, 2, L_FIX}, // "sprmSDyaHdrBottom" sep.dyaHdrBottom;dya;word;
660*b1cdbd2cSJim Jagielski         {0x3019, 1, L_FIX}, // "sprmSLBetween" sep.fLBetween;0 or 1;byte;
661*b1cdbd2cSJim Jagielski         {0x301A, 1, L_FIX}, // "sprmSVjc" sep.vjc;vjc;byte;
662*b1cdbd2cSJim Jagielski         {0x501B, 2, L_FIX}, // "sprmSLnnMin" sep.lnnMin;lnn;word;
663*b1cdbd2cSJim Jagielski         {0x501C, 2, L_FIX}, // "sprmSPgnStart" sep.pgnStart;pgn;word;
664*b1cdbd2cSJim Jagielski         {0x301D, 1, L_FIX}, // "sprmSBOrientation" sep.dmOrientPage;dm;byte;
665*b1cdbd2cSJim Jagielski         {0x301E, 1, L_FIX}, // "sprmSBCustomize" ;;;
666*b1cdbd2cSJim Jagielski         {0xB01F, 2, L_FIX}, // "sprmSXaPage" sep.xaPage;xa;word;
667*b1cdbd2cSJim Jagielski         {0xB020, 2, L_FIX}, // "sprmSYaPage" sep.yaPage;ya;word;
668*b1cdbd2cSJim Jagielski         {0xB021, 2, L_FIX}, // "sprmSDxaLeft" sep.dxaLeft;dxa;word;
669*b1cdbd2cSJim Jagielski         {0xB022, 2, L_FIX}, // "sprmSDxaRight" sep.dxaRight;dxa;word;
670*b1cdbd2cSJim Jagielski         {0x9023, 2, L_FIX}, // "sprmSDyaTop" sep.dyaTop;dya;word;
671*b1cdbd2cSJim Jagielski         {0x9024, 2, L_FIX}, // "sprmSDyaBottom" sep.dyaBottom;dya;word;
672*b1cdbd2cSJim Jagielski         {0xB025, 2, L_FIX}, // "sprmSDzaGutter" sep.dzaGutter;dza;word;
673*b1cdbd2cSJim Jagielski         {0x5026, 2, L_FIX}, // "sprmSDmPaperReq" sep.dmPaperReq;dm;word;
674*b1cdbd2cSJim Jagielski         {0xD227, 0, L_VAR}, // "sprmSPropRMark" sep.fPropRMark,
675*b1cdbd2cSJim Jagielski                             // sep.ibstPropRMark, sep.dttmPropRMark ;complex
676*b1cdbd2cSJim Jagielski         {0x3228, 1, L_FIX}, // "sprmSFBiDi" ;;;
677*b1cdbd2cSJim Jagielski         {0x3229, 1, L_FIX}, // "sprmSFFacingCol" ;;;
678*b1cdbd2cSJim Jagielski         {0x322A, 1, L_FIX}, // "sprmSFRTLGutter", set to one if gutter is on
679*b1cdbd2cSJim Jagielski                             // right
680*b1cdbd2cSJim Jagielski         {0x702B, 4, L_FIX}, // "sprmSBrcTop" sep.brcTop;BRC;long;
681*b1cdbd2cSJim Jagielski         {0x702C, 4, L_FIX}, // "sprmSBrcLeft" sep.brcLeft;BRC;long;
682*b1cdbd2cSJim Jagielski         {0x702D, 4, L_FIX}, // "sprmSBrcBottom" sep.brcBottom;BRC;long;
683*b1cdbd2cSJim Jagielski         {0x702E, 4, L_FIX}, // "sprmSBrcRight" sep.brcRight;BRC;long;
684*b1cdbd2cSJim Jagielski         {0x522F, 2, L_FIX}, // "sprmSPgbProp" sep.pgbProp;;word;
685*b1cdbd2cSJim Jagielski         {0x7030, 4, L_FIX}, // "sprmSDxtCharSpace" sep.dxtCharSpace;dxt;long;
686*b1cdbd2cSJim Jagielski         {0x9031, 2, L_FIX}, // "sprmSDyaLinePitch"
687*b1cdbd2cSJim Jagielski                             // sep.dyaLinePitch;dya; WRONG:long; RIGHT:short; !
688*b1cdbd2cSJim Jagielski         {0x5032, 2, L_FIX}, // "sprmSClm" ;;;
689*b1cdbd2cSJim Jagielski         {0x5033, 2, L_FIX}, // "sprmSTextFlow" sep.wTextFlow;complex
690*b1cdbd2cSJim Jagielski         {0x5400, 2, L_FIX}, // "sprmTJc" tap.jc;jc;word (low order byte is
691*b1cdbd2cSJim Jagielski                             // significant);
692*b1cdbd2cSJim Jagielski         {0x9601, 2, L_FIX}, // "sprmTDxaLeft" tap.rgdxaCenter
693*b1cdbd2cSJim Jagielski         {0x9602, 2, L_FIX}, // "sprmTDxaGapHalf" tap.dxaGapHalf,
694*b1cdbd2cSJim Jagielski                             // tap.rgdxaCenter
695*b1cdbd2cSJim Jagielski         {0x3403, 1, L_FIX}, // "sprmTFCantSplit" tap.fCantSplit;1 or 0;byte;
696*b1cdbd2cSJim Jagielski         {0x3404, 1, L_FIX}, // "sprmTTableHeader" tap.fTableHeader;1 or 0;byte;
697*b1cdbd2cSJim Jagielski         {0x3466, 1, L_FIX}, // "sprmTFCantSplit90" tap.fCantSplit90;1 or 0;byte;
698*b1cdbd2cSJim Jagielski         {0xD605, 0, L_VAR}, // "sprmTTableBorders" tap.rgbrcTable;complex
699*b1cdbd2cSJim Jagielski         {0xD606, 0, L_VAR}, // "sprmTDefTable10" tap.rgdxaCenter,
700*b1cdbd2cSJim Jagielski                             // tap.rgtc;complex
701*b1cdbd2cSJim Jagielski         {0x9407, 2, L_FIX}, // "sprmTDyaRowHeight" tap.dyaRowHeight;dya;word;
702*b1cdbd2cSJim Jagielski         {0xD608, 0, L_VAR}, // "sprmTDefTable" tap.rgtc;complex
703*b1cdbd2cSJim Jagielski         {0xD609, 0, L_VAR}, // "sprmTDefTableShd" tap.rgshd;complex
704*b1cdbd2cSJim Jagielski         {0x740A, 4, L_FIX}, // "sprmTTlp" tap.tlp;TLP;4 bytes;
705*b1cdbd2cSJim Jagielski         {0x560B, 2, L_FIX}, // "sprmTFBiDi" ;;;
706*b1cdbd2cSJim Jagielski         {0x740C, 1, L_FIX}, // "sprmTHTMLProps" ;;;
707*b1cdbd2cSJim Jagielski         {0xD620, 0, L_VAR}, // "sprmTSetBrc" tap.rgtc[].rgbrc;complex
708*b1cdbd2cSJim Jagielski         {0x7621, 4, L_FIX}, // "sprmTInsert" tap.rgdxaCenter, tap.rgtc;complex
709*b1cdbd2cSJim Jagielski         {0x5622, 2, L_FIX}, // "sprmTDelete" tap.rgdxaCenter, tap.rgtc;complex
710*b1cdbd2cSJim Jagielski         {0x7623, 4, L_FIX}, // "sprmTDxaCol" tap.rgdxaCenter;complex
711*b1cdbd2cSJim Jagielski         {0x5624, 0, L_VAR}, // "sprmTMerge" tap.fFirstMerged, tap.fMerged;
712*b1cdbd2cSJim Jagielski         {0x5625, 0, L_VAR}, // "sprmTSplit" tap.fFirstMerged, tap.fMerged;
713*b1cdbd2cSJim Jagielski         {0xD626, 0, L_VAR}, // "sprmTSetBrc10" tap.rgtc[].rgbrc;complex
714*b1cdbd2cSJim Jagielski         {0x7627, 0, L_VAR}, // "sprmTSetShd" tap.rgshd;complex
715*b1cdbd2cSJim Jagielski         {0x7628, 0, L_VAR}, // "sprmTSetShdOdd" tap.rgshd;complex
716*b1cdbd2cSJim Jagielski         {0x7629, 4, L_FIX}, // "sprmTTextFlow" tap.rgtc[].fVerticaltap,
717*b1cdbd2cSJim Jagielski                             // rgtc[].fBackwardtap, rgtc[].fRotateFont;0 or 10
718*b1cdbd2cSJim Jagielski                             // or 10 or 1;word;
719*b1cdbd2cSJim Jagielski         {0xD62A, 1, L_FIX}, // "sprmTDiagLine" ;;;
720*b1cdbd2cSJim Jagielski         {0xD62B, 0, L_VAR}, // "sprmTVertMerge" tap.rgtc[].vertMerge
721*b1cdbd2cSJim Jagielski         {0xD62C, 0, L_VAR}, // "sprmTVertAlign" tap.rgtc[].vertAlign
722*b1cdbd2cSJim Jagielski         {0xCA78, 0, L_VAR}, // undocumented "sprmCDoubleLine ?"
723*b1cdbd2cSJim Jagielski         {0x6649, 4, L_FIX}, // undocumented
724*b1cdbd2cSJim Jagielski         {0xF614, 3, L_FIX}, // undocumented
725*b1cdbd2cSJim Jagielski         {0xD612, 0, L_VAR}, // undocumented, new background colours.
726*b1cdbd2cSJim Jagielski         {0xD613, 0, L_VAR}, // undocumented
727*b1cdbd2cSJim Jagielski         {0xD61A, 0, L_VAR}, // undocumented
728*b1cdbd2cSJim Jagielski         {0xD61B, 0, L_VAR}, // undocumented
729*b1cdbd2cSJim Jagielski         {0xD61C, 0, L_VAR}, // undocumented
730*b1cdbd2cSJim Jagielski         {0xD61D, 0, L_VAR}, // undocumented
731*b1cdbd2cSJim Jagielski         {0xD632, 0, L_VAR}, // undocumented
732*b1cdbd2cSJim Jagielski         {0xD634, 0, L_VAR}, // undocumented
733*b1cdbd2cSJim Jagielski         {0xD238, 0, L_VAR}, // undocumented sep
734*b1cdbd2cSJim Jagielski         {0xC64E, 0, L_VAR}, // undocumented
735*b1cdbd2cSJim Jagielski         {0xC64F, 0, L_VAR}, // undocumented
736*b1cdbd2cSJim Jagielski         {0xC650, 0, L_VAR}, // undocumented
737*b1cdbd2cSJim Jagielski         {0xC651, 0, L_VAR}, // undocumented
738*b1cdbd2cSJim Jagielski         {0xF661, 3, L_FIX}, // undocumented
739*b1cdbd2cSJim Jagielski         {0x4873, 2, L_FIX}, // undocumented
740*b1cdbd2cSJim Jagielski         {0x4874, 2, L_FIX}, // undocumented
741*b1cdbd2cSJim Jagielski         {0x6463, 4, L_FIX}, // undocumented
742*b1cdbd2cSJim Jagielski         {0x2461, 1, L_FIX}, // undoc, must be asian version of "sprmPJc"
743*b1cdbd2cSJim Jagielski         {0x845D, 2, L_FIX}, // undoc, must be asian version of "sprmPDxaRight"
744*b1cdbd2cSJim Jagielski         {0x845E, 2, L_FIX}, // undoc, must be asian version of "sprmPDxaLeft"
745*b1cdbd2cSJim Jagielski         {0x8460, 2, L_FIX}, // undoc, must be asian version of "sprmPDxaLeft1"
746*b1cdbd2cSJim Jagielski         {0x3615, 1, L_FIX}, // undocumented
747*b1cdbd2cSJim Jagielski         {0x360D, 1, L_FIX}, // undocumented
748*b1cdbd2cSJim Jagielski         {0x703A, 4, L_FIX}, // undocumented, sep, perhaps related to textgrids ?
749*b1cdbd2cSJim Jagielski         {0x303B, 1, L_FIX}, // undocumented, sep
750*b1cdbd2cSJim Jagielski         {0x244B, 1, L_FIX}, // undocumented, subtable "sprmPFInTable" equiv ?
751*b1cdbd2cSJim Jagielski         {0x244C, 1, L_FIX}, // undocumented, subtable "sprmPFTtp" equiv ?
752*b1cdbd2cSJim Jagielski         {0x940E, 2, L_FIX}, // undocumented
753*b1cdbd2cSJim Jagielski         {0x940F, 2, L_FIX}, // undocumented
754*b1cdbd2cSJim Jagielski         {0x9410, 2, L_FIX}, // undocumented
755*b1cdbd2cSJim Jagielski         {0x6815, 4, L_FIX}, // undocumented
756*b1cdbd2cSJim Jagielski         {0x6816, 4, L_FIX}, // undocumented
757*b1cdbd2cSJim Jagielski         {0x6870, 4, L_FIX}, // undocumented, text colour
758*b1cdbd2cSJim Jagielski         {0xC64D, 0, L_VAR}, // undocumented, para back colour
759*b1cdbd2cSJim Jagielski         {0x6467, 4, L_FIX}, // undocumented
760*b1cdbd2cSJim Jagielski         {0x646B, 4, L_FIX}, // undocumented
761*b1cdbd2cSJim Jagielski         {0xF617, 3, L_FIX}, // undocumented
762*b1cdbd2cSJim Jagielski         {0xD660, 0, L_VAR}, // undocumented, something to do with colour.
763*b1cdbd2cSJim Jagielski         {0xD670, 0, L_VAR}, // undocumented, something to do with colour.
764*b1cdbd2cSJim Jagielski         {0xCA71, 0, L_VAR}, // undocumented, text backcolour
765*b1cdbd2cSJim Jagielski         {0x303C, 1, L_FIX}, // undocumented, sep
766*b1cdbd2cSJim Jagielski         {0x245B, 1, L_FIX}, // undocumented, para autobefore
767*b1cdbd2cSJim Jagielski         {0x245C, 1, L_FIX}, // undocumented, para autoafter
768*b1cdbd2cSJim Jagielski         // undocumented, don't add space between para of the same style
769*b1cdbd2cSJim Jagielski         {0x246D, 1, L_FIX}
770*b1cdbd2cSJim Jagielski     };
771*b1cdbd2cSJim Jagielski 
772*b1cdbd2cSJim Jagielski     static wwSprmSearcher aSprmSrch(aSprms, sizeof(aSprms) / sizeof(aSprms[0]));
773*b1cdbd2cSJim Jagielski     return &aSprmSrch;
774*b1cdbd2cSJim Jagielski };
775*b1cdbd2cSJim Jagielski 
wwSprmParser(ww::WordVersion eVersion)776*b1cdbd2cSJim Jagielski wwSprmParser::wwSprmParser(ww::WordVersion eVersion) : meVersion(eVersion)
777*b1cdbd2cSJim Jagielski {
778*b1cdbd2cSJim Jagielski     ASSERT((meVersion >= ww::eWW2 && meVersion <= ww::eWW8),
779*b1cdbd2cSJim Jagielski         "Impossible value for version");
780*b1cdbd2cSJim Jagielski 
781*b1cdbd2cSJim Jagielski     mnDelta = (ww::IsSevenMinus(meVersion)) ? 0 : 1;
782*b1cdbd2cSJim Jagielski 
783*b1cdbd2cSJim Jagielski     if (meVersion <= ww::eWW2)
784*b1cdbd2cSJim Jagielski         mpKnownSprms = GetWW2SprmSearcher();
785*b1cdbd2cSJim Jagielski     else if (meVersion < ww::eWW8)
786*b1cdbd2cSJim Jagielski         mpKnownSprms = GetWW6SprmSearcher();
787*b1cdbd2cSJim Jagielski     else
788*b1cdbd2cSJim Jagielski         mpKnownSprms = GetWW8SprmSearcher();
789*b1cdbd2cSJim Jagielski }
790*b1cdbd2cSJim Jagielski 
GetSprmInfo(sal_uInt16 nId) const791*b1cdbd2cSJim Jagielski SprmInfo wwSprmParser::GetSprmInfo(sal_uInt16 nId) const
792*b1cdbd2cSJim Jagielski {
793*b1cdbd2cSJim Jagielski     // Find sprm
794*b1cdbd2cSJim Jagielski     SprmInfo aSrch={0,0,0};
795*b1cdbd2cSJim Jagielski     aSrch.nId = nId;
796*b1cdbd2cSJim Jagielski     const SprmInfo* pFound = mpKnownSprms->search(aSrch);
797*b1cdbd2cSJim Jagielski     if (pFound == 0)
798*b1cdbd2cSJim Jagielski     {
799*b1cdbd2cSJim Jagielski         ASSERT(ww::IsEightPlus(meVersion),
800*b1cdbd2cSJim Jagielski            "Unknown ww7- sprm, dangerous, report to development");
801*b1cdbd2cSJim Jagielski 
802*b1cdbd2cSJim Jagielski         aSrch.nId = 0;
803*b1cdbd2cSJim Jagielski         aSrch.nLen = 0;
804*b1cdbd2cSJim Jagielski         //All the unknown ww7 sprms appear to be variable (which makes sense)
805*b1cdbd2cSJim Jagielski         aSrch.nVari = L_VAR;
806*b1cdbd2cSJim Jagielski 
807*b1cdbd2cSJim Jagielski         if (ww::IsEightPlus(meVersion)) //We can recover perfectly in this case
808*b1cdbd2cSJim Jagielski         {
809*b1cdbd2cSJim Jagielski             aSrch.nVari = L_FIX;
810*b1cdbd2cSJim Jagielski             switch (nId >> 13)
811*b1cdbd2cSJim Jagielski             {
812*b1cdbd2cSJim Jagielski                 case 0:
813*b1cdbd2cSJim Jagielski                 case 1:
814*b1cdbd2cSJim Jagielski                     aSrch.nLen = 1;
815*b1cdbd2cSJim Jagielski                     break;
816*b1cdbd2cSJim Jagielski                 case 2:
817*b1cdbd2cSJim Jagielski                     aSrch.nLen = 2;
818*b1cdbd2cSJim Jagielski                     break;
819*b1cdbd2cSJim Jagielski                 case 3:
820*b1cdbd2cSJim Jagielski                     aSrch.nLen = 4;
821*b1cdbd2cSJim Jagielski                     break;
822*b1cdbd2cSJim Jagielski                 case 4:
823*b1cdbd2cSJim Jagielski                 case 5:
824*b1cdbd2cSJim Jagielski                     aSrch.nLen = 2;
825*b1cdbd2cSJim Jagielski                     break;
826*b1cdbd2cSJim Jagielski                 case 6:
827*b1cdbd2cSJim Jagielski                     aSrch.nLen = 0;
828*b1cdbd2cSJim Jagielski                     aSrch.nVari =  L_VAR;
829*b1cdbd2cSJim Jagielski                     break;
830*b1cdbd2cSJim Jagielski                 case 7:
831*b1cdbd2cSJim Jagielski                 default:
832*b1cdbd2cSJim Jagielski                     aSrch.nLen = 3;
833*b1cdbd2cSJim Jagielski                     break;
834*b1cdbd2cSJim Jagielski             }
835*b1cdbd2cSJim Jagielski         }
836*b1cdbd2cSJim Jagielski 
837*b1cdbd2cSJim Jagielski         pFound = &aSrch;
838*b1cdbd2cSJim Jagielski     }
839*b1cdbd2cSJim Jagielski     return *pFound;
840*b1cdbd2cSJim Jagielski }
841*b1cdbd2cSJim Jagielski 
842*b1cdbd2cSJim Jagielski //-end
843*b1cdbd2cSJim Jagielski 
Get_Byte(sal_uInt8 * & p)844*b1cdbd2cSJim Jagielski inline sal_uInt8 Get_Byte( sal_uInt8 *& p )
845*b1cdbd2cSJim Jagielski {
846*b1cdbd2cSJim Jagielski     sal_uInt8 n = SVBT8ToByte( *(SVBT8*)p );
847*b1cdbd2cSJim Jagielski     p += 1;
848*b1cdbd2cSJim Jagielski     return n;
849*b1cdbd2cSJim Jagielski }
850*b1cdbd2cSJim Jagielski 
Get_UShort(sal_uInt8 * & p)851*b1cdbd2cSJim Jagielski inline sal_uInt16 Get_UShort( sal_uInt8 *& p )
852*b1cdbd2cSJim Jagielski {
853*b1cdbd2cSJim Jagielski     sal_uInt16 n = SVBT16ToShort( *(SVBT16*)p );
854*b1cdbd2cSJim Jagielski     p += 2;
855*b1cdbd2cSJim Jagielski     return n;
856*b1cdbd2cSJim Jagielski }
857*b1cdbd2cSJim Jagielski 
Get_Short(sal_uInt8 * & p)858*b1cdbd2cSJim Jagielski inline short Get_Short( sal_uInt8 *& p )
859*b1cdbd2cSJim Jagielski {
860*b1cdbd2cSJim Jagielski     return Get_UShort(p);
861*b1cdbd2cSJim Jagielski }
862*b1cdbd2cSJim Jagielski 
Get_ULong(sal_uInt8 * & p)863*b1cdbd2cSJim Jagielski inline sal_uLong Get_ULong( sal_uInt8 *& p )
864*b1cdbd2cSJim Jagielski {
865*b1cdbd2cSJim Jagielski     sal_uLong n = SVBT32ToUInt32( *(SVBT32*)p );
866*b1cdbd2cSJim Jagielski     p += 4;
867*b1cdbd2cSJim Jagielski     return n;
868*b1cdbd2cSJim Jagielski }
869*b1cdbd2cSJim Jagielski 
Get_Long(sal_uInt8 * & p)870*b1cdbd2cSJim Jagielski inline long Get_Long( sal_uInt8 *& p )
871*b1cdbd2cSJim Jagielski {
872*b1cdbd2cSJim Jagielski     return Get_ULong(p);
873*b1cdbd2cSJim Jagielski }
874*b1cdbd2cSJim Jagielski 
WW8SprmIter(const sal_uInt8 * pSprms_,long nLen_,const wwSprmParser & rParser)875*b1cdbd2cSJim Jagielski WW8SprmIter::WW8SprmIter(const sal_uInt8* pSprms_, long nLen_,
876*b1cdbd2cSJim Jagielski     const wwSprmParser &rParser)
877*b1cdbd2cSJim Jagielski     :  mrSprmParser(rParser), pSprms( pSprms_), nRemLen( nLen_)
878*b1cdbd2cSJim Jagielski {
879*b1cdbd2cSJim Jagielski     UpdateMyMembers();
880*b1cdbd2cSJim Jagielski }
881*b1cdbd2cSJim Jagielski 
SetSprms(const sal_uInt8 * pSprms_,long nLen_)882*b1cdbd2cSJim Jagielski void WW8SprmIter::SetSprms(const sal_uInt8* pSprms_, long nLen_)
883*b1cdbd2cSJim Jagielski {
884*b1cdbd2cSJim Jagielski     pSprms = pSprms_;
885*b1cdbd2cSJim Jagielski     nRemLen = nLen_;
886*b1cdbd2cSJim Jagielski     UpdateMyMembers();
887*b1cdbd2cSJim Jagielski }
888*b1cdbd2cSJim Jagielski 
operator ++(int)889*b1cdbd2cSJim Jagielski const sal_uInt8* WW8SprmIter::operator ++( int )
890*b1cdbd2cSJim Jagielski {
891*b1cdbd2cSJim Jagielski     if (nRemLen > 0 )
892*b1cdbd2cSJim Jagielski     {
893*b1cdbd2cSJim Jagielski         if( nRemLen >= nAktSize )
894*b1cdbd2cSJim Jagielski         {
895*b1cdbd2cSJim Jagielski             pSprms += nAktSize;
896*b1cdbd2cSJim Jagielski             nRemLen -= nAktSize;
897*b1cdbd2cSJim Jagielski             UpdateMyMembers();
898*b1cdbd2cSJim Jagielski         }
899*b1cdbd2cSJim Jagielski         else
900*b1cdbd2cSJim Jagielski         {
901*b1cdbd2cSJim Jagielski             throw( ::std::exception() );
902*b1cdbd2cSJim Jagielski         }
903*b1cdbd2cSJim Jagielski     }
904*b1cdbd2cSJim Jagielski     return pSprms;
905*b1cdbd2cSJim Jagielski }
906*b1cdbd2cSJim Jagielski 
UpdateMyMembers()907*b1cdbd2cSJim Jagielski void WW8SprmIter::UpdateMyMembers()
908*b1cdbd2cSJim Jagielski {
909*b1cdbd2cSJim Jagielski     if (pSprms && nRemLen > (mrSprmParser.getVersion()?1:0)) //see #125180#
910*b1cdbd2cSJim Jagielski     {
911*b1cdbd2cSJim Jagielski         nAktId = mrSprmParser.GetSprmId(pSprms);
912*b1cdbd2cSJim Jagielski         pAktParams = pSprms + mrSprmParser.DistanceToData(nAktId);
913*b1cdbd2cSJim Jagielski         nAktSize = mrSprmParser.GetSprmSize(nAktId, pSprms);
914*b1cdbd2cSJim Jagielski     }
915*b1cdbd2cSJim Jagielski     else
916*b1cdbd2cSJim Jagielski     {
917*b1cdbd2cSJim Jagielski         nAktId = 0;
918*b1cdbd2cSJim Jagielski         pAktParams = 0;
919*b1cdbd2cSJim Jagielski         nAktSize = 0;
920*b1cdbd2cSJim Jagielski         nRemLen = 0;
921*b1cdbd2cSJim Jagielski     }
922*b1cdbd2cSJim Jagielski }
923*b1cdbd2cSJim Jagielski 
FindSprm(sal_uInt16 nId)924*b1cdbd2cSJim Jagielski const sal_uInt8* WW8SprmIter::FindSprm(sal_uInt16 nId)
925*b1cdbd2cSJim Jagielski {
926*b1cdbd2cSJim Jagielski     while(GetSprms())
927*b1cdbd2cSJim Jagielski     {
928*b1cdbd2cSJim Jagielski         if( GetAktId() == nId )
929*b1cdbd2cSJim Jagielski             return GetAktParams();              // SPRM found!
930*b1cdbd2cSJim Jagielski         operator ++(0);
931*b1cdbd2cSJim Jagielski     }
932*b1cdbd2cSJim Jagielski 
933*b1cdbd2cSJim Jagielski     return 0;                                   // SPRM _not_ found
934*b1cdbd2cSJim Jagielski }
935*b1cdbd2cSJim Jagielski 
936*b1cdbd2cSJim Jagielski namespace {
IsPLCFPosArrayValid(const sal_Int32 * pPLCFPosArray,const sal_Int32 nMaxIndex)937*b1cdbd2cSJim Jagielski     bool IsPLCFPosArrayValid(
938*b1cdbd2cSJim Jagielski         const sal_Int32* pPLCFPosArray,
939*b1cdbd2cSJim Jagielski         const sal_Int32 nMaxIndex )
940*b1cdbd2cSJim Jagielski     {
941*b1cdbd2cSJim Jagielski         bool bIsValid = true;
942*b1cdbd2cSJim Jagielski 
943*b1cdbd2cSJim Jagielski         //WW8_CP nValue = 0;
944*b1cdbd2cSJim Jagielski         for ( sal_Int32 i = 0; i <= nMaxIndex; ++i )
945*b1cdbd2cSJim Jagielski         {
946*b1cdbd2cSJim Jagielski             if ( pPLCFPosArray[i] < 0
947*b1cdbd2cSJim Jagielski                  && !( i == nMaxIndex-1 && pPLCFPosArray[i] == -63488 )   // pPLCFPosArray[nMaxIndex-1]==-63488 (0xffff0800) seems to be allowed
948*b1cdbd2cSJim Jagielski                  && !( i == nMaxIndex-1 && pPLCFPosArray[i] == -65536 )   // pPLCFPosArray[nMaxIndex-1]==-65536 (0xffff0000) seems to be allowed
949*b1cdbd2cSJim Jagielski                  && !( i == nMaxIndex-1 && pPLCFPosArray[i] == -61440 ) ) // pPLCFPosArray[nMaxIndex-1]==-61440 (0xffff112c) seems to be allowed
950*b1cdbd2cSJim Jagielski             {
951*b1cdbd2cSJim Jagielski                 bIsValid = false;
952*b1cdbd2cSJim Jagielski                 break;
953*b1cdbd2cSJim Jagielski             }
954*b1cdbd2cSJim Jagielski             //nValue = pPLCFPosArray[i];
955*b1cdbd2cSJim Jagielski         }
956*b1cdbd2cSJim Jagielski 
957*b1cdbd2cSJim Jagielski         return bIsValid;
958*b1cdbd2cSJim Jagielski     }
959*b1cdbd2cSJim Jagielski }
960*b1cdbd2cSJim Jagielski 
961*b1cdbd2cSJim Jagielski //-----------------------------------------
962*b1cdbd2cSJim Jagielski //      temporaerer Test
963*b1cdbd2cSJim Jagielski //-----------------------------------------
964*b1cdbd2cSJim Jagielski // WW8PLCFx_PCDAttrs halten sich an WW8PLCF_Pcd fest und besitzen deshalb keine
965*b1cdbd2cSJim Jagielski // eigenen Iteratoren. Alle sich auf Iteratoren beziehenden Methoden
966*b1cdbd2cSJim Jagielski // sind deshalb Dummies.
967*b1cdbd2cSJim Jagielski 
WW8PLCFx_PCDAttrs(ww::WordVersion eVersion,WW8PLCFx_PCD * pPLCFx_PCD,const WW8ScannerBase * pBase)968*b1cdbd2cSJim Jagielski WW8PLCFx_PCDAttrs::WW8PLCFx_PCDAttrs(ww::WordVersion eVersion,
969*b1cdbd2cSJim Jagielski     WW8PLCFx_PCD* pPLCFx_PCD, const WW8ScannerBase* pBase)
970*b1cdbd2cSJim Jagielski     : WW8PLCFx(eVersion, true), pPcdI(pPLCFx_PCD->GetPLCFIter()),
971*b1cdbd2cSJim Jagielski     pPcd(pPLCFx_PCD), pGrpprls(pBase->pPieceGrpprls),
972*b1cdbd2cSJim Jagielski     nGrpprls(pBase->nPieceGrpprls)
973*b1cdbd2cSJim Jagielski {
974*b1cdbd2cSJim Jagielski }
975*b1cdbd2cSJim Jagielski 
GetIdx() const976*b1cdbd2cSJim Jagielski sal_uLong WW8PLCFx_PCDAttrs::GetIdx() const
977*b1cdbd2cSJim Jagielski {
978*b1cdbd2cSJim Jagielski     return 0;
979*b1cdbd2cSJim Jagielski }
980*b1cdbd2cSJim Jagielski 
SetIdx(sal_uLong)981*b1cdbd2cSJim Jagielski void WW8PLCFx_PCDAttrs::SetIdx( sal_uLong )
982*b1cdbd2cSJim Jagielski {
983*b1cdbd2cSJim Jagielski }
984*b1cdbd2cSJim Jagielski 
SeekPos(WW8_CP)985*b1cdbd2cSJim Jagielski bool WW8PLCFx_PCDAttrs::SeekPos(WW8_CP )
986*b1cdbd2cSJim Jagielski {
987*b1cdbd2cSJim Jagielski     return true;
988*b1cdbd2cSJim Jagielski }
989*b1cdbd2cSJim Jagielski 
operator ++(int)990*b1cdbd2cSJim Jagielski WW8PLCFx& WW8PLCFx_PCDAttrs::operator ++( int )
991*b1cdbd2cSJim Jagielski {
992*b1cdbd2cSJim Jagielski     return *this;
993*b1cdbd2cSJim Jagielski }
994*b1cdbd2cSJim Jagielski 
Where()995*b1cdbd2cSJim Jagielski WW8_CP WW8PLCFx_PCDAttrs::Where()
996*b1cdbd2cSJim Jagielski {
997*b1cdbd2cSJim Jagielski     return ( pPcd ) ? pPcd->Where() : WW8_CP_MAX;
998*b1cdbd2cSJim Jagielski }
999*b1cdbd2cSJim Jagielski 
GetSprms(WW8PLCFxDesc * p)1000*b1cdbd2cSJim Jagielski void WW8PLCFx_PCDAttrs::GetSprms(WW8PLCFxDesc* p)
1001*b1cdbd2cSJim Jagielski {
1002*b1cdbd2cSJim Jagielski     void* pData;
1003*b1cdbd2cSJim Jagielski 
1004*b1cdbd2cSJim Jagielski     p->bRealLineEnd = false;
1005*b1cdbd2cSJim Jagielski     if ( !pPcdI || !pPcdI->Get(p->nStartPos, p->nEndPos, pData) )
1006*b1cdbd2cSJim Jagielski     {
1007*b1cdbd2cSJim Jagielski         // PLCF fully processed
1008*b1cdbd2cSJim Jagielski         p->nStartPos = p->nEndPos = WW8_CP_MAX;
1009*b1cdbd2cSJim Jagielski         p->pMemPos = 0;
1010*b1cdbd2cSJim Jagielski         p->nSprmsLen = 0;
1011*b1cdbd2cSJim Jagielski         return;
1012*b1cdbd2cSJim Jagielski     }
1013*b1cdbd2cSJim Jagielski 
1014*b1cdbd2cSJim Jagielski     sal_uInt16 nPrm = SVBT16ToShort( ( (WW8_PCD*)pData )->prm );
1015*b1cdbd2cSJim Jagielski     if ( nPrm & 1 )
1016*b1cdbd2cSJim Jagielski     {
1017*b1cdbd2cSJim Jagielski         // PRM Variant 2
1018*b1cdbd2cSJim Jagielski         sal_uInt16 nSprmIdx = nPrm >> 1;
1019*b1cdbd2cSJim Jagielski 
1020*b1cdbd2cSJim Jagielski         if( nSprmIdx >= nGrpprls )
1021*b1cdbd2cSJim Jagielski         {
1022*b1cdbd2cSJim Jagielski             // Invalid Index
1023*b1cdbd2cSJim Jagielski             p->nStartPos = p->nEndPos = WW8_CP_MAX;
1024*b1cdbd2cSJim Jagielski             p->pMemPos = 0;
1025*b1cdbd2cSJim Jagielski             p->nSprmsLen = 0;
1026*b1cdbd2cSJim Jagielski             return;
1027*b1cdbd2cSJim Jagielski         }
1028*b1cdbd2cSJim Jagielski         const sal_uInt8* pSprms = pGrpprls[ nSprmIdx ];
1029*b1cdbd2cSJim Jagielski 
1030*b1cdbd2cSJim Jagielski         p->nSprmsLen = SVBT16ToShort( pSprms ); // Length
1031*b1cdbd2cSJim Jagielski         pSprms += 2;
1032*b1cdbd2cSJim Jagielski         p->pMemPos = pSprms;                    // Position
1033*b1cdbd2cSJim Jagielski     }
1034*b1cdbd2cSJim Jagielski     else
1035*b1cdbd2cSJim Jagielski     {
1036*b1cdbd2cSJim Jagielski         // PRM Variante 1:  Sprm wird direkt in Member-Var abgelegt
1037*b1cdbd2cSJim Jagielski         /*
1038*b1cdbd2cSJim Jagielski             Dies sind die Attr, die in der Piece-Table stehen, statt im Text !
1039*b1cdbd2cSJim Jagielski         */
1040*b1cdbd2cSJim Jagielski 
1041*b1cdbd2cSJim Jagielski         if (IsSevenMinus(GetFIBVersion()))
1042*b1cdbd2cSJim Jagielski         {
1043*b1cdbd2cSJim Jagielski             aShortSprm[0] = (sal_uInt8)( ( nPrm & 0xfe) >> 1 );
1044*b1cdbd2cSJim Jagielski             aShortSprm[1] = (sal_uInt8)(   nPrm         >> 8 );
1045*b1cdbd2cSJim Jagielski             p->nSprmsLen = ( nPrm ) ? 2 : 0;        // Laenge
1046*b1cdbd2cSJim Jagielski 
1047*b1cdbd2cSJim Jagielski             // store Postion of internal mini storage in Data Pointer
1048*b1cdbd2cSJim Jagielski             p->pMemPos = aShortSprm;
1049*b1cdbd2cSJim Jagielski         }
1050*b1cdbd2cSJim Jagielski         else
1051*b1cdbd2cSJim Jagielski         {
1052*b1cdbd2cSJim Jagielski             p->pMemPos = 0;
1053*b1cdbd2cSJim Jagielski             p->nSprmsLen = 0;
1054*b1cdbd2cSJim Jagielski             sal_uInt8 nSprmListIdx = (sal_uInt8)((nPrm & 0xfe) >> 1);
1055*b1cdbd2cSJim Jagielski             if( nSprmListIdx )
1056*b1cdbd2cSJim Jagielski             {
1057*b1cdbd2cSJim Jagielski                 // process Sprm Id Matching as explained in MS Doku
1058*b1cdbd2cSJim Jagielski                 //
1059*b1cdbd2cSJim Jagielski                 // ''Property Modifier(variant 1) (PRM)''
1060*b1cdbd2cSJim Jagielski                 // see file: s62f39.htm
1061*b1cdbd2cSJim Jagielski                 //
1062*b1cdbd2cSJim Jagielski                 // Since isprm is 7 bits, rgsprmPrm can hold 0x80 entries.
1063*b1cdbd2cSJim Jagielski                 static const sal_uInt16 aSprmId[0x80] =
1064*b1cdbd2cSJim Jagielski                 {
1065*b1cdbd2cSJim Jagielski                     // sprmNoop, sprmNoop, sprmNoop, sprmNoop
1066*b1cdbd2cSJim Jagielski                     0x0000,0x0000,0x0000,0x0000,
1067*b1cdbd2cSJim Jagielski                     // sprmPIncLvl, sprmPJc, sprmPFSideBySide, sprmPFKeep
1068*b1cdbd2cSJim Jagielski                     0x2402,0x2403,0x2404,0x2405,
1069*b1cdbd2cSJim Jagielski                     // sprmPFKeepFollow, sprmPFPageBreakBefore, sprmPBrcl,
1070*b1cdbd2cSJim Jagielski                     // sprmPBrcp
1071*b1cdbd2cSJim Jagielski                     0x2406,0x2407,0x2408,0x2409,
1072*b1cdbd2cSJim Jagielski                     // sprmPIlvl, sprmNoop, sprmPFNoLineNumb, sprmNoop
1073*b1cdbd2cSJim Jagielski                     0x260A,0x0000,0x240C,0x0000,
1074*b1cdbd2cSJim Jagielski                     // sprmNoop, sprmNoop, sprmNoop, sprmNoop
1075*b1cdbd2cSJim Jagielski                     0x0000,0x0000,0x0000,0x0000,
1076*b1cdbd2cSJim Jagielski                     // sprmNoop, sprmNoop, sprmNoop, sprmNoop
1077*b1cdbd2cSJim Jagielski                     0x0000,0x0000,0x0000,0x0000,
1078*b1cdbd2cSJim Jagielski                     // sprmPFInTable, sprmPFTtp, sprmNoop, sprmNoop
1079*b1cdbd2cSJim Jagielski                     0x2416,0x2417,0x0000,0x0000,
1080*b1cdbd2cSJim Jagielski                     // sprmNoop, sprmPPc,  sprmNoop, sprmNoop
1081*b1cdbd2cSJim Jagielski                     0x0000,0x261B,0x0000,0x0000,
1082*b1cdbd2cSJim Jagielski                     // sprmNoop, sprmNoop, sprmNoop, sprmNoop
1083*b1cdbd2cSJim Jagielski                     0x0000,0x0000,0x0000,0x0000,
1084*b1cdbd2cSJim Jagielski                     // sprmNoop, sprmPWr,  sprmNoop, sprmNoop
1085*b1cdbd2cSJim Jagielski                     0x0000,0x2423,0x0000,0x0000,
1086*b1cdbd2cSJim Jagielski                     // sprmNoop, sprmNoop, sprmNoop, sprmNoop
1087*b1cdbd2cSJim Jagielski                     0x0000,0x0000,0x0000,0x0000,
1088*b1cdbd2cSJim Jagielski                     // sprmPFNoAutoHyph, sprmNoop, sprmNoop, sprmNoop
1089*b1cdbd2cSJim Jagielski                     0x242A,0x0000,0x0000,0x0000,
1090*b1cdbd2cSJim Jagielski                     // sprmNoop, sprmNoop, sprmPFLocked, sprmPFWidowControl
1091*b1cdbd2cSJim Jagielski                     0x0000,0x0000,0x2430,0x2431,
1092*b1cdbd2cSJim Jagielski                     // sprmNoop, sprmPFKinsoku, sprmPFWordWrap,
1093*b1cdbd2cSJim Jagielski                     // sprmPFOverflowPunct
1094*b1cdbd2cSJim Jagielski                     0x0000,0x2433,0x2434,0x2435,
1095*b1cdbd2cSJim Jagielski                     // sprmPFTopLinePunct, sprmPFAutoSpaceDE,
1096*b1cdbd2cSJim Jagielski                     // sprmPFAutoSpaceDN, sprmNoop
1097*b1cdbd2cSJim Jagielski                     0x2436,0x2437,0x2438,0x0000,
1098*b1cdbd2cSJim Jagielski                     // sprmNoop, sprmPISnapBaseLine, sprmNoop, sprmNoop
1099*b1cdbd2cSJim Jagielski                     0x0000,0x243B,0x000,0x0000,
1100*b1cdbd2cSJim Jagielski                     // sprmNoop, sprmCFStrikeRM, sprmCFRMark, sprmCFFldVanish
1101*b1cdbd2cSJim Jagielski                     0x0000,0x0800,0x0801,0x0802,
1102*b1cdbd2cSJim Jagielski                     // sprmNoop, sprmNoop, sprmNoop, sprmCFData
1103*b1cdbd2cSJim Jagielski                     0x0000,0x0000,0x0000,0x0806,
1104*b1cdbd2cSJim Jagielski                     // sprmNoop, sprmNoop, sprmNoop, sprmCFOle2
1105*b1cdbd2cSJim Jagielski                     0x0000,0x0000,0x0000,0x080A,
1106*b1cdbd2cSJim Jagielski                     // sprmNoop, sprmCHighlight, sprmCFEmboss, sprmCSfxText
1107*b1cdbd2cSJim Jagielski                     0x0000,0x2A0C,0x0858,0x2859,
1108*b1cdbd2cSJim Jagielski                     // sprmNoop, sprmNoop, sprmNoop, sprmCPlain
1109*b1cdbd2cSJim Jagielski                     0x0000,0x0000,0x0000,0x2A33,
1110*b1cdbd2cSJim Jagielski                     // sprmNoop, sprmCFBold, sprmCFItalic, sprmCFStrike
1111*b1cdbd2cSJim Jagielski                     0x0000,0x0835,0x0836,0x0837,
1112*b1cdbd2cSJim Jagielski                     // sprmCFOutline, sprmCFShadow, sprmCFSmallCaps, sprmCFCaps,
1113*b1cdbd2cSJim Jagielski                     0x0838,0x0839,0x083a,0x083b,
1114*b1cdbd2cSJim Jagielski                     // sprmCFVanish, sprmNoop, sprmCKul, sprmNoop,
1115*b1cdbd2cSJim Jagielski                     0x083C,0x0000,0x2A3E,0x0000,
1116*b1cdbd2cSJim Jagielski                     // sprmNoop, sprmNoop, sprmCIco, sprmNoop,
1117*b1cdbd2cSJim Jagielski                     0x0000,0x0000,0x2A42,0x0000,
1118*b1cdbd2cSJim Jagielski                     // sprmCHpsInc, sprmNoop, sprmCHpsPosAdj, sprmNoop,
1119*b1cdbd2cSJim Jagielski                     0x2A44,0x0000,0x2A46,0x0000,
1120*b1cdbd2cSJim Jagielski                     // sprmCIss, sprmNoop, sprmNoop, sprmNoop,
1121*b1cdbd2cSJim Jagielski                     0x2A48,0x0000,0x0000,0x0000,
1122*b1cdbd2cSJim Jagielski                     // sprmNoop, sprmNoop, sprmNoop, sprmNoop,
1123*b1cdbd2cSJim Jagielski                     0x0000,0x0000,0x0000,0x0000,
1124*b1cdbd2cSJim Jagielski                     // sprmNoop, sprmNoop, sprmNoop, sprmCFDStrike,
1125*b1cdbd2cSJim Jagielski                     0x0000,0x0000,0x0000,0x2A53,
1126*b1cdbd2cSJim Jagielski                     // sprmCFImprint, sprmCFSpec, sprmCFObj, sprmPicBrcl,
1127*b1cdbd2cSJim Jagielski                     0x0854,0x0855,0x0856,0x2E00,
1128*b1cdbd2cSJim Jagielski                     // sprmPOutLvl, sprmPFBiDi, sprmNoop, sprmNoop,
1129*b1cdbd2cSJim Jagielski                     0x2640,0x2441,0x0000,0x0000,
1130*b1cdbd2cSJim Jagielski                     // sprmNoop, sprmNoop, sprmPPnbrRMarkNot
1131*b1cdbd2cSJim Jagielski                     0x0000,0x0000,0x0000,0x0000
1132*b1cdbd2cSJim Jagielski                 };
1133*b1cdbd2cSJim Jagielski 
1134*b1cdbd2cSJim Jagielski                 // find real Sprm Id:
1135*b1cdbd2cSJim Jagielski                 sal_uInt16 nSprmId = aSprmId[ nSprmListIdx ];
1136*b1cdbd2cSJim Jagielski 
1137*b1cdbd2cSJim Jagielski                 if( nSprmId )
1138*b1cdbd2cSJim Jagielski                 {
1139*b1cdbd2cSJim Jagielski                     // move Sprm Id and Sprm Param to internal mini storage:
1140*b1cdbd2cSJim Jagielski                     aShortSprm[0] = (sal_uInt8)( ( nSprmId & 0x00ff)      );
1141*b1cdbd2cSJim Jagielski                     aShortSprm[1] = (sal_uInt8)( ( nSprmId & 0xff00) >> 8 );
1142*b1cdbd2cSJim Jagielski                     aShortSprm[2] = (sal_uInt8)( nPrm >> 8 );
1143*b1cdbd2cSJim Jagielski 
1144*b1cdbd2cSJim Jagielski                     // store Sprm Length in member:
1145*b1cdbd2cSJim Jagielski                     p->nSprmsLen = ( nPrm ) ? 3 : 0;
1146*b1cdbd2cSJim Jagielski 
1147*b1cdbd2cSJim Jagielski                     // store Postion of internal mini storage in Data Pointer
1148*b1cdbd2cSJim Jagielski                     p->pMemPos = aShortSprm;
1149*b1cdbd2cSJim Jagielski                 }
1150*b1cdbd2cSJim Jagielski             }
1151*b1cdbd2cSJim Jagielski         }
1152*b1cdbd2cSJim Jagielski     }
1153*b1cdbd2cSJim Jagielski }
1154*b1cdbd2cSJim Jagielski 
1155*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
1156*b1cdbd2cSJim Jagielski 
WW8PLCFx_PCD(ww::WordVersion eVersion,WW8PLCFpcd * pPLCFpcd,WW8_CP nStartCp,bool bVer67P)1157*b1cdbd2cSJim Jagielski WW8PLCFx_PCD::WW8PLCFx_PCD(ww::WordVersion eVersion, WW8PLCFpcd* pPLCFpcd,
1158*b1cdbd2cSJim Jagielski     WW8_CP nStartCp, bool bVer67P)
1159*b1cdbd2cSJim Jagielski     : WW8PLCFx(eVersion, false), nClipStart(-1)
1160*b1cdbd2cSJim Jagielski {
1161*b1cdbd2cSJim Jagielski     // eigenen Iterator konstruieren
1162*b1cdbd2cSJim Jagielski     pPcdI = new WW8PLCFpcd_Iter(*pPLCFpcd, nStartCp);
1163*b1cdbd2cSJim Jagielski     bVer67= bVer67P;
1164*b1cdbd2cSJim Jagielski }
1165*b1cdbd2cSJim Jagielski 
~WW8PLCFx_PCD()1166*b1cdbd2cSJim Jagielski WW8PLCFx_PCD::~WW8PLCFx_PCD()
1167*b1cdbd2cSJim Jagielski {
1168*b1cdbd2cSJim Jagielski     // pPcd-Dtor which in called from WW8ScannerBase
1169*b1cdbd2cSJim Jagielski     delete pPcdI;
1170*b1cdbd2cSJim Jagielski }
1171*b1cdbd2cSJim Jagielski 
GetIMax() const1172*b1cdbd2cSJim Jagielski sal_uLong WW8PLCFx_PCD::GetIMax() const
1173*b1cdbd2cSJim Jagielski {
1174*b1cdbd2cSJim Jagielski     return pPcdI ? pPcdI->GetIMax() : 0;
1175*b1cdbd2cSJim Jagielski }
1176*b1cdbd2cSJim Jagielski 
GetIdx() const1177*b1cdbd2cSJim Jagielski sal_uLong WW8PLCFx_PCD::GetIdx() const
1178*b1cdbd2cSJim Jagielski {
1179*b1cdbd2cSJim Jagielski     return pPcdI ? pPcdI->GetIdx() : 0;
1180*b1cdbd2cSJim Jagielski }
1181*b1cdbd2cSJim Jagielski 
SetIdx(sal_uLong nIdx)1182*b1cdbd2cSJim Jagielski void WW8PLCFx_PCD::SetIdx( sal_uLong nIdx )
1183*b1cdbd2cSJim Jagielski {
1184*b1cdbd2cSJim Jagielski     if (pPcdI)
1185*b1cdbd2cSJim Jagielski         pPcdI->SetIdx( nIdx );
1186*b1cdbd2cSJim Jagielski }
1187*b1cdbd2cSJim Jagielski 
SeekPos(WW8_CP nCpPos)1188*b1cdbd2cSJim Jagielski bool WW8PLCFx_PCD::SeekPos(WW8_CP nCpPos)
1189*b1cdbd2cSJim Jagielski {
1190*b1cdbd2cSJim Jagielski     return pPcdI ? pPcdI->SeekPos( nCpPos ) : false;
1191*b1cdbd2cSJim Jagielski }
1192*b1cdbd2cSJim Jagielski 
Where()1193*b1cdbd2cSJim Jagielski WW8_CP WW8PLCFx_PCD::Where()
1194*b1cdbd2cSJim Jagielski {
1195*b1cdbd2cSJim Jagielski     return pPcdI ? pPcdI->Where() : WW8_CP_MAX;
1196*b1cdbd2cSJim Jagielski }
1197*b1cdbd2cSJim Jagielski 
GetNoSprms(WW8_CP & rStart,WW8_CP & rEnd,sal_Int32 & rLen)1198*b1cdbd2cSJim Jagielski long WW8PLCFx_PCD::GetNoSprms( WW8_CP& rStart, WW8_CP& rEnd, sal_Int32& rLen )
1199*b1cdbd2cSJim Jagielski {
1200*b1cdbd2cSJim Jagielski     void* pData;
1201*b1cdbd2cSJim Jagielski     rLen = 0;
1202*b1cdbd2cSJim Jagielski 
1203*b1cdbd2cSJim Jagielski     if ( !pPcdI || !pPcdI->Get(rStart, rEnd, pData) )
1204*b1cdbd2cSJim Jagielski     {
1205*b1cdbd2cSJim Jagielski         rStart = rEnd = WW8_CP_MAX;
1206*b1cdbd2cSJim Jagielski         return -1;
1207*b1cdbd2cSJim Jagielski     }
1208*b1cdbd2cSJim Jagielski     return pPcdI->GetIdx();
1209*b1cdbd2cSJim Jagielski }
1210*b1cdbd2cSJim Jagielski 
operator ++(int)1211*b1cdbd2cSJim Jagielski WW8PLCFx& WW8PLCFx_PCD::operator ++( int )
1212*b1cdbd2cSJim Jagielski {
1213*b1cdbd2cSJim Jagielski     if (pPcdI)
1214*b1cdbd2cSJim Jagielski         (*pPcdI)++;
1215*b1cdbd2cSJim Jagielski     else {
1216*b1cdbd2cSJim Jagielski         ASSERT( !this, "pPcdI fehlt");
1217*b1cdbd2cSJim Jagielski     }
1218*b1cdbd2cSJim Jagielski     return *this;
1219*b1cdbd2cSJim Jagielski }
1220*b1cdbd2cSJim Jagielski 
AktPieceStartCp2Fc(WW8_CP nCp)1221*b1cdbd2cSJim Jagielski WW8_FC WW8PLCFx_PCD::AktPieceStartCp2Fc( WW8_CP nCp )
1222*b1cdbd2cSJim Jagielski {
1223*b1cdbd2cSJim Jagielski     WW8_CP nCpStart, nCpEnd;
1224*b1cdbd2cSJim Jagielski     void* pData;
1225*b1cdbd2cSJim Jagielski 
1226*b1cdbd2cSJim Jagielski     if ( !pPcdI->Get(nCpStart, nCpEnd, pData) )
1227*b1cdbd2cSJim Jagielski     {
1228*b1cdbd2cSJim Jagielski         ASSERT( !this, "AktPieceStartCp2Fc() with false Cp found (1)" );
1229*b1cdbd2cSJim Jagielski         return WW8_FC_MAX;
1230*b1cdbd2cSJim Jagielski     }
1231*b1cdbd2cSJim Jagielski 
1232*b1cdbd2cSJim Jagielski     ASSERT( nCp >= nCpStart && nCp < nCpEnd,
1233*b1cdbd2cSJim Jagielski         "AktPieceCp2Fc() with false Cp found (2)" );
1234*b1cdbd2cSJim Jagielski 
1235*b1cdbd2cSJim Jagielski     if( nCp < nCpStart )
1236*b1cdbd2cSJim Jagielski         nCp = nCpStart;
1237*b1cdbd2cSJim Jagielski     if( nCp >= nCpEnd )
1238*b1cdbd2cSJim Jagielski         nCp = nCpEnd - 1;
1239*b1cdbd2cSJim Jagielski 
1240*b1cdbd2cSJim Jagielski     bool bIsUnicode = false;
1241*b1cdbd2cSJim Jagielski     WW8_FC nFC = SVBT32ToUInt32( ((WW8_PCD*)pData)->fc );
1242*b1cdbd2cSJim Jagielski     if( !bVer67 )
1243*b1cdbd2cSJim Jagielski         nFC = WW8PLCFx_PCD::TransformPieceAddress( nFC, bIsUnicode );
1244*b1cdbd2cSJim Jagielski 
1245*b1cdbd2cSJim Jagielski     return nFC + (nCp - nCpStart) * (bIsUnicode ? 2 : 1);
1246*b1cdbd2cSJim Jagielski }
1247*b1cdbd2cSJim Jagielski 
1248*b1cdbd2cSJim Jagielski 
AktPieceFc2Cp(WW8_CP & rStartPos,WW8_CP & rEndPos,const WW8ScannerBase * pSBase)1249*b1cdbd2cSJim Jagielski void WW8PLCFx_PCD::AktPieceFc2Cp( WW8_CP& rStartPos, WW8_CP& rEndPos,
1250*b1cdbd2cSJim Jagielski     const WW8ScannerBase *pSBase )
1251*b1cdbd2cSJim Jagielski {
1252*b1cdbd2cSJim Jagielski     //No point going anywhere with this
1253*b1cdbd2cSJim Jagielski     if ((rStartPos == WW8_CP_MAX) && (rEndPos == WW8_CP_MAX))
1254*b1cdbd2cSJim Jagielski         return;
1255*b1cdbd2cSJim Jagielski 
1256*b1cdbd2cSJim Jagielski     rStartPos = pSBase->WW8Fc2Cp( rStartPos );
1257*b1cdbd2cSJim Jagielski     rEndPos = pSBase->WW8Fc2Cp( rEndPos );
1258*b1cdbd2cSJim Jagielski }
1259*b1cdbd2cSJim Jagielski 
AktPieceStartFc2Cp(WW8_FC nStartPos)1260*b1cdbd2cSJim Jagielski WW8_CP WW8PLCFx_PCD::AktPieceStartFc2Cp( WW8_FC nStartPos )
1261*b1cdbd2cSJim Jagielski {
1262*b1cdbd2cSJim Jagielski     WW8_CP nCpStart, nCpEnd;
1263*b1cdbd2cSJim Jagielski     void* pData;
1264*b1cdbd2cSJim Jagielski     if ( !pPcdI->Get( nCpStart, nCpEnd, pData ) )
1265*b1cdbd2cSJim Jagielski     {
1266*b1cdbd2cSJim Jagielski         ASSERT( !this, "AktPieceStartFc2Cp() - Fehler" );
1267*b1cdbd2cSJim Jagielski         return WW8_CP_MAX;
1268*b1cdbd2cSJim Jagielski     }
1269*b1cdbd2cSJim Jagielski     bool bIsUnicode = false;
1270*b1cdbd2cSJim Jagielski     sal_Int32 nFcStart  = SVBT32ToUInt32( ((WW8_PCD*)pData)->fc );
1271*b1cdbd2cSJim Jagielski     if( !bVer67 )
1272*b1cdbd2cSJim Jagielski         nFcStart = WW8PLCFx_PCD::TransformPieceAddress( nFcStart, bIsUnicode );
1273*b1cdbd2cSJim Jagielski 
1274*b1cdbd2cSJim Jagielski     sal_Int32 nUnicodeFactor = bIsUnicode ? 2 : 1;
1275*b1cdbd2cSJim Jagielski 
1276*b1cdbd2cSJim Jagielski     if( nStartPos < nFcStart )
1277*b1cdbd2cSJim Jagielski         nStartPos = nFcStart;
1278*b1cdbd2cSJim Jagielski 
1279*b1cdbd2cSJim Jagielski     if( nStartPos >= nFcStart + (nCpEnd - nCpStart)     * nUnicodeFactor )
1280*b1cdbd2cSJim Jagielski         nStartPos  = nFcStart + (nCpEnd - nCpStart - 1) * nUnicodeFactor;
1281*b1cdbd2cSJim Jagielski 
1282*b1cdbd2cSJim Jagielski     return nCpStart + (nStartPos - nFcStart) / nUnicodeFactor;
1283*b1cdbd2cSJim Jagielski }
1284*b1cdbd2cSJim Jagielski 
1285*b1cdbd2cSJim Jagielski //-----------------------------------------
1286*b1cdbd2cSJim Jagielski //      Hilfsroutinen fuer alle
1287*b1cdbd2cSJim Jagielski //-----------------------------------------
1288*b1cdbd2cSJim Jagielski 
DetermineBorderProperties(bool bVer67,short * pSpace,sal_uInt8 * pCol,short * pIdx) const1289*b1cdbd2cSJim Jagielski short WW8_BRC::DetermineBorderProperties(bool bVer67, short *pSpace,
1290*b1cdbd2cSJim Jagielski     sal_uInt8 *pCol, short *pIdx) const
1291*b1cdbd2cSJim Jagielski {
1292*b1cdbd2cSJim Jagielski     /*
1293*b1cdbd2cSJim Jagielski         Word does not factor the width of the border into the width/height
1294*b1cdbd2cSJim Jagielski         stored in the information for graphic/table/object widths, so we need
1295*b1cdbd2cSJim Jagielski         to figure out this extra width here and utilize the returned size in
1296*b1cdbd2cSJim Jagielski         our calculations
1297*b1cdbd2cSJim Jagielski     */
1298*b1cdbd2cSJim Jagielski     short nMSTotalWidth;
1299*b1cdbd2cSJim Jagielski     sal_uInt8 nCol;
1300*b1cdbd2cSJim Jagielski     short nIdx,nSpace;
1301*b1cdbd2cSJim Jagielski     if( bVer67 )
1302*b1cdbd2cSJim Jagielski     {
1303*b1cdbd2cSJim Jagielski         sal_uInt16 aBrc1 = SVBT16ToShort(aBits1);
1304*b1cdbd2cSJim Jagielski         nCol = static_cast< sal_uInt8 >((aBrc1 >> 6) & 0x1f);   // aBor.ico
1305*b1cdbd2cSJim Jagielski         nSpace = (aBrc1 & 0xF800) >> 11;
1306*b1cdbd2cSJim Jagielski 
1307*b1cdbd2cSJim Jagielski         nMSTotalWidth = aBrc1 & 0x07;
1308*b1cdbd2cSJim Jagielski         nIdx = (aBrc1 & 0x18) >> 3;
1309*b1cdbd2cSJim Jagielski         //Dashed/Dotted unsets double/thick
1310*b1cdbd2cSJim Jagielski         if (nMSTotalWidth > 5)
1311*b1cdbd2cSJim Jagielski         {
1312*b1cdbd2cSJim Jagielski             nMSTotalWidth=1;
1313*b1cdbd2cSJim Jagielski             nIdx = 1;
1314*b1cdbd2cSJim Jagielski         }
1315*b1cdbd2cSJim Jagielski         nMSTotalWidth = nMSTotalWidth * nIdx * 15;
1316*b1cdbd2cSJim Jagielski     }
1317*b1cdbd2cSJim Jagielski     else
1318*b1cdbd2cSJim Jagielski     {
1319*b1cdbd2cSJim Jagielski         nIdx = aBits1[1];
1320*b1cdbd2cSJim Jagielski         nCol = aBits2[0];   // aBor.ico
1321*b1cdbd2cSJim Jagielski         nSpace = aBits2[1] & 0x1F; //space between line and object
1322*b1cdbd2cSJim Jagielski 
1323*b1cdbd2cSJim Jagielski         //Specification in 8ths of a point, 1 Point = 20 Twips, so by 2.5
1324*b1cdbd2cSJim Jagielski         nMSTotalWidth  = aBits1[ 0 ] * 20 / 8;
1325*b1cdbd2cSJim Jagielski 
1326*b1cdbd2cSJim Jagielski         //Figure out the real size of the border according to word
1327*b1cdbd2cSJim Jagielski         switch (nIdx)
1328*b1cdbd2cSJim Jagielski         {
1329*b1cdbd2cSJim Jagielski             //Note that codes over 25 are undocumented, and I can't create
1330*b1cdbd2cSJim Jagielski             //these 4 here in the wild.
1331*b1cdbd2cSJim Jagielski             default:
1332*b1cdbd2cSJim Jagielski             case 2:
1333*b1cdbd2cSJim Jagielski             case 4:
1334*b1cdbd2cSJim Jagielski             case 5:
1335*b1cdbd2cSJim Jagielski             case 22:
1336*b1cdbd2cSJim Jagielski                 DBG_WARNING("Can't create these from the menus, please report");
1337*b1cdbd2cSJim Jagielski             case 1:
1338*b1cdbd2cSJim Jagielski             case 6:
1339*b1cdbd2cSJim Jagielski             case 7:
1340*b1cdbd2cSJim Jagielski             case 8:
1341*b1cdbd2cSJim Jagielski             case 9:
1342*b1cdbd2cSJim Jagielski             case 23:    //Only 3pt in the menus, but honours the size setting.
1343*b1cdbd2cSJim Jagielski                 break;
1344*b1cdbd2cSJim Jagielski             case 3:
1345*b1cdbd2cSJim Jagielski                 /*
1346*b1cdbd2cSJim Jagielski                 double line is three times the width of an ordinary line,
1347*b1cdbd2cSJim Jagielski                 except for the smallest 1/4 point size which appears to have
1348*b1cdbd2cSJim Jagielski                 exactly the same total border width as a 1/2 point size
1349*b1cdbd2cSJim Jagielski                 ordinary line, i.e. twice the nominal line width
1350*b1cdbd2cSJim Jagielski                 */
1351*b1cdbd2cSJim Jagielski                 nMSTotalWidth = (nMSTotalWidth == 5) ?
1352*b1cdbd2cSJim Jagielski                     nMSTotalWidth*2 : nMSTotalWidth*3;
1353*b1cdbd2cSJim Jagielski                 break;
1354*b1cdbd2cSJim Jagielski             case 10:
1355*b1cdbd2cSJim Jagielski                 /*
1356*b1cdbd2cSJim Jagielski                 triple line is five times the width of an ordinary line,
1357*b1cdbd2cSJim Jagielski                 except that the smallest 1/4 point size appears to have
1358*b1cdbd2cSJim Jagielski                 exactly the same total border width as a 3/4 point size
1359*b1cdbd2cSJim Jagielski                 ordinary line, i.e. three times the nominal line width.  The
1360*b1cdbd2cSJim Jagielski                 second smallest 1/2 point size appears to have exactly the
1361*b1cdbd2cSJim Jagielski                 total border width as a 2 1/4 border, i.e 4.5 times the size.
1362*b1cdbd2cSJim Jagielski                 */
1363*b1cdbd2cSJim Jagielski                 if (nMSTotalWidth == 5)
1364*b1cdbd2cSJim Jagielski                     nMSTotalWidth*=3;
1365*b1cdbd2cSJim Jagielski                 else if (nMSTotalWidth == 10)
1366*b1cdbd2cSJim Jagielski                     nMSTotalWidth = nMSTotalWidth*9/2;
1367*b1cdbd2cSJim Jagielski                 else
1368*b1cdbd2cSJim Jagielski                     nMSTotalWidth*=5;
1369*b1cdbd2cSJim Jagielski                 break;
1370*b1cdbd2cSJim Jagielski             case 11:
1371*b1cdbd2cSJim Jagielski             case 12:
1372*b1cdbd2cSJim Jagielski                 /*
1373*b1cdbd2cSJim Jagielski                 small gap thin thick and thick thin appears to have a 3/4
1374*b1cdbd2cSJim Jagielski                 point line, a 3/4 point gap and a thick line of the specified
1375*b1cdbd2cSJim Jagielski                 width
1376*b1cdbd2cSJim Jagielski                 */
1377*b1cdbd2cSJim Jagielski                 nMSTotalWidth = nMSTotalWidth + 15*2;
1378*b1cdbd2cSJim Jagielski                 break;
1379*b1cdbd2cSJim Jagielski             case 13:
1380*b1cdbd2cSJim Jagielski                 /*
1381*b1cdbd2cSJim Jagielski                 thin thick thin appears to have two outside 3/4 point lines,
1382*b1cdbd2cSJim Jagielski                 two 3/4 point gaps and a thick line of the specified width
1383*b1cdbd2cSJim Jagielski                 */
1384*b1cdbd2cSJim Jagielski                 nMSTotalWidth = nMSTotalWidth + 15*4;
1385*b1cdbd2cSJim Jagielski                 break;
1386*b1cdbd2cSJim Jagielski             case 14:
1387*b1cdbd2cSJim Jagielski             case 15:
1388*b1cdbd2cSJim Jagielski                 /*
1389*b1cdbd2cSJim Jagielski                 medium gap thin thick and thick thin appears to have a line
1390*b1cdbd2cSJim Jagielski                 50% of the thick line, and an equal sized gap and then the
1391*b1cdbd2cSJim Jagielski                 thick line of the specified width. But it appears to only
1392*b1cdbd2cSJim Jagielski                 use one of the existing predefined widths for the thin line,
1393*b1cdbd2cSJim Jagielski                 so the closest smallest existing border to the halved thick
1394*b1cdbd2cSJim Jagielski                 line is used.
1395*b1cdbd2cSJim Jagielski                 */
1396*b1cdbd2cSJim Jagielski                 switch (nMSTotalWidth)
1397*b1cdbd2cSJim Jagielski                 {
1398*b1cdbd2cSJim Jagielski                     case 45:    //2 1/4, closest to half is 1
1399*b1cdbd2cSJim Jagielski                         nMSTotalWidth += 20 + (nMSTotalWidth-1)/2;
1400*b1cdbd2cSJim Jagielski                         break;
1401*b1cdbd2cSJim Jagielski                     case 5:
1402*b1cdbd2cSJim Jagielski                     case 10:
1403*b1cdbd2cSJim Jagielski                         nMSTotalWidth += 5;
1404*b1cdbd2cSJim Jagielski                         break;
1405*b1cdbd2cSJim Jagielski                     case 15:    //3/4, closest to half is 1/4
1406*b1cdbd2cSJim Jagielski                         nMSTotalWidth += 5 + (nMSTotalWidth-1)/2;
1407*b1cdbd2cSJim Jagielski                         break;
1408*b1cdbd2cSJim Jagielski                     default:
1409*b1cdbd2cSJim Jagielski                         nMSTotalWidth*=2;
1410*b1cdbd2cSJim Jagielski                         break;
1411*b1cdbd2cSJim Jagielski                 }
1412*b1cdbd2cSJim Jagielski                 break;
1413*b1cdbd2cSJim Jagielski             case 16:
1414*b1cdbd2cSJim Jagielski                 /*
1415*b1cdbd2cSJim Jagielski                 medium gap thin thick thin appears to have a line
1416*b1cdbd2cSJim Jagielski                 50% of the thick line, and an equal sized gap and then the
1417*b1cdbd2cSJim Jagielski                 thick line of the specified width. But it appears to only
1418*b1cdbd2cSJim Jagielski                 use one of the existing predefined widths for the thin
1419*b1cdbd2cSJim Jagielski                 line, so the closest smallest existing border to the halved
1420*b1cdbd2cSJim Jagielski                 thick line is used. Though some fudging at smaller sizes is
1421*b1cdbd2cSJim Jagielski                 still required.
1422*b1cdbd2cSJim Jagielski                 */
1423*b1cdbd2cSJim Jagielski                 switch (nMSTotalWidth)
1424*b1cdbd2cSJim Jagielski                 {
1425*b1cdbd2cSJim Jagielski                     case 45:    //2 1/4, closest to half is 1
1426*b1cdbd2cSJim Jagielski                         nMSTotalWidth += nMSTotalWidth + 20 * 2;
1427*b1cdbd2cSJim Jagielski                         break;
1428*b1cdbd2cSJim Jagielski                     case 20:
1429*b1cdbd2cSJim Jagielski                     case 15:
1430*b1cdbd2cSJim Jagielski                         nMSTotalWidth += nMSTotalWidth + 7 * 2;
1431*b1cdbd2cSJim Jagielski                         break;
1432*b1cdbd2cSJim Jagielski                     case 10:
1433*b1cdbd2cSJim Jagielski                     case 5:
1434*b1cdbd2cSJim Jagielski                         nMSTotalWidth += 5 + 4;
1435*b1cdbd2cSJim Jagielski                         break;
1436*b1cdbd2cSJim Jagielski                     default:
1437*b1cdbd2cSJim Jagielski                         nMSTotalWidth*=3;
1438*b1cdbd2cSJim Jagielski                         break;
1439*b1cdbd2cSJim Jagielski                 }
1440*b1cdbd2cSJim Jagielski                 break;
1441*b1cdbd2cSJim Jagielski             case 17:
1442*b1cdbd2cSJim Jagielski             case 18:
1443*b1cdbd2cSJim Jagielski                 /*
1444*b1cdbd2cSJim Jagielski                 large gap thin thick and thick thin appears to have a thick
1445*b1cdbd2cSJim Jagielski                 line of 1 1/2 pt and a narrow of 3/4 point, with a distance
1446*b1cdbd2cSJim Jagielski                 between the two of the explicitly set line width
1447*b1cdbd2cSJim Jagielski                 */
1448*b1cdbd2cSJim Jagielski                 nMSTotalWidth+=15+30;
1449*b1cdbd2cSJim Jagielski                 break;
1450*b1cdbd2cSJim Jagielski             case 19:
1451*b1cdbd2cSJim Jagielski                 /*
1452*b1cdbd2cSJim Jagielski                 large gap thin thick thin appears to have a thick line of 1
1453*b1cdbd2cSJim Jagielski                 1/2 pt and two narrows of 3/4 point, with a distance between
1454*b1cdbd2cSJim Jagielski                 the two of the explicitly set line width, though the narrowest
1455*b1cdbd2cSJim Jagielski                 line appears to behave as if it was even smaller
1456*b1cdbd2cSJim Jagielski                 */
1457*b1cdbd2cSJim Jagielski                 if (nMSTotalWidth == 5)
1458*b1cdbd2cSJim Jagielski                     nMSTotalWidth = 3;
1459*b1cdbd2cSJim Jagielski                 nMSTotalWidth = nMSTotalWidth*2 + 15*2 + 30;
1460*b1cdbd2cSJim Jagielski                 break;
1461*b1cdbd2cSJim Jagielski             case 20:
1462*b1cdbd2cSJim Jagielski                 /*
1463*b1cdbd2cSJim Jagielski                 wave, the dimensions appear to be created by the drawing of
1464*b1cdbd2cSJim Jagielski                 the wave, so we have only two possibilites in the menus, 3/4
1465*b1cdbd2cSJim Jagielski                 point is equal to solid 3 point. This calculation seems to
1466*b1cdbd2cSJim Jagielski                 match well to results.
1467*b1cdbd2cSJim Jagielski                 */
1468*b1cdbd2cSJim Jagielski                 nMSTotalWidth +=45;
1469*b1cdbd2cSJim Jagielski                 break;
1470*b1cdbd2cSJim Jagielski             case 21:
1471*b1cdbd2cSJim Jagielski                 /*
1472*b1cdbd2cSJim Jagielski                 double wave, the dimensions appear to be created by the
1473*b1cdbd2cSJim Jagielski                 drawing of the wave, so we have only one possibilites in the
1474*b1cdbd2cSJim Jagielski                 menus, that of 3/4 point is equal to solid 3 point. This
1475*b1cdbd2cSJim Jagielski                 calculation seems to match well to results.
1476*b1cdbd2cSJim Jagielski                 */
1477*b1cdbd2cSJim Jagielski                 nMSTotalWidth += 45*2;
1478*b1cdbd2cSJim Jagielski                 break;
1479*b1cdbd2cSJim Jagielski             case 24:
1480*b1cdbd2cSJim Jagielski             case 25:
1481*b1cdbd2cSJim Jagielski                 /*
1482*b1cdbd2cSJim Jagielski                 emboss and engrave consist of a three lines, the central is of
1483*b1cdbd2cSJim Jagielski                 the explicit point width, the other two (of equal size to each
1484*b1cdbd2cSJim Jagielski                 other are the shadows and are either 3/4 pt of 1 1/2 depending
1485*b1cdbd2cSJim Jagielski                 on if the central line is greater of less than 2 1/4 pt
1486*b1cdbd2cSJim Jagielski                 */
1487*b1cdbd2cSJim Jagielski                 if (nMSTotalWidth <= 45)
1488*b1cdbd2cSJim Jagielski                     nMSTotalWidth += 2*15;
1489*b1cdbd2cSJim Jagielski                 else
1490*b1cdbd2cSJim Jagielski                     nMSTotalWidth += 2*30;
1491*b1cdbd2cSJim Jagielski                 break;
1492*b1cdbd2cSJim Jagielski         }
1493*b1cdbd2cSJim Jagielski     }
1494*b1cdbd2cSJim Jagielski 
1495*b1cdbd2cSJim Jagielski     if (pIdx)
1496*b1cdbd2cSJim Jagielski         *pIdx = nIdx;
1497*b1cdbd2cSJim Jagielski     if (pSpace)
1498*b1cdbd2cSJim Jagielski         *pSpace = nSpace*20;
1499*b1cdbd2cSJim Jagielski     if (pCol)
1500*b1cdbd2cSJim Jagielski         *pCol = nCol;
1501*b1cdbd2cSJim Jagielski     return nMSTotalWidth;
1502*b1cdbd2cSJim Jagielski }
1503*b1cdbd2cSJim Jagielski 
WW8Fc2Cp(WW8_FC nFcPos) const1504*b1cdbd2cSJim Jagielski WW8_CP WW8ScannerBase::WW8Fc2Cp( WW8_FC nFcPos ) const
1505*b1cdbd2cSJim Jagielski {
1506*b1cdbd2cSJim Jagielski     WW8_CP nFallBackCpEnd = WW8_CP_MAX;
1507*b1cdbd2cSJim Jagielski     if( nFcPos == WW8_FC_MAX )
1508*b1cdbd2cSJim Jagielski         return nFallBackCpEnd;
1509*b1cdbd2cSJim Jagielski 
1510*b1cdbd2cSJim Jagielski     bool bIsUnicode = false;
1511*b1cdbd2cSJim Jagielski     if( pPieceIter )    // Complex File ?
1512*b1cdbd2cSJim Jagielski     {
1513*b1cdbd2cSJim Jagielski         sal_uLong nOldPos = pPieceIter->GetIdx();
1514*b1cdbd2cSJim Jagielski 
1515*b1cdbd2cSJim Jagielski         for (pPieceIter->SetIdx(0);
1516*b1cdbd2cSJim Jagielski             pPieceIter->GetIdx() < pPieceIter->GetIMax();(*pPieceIter)++)
1517*b1cdbd2cSJim Jagielski         {
1518*b1cdbd2cSJim Jagielski             WW8_CP nCpStart, nCpEnd;
1519*b1cdbd2cSJim Jagielski             void* pData;
1520*b1cdbd2cSJim Jagielski             if( !pPieceIter->Get( nCpStart, nCpEnd, pData ) )
1521*b1cdbd2cSJim Jagielski             {   // ausserhalb PLCFfpcd ?
1522*b1cdbd2cSJim Jagielski                 ASSERT( !this, "PLCFpcd-WW8Fc2Cp() ging schief" );
1523*b1cdbd2cSJim Jagielski                 break;
1524*b1cdbd2cSJim Jagielski             }
1525*b1cdbd2cSJim Jagielski             sal_Int32 nFcStart  = SVBT32ToUInt32( ((WW8_PCD*)pData)->fc );
1526*b1cdbd2cSJim Jagielski             if( 8 <= pWw8Fib->nVersion )
1527*b1cdbd2cSJim Jagielski             {
1528*b1cdbd2cSJim Jagielski                 nFcStart = WW8PLCFx_PCD::TransformPieceAddress( nFcStart,
1529*b1cdbd2cSJim Jagielski                                                                 bIsUnicode );
1530*b1cdbd2cSJim Jagielski             }
1531*b1cdbd2cSJim Jagielski             else
1532*b1cdbd2cSJim Jagielski             {
1533*b1cdbd2cSJim Jagielski                 if (pWw8Fib->fExtChar)
1534*b1cdbd2cSJim Jagielski                     bIsUnicode=true;
1535*b1cdbd2cSJim Jagielski             }
1536*b1cdbd2cSJim Jagielski             sal_Int32 nLen = (nCpEnd - nCpStart) * (bIsUnicode ? 2 : 1);
1537*b1cdbd2cSJim Jagielski 
1538*b1cdbd2cSJim Jagielski             /*
1539*b1cdbd2cSJim Jagielski             If this cp is inside this piece, or its the last piece and we are
1540*b1cdbd2cSJim Jagielski             on the very last cp of that piece
1541*b1cdbd2cSJim Jagielski             */
1542*b1cdbd2cSJim Jagielski             if (nFcPos >= nFcStart)
1543*b1cdbd2cSJim Jagielski             {
1544*b1cdbd2cSJim Jagielski                 // found
1545*b1cdbd2cSJim Jagielski                 WW8_CP nTempCp =
1546*b1cdbd2cSJim Jagielski                     nCpStart + ((nFcPos - nFcStart) / (bIsUnicode ? 2 : 1));
1547*b1cdbd2cSJim Jagielski                 if (nFcPos < nFcStart + nLen)
1548*b1cdbd2cSJim Jagielski                 {
1549*b1cdbd2cSJim Jagielski                     pPieceIter->SetIdx( nOldPos );
1550*b1cdbd2cSJim Jagielski                     return nTempCp;
1551*b1cdbd2cSJim Jagielski                 }
1552*b1cdbd2cSJim Jagielski                 else if (nFcPos == nFcStart + nLen)
1553*b1cdbd2cSJim Jagielski                 {
1554*b1cdbd2cSJim Jagielski                     //Keep this cp as its on a piece boundary because we might
1555*b1cdbd2cSJim Jagielski                     //need it if tests fail
1556*b1cdbd2cSJim Jagielski                     nFallBackCpEnd = nTempCp;
1557*b1cdbd2cSJim Jagielski                 }
1558*b1cdbd2cSJim Jagielski             }
1559*b1cdbd2cSJim Jagielski         }
1560*b1cdbd2cSJim Jagielski         // not found
1561*b1cdbd2cSJim Jagielski         pPieceIter->SetIdx( nOldPos );      // not found
1562*b1cdbd2cSJim Jagielski         /*
1563*b1cdbd2cSJim Jagielski         If it was not found, then this is because it has fallen between two
1564*b1cdbd2cSJim Jagielski         stools, i.e. either it is the last cp/fc of the last piece, or it is
1565*b1cdbd2cSJim Jagielski         the last cp/fc of a disjoint piece.
1566*b1cdbd2cSJim Jagielski         */
1567*b1cdbd2cSJim Jagielski         return nFallBackCpEnd;
1568*b1cdbd2cSJim Jagielski     }
1569*b1cdbd2cSJim Jagielski     // No complex file
1570*b1cdbd2cSJim Jagielski     if (pWw8Fib->fExtChar)
1571*b1cdbd2cSJim Jagielski         bIsUnicode=true;
1572*b1cdbd2cSJim Jagielski     return ((nFcPos - pWw8Fib->fcMin) / (bIsUnicode ? 2 : 1));
1573*b1cdbd2cSJim Jagielski }
1574*b1cdbd2cSJim Jagielski 
WW8Cp2Fc(WW8_CP nCpPos,bool * pIsUnicode,WW8_CP * pNextPieceCp,bool * pTestFlag) const1575*b1cdbd2cSJim Jagielski WW8_FC WW8ScannerBase::WW8Cp2Fc(WW8_CP nCpPos, bool* pIsUnicode,
1576*b1cdbd2cSJim Jagielski     WW8_CP* pNextPieceCp, bool* pTestFlag) const
1577*b1cdbd2cSJim Jagielski {
1578*b1cdbd2cSJim Jagielski     if( pTestFlag )
1579*b1cdbd2cSJim Jagielski         *pTestFlag = true;
1580*b1cdbd2cSJim Jagielski     if( WW8_CP_MAX == nCpPos )
1581*b1cdbd2cSJim Jagielski         return WW8_CP_MAX;
1582*b1cdbd2cSJim Jagielski 
1583*b1cdbd2cSJim Jagielski     bool bIsUnicode;
1584*b1cdbd2cSJim Jagielski     if( !pIsUnicode )
1585*b1cdbd2cSJim Jagielski         pIsUnicode = &bIsUnicode;
1586*b1cdbd2cSJim Jagielski 
1587*b1cdbd2cSJim Jagielski     if( pPieceIter )
1588*b1cdbd2cSJim Jagielski     {   // Complex File
1589*b1cdbd2cSJim Jagielski         if( pNextPieceCp )
1590*b1cdbd2cSJim Jagielski             *pNextPieceCp = WW8_CP_MAX;
1591*b1cdbd2cSJim Jagielski 
1592*b1cdbd2cSJim Jagielski         if( !pPieceIter->SeekPos( nCpPos ) )
1593*b1cdbd2cSJim Jagielski         {
1594*b1cdbd2cSJim Jagielski             if( pTestFlag )
1595*b1cdbd2cSJim Jagielski                 *pTestFlag = false;
1596*b1cdbd2cSJim Jagielski             else {
1597*b1cdbd2cSJim Jagielski                 ASSERT( !this, "Falscher CP an WW8Cp2Fc() uebergeben" );
1598*b1cdbd2cSJim Jagielski             }
1599*b1cdbd2cSJim Jagielski             return WW8_FC_MAX;
1600*b1cdbd2cSJim Jagielski         }
1601*b1cdbd2cSJim Jagielski         WW8_CP nCpStart, nCpEnd;
1602*b1cdbd2cSJim Jagielski         void* pData;
1603*b1cdbd2cSJim Jagielski         if( !pPieceIter->Get( nCpStart, nCpEnd, pData ) )
1604*b1cdbd2cSJim Jagielski         {
1605*b1cdbd2cSJim Jagielski             if( pTestFlag )
1606*b1cdbd2cSJim Jagielski                 *pTestFlag = false;
1607*b1cdbd2cSJim Jagielski             else {
1608*b1cdbd2cSJim Jagielski                 ASSERT( !this, "PLCFfpcd-Get ging schief" );
1609*b1cdbd2cSJim Jagielski             }
1610*b1cdbd2cSJim Jagielski             return WW8_FC_MAX;
1611*b1cdbd2cSJim Jagielski         }
1612*b1cdbd2cSJim Jagielski         if( pNextPieceCp )
1613*b1cdbd2cSJim Jagielski             *pNextPieceCp = nCpEnd;
1614*b1cdbd2cSJim Jagielski 
1615*b1cdbd2cSJim Jagielski         WW8_FC nRet = SVBT32ToUInt32( ((WW8_PCD*)pData)->fc );
1616*b1cdbd2cSJim Jagielski         if (8 > pWw8Fib->nVersion)
1617*b1cdbd2cSJim Jagielski 	    if (pWw8Fib->fExtChar)
1618*b1cdbd2cSJim Jagielski         	    *pIsUnicode=true;
1619*b1cdbd2cSJim Jagielski             else
1620*b1cdbd2cSJim Jagielski                     *pIsUnicode = false;
1621*b1cdbd2cSJim Jagielski         else
1622*b1cdbd2cSJim Jagielski             nRet = WW8PLCFx_PCD::TransformPieceAddress( nRet, *pIsUnicode );
1623*b1cdbd2cSJim Jagielski 
1624*b1cdbd2cSJim Jagielski 
1625*b1cdbd2cSJim Jagielski         nRet += (nCpPos - nCpStart) * (*pIsUnicode ? 2 : 1);
1626*b1cdbd2cSJim Jagielski 
1627*b1cdbd2cSJim Jagielski         return nRet;
1628*b1cdbd2cSJim Jagielski     }
1629*b1cdbd2cSJim Jagielski 
1630*b1cdbd2cSJim Jagielski     // No complex file
1631*b1cdbd2cSJim Jagielski     if (pWw8Fib->fExtChar)
1632*b1cdbd2cSJim Jagielski         *pIsUnicode = true;
1633*b1cdbd2cSJim Jagielski     else
1634*b1cdbd2cSJim Jagielski         *pIsUnicode = false;
1635*b1cdbd2cSJim Jagielski     return pWw8Fib->fcMin + nCpPos * (*pIsUnicode ? 2 : 1);
1636*b1cdbd2cSJim Jagielski }
1637*b1cdbd2cSJim Jagielski 
1638*b1cdbd2cSJim Jagielski //-----------------------------------------
1639*b1cdbd2cSJim Jagielski //      class WW8ScannerBase
1640*b1cdbd2cSJim Jagielski //-----------------------------------------
1641*b1cdbd2cSJim Jagielski 
OpenPieceTable(SvStream * pStr,const WW8Fib * pWwF)1642*b1cdbd2cSJim Jagielski WW8PLCFpcd* WW8ScannerBase::OpenPieceTable( SvStream* pStr, const WW8Fib* pWwF )
1643*b1cdbd2cSJim Jagielski {
1644*b1cdbd2cSJim Jagielski     if ( ((8 > pWw8Fib->nVersion) && !pWwF->fComplex) || !pWwF->lcbClx )
1645*b1cdbd2cSJim Jagielski         return 0;
1646*b1cdbd2cSJim Jagielski 
1647*b1cdbd2cSJim Jagielski     WW8_FC nClxPos = pWwF->fcClx;
1648*b1cdbd2cSJim Jagielski     sal_Int32 nClxLen = pWwF->lcbClx;
1649*b1cdbd2cSJim Jagielski     sal_Int32 nLeft = nClxLen;
1650*b1cdbd2cSJim Jagielski     sal_Int16 nGrpprl = 0;
1651*b1cdbd2cSJim Jagielski     sal_uInt8 clxt;
1652*b1cdbd2cSJim Jagielski 
1653*b1cdbd2cSJim Jagielski     pStr->Seek( nClxPos );
1654*b1cdbd2cSJim Jagielski     while( nGrpprl < SAL_MAX_INT16 ) // Zaehle Zahl der Grpprls
1655*b1cdbd2cSJim Jagielski     {
1656*b1cdbd2cSJim Jagielski         *pStr >> clxt;
1657*b1cdbd2cSJim Jagielski         nLeft--;
1658*b1cdbd2cSJim Jagielski         if( 2 == clxt )                         // PLCFfpcd ?
1659*b1cdbd2cSJim Jagielski             break;                              // PLCFfpcd gefunden
1660*b1cdbd2cSJim Jagielski         if( 1 == clxt )                         // clxtGrpprl ?
1661*b1cdbd2cSJim Jagielski             nGrpprl++;
1662*b1cdbd2cSJim Jagielski         sal_uInt16 nLen;
1663*b1cdbd2cSJim Jagielski         *pStr >> nLen;
1664*b1cdbd2cSJim Jagielski         nLeft -= 2 + nLen;
1665*b1cdbd2cSJim Jagielski         if( nLeft < 0 )
1666*b1cdbd2cSJim Jagielski             return 0;                           // schiefgegangen
1667*b1cdbd2cSJim Jagielski         pStr->SeekRel( nLen );                  // ueberlies grpprl
1668*b1cdbd2cSJim Jagielski     }
1669*b1cdbd2cSJim Jagielski     if ( nGrpprl == SAL_MAX_INT16 )
1670*b1cdbd2cSJim Jagielski         return 0;
1671*b1cdbd2cSJim Jagielski     pStr->Seek( nClxPos );
1672*b1cdbd2cSJim Jagielski     nLeft = nClxLen;
1673*b1cdbd2cSJim Jagielski     pPieceGrpprls = new sal_uInt8*[nGrpprl + 1];
1674*b1cdbd2cSJim Jagielski     memset( pPieceGrpprls, 0, ( nGrpprl + 1 ) * sizeof(sal_uInt8 *) );
1675*b1cdbd2cSJim Jagielski     nPieceGrpprls = nGrpprl;
1676*b1cdbd2cSJim Jagielski     sal_Int16 nAktGrpprl = 0;                       // lies Grpprls ein
1677*b1cdbd2cSJim Jagielski     while( 1 )
1678*b1cdbd2cSJim Jagielski     {
1679*b1cdbd2cSJim Jagielski         *pStr >> clxt;
1680*b1cdbd2cSJim Jagielski         nLeft--;
1681*b1cdbd2cSJim Jagielski         if( 2 == clxt)                          // PLCFfpcd ?
1682*b1cdbd2cSJim Jagielski             break;                              // PLCFfpcd gefunden
1683*b1cdbd2cSJim Jagielski         sal_uInt16 nLen;
1684*b1cdbd2cSJim Jagielski         *pStr >> nLen;
1685*b1cdbd2cSJim Jagielski         nLeft -= 2 + nLen;
1686*b1cdbd2cSJim Jagielski         if( nLeft < 0 )
1687*b1cdbd2cSJim Jagielski             return 0;                           // schiefgegangen
1688*b1cdbd2cSJim Jagielski         if( 1 == clxt )                         // clxtGrpprl ?
1689*b1cdbd2cSJim Jagielski         {
1690*b1cdbd2cSJim Jagielski             sal_uInt8* p = new sal_uInt8[nLen+2];         // alloziere
1691*b1cdbd2cSJim Jagielski             ShortToSVBT16(nLen, p);             // trage Laenge ein
1692*b1cdbd2cSJim Jagielski             pStr->Read( p+2, nLen );            // lies grpprl
1693*b1cdbd2cSJim Jagielski             pPieceGrpprls[nAktGrpprl++] = p;    // trage in Array ein
1694*b1cdbd2cSJim Jagielski         }
1695*b1cdbd2cSJim Jagielski         else
1696*b1cdbd2cSJim Jagielski             pStr->SeekRel( nLen );              // ueberlies nicht-Grpprl
1697*b1cdbd2cSJim Jagielski     }
1698*b1cdbd2cSJim Jagielski     // lies Piece Table PLCF ein
1699*b1cdbd2cSJim Jagielski     sal_Int32 nPLCFfLen;
1700*b1cdbd2cSJim Jagielski     if (pWwF->GetFIBVersion() <= ww::eWW2)
1701*b1cdbd2cSJim Jagielski     {
1702*b1cdbd2cSJim Jagielski         sal_Int16 nWordTwoLen;
1703*b1cdbd2cSJim Jagielski         *pStr >> nWordTwoLen;
1704*b1cdbd2cSJim Jagielski         nPLCFfLen = nWordTwoLen;
1705*b1cdbd2cSJim Jagielski     }
1706*b1cdbd2cSJim Jagielski     else
1707*b1cdbd2cSJim Jagielski         *pStr >> nPLCFfLen;
1708*b1cdbd2cSJim Jagielski     ASSERT( 65536 > nPLCFfLen, "PLCFfpcd ueber 64 k" );
1709*b1cdbd2cSJim Jagielski     return new WW8PLCFpcd( pStr, pStr->Tell(), nPLCFfLen, 8 );
1710*b1cdbd2cSJim Jagielski }
1711*b1cdbd2cSJim Jagielski 
DeletePieceTable()1712*b1cdbd2cSJim Jagielski void WW8ScannerBase::DeletePieceTable()
1713*b1cdbd2cSJim Jagielski {
1714*b1cdbd2cSJim Jagielski     if( pPieceGrpprls )
1715*b1cdbd2cSJim Jagielski     {
1716*b1cdbd2cSJim Jagielski         for( sal_uInt8** p = pPieceGrpprls; *p; p++ )
1717*b1cdbd2cSJim Jagielski             delete[] (*p);
1718*b1cdbd2cSJim Jagielski         delete[] pPieceGrpprls;
1719*b1cdbd2cSJim Jagielski         pPieceGrpprls = 0;
1720*b1cdbd2cSJim Jagielski     }
1721*b1cdbd2cSJim Jagielski }
1722*b1cdbd2cSJim Jagielski 
WW8ScannerBase(SvStream * pSt,SvStream * pTblSt,SvStream * pDataSt,const WW8Fib * pWwFib)1723*b1cdbd2cSJim Jagielski WW8ScannerBase::WW8ScannerBase( SvStream* pSt, SvStream* pTblSt,
1724*b1cdbd2cSJim Jagielski     SvStream* pDataSt, const WW8Fib* pWwFib )
1725*b1cdbd2cSJim Jagielski     : pWw8Fib(pWwFib)
1726*b1cdbd2cSJim Jagielski     , pChpPLCF( 0 )
1727*b1cdbd2cSJim Jagielski     , pPapPLCF( 0 )
1728*b1cdbd2cSJim Jagielski     , pSepPLCF( 0 )
1729*b1cdbd2cSJim Jagielski     , pFtnPLCF( 0 )
1730*b1cdbd2cSJim Jagielski     , pEdnPLCF( 0 )
1731*b1cdbd2cSJim Jagielski     , pAndPLCF( 0 )
1732*b1cdbd2cSJim Jagielski     , pFldPLCF( 0 )
1733*b1cdbd2cSJim Jagielski     , pFldHdFtPLCF( 0 )
1734*b1cdbd2cSJim Jagielski     , pFldTxbxPLCF( 0 )
1735*b1cdbd2cSJim Jagielski     , pFldTxbxHdFtPLCF( 0 )
1736*b1cdbd2cSJim Jagielski     , pFldFtnPLCF( 0 )
1737*b1cdbd2cSJim Jagielski     , pFldEdnPLCF( 0 )
1738*b1cdbd2cSJim Jagielski     , pFldAndPLCF( 0 )
1739*b1cdbd2cSJim Jagielski     , pMainFdoa(0)
1740*b1cdbd2cSJim Jagielski     , pHdFtFdoa(0)
1741*b1cdbd2cSJim Jagielski     , pMainTxbx(0)
1742*b1cdbd2cSJim Jagielski     , pMainTxbxBkd(0)
1743*b1cdbd2cSJim Jagielski     , pHdFtTxbx(0)
1744*b1cdbd2cSJim Jagielski     , pHdFtTxbxBkd(0)
1745*b1cdbd2cSJim Jagielski     , pMagicTables(0)
1746*b1cdbd2cSJim Jagielski     , pSubdocs(0)
1747*b1cdbd2cSJim Jagielski     , pExtendedAtrds(0)
1748*b1cdbd2cSJim Jagielski     , pBook( 0 )
1749*b1cdbd2cSJim Jagielski     , pPiecePLCF( 0 )
1750*b1cdbd2cSJim Jagielski     , pPieceIter( 0 )
1751*b1cdbd2cSJim Jagielski     , pPLCFx_PCD( 0 )
1752*b1cdbd2cSJim Jagielski     , pPLCFx_PCDAttrs( 0 )
1753*b1cdbd2cSJim Jagielski     , pPieceGrpprls(0)
1754*b1cdbd2cSJim Jagielski     , nPieceGrpprls( 0 )
1755*b1cdbd2cSJim Jagielski {
1756*b1cdbd2cSJim Jagielski     pPiecePLCF = OpenPieceTable( pTblSt, pWw8Fib );             // Complex
1757*b1cdbd2cSJim Jagielski     if( pPiecePLCF )
1758*b1cdbd2cSJim Jagielski     {
1759*b1cdbd2cSJim Jagielski         pPieceIter = new WW8PLCFpcd_Iter( *pPiecePLCF );
1760*b1cdbd2cSJim Jagielski         pPLCFx_PCD = new WW8PLCFx_PCD(pWwFib->GetFIBVersion(), pPiecePLCF, 0,
1761*b1cdbd2cSJim Jagielski             IsSevenMinus(pWw8Fib->GetFIBVersion()));
1762*b1cdbd2cSJim Jagielski         pPLCFx_PCDAttrs = new WW8PLCFx_PCDAttrs(pWwFib->GetFIBVersion(),
1763*b1cdbd2cSJim Jagielski             pPLCFx_PCD, this);
1764*b1cdbd2cSJim Jagielski     }
1765*b1cdbd2cSJim Jagielski     else
1766*b1cdbd2cSJim Jagielski     {
1767*b1cdbd2cSJim Jagielski         pPieceIter = 0;
1768*b1cdbd2cSJim Jagielski         pPLCFx_PCD = 0;
1769*b1cdbd2cSJim Jagielski         pPLCFx_PCDAttrs = 0;
1770*b1cdbd2cSJim Jagielski     }
1771*b1cdbd2cSJim Jagielski 
1772*b1cdbd2cSJim Jagielski     // pChpPLCF and pPapPLCF may NOT be created before pPLCFx_PCD !!
1773*b1cdbd2cSJim Jagielski     pChpPLCF = new WW8PLCFx_Cp_FKP( pSt, pTblSt, pDataSt, *this, CHP ); // CHPX
1774*b1cdbd2cSJim Jagielski     pPapPLCF = new WW8PLCFx_Cp_FKP( pSt, pTblSt, pDataSt, *this, PAP ); // PAPX
1775*b1cdbd2cSJim Jagielski 
1776*b1cdbd2cSJim Jagielski     pSepPLCF = new WW8PLCFx_SEPX(   pSt, pTblSt, *pWwFib, 0 );          // SEPX
1777*b1cdbd2cSJim Jagielski 
1778*b1cdbd2cSJim Jagielski     // Footnotes
1779*b1cdbd2cSJim Jagielski     pFtnPLCF = new WW8PLCFx_SubDoc( pTblSt, pWwFib->GetFIBVersion(), 0,
1780*b1cdbd2cSJim Jagielski         pWwFib->fcPlcffndRef, pWwFib->lcbPlcffndRef, pWwFib->fcPlcffndTxt,
1781*b1cdbd2cSJim Jagielski         pWwFib->lcbPlcffndTxt, 2 );
1782*b1cdbd2cSJim Jagielski     // Endnotes
1783*b1cdbd2cSJim Jagielski     pEdnPLCF = new WW8PLCFx_SubDoc( pTblSt, pWwFib->GetFIBVersion(), 0,
1784*b1cdbd2cSJim Jagielski         pWwFib->fcPlcfendRef, pWwFib->lcbPlcfendRef, pWwFib->fcPlcfendTxt,
1785*b1cdbd2cSJim Jagielski         pWwFib->lcbPlcfendTxt, 2 );
1786*b1cdbd2cSJim Jagielski     // Anmerkungen
1787*b1cdbd2cSJim Jagielski     pAndPLCF = new WW8PLCFx_SubDoc( pTblSt, pWwFib->GetFIBVersion(), 0,
1788*b1cdbd2cSJim Jagielski         pWwFib->fcPlcfandRef, pWwFib->lcbPlcfandRef, pWwFib->fcPlcfandTxt,
1789*b1cdbd2cSJim Jagielski         pWwFib->lcbPlcfandTxt, IsSevenMinus(pWwFib->GetFIBVersion()) ? 20 : 30);
1790*b1cdbd2cSJim Jagielski 
1791*b1cdbd2cSJim Jagielski     // Fields Main Text
1792*b1cdbd2cSJim Jagielski     pFldPLCF    = new WW8PLCFx_FLD(pTblSt, *pWwFib, MAN_MAINTEXT);
1793*b1cdbd2cSJim Jagielski     // Fields Header / Footer
1794*b1cdbd2cSJim Jagielski     pFldHdFtPLCF= new WW8PLCFx_FLD(pTblSt, *pWwFib, MAN_HDFT);
1795*b1cdbd2cSJim Jagielski     // Fields Footnote
1796*b1cdbd2cSJim Jagielski     pFldFtnPLCF = new WW8PLCFx_FLD(pTblSt, *pWwFib, MAN_FTN);
1797*b1cdbd2cSJim Jagielski     // Fields Endnote
1798*b1cdbd2cSJim Jagielski     pFldEdnPLCF = new WW8PLCFx_FLD(pTblSt, *pWwFib, MAN_EDN);
1799*b1cdbd2cSJim Jagielski     // Fields Anmerkungen
1800*b1cdbd2cSJim Jagielski     pFldAndPLCF = new WW8PLCFx_FLD(pTblSt, *pWwFib, MAN_AND);
1801*b1cdbd2cSJim Jagielski     // Fields in Textboxes in Main Text
1802*b1cdbd2cSJim Jagielski     pFldTxbxPLCF= new WW8PLCFx_FLD(pTblSt, *pWwFib, MAN_TXBX);
1803*b1cdbd2cSJim Jagielski     // Fields in Textboxes in Header / Footer
1804*b1cdbd2cSJim Jagielski     pFldTxbxHdFtPLCF = new WW8PLCFx_FLD(pTblSt,*pWwFib,MAN_TXBX_HDFT);
1805*b1cdbd2cSJim Jagielski 
1806*b1cdbd2cSJim Jagielski     // Note: 6 stands for "6 OR 7",  7 stands for "ONLY 7"
1807*b1cdbd2cSJim Jagielski     switch( pWw8Fib->nVersion )
1808*b1cdbd2cSJim Jagielski     {
1809*b1cdbd2cSJim Jagielski         case 6:
1810*b1cdbd2cSJim Jagielski         case 7:
1811*b1cdbd2cSJim Jagielski             if( pWwFib->fcPlcfdoaMom && pWwFib->lcbPlcfdoaMom )
1812*b1cdbd2cSJim Jagielski             {
1813*b1cdbd2cSJim Jagielski                 pMainFdoa = new WW8PLCFspecial( pTblSt, pWwFib->fcPlcfdoaMom,
1814*b1cdbd2cSJim Jagielski                     pWwFib->lcbPlcfdoaMom, 6 );
1815*b1cdbd2cSJim Jagielski             }
1816*b1cdbd2cSJim Jagielski             if( pWwFib->fcPlcfdoaHdr && pWwFib->lcbPlcfdoaHdr )
1817*b1cdbd2cSJim Jagielski             {
1818*b1cdbd2cSJim Jagielski                 pHdFtFdoa = new WW8PLCFspecial( pTblSt, pWwFib->fcPlcfdoaHdr,
1819*b1cdbd2cSJim Jagielski                 pWwFib->lcbPlcfdoaHdr, 6 );
1820*b1cdbd2cSJim Jagielski             }
1821*b1cdbd2cSJim Jagielski             break;
1822*b1cdbd2cSJim Jagielski         case 8:
1823*b1cdbd2cSJim Jagielski             if( pWwFib->fcPlcfspaMom && pWwFib->lcbPlcfspaMom )
1824*b1cdbd2cSJim Jagielski             {
1825*b1cdbd2cSJim Jagielski                 pMainFdoa = new WW8PLCFspecial( pTblSt, pWwFib->fcPlcfspaMom,
1826*b1cdbd2cSJim Jagielski                     pWwFib->lcbPlcfspaMom, 26 );
1827*b1cdbd2cSJim Jagielski             }
1828*b1cdbd2cSJim Jagielski             if( pWwFib->fcPlcfspaHdr && pWwFib->lcbPlcfspaHdr )
1829*b1cdbd2cSJim Jagielski             {
1830*b1cdbd2cSJim Jagielski                 pHdFtFdoa = new WW8PLCFspecial( pTblSt, pWwFib->fcPlcfspaHdr,
1831*b1cdbd2cSJim Jagielski                     pWwFib->lcbPlcfspaHdr, 26 );
1832*b1cdbd2cSJim Jagielski             }
1833*b1cdbd2cSJim Jagielski             // PLCF fuer TextBox-Break-Deskriptoren im Maintext
1834*b1cdbd2cSJim Jagielski             if( pWwFib->fcPlcftxbxBkd && pWwFib->lcbPlcftxbxBkd )
1835*b1cdbd2cSJim Jagielski             {
1836*b1cdbd2cSJim Jagielski                 pMainTxbxBkd = new WW8PLCFspecial( pTblSt,
1837*b1cdbd2cSJim Jagielski                     pWwFib->fcPlcftxbxBkd, pWwFib->lcbPlcftxbxBkd, 0);
1838*b1cdbd2cSJim Jagielski             }
1839*b1cdbd2cSJim Jagielski             // PLCF fuer TextBox-Break-Deskriptoren im Header-/Footer-Bereich
1840*b1cdbd2cSJim Jagielski             if( pWwFib->fcPlcfHdrtxbxBkd && pWwFib->lcbPlcfHdrtxbxBkd )
1841*b1cdbd2cSJim Jagielski             {
1842*b1cdbd2cSJim Jagielski                 pHdFtTxbxBkd = new WW8PLCFspecial( pTblSt,
1843*b1cdbd2cSJim Jagielski                     pWwFib->fcPlcfHdrtxbxBkd, pWwFib->lcbPlcfHdrtxbxBkd, 0);
1844*b1cdbd2cSJim Jagielski             }
1845*b1cdbd2cSJim Jagielski             // Sub table cp positions
1846*b1cdbd2cSJim Jagielski             if (pWwFib->fcPlcfTch && pWwFib->lcbPlcfTch)
1847*b1cdbd2cSJim Jagielski             {
1848*b1cdbd2cSJim Jagielski                 pMagicTables = new WW8PLCFspecial( pTblSt,
1849*b1cdbd2cSJim Jagielski                     pWwFib->fcPlcfTch, pWwFib->lcbPlcfTch, 4);
1850*b1cdbd2cSJim Jagielski             }
1851*b1cdbd2cSJim Jagielski             // Sub document cp positions
1852*b1cdbd2cSJim Jagielski             if (pWwFib->fcPlcfwkb && pWwFib->lcbPlcfwkb)
1853*b1cdbd2cSJim Jagielski             {
1854*b1cdbd2cSJim Jagielski                 pSubdocs = new WW8PLCFspecial( pTblSt,
1855*b1cdbd2cSJim Jagielski                     pWwFib->fcPlcfwkb, pWwFib->lcbPlcfwkb, 12);
1856*b1cdbd2cSJim Jagielski             }
1857*b1cdbd2cSJim Jagielski             // Extended ATRD
1858*b1cdbd2cSJim Jagielski             if (pWwFib->fcAtrdExtra && pWwFib->lcbAtrdExtra)
1859*b1cdbd2cSJim Jagielski             {
1860*b1cdbd2cSJim Jagielski                 pExtendedAtrds = new sal_uInt8[pWwFib->lcbAtrdExtra];
1861*b1cdbd2cSJim Jagielski                 long nOldPos = pTblSt->Tell();
1862*b1cdbd2cSJim Jagielski                 pTblSt->Seek(pWwFib->fcAtrdExtra);
1863*b1cdbd2cSJim Jagielski                 pTblSt->Read(pExtendedAtrds, pWwFib->lcbAtrdExtra);
1864*b1cdbd2cSJim Jagielski                 pTblSt->Seek(nOldPos);
1865*b1cdbd2cSJim Jagielski             }
1866*b1cdbd2cSJim Jagielski 
1867*b1cdbd2cSJim Jagielski             break;
1868*b1cdbd2cSJim Jagielski         default:
1869*b1cdbd2cSJim Jagielski             ASSERT( !this, "Es wurde vergessen, nVersion zu kodieren!" );
1870*b1cdbd2cSJim Jagielski             break;
1871*b1cdbd2cSJim Jagielski     }
1872*b1cdbd2cSJim Jagielski 
1873*b1cdbd2cSJim Jagielski     // PLCF fuer TextBox-Stories im Maintext
1874*b1cdbd2cSJim Jagielski     long nLenTxBxS = (8 > pWw8Fib->nVersion) ? 0 : 22;
1875*b1cdbd2cSJim Jagielski     if( pWwFib->fcPlcftxbxTxt && pWwFib->lcbPlcftxbxTxt )
1876*b1cdbd2cSJim Jagielski     {
1877*b1cdbd2cSJim Jagielski         pMainTxbx = new WW8PLCFspecial( pTblSt, pWwFib->fcPlcftxbxTxt,
1878*b1cdbd2cSJim Jagielski             pWwFib->lcbPlcftxbxTxt, nLenTxBxS );
1879*b1cdbd2cSJim Jagielski     }
1880*b1cdbd2cSJim Jagielski 
1881*b1cdbd2cSJim Jagielski     // PLCF fuer TextBox-Stories im Header-/Footer-Bereich
1882*b1cdbd2cSJim Jagielski     if( pWwFib->fcPlcfHdrtxbxTxt && pWwFib->lcbPlcfHdrtxbxTxt )
1883*b1cdbd2cSJim Jagielski     {
1884*b1cdbd2cSJim Jagielski         pHdFtTxbx = new WW8PLCFspecial( pTblSt, pWwFib->fcPlcfHdrtxbxTxt,
1885*b1cdbd2cSJim Jagielski             pWwFib->lcbPlcfHdrtxbxTxt, nLenTxBxS );
1886*b1cdbd2cSJim Jagielski     }
1887*b1cdbd2cSJim Jagielski 
1888*b1cdbd2cSJim Jagielski     pBook = new WW8PLCFx_Book(pTblSt, *pWwFib);
1889*b1cdbd2cSJim Jagielski }
1890*b1cdbd2cSJim Jagielski 
IsValid()1891*b1cdbd2cSJim Jagielski bool WW8ScannerBase::IsValid()
1892*b1cdbd2cSJim Jagielski {
1893*b1cdbd2cSJim Jagielski     return ( pPiecePLCF == 0 || pPiecePLCF->IsValid() )
1894*b1cdbd2cSJim Jagielski            && pChpPLCF->HasValidPLCF()
1895*b1cdbd2cSJim Jagielski            && pPapPLCF->HasValidPLCF()
1896*b1cdbd2cSJim Jagielski            && pSepPLCF->HasValidPLCF()
1897*b1cdbd2cSJim Jagielski            && pFtnPLCF->HasValidPLCF()
1898*b1cdbd2cSJim Jagielski            && pEdnPLCF->HasValidPLCF()
1899*b1cdbd2cSJim Jagielski            && pAndPLCF->HasValidPLCF()
1900*b1cdbd2cSJim Jagielski            && pFldPLCF->HasValidPLCF()
1901*b1cdbd2cSJim Jagielski            && pFldHdFtPLCF->HasValidPLCF()
1902*b1cdbd2cSJim Jagielski            && pFldFtnPLCF->HasValidPLCF()
1903*b1cdbd2cSJim Jagielski            && pFldEdnPLCF->HasValidPLCF()
1904*b1cdbd2cSJim Jagielski            && pFldAndPLCF->HasValidPLCF()
1905*b1cdbd2cSJim Jagielski            && pFldTxbxPLCF->HasValidPLCF()
1906*b1cdbd2cSJim Jagielski            && pFldTxbxHdFtPLCF->HasValidPLCF()
1907*b1cdbd2cSJim Jagielski            && ( pMainFdoa == 0 || pMainFdoa->IsValid() )
1908*b1cdbd2cSJim Jagielski            && ( pHdFtFdoa == 0 || pHdFtFdoa->IsValid() )
1909*b1cdbd2cSJim Jagielski            && ( pMainTxbxBkd == 0 || pMainTxbxBkd->IsValid() )
1910*b1cdbd2cSJim Jagielski            && ( pHdFtTxbxBkd == 0 || pHdFtTxbxBkd->IsValid() )
1911*b1cdbd2cSJim Jagielski            && ( pMagicTables == 0 || pMagicTables->IsValid() )
1912*b1cdbd2cSJim Jagielski            && ( pSubdocs == 0 || pSubdocs->IsValid() )
1913*b1cdbd2cSJim Jagielski            && ( pHdFtTxbx == 0 || pHdFtTxbx->IsValid() )
1914*b1cdbd2cSJim Jagielski            && pBook->HasValidPLCF();
1915*b1cdbd2cSJim Jagielski }
1916*b1cdbd2cSJim Jagielski 
~WW8ScannerBase()1917*b1cdbd2cSJim Jagielski WW8ScannerBase::~WW8ScannerBase()
1918*b1cdbd2cSJim Jagielski {
1919*b1cdbd2cSJim Jagielski     DeletePieceTable();
1920*b1cdbd2cSJim Jagielski     delete pPLCFx_PCDAttrs;
1921*b1cdbd2cSJim Jagielski     delete pPLCFx_PCD;
1922*b1cdbd2cSJim Jagielski     delete pPieceIter;
1923*b1cdbd2cSJim Jagielski     delete pPiecePLCF;
1924*b1cdbd2cSJim Jagielski     delete pBook;
1925*b1cdbd2cSJim Jagielski     delete pFldEdnPLCF;
1926*b1cdbd2cSJim Jagielski     delete pFldFtnPLCF;
1927*b1cdbd2cSJim Jagielski     delete pFldAndPLCF;
1928*b1cdbd2cSJim Jagielski     delete pFldHdFtPLCF;
1929*b1cdbd2cSJim Jagielski     delete pFldPLCF;
1930*b1cdbd2cSJim Jagielski     delete pFldTxbxPLCF;
1931*b1cdbd2cSJim Jagielski     delete pFldTxbxHdFtPLCF;
1932*b1cdbd2cSJim Jagielski     delete pEdnPLCF;
1933*b1cdbd2cSJim Jagielski     delete pFtnPLCF;
1934*b1cdbd2cSJim Jagielski     delete pAndPLCF;
1935*b1cdbd2cSJim Jagielski     delete pSepPLCF;
1936*b1cdbd2cSJim Jagielski     delete pPapPLCF;
1937*b1cdbd2cSJim Jagielski     delete pChpPLCF;
1938*b1cdbd2cSJim Jagielski     // vergessene Schaeflein
1939*b1cdbd2cSJim Jagielski     delete pMainFdoa;
1940*b1cdbd2cSJim Jagielski     delete pHdFtFdoa;
1941*b1cdbd2cSJim Jagielski     delete pMainTxbx;
1942*b1cdbd2cSJim Jagielski     delete pMainTxbxBkd;
1943*b1cdbd2cSJim Jagielski     delete pHdFtTxbx;
1944*b1cdbd2cSJim Jagielski     delete pHdFtTxbxBkd;
1945*b1cdbd2cSJim Jagielski     delete pMagicTables;
1946*b1cdbd2cSJim Jagielski     delete pSubdocs;
1947*b1cdbd2cSJim Jagielski     delete [] pExtendedAtrds;
1948*b1cdbd2cSJim Jagielski }
1949*b1cdbd2cSJim Jagielski 
1950*b1cdbd2cSJim Jagielski //-----------------------------------------
1951*b1cdbd2cSJim Jagielski //          Fields
1952*b1cdbd2cSJim Jagielski //-----------------------------------------
WW8SkipField(WW8PLCFspecial & rPLCF)1953*b1cdbd2cSJim Jagielski static bool WW8SkipField(WW8PLCFspecial& rPLCF)
1954*b1cdbd2cSJim Jagielski {
1955*b1cdbd2cSJim Jagielski     void* pData;
1956*b1cdbd2cSJim Jagielski     WW8_CP nP;
1957*b1cdbd2cSJim Jagielski 
1958*b1cdbd2cSJim Jagielski     if (!rPLCF.Get(nP, pData))              // Ende des PLCFspecial ?
1959*b1cdbd2cSJim Jagielski         return false;
1960*b1cdbd2cSJim Jagielski 
1961*b1cdbd2cSJim Jagielski     rPLCF++;
1962*b1cdbd2cSJim Jagielski 
1963*b1cdbd2cSJim Jagielski     if((((sal_uInt8*)pData)[0] & 0x1f ) != 0x13 )    // Kein Anfang ?
1964*b1cdbd2cSJim Jagielski         return true;                            // Bei Fehler nicht abbrechen
1965*b1cdbd2cSJim Jagielski 
1966*b1cdbd2cSJim Jagielski     if( !rPLCF.Get( nP, pData ) )
1967*b1cdbd2cSJim Jagielski         return false;
1968*b1cdbd2cSJim Jagielski 
1969*b1cdbd2cSJim Jagielski 
1970*b1cdbd2cSJim Jagielski     while((((sal_uInt8*)pData)[0] & 0x1f ) == 0x13 )
1971*b1cdbd2cSJim Jagielski     {
1972*b1cdbd2cSJim Jagielski         // immer noch neue (nested) Anfaenge ?
1973*b1cdbd2cSJim Jagielski         WW8SkipField( rPLCF );              // nested Field im Beschreibungsteil
1974*b1cdbd2cSJim Jagielski         if( !rPLCF.Get( nP, pData ) )
1975*b1cdbd2cSJim Jagielski             return false;
1976*b1cdbd2cSJim Jagielski     }
1977*b1cdbd2cSJim Jagielski 
1978*b1cdbd2cSJim Jagielski     if((((sal_uInt8*)pData)[0] & 0x1f ) == 0x14 )
1979*b1cdbd2cSJim Jagielski     {
1980*b1cdbd2cSJim Jagielski 
1981*b1cdbd2cSJim Jagielski         // Field Separator ?
1982*b1cdbd2cSJim Jagielski         rPLCF++;
1983*b1cdbd2cSJim Jagielski 
1984*b1cdbd2cSJim Jagielski         if( !rPLCF.Get( nP, pData ) )
1985*b1cdbd2cSJim Jagielski             return false;
1986*b1cdbd2cSJim Jagielski 
1987*b1cdbd2cSJim Jagielski         while ((((sal_uInt8*)pData)[0] & 0x1f ) == 0x13)
1988*b1cdbd2cSJim Jagielski         {
1989*b1cdbd2cSJim Jagielski             // immer noch neue (nested) Anfaenge ?
1990*b1cdbd2cSJim Jagielski             WW8SkipField( rPLCF );          // nested Field im Resultatteil
1991*b1cdbd2cSJim Jagielski             if( !rPLCF.Get( nP, pData ) )
1992*b1cdbd2cSJim Jagielski                 return false;
1993*b1cdbd2cSJim Jagielski         }
1994*b1cdbd2cSJim Jagielski     }
1995*b1cdbd2cSJim Jagielski     rPLCF++;
1996*b1cdbd2cSJim Jagielski 
1997*b1cdbd2cSJim Jagielski     return true;
1998*b1cdbd2cSJim Jagielski }
1999*b1cdbd2cSJim Jagielski 
WW8GetFieldPara(WW8PLCFspecial & rPLCF,WW8FieldDesc & rF)2000*b1cdbd2cSJim Jagielski static bool WW8GetFieldPara(WW8PLCFspecial& rPLCF, WW8FieldDesc& rF)
2001*b1cdbd2cSJim Jagielski {
2002*b1cdbd2cSJim Jagielski     void* pData;
2003*b1cdbd2cSJim Jagielski     sal_uLong nOldIdx = rPLCF.GetIdx();
2004*b1cdbd2cSJim Jagielski 
2005*b1cdbd2cSJim Jagielski     rF.nLen = rF.nId = rF.nOpt = rF.bCodeNest = rF.bResNest = 0;
2006*b1cdbd2cSJim Jagielski 
2007*b1cdbd2cSJim Jagielski     if( !rPLCF.Get( rF.nSCode, pData ) )             // Ende des PLCFspecial ?
2008*b1cdbd2cSJim Jagielski         goto Err;
2009*b1cdbd2cSJim Jagielski 
2010*b1cdbd2cSJim Jagielski     rPLCF++;
2011*b1cdbd2cSJim Jagielski 
2012*b1cdbd2cSJim Jagielski     if((((sal_uInt8*)pData)[0] & 0x1f ) != 0x13 )        // Kein Anfang ?
2013*b1cdbd2cSJim Jagielski         goto Err;
2014*b1cdbd2cSJim Jagielski 
2015*b1cdbd2cSJim Jagielski     rF.nId = ((sal_uInt8*)pData)[1];
2016*b1cdbd2cSJim Jagielski 
2017*b1cdbd2cSJim Jagielski     if( !rPLCF.Get( rF.nLCode, pData ) )
2018*b1cdbd2cSJim Jagielski         goto Err;
2019*b1cdbd2cSJim Jagielski 
2020*b1cdbd2cSJim Jagielski     rF.nSRes = rF.nLCode;                           // Default
2021*b1cdbd2cSJim Jagielski     rF.nSCode++;                                    // ohne Marken
2022*b1cdbd2cSJim Jagielski     rF.nLCode -= rF.nSCode;                         // Pos zu Laenge
2023*b1cdbd2cSJim Jagielski 
2024*b1cdbd2cSJim Jagielski     while((((sal_uInt8*)pData)[0] & 0x1f ) == 0x13 )
2025*b1cdbd2cSJim Jagielski     {
2026*b1cdbd2cSJim Jagielski         // immer noch neue (nested) Anfaenge ?
2027*b1cdbd2cSJim Jagielski         WW8SkipField( rPLCF );              // nested Field im Beschreibungsteil
2028*b1cdbd2cSJim Jagielski         rF.bCodeNest = true;
2029*b1cdbd2cSJim Jagielski         if( !rPLCF.Get( rF.nSRes, pData ) )
2030*b1cdbd2cSJim Jagielski             goto Err;
2031*b1cdbd2cSJim Jagielski     }
2032*b1cdbd2cSJim Jagielski 
2033*b1cdbd2cSJim Jagielski     if((((sal_uInt8*)pData)[0] & 0x1f ) == 0x14 ){       // Field Separator ?
2034*b1cdbd2cSJim Jagielski         rPLCF++;
2035*b1cdbd2cSJim Jagielski 
2036*b1cdbd2cSJim Jagielski         if( !rPLCF.Get( rF.nLRes, pData ) )
2037*b1cdbd2cSJim Jagielski             goto Err;
2038*b1cdbd2cSJim Jagielski 
2039*b1cdbd2cSJim Jagielski         while((((sal_uInt8*)pData)[0] & 0x1f ) == 0x13 )
2040*b1cdbd2cSJim Jagielski         {
2041*b1cdbd2cSJim Jagielski             // immer noch neue (nested) Anfaenge ?
2042*b1cdbd2cSJim Jagielski             WW8SkipField( rPLCF );              // nested Field im Resultatteil
2043*b1cdbd2cSJim Jagielski             rF.bResNest = true;
2044*b1cdbd2cSJim Jagielski             if( !rPLCF.Get( rF.nLRes, pData ) )
2045*b1cdbd2cSJim Jagielski                 goto Err;
2046*b1cdbd2cSJim Jagielski         }
2047*b1cdbd2cSJim Jagielski         rF.nLen = rF.nLRes - rF.nSCode + 2; // nLRes ist noch die Endposition
2048*b1cdbd2cSJim Jagielski         rF.nLRes -= rF.nSRes;                       // nun: nLRes = Laenge
2049*b1cdbd2cSJim Jagielski         rF.nSRes++;                                 // Endpos encl. Marken
2050*b1cdbd2cSJim Jagielski         rF.nLRes--;
2051*b1cdbd2cSJim Jagielski 
2052*b1cdbd2cSJim Jagielski     }else{
2053*b1cdbd2cSJim Jagielski         rF.nLRes = 0;                               // Kein Result vorhanden
2054*b1cdbd2cSJim Jagielski         rF.nLen = rF.nSRes - rF.nSCode + 2;         // Gesamtlaenge
2055*b1cdbd2cSJim Jagielski     }
2056*b1cdbd2cSJim Jagielski 
2057*b1cdbd2cSJim Jagielski     rPLCF++;
2058*b1cdbd2cSJim Jagielski     if((((sal_uInt8*)pData)[0] & 0x1f ) == 0x15 )
2059*b1cdbd2cSJim Jagielski     {
2060*b1cdbd2cSJim Jagielski         // Field Ende ?
2061*b1cdbd2cSJim Jagielski         // INDEX-Fld hat Bit7 gesetzt!?!
2062*b1cdbd2cSJim Jagielski         rF.nOpt = ((sal_uInt8*)pData)[1];                // Ja -> Flags uebernehmen
2063*b1cdbd2cSJim Jagielski     }else{
2064*b1cdbd2cSJim Jagielski         rF.nId = 0;                                 // Nein -> Feld ungueltig
2065*b1cdbd2cSJim Jagielski     }
2066*b1cdbd2cSJim Jagielski 
2067*b1cdbd2cSJim Jagielski     rPLCF.SetIdx( nOldIdx );
2068*b1cdbd2cSJim Jagielski     return true;
2069*b1cdbd2cSJim Jagielski Err:
2070*b1cdbd2cSJim Jagielski     rPLCF.SetIdx( nOldIdx );
2071*b1cdbd2cSJim Jagielski     return false;
2072*b1cdbd2cSJim Jagielski }
2073*b1cdbd2cSJim Jagielski 
2074*b1cdbd2cSJim Jagielski 
2075*b1cdbd2cSJim Jagielski //-----------------------------------------
2076*b1cdbd2cSJim Jagielski 
2077*b1cdbd2cSJim Jagielski 
2078*b1cdbd2cSJim Jagielski // WW8ReadPString liest einen Pascal-String ein und gibt ihn zurueck. Der
2079*b1cdbd2cSJim Jagielski // Pascal- String hat am Ende ein \0, der aber im Laengenbyte nicht
2080*b1cdbd2cSJim Jagielski // mitgezaehlt wird.  Der Speicher fuer den Pascalstring wird alloziert.
WW8ReadPString(SvStream & rStrm,rtl_TextEncoding eEnc,bool bAtEndSeekRel1)2081*b1cdbd2cSJim Jagielski String WW8ReadPString(SvStream& rStrm, rtl_TextEncoding eEnc,
2082*b1cdbd2cSJim Jagielski     bool bAtEndSeekRel1)
2083*b1cdbd2cSJim Jagielski {
2084*b1cdbd2cSJim Jagielski     ByteString aByteStr;
2085*b1cdbd2cSJim Jagielski     sal_uInt8 b;
2086*b1cdbd2cSJim Jagielski     rStrm >> b;
2087*b1cdbd2cSJim Jagielski 
2088*b1cdbd2cSJim Jagielski     if (b)
2089*b1cdbd2cSJim Jagielski     {
2090*b1cdbd2cSJim Jagielski         // Alloc methode automatically sets Zero at the end
2091*b1cdbd2cSJim Jagielski         sal_Char*  pByteData = aByteStr.AllocBuffer( b );
2092*b1cdbd2cSJim Jagielski 
2093*b1cdbd2cSJim Jagielski         sal_uLong nWasRead = rStrm.Read( pByteData, b );
2094*b1cdbd2cSJim Jagielski         if( nWasRead != b )
2095*b1cdbd2cSJim Jagielski             aByteStr.ReleaseBufferAccess(static_cast<xub_StrLen>(nWasRead));
2096*b1cdbd2cSJim Jagielski     }
2097*b1cdbd2cSJim Jagielski 
2098*b1cdbd2cSJim Jagielski     if( bAtEndSeekRel1 )
2099*b1cdbd2cSJim Jagielski         rStrm.SeekRel( 1 ); // ueberspringe das Null-Byte am Ende.
2100*b1cdbd2cSJim Jagielski 
2101*b1cdbd2cSJim Jagielski 
2102*b1cdbd2cSJim Jagielski     return String( aByteStr, eEnc );
2103*b1cdbd2cSJim Jagielski }
2104*b1cdbd2cSJim Jagielski 
WW8Read_xstz(SvStream & rStrm,sal_uInt16 nChars,bool bAtEndSeekRel1)2105*b1cdbd2cSJim Jagielski String WW8Read_xstz(SvStream& rStrm, sal_uInt16 nChars, bool bAtEndSeekRel1)
2106*b1cdbd2cSJim Jagielski {
2107*b1cdbd2cSJim Jagielski     sal_uInt16 b;
2108*b1cdbd2cSJim Jagielski 
2109*b1cdbd2cSJim Jagielski     if( nChars )
2110*b1cdbd2cSJim Jagielski         b = nChars;
2111*b1cdbd2cSJim Jagielski     else
2112*b1cdbd2cSJim Jagielski         rStrm >> b;
2113*b1cdbd2cSJim Jagielski 
2114*b1cdbd2cSJim Jagielski     String aStr;
2115*b1cdbd2cSJim Jagielski     if (b)
2116*b1cdbd2cSJim Jagielski     {
2117*b1cdbd2cSJim Jagielski         // Alloc methode automatically sets Zero at the end
2118*b1cdbd2cSJim Jagielski         sal_Unicode* pData = aStr.AllocBuffer( b );
2119*b1cdbd2cSJim Jagielski 
2120*b1cdbd2cSJim Jagielski         sal_uLong nWasRead = rStrm.Read( (sal_Char*)pData, b * 2 );
2121*b1cdbd2cSJim Jagielski         if( nWasRead != static_cast<sal_uLong>(b*2) )
2122*b1cdbd2cSJim Jagielski         {
2123*b1cdbd2cSJim Jagielski             b = static_cast<sal_uInt16>(nWasRead / 2);
2124*b1cdbd2cSJim Jagielski             aStr.ReleaseBufferAccess( b );
2125*b1cdbd2cSJim Jagielski             pData = aStr.GetBufferAccess();
2126*b1cdbd2cSJim Jagielski         }
2127*b1cdbd2cSJim Jagielski 
2128*b1cdbd2cSJim Jagielski #ifdef OSL_BIGENDIAN
2129*b1cdbd2cSJim Jagielski         sal_uLong n;
2130*b1cdbd2cSJim Jagielski         sal_Unicode *pWork;
2131*b1cdbd2cSJim Jagielski         for( n = 0, pWork = pData; n < b; ++n, ++pWork )
2132*b1cdbd2cSJim Jagielski             *pWork = SWAPSHORT( *pWork );
2133*b1cdbd2cSJim Jagielski #endif // ifdef OSL_BIGENDIAN
2134*b1cdbd2cSJim Jagielski     }
2135*b1cdbd2cSJim Jagielski 
2136*b1cdbd2cSJim Jagielski     if( bAtEndSeekRel1 )
2137*b1cdbd2cSJim Jagielski         rStrm.SeekRel( 2 ); // ueberspringe das Null-Character am Ende.
2138*b1cdbd2cSJim Jagielski 
2139*b1cdbd2cSJim Jagielski     return aStr;
2140*b1cdbd2cSJim Jagielski }
2141*b1cdbd2cSJim Jagielski 
SafeReadString(ByteString & rStr,sal_uInt16 nLen,SvStream & rStrm)2142*b1cdbd2cSJim Jagielski sal_uLong SafeReadString(ByteString &rStr,sal_uInt16 nLen,SvStream &rStrm)
2143*b1cdbd2cSJim Jagielski {
2144*b1cdbd2cSJim Jagielski     sal_uLong nWasRead=0;
2145*b1cdbd2cSJim Jagielski     if (nLen)
2146*b1cdbd2cSJim Jagielski     {
2147*b1cdbd2cSJim Jagielski         nWasRead = rStrm.Read( rStr.AllocBuffer( nLen ), nLen);
2148*b1cdbd2cSJim Jagielski         if( nWasRead != nLen )
2149*b1cdbd2cSJim Jagielski             rStr.ReleaseBufferAccess(static_cast<xub_StrLen>(nWasRead));
2150*b1cdbd2cSJim Jagielski     }
2151*b1cdbd2cSJim Jagielski     return nWasRead;
2152*b1cdbd2cSJim Jagielski }
2153*b1cdbd2cSJim Jagielski 
WW8ReadString(SvStream & rStrm,String & rStr,WW8_CP nAktStartCp,long nTotalLen,rtl_TextEncoding eEnc) const2154*b1cdbd2cSJim Jagielski xub_StrLen WW8ScannerBase::WW8ReadString( SvStream& rStrm, String& rStr,
2155*b1cdbd2cSJim Jagielski     WW8_CP nAktStartCp, long nTotalLen, rtl_TextEncoding eEnc ) const
2156*b1cdbd2cSJim Jagielski {
2157*b1cdbd2cSJim Jagielski     // Klartext einlesen, der sich ueber mehrere Pieces erstrecken kann
2158*b1cdbd2cSJim Jagielski     rStr.Erase();
2159*b1cdbd2cSJim Jagielski 
2160*b1cdbd2cSJim Jagielski     long nTotalRead = 0;
2161*b1cdbd2cSJim Jagielski     WW8_CP nBehindTextCp = nAktStartCp + nTotalLen;
2162*b1cdbd2cSJim Jagielski     WW8_CP nNextPieceCp  = nBehindTextCp; // Initialisierung wichtig fuer Ver6
2163*b1cdbd2cSJim Jagielski     do
2164*b1cdbd2cSJim Jagielski     {
2165*b1cdbd2cSJim Jagielski         bool bIsUnicode, bPosOk;
2166*b1cdbd2cSJim Jagielski         WW8_FC fcAct = WW8Cp2Fc(nAktStartCp,&bIsUnicode,&nNextPieceCp,&bPosOk);
2167*b1cdbd2cSJim Jagielski 
2168*b1cdbd2cSJim Jagielski         // vermutlich uebers Dateiende hinaus gezielt, macht nix!
2169*b1cdbd2cSJim Jagielski         if( !bPosOk )
2170*b1cdbd2cSJim Jagielski             break;
2171*b1cdbd2cSJim Jagielski 
2172*b1cdbd2cSJim Jagielski         rStrm.Seek( fcAct );
2173*b1cdbd2cSJim Jagielski 
2174*b1cdbd2cSJim Jagielski         long nLen = ( (nNextPieceCp < nBehindTextCp) ? nNextPieceCp
2175*b1cdbd2cSJim Jagielski             : nBehindTextCp ) - nAktStartCp;
2176*b1cdbd2cSJim Jagielski 
2177*b1cdbd2cSJim Jagielski         if( 0 >= nLen )
2178*b1cdbd2cSJim Jagielski             break;
2179*b1cdbd2cSJim Jagielski 
2180*b1cdbd2cSJim Jagielski         if( nLen > USHRT_MAX - 1 )
2181*b1cdbd2cSJim Jagielski             nLen = USHRT_MAX - 1;
2182*b1cdbd2cSJim Jagielski 
2183*b1cdbd2cSJim Jagielski         if( bIsUnicode )
2184*b1cdbd2cSJim Jagielski             rStr.Append(WW8Read_xstz(rStrm, (sal_uInt16)nLen, false));
2185*b1cdbd2cSJim Jagielski         else
2186*b1cdbd2cSJim Jagielski         {
2187*b1cdbd2cSJim Jagielski             // Alloc method automatically sets Zero at the end
2188*b1cdbd2cSJim Jagielski             ByteString aByteStr;
2189*b1cdbd2cSJim Jagielski             SafeReadString(aByteStr,(sal_uInt16)nLen,rStrm);
2190*b1cdbd2cSJim Jagielski             rStr += String( aByteStr, eEnc );
2191*b1cdbd2cSJim Jagielski         }
2192*b1cdbd2cSJim Jagielski         nTotalRead  += nLen;
2193*b1cdbd2cSJim Jagielski         nAktStartCp += nLen;
2194*b1cdbd2cSJim Jagielski         if ( nTotalRead != rStr.Len() )
2195*b1cdbd2cSJim Jagielski             break;
2196*b1cdbd2cSJim Jagielski     }
2197*b1cdbd2cSJim Jagielski     while( nTotalRead < nTotalLen );
2198*b1cdbd2cSJim Jagielski 
2199*b1cdbd2cSJim Jagielski     return rStr.Len();
2200*b1cdbd2cSJim Jagielski }
2201*b1cdbd2cSJim Jagielski 
2202*b1cdbd2cSJim Jagielski //-----------------------------------------
2203*b1cdbd2cSJim Jagielski //              WW8PLCFspecial
2204*b1cdbd2cSJim Jagielski //-----------------------------------------
2205*b1cdbd2cSJim Jagielski 
2206*b1cdbd2cSJim Jagielski // Bei nStartPos < 0 wird das erste Element des PLCFs genommen
WW8PLCFspecial(SvStream * pSt,long nFilePos,long nPLCF,long nStruct,long nStartPos)2207*b1cdbd2cSJim Jagielski WW8PLCFspecial::WW8PLCFspecial(SvStream* pSt, long nFilePos, long nPLCF,
2208*b1cdbd2cSJim Jagielski     long nStruct, long nStartPos)
2209*b1cdbd2cSJim Jagielski     : nIdx(0), nStru(nStruct)
2210*b1cdbd2cSJim Jagielski {
2211*b1cdbd2cSJim Jagielski     nIMax = ( nPLCF - 4 ) / ( 4 + nStruct );
2212*b1cdbd2cSJim Jagielski     // Pointer auf Pos- u. Struct-Array
2213*b1cdbd2cSJim Jagielski     pPLCF_PosArray = new sal_Int32[ ( nPLCF + 3 ) / 4 ];
2214*b1cdbd2cSJim Jagielski 
2215*b1cdbd2cSJim Jagielski     long nOldPos = pSt->Tell();
2216*b1cdbd2cSJim Jagielski 
2217*b1cdbd2cSJim Jagielski     pSt->Seek( nFilePos );
2218*b1cdbd2cSJim Jagielski     pSt->Read( pPLCF_PosArray, nPLCF );
2219*b1cdbd2cSJim Jagielski #ifdef OSL_BIGENDIAN
2220*b1cdbd2cSJim Jagielski     for( nIdx = 0; nIdx <= nIMax; nIdx++ )
2221*b1cdbd2cSJim Jagielski         pPLCF_PosArray[nIdx] = SWAPLONG( pPLCF_PosArray[nIdx] );
2222*b1cdbd2cSJim Jagielski     nIdx = 0;
2223*b1cdbd2cSJim Jagielski #endif // OSL_BIGENDIAN
2224*b1cdbd2cSJim Jagielski     if( nStruct ) // Pointer auf Inhalts-Array
2225*b1cdbd2cSJim Jagielski         pPLCF_Contents = (sal_uInt8*)&pPLCF_PosArray[nIMax + 1];
2226*b1cdbd2cSJim Jagielski     else
2227*b1cdbd2cSJim Jagielski         pPLCF_Contents = 0;                         // kein Inhalt
2228*b1cdbd2cSJim Jagielski     if( nStartPos >= 0 )
2229*b1cdbd2cSJim Jagielski         SeekPos( nStartPos );
2230*b1cdbd2cSJim Jagielski 
2231*b1cdbd2cSJim Jagielski     pSt->Seek( nOldPos );
2232*b1cdbd2cSJim Jagielski }
2233*b1cdbd2cSJim Jagielski 
IsValid()2234*b1cdbd2cSJim Jagielski bool WW8PLCFspecial::IsValid()
2235*b1cdbd2cSJim Jagielski {
2236*b1cdbd2cSJim Jagielski     return IsPLCFPosArrayValid( pPLCF_PosArray, nIMax );
2237*b1cdbd2cSJim Jagielski }
2238*b1cdbd2cSJim Jagielski 
2239*b1cdbd2cSJim Jagielski // WW8PLCFspecial::SeekPos() stellt den WW8PLCFspecial auf die Stelle nPos, wobei auch noch der
2240*b1cdbd2cSJim Jagielski // Eintrag benutzt wird, der vor nPos beginnt und bis hinter nPos reicht.
2241*b1cdbd2cSJim Jagielski // geeignet fuer normale Attribute. Allerdings wird der Attributanfang nicht
2242*b1cdbd2cSJim Jagielski // auf die Position nPos korrigiert.
SeekPos(long nP)2243*b1cdbd2cSJim Jagielski bool WW8PLCFspecial::SeekPos(long nP)
2244*b1cdbd2cSJim Jagielski {
2245*b1cdbd2cSJim Jagielski     if( nP < pPLCF_PosArray[0] )
2246*b1cdbd2cSJim Jagielski     {
2247*b1cdbd2cSJim Jagielski         nIdx = 0;
2248*b1cdbd2cSJim Jagielski         return false;   // Not found: nP unterhalb kleinstem Eintrag
2249*b1cdbd2cSJim Jagielski     }
2250*b1cdbd2cSJim Jagielski 
2251*b1cdbd2cSJim Jagielski     // Search from beginning?
2252*b1cdbd2cSJim Jagielski     if( (1 > nIdx) || (nP < pPLCF_PosArray[ nIdx-1 ]) )
2253*b1cdbd2cSJim Jagielski         nIdx = 1;
2254*b1cdbd2cSJim Jagielski 
2255*b1cdbd2cSJim Jagielski     long nI   = nIdx ? nIdx : 1;
2256*b1cdbd2cSJim Jagielski     long nEnd = nIMax;
2257*b1cdbd2cSJim Jagielski 
2258*b1cdbd2cSJim Jagielski     for(int n = (1==nIdx ? 1 : 2); n; --n )
2259*b1cdbd2cSJim Jagielski     {
2260*b1cdbd2cSJim Jagielski         for( ; nI <=nEnd; ++nI)
2261*b1cdbd2cSJim Jagielski         {                                   // Suchen mit um 1 erhoehtem Index
2262*b1cdbd2cSJim Jagielski             if( nP < pPLCF_PosArray[nI] )
2263*b1cdbd2cSJim Jagielski             {                               // Position gefunden
2264*b1cdbd2cSJim Jagielski                 nIdx = nI - 1;              // nI - 1 ist der richtige Index
2265*b1cdbd2cSJim Jagielski                 return true;                // ... und fertig
2266*b1cdbd2cSJim Jagielski             }
2267*b1cdbd2cSJim Jagielski         }
2268*b1cdbd2cSJim Jagielski         nI   = 1;
2269*b1cdbd2cSJim Jagielski         nEnd = nIdx-1;
2270*b1cdbd2cSJim Jagielski     }
2271*b1cdbd2cSJim Jagielski     nIdx = nIMax;               // Nicht gefunden, groesser als alle Eintraege
2272*b1cdbd2cSJim Jagielski     return false;
2273*b1cdbd2cSJim Jagielski }
2274*b1cdbd2cSJim Jagielski 
2275*b1cdbd2cSJim Jagielski // WW8PLCFspecial::SeekPosExact() wie SeekPos(), aber es wird sichergestellt,
2276*b1cdbd2cSJim Jagielski // dass kein Attribut angeschnitten wird, d.h. das naechste gelieferte
2277*b1cdbd2cSJim Jagielski // Attribut beginnt auf oder hinter nPos. Wird benutzt fuer Felder +
2278*b1cdbd2cSJim Jagielski // Bookmarks.
SeekPosExact(long nP)2279*b1cdbd2cSJim Jagielski bool WW8PLCFspecial::SeekPosExact(long nP)
2280*b1cdbd2cSJim Jagielski {
2281*b1cdbd2cSJim Jagielski     if( nP < pPLCF_PosArray[0] )
2282*b1cdbd2cSJim Jagielski     {
2283*b1cdbd2cSJim Jagielski         nIdx = 0;
2284*b1cdbd2cSJim Jagielski         return false;       // Not found: nP unterhalb kleinstem Eintrag
2285*b1cdbd2cSJim Jagielski     }
2286*b1cdbd2cSJim Jagielski     // Search from beginning?
2287*b1cdbd2cSJim Jagielski     if( nP <=pPLCF_PosArray[nIdx] )
2288*b1cdbd2cSJim Jagielski         nIdx = 0;
2289*b1cdbd2cSJim Jagielski 
2290*b1cdbd2cSJim Jagielski     long nI   = nIdx ? nIdx-1 : 0;
2291*b1cdbd2cSJim Jagielski     long nEnd = nIMax;
2292*b1cdbd2cSJim Jagielski 
2293*b1cdbd2cSJim Jagielski     for(int n = (0==nIdx ? 1 : 2); n; --n )
2294*b1cdbd2cSJim Jagielski     {
2295*b1cdbd2cSJim Jagielski         for( ; nI < nEnd; ++nI)
2296*b1cdbd2cSJim Jagielski         {
2297*b1cdbd2cSJim Jagielski             if( nP <=pPLCF_PosArray[nI] )
2298*b1cdbd2cSJim Jagielski             {                           // Position gefunden
2299*b1cdbd2cSJim Jagielski                 nIdx = nI;              // nI     ist der richtige Index
2300*b1cdbd2cSJim Jagielski                 return true;            // ... und fertig
2301*b1cdbd2cSJim Jagielski             }
2302*b1cdbd2cSJim Jagielski         }
2303*b1cdbd2cSJim Jagielski         nI   = 0;
2304*b1cdbd2cSJim Jagielski         nEnd = nIdx;
2305*b1cdbd2cSJim Jagielski     }
2306*b1cdbd2cSJim Jagielski     nIdx = nIMax;               // Not found, groesser als alle Eintraege
2307*b1cdbd2cSJim Jagielski     return false;
2308*b1cdbd2cSJim Jagielski }
2309*b1cdbd2cSJim Jagielski 
Get(WW8_CP & rPos,void * & rpValue) const2310*b1cdbd2cSJim Jagielski bool WW8PLCFspecial::Get(WW8_CP& rPos, void*& rpValue) const
2311*b1cdbd2cSJim Jagielski {
2312*b1cdbd2cSJim Jagielski     return GetData( nIdx, rPos, rpValue );
2313*b1cdbd2cSJim Jagielski }
2314*b1cdbd2cSJim Jagielski 
GetData(long nInIdx,WW8_CP & rPos,void * & rpValue) const2315*b1cdbd2cSJim Jagielski bool WW8PLCFspecial::GetData(long nInIdx, WW8_CP& rPos, void*& rpValue) const
2316*b1cdbd2cSJim Jagielski {
2317*b1cdbd2cSJim Jagielski     if ( nInIdx >= nIMax )
2318*b1cdbd2cSJim Jagielski     {
2319*b1cdbd2cSJim Jagielski         rPos = WW8_CP_MAX;
2320*b1cdbd2cSJim Jagielski         return false;
2321*b1cdbd2cSJim Jagielski     }
2322*b1cdbd2cSJim Jagielski     rPos = pPLCF_PosArray[nInIdx];
2323*b1cdbd2cSJim Jagielski     rpValue = pPLCF_Contents ? (void*)&pPLCF_Contents[nInIdx * nStru] : 0;
2324*b1cdbd2cSJim Jagielski     return true;
2325*b1cdbd2cSJim Jagielski }
2326*b1cdbd2cSJim Jagielski 
2327*b1cdbd2cSJim Jagielski //-----------------------------------------
2328*b1cdbd2cSJim Jagielski //              WW8PLCF z.B. fuer SEPX
2329*b1cdbd2cSJim Jagielski //-----------------------------------------
2330*b1cdbd2cSJim Jagielski 
2331*b1cdbd2cSJim Jagielski // Ctor fuer *andere* als Fkps
2332*b1cdbd2cSJim Jagielski // Bei nStartPos < 0 wird das erste Element des PLCFs genommen
WW8PLCF(SvStream * pSt,WW8_FC nFilePos,sal_Int32 nPLCF,int nStruct,WW8_CP nStartPos)2333*b1cdbd2cSJim Jagielski WW8PLCF::WW8PLCF(
2334*b1cdbd2cSJim Jagielski     SvStream* pSt,
2335*b1cdbd2cSJim Jagielski     WW8_FC nFilePos,
2336*b1cdbd2cSJim Jagielski     sal_Int32 nPLCF,
2337*b1cdbd2cSJim Jagielski     int nStruct,
2338*b1cdbd2cSJim Jagielski     WW8_CP nStartPos )
2339*b1cdbd2cSJim Jagielski     : pPLCF_PosArray( 0 )
2340*b1cdbd2cSJim Jagielski     , pPLCF_Contents( 0 )
2341*b1cdbd2cSJim Jagielski     , nIMax( 0 )
2342*b1cdbd2cSJim Jagielski     , nIdx( 0 )
2343*b1cdbd2cSJim Jagielski     , nStru( nStruct )
2344*b1cdbd2cSJim Jagielski {
2345*b1cdbd2cSJim Jagielski     ASSERT( nPLCF, "WW8PLCF: nPLCF ist Null!" );
2346*b1cdbd2cSJim Jagielski 
2347*b1cdbd2cSJim Jagielski     nIMax = ( nPLCF - 4 ) / ( 4 + nStruct );
2348*b1cdbd2cSJim Jagielski 
2349*b1cdbd2cSJim Jagielski     ReadPLCF( pSt, nFilePos, nPLCF );
2350*b1cdbd2cSJim Jagielski 
2351*b1cdbd2cSJim Jagielski     if( nStartPos >= 0 )
2352*b1cdbd2cSJim Jagielski         SeekPos( nStartPos );
2353*b1cdbd2cSJim Jagielski }
2354*b1cdbd2cSJim Jagielski 
2355*b1cdbd2cSJim Jagielski // Ctor *nur* fuer Fkps
2356*b1cdbd2cSJim Jagielski // Die letzten 2 Parameter sind fuer PLCF.Chpx und PLCF.Papx noetig.  ist ncpN
2357*b1cdbd2cSJim Jagielski // != 0, dann wird ein unvollstaendiger PLCF vervollstaendigt.  Das ist bei
2358*b1cdbd2cSJim Jagielski // WW6 bei Resourcenmangel und bei WordPad (W95) immer noetig.  Bei nStartPos
2359*b1cdbd2cSJim Jagielski // < 0 wird das erste Element des PLCFs genommen
WW8PLCF(SvStream * pSt,WW8_FC nFilePos,sal_Int32 nPLCF,int nStruct,WW8_CP nStartPos,sal_Int32 nPN,sal_Int32 ncpN)2360*b1cdbd2cSJim Jagielski WW8PLCF::WW8PLCF( SvStream* pSt, WW8_FC nFilePos, sal_Int32 nPLCF, int nStruct,
2361*b1cdbd2cSJim Jagielski     WW8_CP nStartPos, sal_Int32 nPN, sal_Int32 ncpN ) : pPLCF_PosArray(0), nIdx(0),
2362*b1cdbd2cSJim Jagielski     nStru(nStruct)
2363*b1cdbd2cSJim Jagielski {
2364*b1cdbd2cSJim Jagielski     nIMax = ( nPLCF - 4 ) / ( 4 + nStruct );
2365*b1cdbd2cSJim Jagielski 
2366*b1cdbd2cSJim Jagielski     if( nIMax >= ncpN )
2367*b1cdbd2cSJim Jagielski         ReadPLCF( pSt, nFilePos, nPLCF );
2368*b1cdbd2cSJim Jagielski     else
2369*b1cdbd2cSJim Jagielski         GeneratePLCF( pSt, nPN, ncpN );
2370*b1cdbd2cSJim Jagielski 
2371*b1cdbd2cSJim Jagielski     if( nStartPos >= 0 )
2372*b1cdbd2cSJim Jagielski         SeekPos( nStartPos );
2373*b1cdbd2cSJim Jagielski }
2374*b1cdbd2cSJim Jagielski 
IsValid()2375*b1cdbd2cSJim Jagielski bool WW8PLCF::IsValid()
2376*b1cdbd2cSJim Jagielski {
2377*b1cdbd2cSJim Jagielski     return pPLCF_PosArray == 0
2378*b1cdbd2cSJim Jagielski            || IsPLCFPosArrayValid( pPLCF_PosArray, nIMax );
2379*b1cdbd2cSJim Jagielski }
2380*b1cdbd2cSJim Jagielski 
ReadPLCF(SvStream * pSt,WW8_FC nFilePos,sal_Int32 nPLCF)2381*b1cdbd2cSJim Jagielski void WW8PLCF::ReadPLCF( SvStream* pSt, WW8_FC nFilePos, sal_Int32 nPLCF )
2382*b1cdbd2cSJim Jagielski {
2383*b1cdbd2cSJim Jagielski     bool failure = false;
2384*b1cdbd2cSJim Jagielski 
2385*b1cdbd2cSJim Jagielski     // Pointer auf Pos-Array
2386*b1cdbd2cSJim Jagielski     pPLCF_PosArray = new WW8_CP[ ( nPLCF + 3 ) / 4 ];
2387*b1cdbd2cSJim Jagielski 
2388*b1cdbd2cSJim Jagielski     sal_Size nOldPos = pSt->Tell();
2389*b1cdbd2cSJim Jagielski 
2390*b1cdbd2cSJim Jagielski     pSt->Seek( nFilePos );
2391*b1cdbd2cSJim Jagielski     failure = pSt->GetError();
2392*b1cdbd2cSJim Jagielski 
2393*b1cdbd2cSJim Jagielski     if (!failure)
2394*b1cdbd2cSJim Jagielski     {
2395*b1cdbd2cSJim Jagielski         pSt->Read( pPLCF_PosArray, nPLCF );
2396*b1cdbd2cSJim Jagielski         failure = pSt->GetError();
2397*b1cdbd2cSJim Jagielski     }
2398*b1cdbd2cSJim Jagielski 
2399*b1cdbd2cSJim Jagielski     if (!failure)
2400*b1cdbd2cSJim Jagielski     {
2401*b1cdbd2cSJim Jagielski #ifdef OSL_BIGENDIAN
2402*b1cdbd2cSJim Jagielski         for( nIdx = 0; nIdx <= nIMax; nIdx++ )
2403*b1cdbd2cSJim Jagielski             pPLCF_PosArray[nIdx] = SWAPLONG( pPLCF_PosArray[nIdx] );
2404*b1cdbd2cSJim Jagielski         nIdx = 0;
2405*b1cdbd2cSJim Jagielski #endif // OSL_BIGENDIAN
2406*b1cdbd2cSJim Jagielski         // Pointer auf Inhalts-Array
2407*b1cdbd2cSJim Jagielski         pPLCF_Contents = (sal_uInt8*)&pPLCF_PosArray[nIMax + 1];
2408*b1cdbd2cSJim Jagielski     }
2409*b1cdbd2cSJim Jagielski 
2410*b1cdbd2cSJim Jagielski     pSt->Seek( nOldPos );
2411*b1cdbd2cSJim Jagielski 
2412*b1cdbd2cSJim Jagielski     ASSERT( !failure, "Document has corrupt PLCF, ignoring it" );
2413*b1cdbd2cSJim Jagielski 
2414*b1cdbd2cSJim Jagielski     if (failure)
2415*b1cdbd2cSJim Jagielski         MakeFailedPLCF();
2416*b1cdbd2cSJim Jagielski }
2417*b1cdbd2cSJim Jagielski 
MakeFailedPLCF()2418*b1cdbd2cSJim Jagielski void WW8PLCF::MakeFailedPLCF()
2419*b1cdbd2cSJim Jagielski {
2420*b1cdbd2cSJim Jagielski     nIMax = 0;
2421*b1cdbd2cSJim Jagielski     delete[] pPLCF_PosArray;
2422*b1cdbd2cSJim Jagielski     pPLCF_PosArray = new sal_Int32[2];
2423*b1cdbd2cSJim Jagielski     pPLCF_PosArray[0] = pPLCF_PosArray[1] = WW8_CP_MAX;
2424*b1cdbd2cSJim Jagielski     pPLCF_Contents = (sal_uInt8*)&pPLCF_PosArray[nIMax + 1];
2425*b1cdbd2cSJim Jagielski }
2426*b1cdbd2cSJim Jagielski 
GeneratePLCF(SvStream * pSt,sal_Int32 nPN,sal_Int32 ncpN)2427*b1cdbd2cSJim Jagielski void WW8PLCF::GeneratePLCF( SvStream* pSt, sal_Int32 nPN, sal_Int32 ncpN )
2428*b1cdbd2cSJim Jagielski {
2429*b1cdbd2cSJim Jagielski     ASSERT( nIMax < ncpN, "Pcl.Fkp: Warum ist PLCF zu gross ?" );
2430*b1cdbd2cSJim Jagielski 
2431*b1cdbd2cSJim Jagielski     bool failure = false;
2432*b1cdbd2cSJim Jagielski     nIMax = ncpN;
2433*b1cdbd2cSJim Jagielski 
2434*b1cdbd2cSJim Jagielski     if ((nIMax < 1) || (nIMax > (WW8_CP_MAX - 4)/6) || ((nPN + ncpN) > USHRT_MAX))
2435*b1cdbd2cSJim Jagielski         failure = true;
2436*b1cdbd2cSJim Jagielski 
2437*b1cdbd2cSJim Jagielski     if (!failure)
2438*b1cdbd2cSJim Jagielski     {
2439*b1cdbd2cSJim Jagielski         size_t nSiz = 6 * nIMax + 4;
2440*b1cdbd2cSJim Jagielski         size_t nElems = ( nSiz + 3 ) / 4;
2441*b1cdbd2cSJim Jagielski         pPLCF_PosArray = new sal_Int32[ nElems ]; // Pointer auf Pos-Array
2442*b1cdbd2cSJim Jagielski 
2443*b1cdbd2cSJim Jagielski         for (sal_Int32 i = 0; i < ncpN && !pSt->GetError(); ++i)
2444*b1cdbd2cSJim Jagielski         {
2445*b1cdbd2cSJim Jagielski             // Baue FC-Eintraege
2446*b1cdbd2cSJim Jagielski             pSt->Seek( ( nPN + i ) << 9 );  // erster FC-Eintrag jedes Fkp
2447*b1cdbd2cSJim Jagielski             WW8_CP nFc;
2448*b1cdbd2cSJim Jagielski             *pSt >> nFc;
2449*b1cdbd2cSJim Jagielski             pPLCF_PosArray[i] = nFc;
2450*b1cdbd2cSJim Jagielski         }
2451*b1cdbd2cSJim Jagielski 
2452*b1cdbd2cSJim Jagielski         failure = pSt->GetError();
2453*b1cdbd2cSJim Jagielski     }
2454*b1cdbd2cSJim Jagielski 
2455*b1cdbd2cSJim Jagielski     if (!failure)
2456*b1cdbd2cSJim Jagielski     {
2457*b1cdbd2cSJim Jagielski         sal_Size nLastFkpPos = ( ( nPN + nIMax - 1 ) << 9 );
2458*b1cdbd2cSJim Jagielski         pSt->Seek( nLastFkpPos + 511 );     // Anz. Fkp-Eintraege des letzten Fkp
2459*b1cdbd2cSJim Jagielski 
2460*b1cdbd2cSJim Jagielski         sal_uInt8 nb;
2461*b1cdbd2cSJim Jagielski         *pSt >> nb;
2462*b1cdbd2cSJim Jagielski         pSt->Seek( nLastFkpPos + nb * 4 );  // letzer FC-Eintrag des letzten Fkp
2463*b1cdbd2cSJim Jagielski 
2464*b1cdbd2cSJim Jagielski         WW8_CP nFc;
2465*b1cdbd2cSJim Jagielski         *pSt >> nFc;
2466*b1cdbd2cSJim Jagielski         pPLCF_PosArray[nIMax] = nFc;        // Ende des letzten Fkp
2467*b1cdbd2cSJim Jagielski 
2468*b1cdbd2cSJim Jagielski         failure = pSt->GetError();
2469*b1cdbd2cSJim Jagielski     }
2470*b1cdbd2cSJim Jagielski 
2471*b1cdbd2cSJim Jagielski     if (!failure)
2472*b1cdbd2cSJim Jagielski     {
2473*b1cdbd2cSJim Jagielski         // Pointer auf Inhalts-Array
2474*b1cdbd2cSJim Jagielski         pPLCF_Contents = (sal_uInt8*)&pPLCF_PosArray[nIMax + 1];
2475*b1cdbd2cSJim Jagielski         sal_uInt8* p = pPLCF_Contents;
2476*b1cdbd2cSJim Jagielski 
2477*b1cdbd2cSJim Jagielski         for (sal_Int32 i = 0; i < ncpN; ++i)         // Baue PNs
2478*b1cdbd2cSJim Jagielski         {
2479*b1cdbd2cSJim Jagielski             ShortToSVBT16(static_cast<sal_uInt16>(nPN + i), p);
2480*b1cdbd2cSJim Jagielski             p+=2;
2481*b1cdbd2cSJim Jagielski         }
2482*b1cdbd2cSJim Jagielski     }
2483*b1cdbd2cSJim Jagielski 
2484*b1cdbd2cSJim Jagielski     ASSERT( !failure, "Document has corrupt PLCF, ignoring it" );
2485*b1cdbd2cSJim Jagielski 
2486*b1cdbd2cSJim Jagielski     if (failure)
2487*b1cdbd2cSJim Jagielski         MakeFailedPLCF();
2488*b1cdbd2cSJim Jagielski }
2489*b1cdbd2cSJim Jagielski 
SeekPos(WW8_CP nPos)2490*b1cdbd2cSJim Jagielski bool WW8PLCF::SeekPos(WW8_CP nPos)
2491*b1cdbd2cSJim Jagielski {
2492*b1cdbd2cSJim Jagielski     WW8_CP nP = nPos;
2493*b1cdbd2cSJim Jagielski 
2494*b1cdbd2cSJim Jagielski     if( nP < pPLCF_PosArray[0] )
2495*b1cdbd2cSJim Jagielski     {
2496*b1cdbd2cSJim Jagielski         nIdx = 0;
2497*b1cdbd2cSJim Jagielski         // Nicht gefunden: nPos unterhalb kleinstem Eintrag
2498*b1cdbd2cSJim Jagielski         return false;
2499*b1cdbd2cSJim Jagielski     }
2500*b1cdbd2cSJim Jagielski 
2501*b1cdbd2cSJim Jagielski     // Search from beginning?
2502*b1cdbd2cSJim Jagielski     if( (1 > nIdx) || (nP < pPLCF_PosArray[ nIdx-1 ]) )
2503*b1cdbd2cSJim Jagielski         nIdx = 1;
2504*b1cdbd2cSJim Jagielski 
2505*b1cdbd2cSJim Jagielski     sal_Int32 nI   = nIdx ? nIdx : 1;
2506*b1cdbd2cSJim Jagielski     sal_Int32 nEnd = nIMax;
2507*b1cdbd2cSJim Jagielski 
2508*b1cdbd2cSJim Jagielski     for(int n = (1==nIdx ? 1 : 2); n; --n )
2509*b1cdbd2cSJim Jagielski     {
2510*b1cdbd2cSJim Jagielski         for( ; nI <=nEnd; ++nI)             // Suchen mit um 1 erhoehtem Index
2511*b1cdbd2cSJim Jagielski         {
2512*b1cdbd2cSJim Jagielski             if( nP < pPLCF_PosArray[nI] )   // Position gefunden
2513*b1cdbd2cSJim Jagielski             {
2514*b1cdbd2cSJim Jagielski                 nIdx = nI - 1;              // nI - 1 ist der richtige Index
2515*b1cdbd2cSJim Jagielski                 return true;                // ... und fertig
2516*b1cdbd2cSJim Jagielski             }
2517*b1cdbd2cSJim Jagielski         }
2518*b1cdbd2cSJim Jagielski         nI   = 1;
2519*b1cdbd2cSJim Jagielski         nEnd = nIdx-1;
2520*b1cdbd2cSJim Jagielski     }
2521*b1cdbd2cSJim Jagielski 
2522*b1cdbd2cSJim Jagielski     nIdx = nIMax;               // Nicht gefunden, groesser als alle Eintraege
2523*b1cdbd2cSJim Jagielski     return false;
2524*b1cdbd2cSJim Jagielski }
2525*b1cdbd2cSJim Jagielski 
Get(WW8_CP & rStart,WW8_CP & rEnd,void * & rpValue) const2526*b1cdbd2cSJim Jagielski bool WW8PLCF::Get(WW8_CP& rStart, WW8_CP& rEnd, void*& rpValue) const
2527*b1cdbd2cSJim Jagielski {
2528*b1cdbd2cSJim Jagielski     if ( nIdx >= nIMax )
2529*b1cdbd2cSJim Jagielski     {
2530*b1cdbd2cSJim Jagielski         rStart = rEnd = WW8_CP_MAX;
2531*b1cdbd2cSJim Jagielski         return false;
2532*b1cdbd2cSJim Jagielski     }
2533*b1cdbd2cSJim Jagielski     rStart = pPLCF_PosArray[ nIdx ];
2534*b1cdbd2cSJim Jagielski     rEnd   = pPLCF_PosArray[ nIdx + 1 ];
2535*b1cdbd2cSJim Jagielski     rpValue = (void*)&pPLCF_Contents[nIdx * nStru];
2536*b1cdbd2cSJim Jagielski     return true;
2537*b1cdbd2cSJim Jagielski }
2538*b1cdbd2cSJim Jagielski 
Where() const2539*b1cdbd2cSJim Jagielski WW8_CP WW8PLCF::Where() const
2540*b1cdbd2cSJim Jagielski {
2541*b1cdbd2cSJim Jagielski     if ( nIdx >= nIMax )
2542*b1cdbd2cSJim Jagielski         return WW8_CP_MAX;
2543*b1cdbd2cSJim Jagielski 
2544*b1cdbd2cSJim Jagielski     return pPLCF_PosArray[nIdx];
2545*b1cdbd2cSJim Jagielski }
2546*b1cdbd2cSJim Jagielski 
2547*b1cdbd2cSJim Jagielski //-----------------------------------------
2548*b1cdbd2cSJim Jagielski //              WW8PLCFpcd
2549*b1cdbd2cSJim Jagielski //-----------------------------------------
2550*b1cdbd2cSJim Jagielski 
WW8PLCFpcd(SvStream * pSt,long nFilePos,long nPLCF,long nStruct)2551*b1cdbd2cSJim Jagielski WW8PLCFpcd::WW8PLCFpcd( SvStream* pSt, long nFilePos, long nPLCF, long nStruct )
2552*b1cdbd2cSJim Jagielski     :nStru( nStruct )
2553*b1cdbd2cSJim Jagielski {
2554*b1cdbd2cSJim Jagielski     nIMax = ( nPLCF - 4 ) / ( 4 + nStruct );
2555*b1cdbd2cSJim Jagielski     pPLCF_PosArray = new sal_Int32[ ( nPLCF + 3 ) / 4 ];    // Pointer auf Pos-Array
2556*b1cdbd2cSJim Jagielski 
2557*b1cdbd2cSJim Jagielski     long nOldPos = pSt->Tell();
2558*b1cdbd2cSJim Jagielski 
2559*b1cdbd2cSJim Jagielski     pSt->Seek( nFilePos );
2560*b1cdbd2cSJim Jagielski     pSt->Read( pPLCF_PosArray, nPLCF );
2561*b1cdbd2cSJim Jagielski #ifdef OSL_BIGENDIAN
2562*b1cdbd2cSJim Jagielski     for( long nI = 0; nI <= nIMax; nI++ )
2563*b1cdbd2cSJim Jagielski       pPLCF_PosArray[nI] = SWAPLONG( pPLCF_PosArray[nI] );
2564*b1cdbd2cSJim Jagielski #endif // OSL_BIGENDIAN
2565*b1cdbd2cSJim Jagielski 
2566*b1cdbd2cSJim Jagielski     // Pointer auf Inhalts-Array
2567*b1cdbd2cSJim Jagielski     pPLCF_Contents = (sal_uInt8*)&pPLCF_PosArray[nIMax + 1];
2568*b1cdbd2cSJim Jagielski 
2569*b1cdbd2cSJim Jagielski     pSt->Seek( nOldPos );
2570*b1cdbd2cSJim Jagielski }
2571*b1cdbd2cSJim Jagielski 
IsValid()2572*b1cdbd2cSJim Jagielski bool WW8PLCFpcd::IsValid()
2573*b1cdbd2cSJim Jagielski {
2574*b1cdbd2cSJim Jagielski     return IsPLCFPosArrayValid( pPLCF_PosArray, nIMax );
2575*b1cdbd2cSJim Jagielski }
2576*b1cdbd2cSJim Jagielski 
2577*b1cdbd2cSJim Jagielski // Bei nStartPos < 0 wird das erste Element des PLCFs genommen
WW8PLCFpcd_Iter(WW8PLCFpcd & rPLCFpcd,long nStartPos)2578*b1cdbd2cSJim Jagielski WW8PLCFpcd_Iter::WW8PLCFpcd_Iter( WW8PLCFpcd& rPLCFpcd, long nStartPos )
2579*b1cdbd2cSJim Jagielski     :rPLCF( rPLCFpcd ), nIdx( 0 )
2580*b1cdbd2cSJim Jagielski {
2581*b1cdbd2cSJim Jagielski     if( nStartPos >= 0 )
2582*b1cdbd2cSJim Jagielski         SeekPos( nStartPos );
2583*b1cdbd2cSJim Jagielski }
2584*b1cdbd2cSJim Jagielski 
SeekPos(long nPos)2585*b1cdbd2cSJim Jagielski bool WW8PLCFpcd_Iter::SeekPos(long nPos)
2586*b1cdbd2cSJim Jagielski {
2587*b1cdbd2cSJim Jagielski     long nP = nPos;
2588*b1cdbd2cSJim Jagielski 
2589*b1cdbd2cSJim Jagielski     if( nP < rPLCF.pPLCF_PosArray[0] )
2590*b1cdbd2cSJim Jagielski     {
2591*b1cdbd2cSJim Jagielski         nIdx = 0;
2592*b1cdbd2cSJim Jagielski         return false;       // Nicht gefunden: nPos unterhalb kleinstem Eintrag
2593*b1cdbd2cSJim Jagielski     }
2594*b1cdbd2cSJim Jagielski     // Search from beginning?
2595*b1cdbd2cSJim Jagielski     if( (1 > nIdx) || (nP < rPLCF.pPLCF_PosArray[ nIdx-1 ]) )
2596*b1cdbd2cSJim Jagielski         nIdx = 1;
2597*b1cdbd2cSJim Jagielski 
2598*b1cdbd2cSJim Jagielski     long nI   = nIdx ? nIdx : 1;
2599*b1cdbd2cSJim Jagielski     long nEnd = rPLCF.nIMax;
2600*b1cdbd2cSJim Jagielski 
2601*b1cdbd2cSJim Jagielski     for(int n = (1==nIdx ? 1 : 2); n; --n )
2602*b1cdbd2cSJim Jagielski     {
2603*b1cdbd2cSJim Jagielski         for( ; nI <=nEnd; ++nI)
2604*b1cdbd2cSJim Jagielski         {                               // Suchen mit um 1 erhoehtem Index
2605*b1cdbd2cSJim Jagielski             if( nP < rPLCF.pPLCF_PosArray[nI] )
2606*b1cdbd2cSJim Jagielski             {                           // Position gefunden
2607*b1cdbd2cSJim Jagielski                 nIdx = nI - 1;          // nI - 1 ist der richtige Index
2608*b1cdbd2cSJim Jagielski                 return true;            // ... und fertig
2609*b1cdbd2cSJim Jagielski             }
2610*b1cdbd2cSJim Jagielski         }
2611*b1cdbd2cSJim Jagielski         nI   = 1;
2612*b1cdbd2cSJim Jagielski         nEnd = nIdx-1;
2613*b1cdbd2cSJim Jagielski     }
2614*b1cdbd2cSJim Jagielski     nIdx = rPLCF.nIMax;         // Nicht gefunden, groesser als alle Eintraege
2615*b1cdbd2cSJim Jagielski     return false;
2616*b1cdbd2cSJim Jagielski }
2617*b1cdbd2cSJim Jagielski 
Get(WW8_CP & rStart,WW8_CP & rEnd,void * & rpValue) const2618*b1cdbd2cSJim Jagielski bool WW8PLCFpcd_Iter::Get(WW8_CP& rStart, WW8_CP& rEnd, void*& rpValue) const
2619*b1cdbd2cSJim Jagielski {
2620*b1cdbd2cSJim Jagielski     if( nIdx >= rPLCF.nIMax )
2621*b1cdbd2cSJim Jagielski     {
2622*b1cdbd2cSJim Jagielski         rStart = rEnd = WW8_CP_MAX;
2623*b1cdbd2cSJim Jagielski         return false;
2624*b1cdbd2cSJim Jagielski     }
2625*b1cdbd2cSJim Jagielski     rStart = rPLCF.pPLCF_PosArray[nIdx];
2626*b1cdbd2cSJim Jagielski     rEnd = rPLCF.pPLCF_PosArray[nIdx + 1];
2627*b1cdbd2cSJim Jagielski     rpValue = (void*)&rPLCF.pPLCF_Contents[nIdx * rPLCF.nStru];
2628*b1cdbd2cSJim Jagielski     return true;
2629*b1cdbd2cSJim Jagielski }
2630*b1cdbd2cSJim Jagielski 
Where() const2631*b1cdbd2cSJim Jagielski sal_Int32 WW8PLCFpcd_Iter::Where() const
2632*b1cdbd2cSJim Jagielski {
2633*b1cdbd2cSJim Jagielski     if ( nIdx >= rPLCF.nIMax )
2634*b1cdbd2cSJim Jagielski         return SAL_MAX_INT32;
2635*b1cdbd2cSJim Jagielski 
2636*b1cdbd2cSJim Jagielski     return rPLCF.pPLCF_PosArray[nIdx];
2637*b1cdbd2cSJim Jagielski }
2638*b1cdbd2cSJim Jagielski 
2639*b1cdbd2cSJim Jagielski //-----------------------------------------
operator <(const WW8PLCFx_Fc_FKP::WW8Fkp::Entry & rSecond) const2640*b1cdbd2cSJim Jagielski bool WW8PLCFx_Fc_FKP::WW8Fkp::Entry::operator<
2641*b1cdbd2cSJim Jagielski     (const WW8PLCFx_Fc_FKP::WW8Fkp::Entry& rSecond) const
2642*b1cdbd2cSJim Jagielski {
2643*b1cdbd2cSJim Jagielski     return (mnFC < rSecond.mnFC);
2644*b1cdbd2cSJim Jagielski }
2645*b1cdbd2cSJim Jagielski 
IsReplaceAllSprm(sal_uInt16 nSpId)2646*b1cdbd2cSJim Jagielski bool IsReplaceAllSprm(sal_uInt16 nSpId)
2647*b1cdbd2cSJim Jagielski {
2648*b1cdbd2cSJim Jagielski     return (0x6645 == nSpId || 0x6646 == nSpId);
2649*b1cdbd2cSJim Jagielski }
2650*b1cdbd2cSJim Jagielski 
IsExpandableSprm(sal_uInt16 nSpId)2651*b1cdbd2cSJim Jagielski bool IsExpandableSprm(sal_uInt16 nSpId)
2652*b1cdbd2cSJim Jagielski {
2653*b1cdbd2cSJim Jagielski     return 0x646B == nSpId;
2654*b1cdbd2cSJim Jagielski }
2655*b1cdbd2cSJim Jagielski 
WW8Fkp(ww::WordVersion eVersion,SvStream * pSt,SvStream * pDataSt,long _nFilePos,long nItemSiz,ePLCFT ePl,WW8_FC nStartFc)2656*b1cdbd2cSJim Jagielski WW8PLCFx_Fc_FKP::WW8Fkp::WW8Fkp(ww::WordVersion eVersion, SvStream* pSt,
2657*b1cdbd2cSJim Jagielski     SvStream* pDataSt, long _nFilePos, long nItemSiz, ePLCFT ePl,
2658*b1cdbd2cSJim Jagielski     WW8_FC nStartFc)
2659*b1cdbd2cSJim Jagielski     : nItemSize(nItemSiz), nFilePos(_nFilePos),  mnIdx(0), ePLCF(ePl),
2660*b1cdbd2cSJim Jagielski     maSprmParser(eVersion)
2661*b1cdbd2cSJim Jagielski {
2662*b1cdbd2cSJim Jagielski     long nOldPos = pSt->Tell();
2663*b1cdbd2cSJim Jagielski 
2664*b1cdbd2cSJim Jagielski     pSt->Seek(nFilePos);
2665*b1cdbd2cSJim Jagielski     pSt->Read(maRawData, 512);
2666*b1cdbd2cSJim Jagielski     mnIMax = maRawData[511];
2667*b1cdbd2cSJim Jagielski 
2668*b1cdbd2cSJim Jagielski     sal_uInt8 *pStart = maRawData;
2669*b1cdbd2cSJim Jagielski     // Pointer to Offset-Location in maRawData
2670*b1cdbd2cSJim Jagielski     sal_uInt8* pOfs = maRawData + (mnIMax + 1) * 4;
2671*b1cdbd2cSJim Jagielski 
2672*b1cdbd2cSJim Jagielski     for (mnIdx = 0; mnIdx < mnIMax; ++mnIdx)
2673*b1cdbd2cSJim Jagielski     {
2674*b1cdbd2cSJim Jagielski         unsigned int nOfs = (*(pOfs + mnIdx * nItemSize)) * 2;
2675*b1cdbd2cSJim Jagielski         Entry aEntry(Get_Long(pStart));
2676*b1cdbd2cSJim Jagielski 
2677*b1cdbd2cSJim Jagielski         if (nOfs)
2678*b1cdbd2cSJim Jagielski         {
2679*b1cdbd2cSJim Jagielski             switch (ePLCF)
2680*b1cdbd2cSJim Jagielski             {
2681*b1cdbd2cSJim Jagielski                 case CHP:
2682*b1cdbd2cSJim Jagielski                     aEntry.mnLen  = maRawData[nOfs];
2683*b1cdbd2cSJim Jagielski                     aEntry.mpData = maRawData + nOfs + 1;
2684*b1cdbd2cSJim Jagielski 
2685*b1cdbd2cSJim Jagielski                     if (aEntry.mnLen && eVersion == ww::eWW2)
2686*b1cdbd2cSJim Jagielski                     {
2687*b1cdbd2cSJim Jagielski                         Word2CHPX aChpx = ReadWord2Chpx(*pSt, nFilePos + nOfs + 1, static_cast< sal_uInt8 >(aEntry.mnLen));
2688*b1cdbd2cSJim Jagielski                         std::vector<sal_uInt8> aSprms = ChpxToSprms(aChpx);
2689*b1cdbd2cSJim Jagielski                         aEntry.mnLen = static_cast< sal_uInt16 >(aSprms.size());
2690*b1cdbd2cSJim Jagielski                         if (aEntry.mnLen)
2691*b1cdbd2cSJim Jagielski                         {
2692*b1cdbd2cSJim Jagielski                             aEntry.mpData = new sal_uInt8[aEntry.mnLen];
2693*b1cdbd2cSJim Jagielski                             memcpy(aEntry.mpData, &(aSprms[0]), aEntry.mnLen);
2694*b1cdbd2cSJim Jagielski                             aEntry.mbMustDelete = true;
2695*b1cdbd2cSJim Jagielski                         }
2696*b1cdbd2cSJim Jagielski                     }
2697*b1cdbd2cSJim Jagielski 
2698*b1cdbd2cSJim Jagielski                     break;
2699*b1cdbd2cSJim Jagielski                 case PAP:
2700*b1cdbd2cSJim Jagielski                     {
2701*b1cdbd2cSJim Jagielski                         sal_uInt8 nDelta = 0;
2702*b1cdbd2cSJim Jagielski 
2703*b1cdbd2cSJim Jagielski                         aEntry.mnLen = maRawData[nOfs];
2704*b1cdbd2cSJim Jagielski                         if (IsEightPlus(eVersion) && !aEntry.mnLen)
2705*b1cdbd2cSJim Jagielski                         {
2706*b1cdbd2cSJim Jagielski                             aEntry.mnLen = maRawData[nOfs+1];
2707*b1cdbd2cSJim Jagielski                             nDelta++;
2708*b1cdbd2cSJim Jagielski                         }
2709*b1cdbd2cSJim Jagielski 
2710*b1cdbd2cSJim Jagielski                         aEntry.mnLen *= 2;
2711*b1cdbd2cSJim Jagielski 
2712*b1cdbd2cSJim Jagielski                         //stylecode, std/istd
2713*b1cdbd2cSJim Jagielski                         if (eVersion == ww::eWW2)
2714*b1cdbd2cSJim Jagielski                         {
2715*b1cdbd2cSJim Jagielski                             aEntry.mnIStd = *(maRawData+nOfs+1+nDelta);
2716*b1cdbd2cSJim Jagielski                             aEntry.mnLen--;  //style code
2717*b1cdbd2cSJim Jagielski                             aEntry.mnLen-=6; //PHE
2718*b1cdbd2cSJim Jagielski                             //skipi stc, len byte + 6 byte PHE
2719*b1cdbd2cSJim Jagielski                             aEntry.mpData = maRawData + nOfs + 8;
2720*b1cdbd2cSJim Jagielski                         }
2721*b1cdbd2cSJim Jagielski                         else
2722*b1cdbd2cSJim Jagielski                         {
2723*b1cdbd2cSJim Jagielski                             aEntry.mnIStd = SVBT16ToShort(maRawData+nOfs+1+nDelta);
2724*b1cdbd2cSJim Jagielski                             aEntry.mnLen-=2; //istd
2725*b1cdbd2cSJim Jagielski                             //skip istd, len byte + optional extra len byte
2726*b1cdbd2cSJim Jagielski                             aEntry.mpData = maRawData + nOfs + 3 + nDelta;
2727*b1cdbd2cSJim Jagielski                         }
2728*b1cdbd2cSJim Jagielski 
2729*b1cdbd2cSJim Jagielski                         sal_uInt16 nSpId = aEntry.mnLen ? maSprmParser.GetSprmId(aEntry.mpData) : 0;
2730*b1cdbd2cSJim Jagielski 
2731*b1cdbd2cSJim Jagielski                         /*
2732*b1cdbd2cSJim Jagielski                          If we replace then we throw away the old data, if we
2733*b1cdbd2cSJim Jagielski                          are expanding, then we tack the old data onto the end
2734*b1cdbd2cSJim Jagielski                          of the new data
2735*b1cdbd2cSJim Jagielski                         */
2736*b1cdbd2cSJim Jagielski                         bool bExpand = IsExpandableSprm(nSpId);
2737*b1cdbd2cSJim Jagielski                         if (IsReplaceAllSprm(nSpId) || bExpand)
2738*b1cdbd2cSJim Jagielski                         {
2739*b1cdbd2cSJim Jagielski                             sal_uInt16 nOrigLen = bExpand ? aEntry.mnLen : 0;
2740*b1cdbd2cSJim Jagielski                             sal_uInt8 *pOrigData = bExpand ? aEntry.mpData : 0;
2741*b1cdbd2cSJim Jagielski 
2742*b1cdbd2cSJim Jagielski                             sal_uInt32 nCurr = pDataSt->Tell();
2743*b1cdbd2cSJim Jagielski 
2744*b1cdbd2cSJim Jagielski                             sal_uInt32 nPos = SVBT32ToUInt32(aEntry.mpData + 2);
2745*b1cdbd2cSJim Jagielski                             pDataSt->Seek(nPos);
2746*b1cdbd2cSJim Jagielski                             *pDataSt >> aEntry.mnLen;
2747*b1cdbd2cSJim Jagielski                             aEntry.mpData =
2748*b1cdbd2cSJim Jagielski                                 new sal_uInt8[aEntry.mnLen + nOrigLen];
2749*b1cdbd2cSJim Jagielski                             aEntry.mbMustDelete = true;
2750*b1cdbd2cSJim Jagielski                             pDataSt->Read(aEntry.mpData, aEntry.mnLen);
2751*b1cdbd2cSJim Jagielski 
2752*b1cdbd2cSJim Jagielski                             pDataSt->Seek( nCurr );
2753*b1cdbd2cSJim Jagielski 
2754*b1cdbd2cSJim Jagielski                             if (pOrigData)
2755*b1cdbd2cSJim Jagielski                             {
2756*b1cdbd2cSJim Jagielski                                 memcpy(aEntry.mpData + aEntry.mnLen,
2757*b1cdbd2cSJim Jagielski                                     pOrigData, nOrigLen);
2758*b1cdbd2cSJim Jagielski                                 aEntry.mnLen = aEntry.mnLen + nOrigLen;
2759*b1cdbd2cSJim Jagielski                             }
2760*b1cdbd2cSJim Jagielski                         }
2761*b1cdbd2cSJim Jagielski                     }
2762*b1cdbd2cSJim Jagielski                     break;
2763*b1cdbd2cSJim Jagielski                 default:
2764*b1cdbd2cSJim Jagielski                     ASSERT(false, "sweet god, what have you done!");
2765*b1cdbd2cSJim Jagielski                     break;
2766*b1cdbd2cSJim Jagielski             }
2767*b1cdbd2cSJim Jagielski         }
2768*b1cdbd2cSJim Jagielski 
2769*b1cdbd2cSJim Jagielski         maEntries.push_back(aEntry);
2770*b1cdbd2cSJim Jagielski     }
2771*b1cdbd2cSJim Jagielski 
2772*b1cdbd2cSJim Jagielski     //one more FC than grrpl entries
2773*b1cdbd2cSJim Jagielski     maEntries.push_back(Entry(Get_Long(pStart)));
2774*b1cdbd2cSJim Jagielski 
2775*b1cdbd2cSJim Jagielski     //#104773#, we expect them sorted, but it appears possible
2776*b1cdbd2cSJim Jagielski     //for them to arive unsorted
2777*b1cdbd2cSJim Jagielski     std::sort(maEntries.begin(), maEntries.end());
2778*b1cdbd2cSJim Jagielski 
2779*b1cdbd2cSJim Jagielski     mnIdx = 0;
2780*b1cdbd2cSJim Jagielski 
2781*b1cdbd2cSJim Jagielski     if (nStartFc >= 0)
2782*b1cdbd2cSJim Jagielski         SeekPos(nStartFc);
2783*b1cdbd2cSJim Jagielski 
2784*b1cdbd2cSJim Jagielski     pSt->Seek(nOldPos);
2785*b1cdbd2cSJim Jagielski }
2786*b1cdbd2cSJim Jagielski 
Entry(const Entry & rEntry)2787*b1cdbd2cSJim Jagielski WW8PLCFx_Fc_FKP::WW8Fkp::Entry::Entry(const Entry &rEntry)
2788*b1cdbd2cSJim Jagielski     : mnFC(rEntry.mnFC), mnLen(rEntry.mnLen), mnIStd(rEntry.mnIStd),
2789*b1cdbd2cSJim Jagielski     mbMustDelete(rEntry.mbMustDelete)
2790*b1cdbd2cSJim Jagielski {
2791*b1cdbd2cSJim Jagielski     if (mbMustDelete)
2792*b1cdbd2cSJim Jagielski     {
2793*b1cdbd2cSJim Jagielski         mpData = new sal_uInt8[mnLen];
2794*b1cdbd2cSJim Jagielski         memcpy(mpData, rEntry.mpData, mnLen);
2795*b1cdbd2cSJim Jagielski     }
2796*b1cdbd2cSJim Jagielski     else
2797*b1cdbd2cSJim Jagielski         mpData = rEntry.mpData;
2798*b1cdbd2cSJim Jagielski }
2799*b1cdbd2cSJim Jagielski 
2800*b1cdbd2cSJim Jagielski WW8PLCFx_Fc_FKP::WW8Fkp::Entry&
operator =(const Entry & rEntry)2801*b1cdbd2cSJim Jagielski     WW8PLCFx_Fc_FKP::WW8Fkp::Entry::operator=(const Entry &rEntry)
2802*b1cdbd2cSJim Jagielski {
2803*b1cdbd2cSJim Jagielski     if (mbMustDelete)
2804*b1cdbd2cSJim Jagielski         delete[] mpData;
2805*b1cdbd2cSJim Jagielski 
2806*b1cdbd2cSJim Jagielski     mnFC = rEntry.mnFC;
2807*b1cdbd2cSJim Jagielski     mnLen = rEntry.mnLen;
2808*b1cdbd2cSJim Jagielski     mnIStd = rEntry.mnIStd;
2809*b1cdbd2cSJim Jagielski     mbMustDelete = rEntry.mbMustDelete;
2810*b1cdbd2cSJim Jagielski 
2811*b1cdbd2cSJim Jagielski     if (mbMustDelete)
2812*b1cdbd2cSJim Jagielski     {
2813*b1cdbd2cSJim Jagielski         mpData = new sal_uInt8[mnLen];
2814*b1cdbd2cSJim Jagielski         memcpy(mpData, rEntry.mpData, mnLen);
2815*b1cdbd2cSJim Jagielski     }
2816*b1cdbd2cSJim Jagielski     else
2817*b1cdbd2cSJim Jagielski         mpData = rEntry.mpData;
2818*b1cdbd2cSJim Jagielski     return *this;
2819*b1cdbd2cSJim Jagielski }
2820*b1cdbd2cSJim Jagielski 
~Entry()2821*b1cdbd2cSJim Jagielski WW8PLCFx_Fc_FKP::WW8Fkp::Entry::~Entry()
2822*b1cdbd2cSJim Jagielski {
2823*b1cdbd2cSJim Jagielski     if (mbMustDelete)
2824*b1cdbd2cSJim Jagielski         delete[] mpData;
2825*b1cdbd2cSJim Jagielski }
2826*b1cdbd2cSJim Jagielski 
Reset(WW8_FC nFc)2827*b1cdbd2cSJim Jagielski void WW8PLCFx_Fc_FKP::WW8Fkp::Reset(WW8_FC nFc)
2828*b1cdbd2cSJim Jagielski {
2829*b1cdbd2cSJim Jagielski     SetIdx(0);
2830*b1cdbd2cSJim Jagielski     if (nFc >= 0)
2831*b1cdbd2cSJim Jagielski         SeekPos(nFc);
2832*b1cdbd2cSJim Jagielski }
2833*b1cdbd2cSJim Jagielski 
SeekPos(WW8_FC nFc)2834*b1cdbd2cSJim Jagielski bool WW8PLCFx_Fc_FKP::WW8Fkp::SeekPos(WW8_FC nFc)
2835*b1cdbd2cSJim Jagielski {
2836*b1cdbd2cSJim Jagielski     if (nFc < maEntries[0].mnFC)
2837*b1cdbd2cSJim Jagielski     {
2838*b1cdbd2cSJim Jagielski         mnIdx = 0;
2839*b1cdbd2cSJim Jagielski         return false;       // Nicht gefunden: nPos unterhalb kleinstem Eintrag
2840*b1cdbd2cSJim Jagielski     }
2841*b1cdbd2cSJim Jagielski 
2842*b1cdbd2cSJim Jagielski     // Search from beginning?
2843*b1cdbd2cSJim Jagielski     if ((1 > mnIdx) || (nFc < maEntries[mnIdx-1].mnFC))
2844*b1cdbd2cSJim Jagielski         mnIdx = 1;
2845*b1cdbd2cSJim Jagielski 
2846*b1cdbd2cSJim Jagielski     sal_uInt8 nI   = mnIdx ? mnIdx : 1;
2847*b1cdbd2cSJim Jagielski     sal_uInt8 nEnd = mnIMax;
2848*b1cdbd2cSJim Jagielski 
2849*b1cdbd2cSJim Jagielski     for(sal_uInt8 n = (1==mnIdx ? 1 : 2); n; --n )
2850*b1cdbd2cSJim Jagielski     {
2851*b1cdbd2cSJim Jagielski         for( ; nI <=nEnd; ++nI)
2852*b1cdbd2cSJim Jagielski         {                               // Suchen mit um 1 erhoehtem Index
2853*b1cdbd2cSJim Jagielski             if (nFc < maEntries[nI].mnFC)
2854*b1cdbd2cSJim Jagielski             {                           // Position gefunden
2855*b1cdbd2cSJim Jagielski                 mnIdx = nI - 1;          // nI - 1 ist der richtige Index
2856*b1cdbd2cSJim Jagielski                 return true;            // ... und fertig
2857*b1cdbd2cSJim Jagielski             }
2858*b1cdbd2cSJim Jagielski         }
2859*b1cdbd2cSJim Jagielski         nI = 1;
2860*b1cdbd2cSJim Jagielski         nEnd = mnIdx-1;
2861*b1cdbd2cSJim Jagielski     }
2862*b1cdbd2cSJim Jagielski     mnIdx = mnIMax;               // Nicht gefunden, groesser als alle Eintraege
2863*b1cdbd2cSJim Jagielski     return false;
2864*b1cdbd2cSJim Jagielski }
2865*b1cdbd2cSJim Jagielski 
Get(WW8_FC & rStart,WW8_FC & rEnd,sal_Int32 & rLen) const2866*b1cdbd2cSJim Jagielski sal_uInt8* WW8PLCFx_Fc_FKP::WW8Fkp::Get(WW8_FC& rStart, WW8_FC& rEnd, sal_Int32& rLen)
2867*b1cdbd2cSJim Jagielski     const
2868*b1cdbd2cSJim Jagielski {
2869*b1cdbd2cSJim Jagielski     rLen = 0;
2870*b1cdbd2cSJim Jagielski 
2871*b1cdbd2cSJim Jagielski     if (mnIdx >= mnIMax)
2872*b1cdbd2cSJim Jagielski     {
2873*b1cdbd2cSJim Jagielski         rStart = WW8_FC_MAX;
2874*b1cdbd2cSJim Jagielski         return 0;
2875*b1cdbd2cSJim Jagielski     }
2876*b1cdbd2cSJim Jagielski 
2877*b1cdbd2cSJim Jagielski     rStart = maEntries[mnIdx].mnFC;
2878*b1cdbd2cSJim Jagielski     rEnd   = maEntries[mnIdx + 1].mnFC;
2879*b1cdbd2cSJim Jagielski 
2880*b1cdbd2cSJim Jagielski     sal_uInt8* pSprms = GetLenAndIStdAndSprms( rLen );
2881*b1cdbd2cSJim Jagielski     return pSprms;
2882*b1cdbd2cSJim Jagielski }
2883*b1cdbd2cSJim Jagielski 
SetIdx(sal_uInt8 nI)2884*b1cdbd2cSJim Jagielski bool WW8PLCFx_Fc_FKP::WW8Fkp::SetIdx(sal_uInt8 nI)
2885*b1cdbd2cSJim Jagielski {
2886*b1cdbd2cSJim Jagielski     if (nI < mnIMax)
2887*b1cdbd2cSJim Jagielski     {
2888*b1cdbd2cSJim Jagielski         mnIdx = nI;
2889*b1cdbd2cSJim Jagielski         return true;
2890*b1cdbd2cSJim Jagielski     }
2891*b1cdbd2cSJim Jagielski     return false;
2892*b1cdbd2cSJim Jagielski }
2893*b1cdbd2cSJim Jagielski 
GetLenAndIStdAndSprms(sal_Int32 & rLen) const2894*b1cdbd2cSJim Jagielski sal_uInt8* WW8PLCFx_Fc_FKP::WW8Fkp::GetLenAndIStdAndSprms(sal_Int32& rLen) const
2895*b1cdbd2cSJim Jagielski {
2896*b1cdbd2cSJim Jagielski     rLen = maEntries[mnIdx].mnLen;
2897*b1cdbd2cSJim Jagielski     return maEntries[mnIdx].mpData;
2898*b1cdbd2cSJim Jagielski }
2899*b1cdbd2cSJim Jagielski 
HasSprm(sal_uInt16 nId)2900*b1cdbd2cSJim Jagielski const sal_uInt8* WW8PLCFx_Fc_FKP::WW8Fkp::HasSprm( sal_uInt16 nId )
2901*b1cdbd2cSJim Jagielski {
2902*b1cdbd2cSJim Jagielski     if (mnIdx >= mnIMax)
2903*b1cdbd2cSJim Jagielski         return 0;
2904*b1cdbd2cSJim Jagielski 
2905*b1cdbd2cSJim Jagielski     sal_Int32 nLen;
2906*b1cdbd2cSJim Jagielski     sal_uInt8* pSprms = GetLenAndIStdAndSprms( nLen );
2907*b1cdbd2cSJim Jagielski 
2908*b1cdbd2cSJim Jagielski     WW8SprmIter aIter(pSprms, nLen, maSprmParser);
2909*b1cdbd2cSJim Jagielski     return aIter.FindSprm(nId);
2910*b1cdbd2cSJim Jagielski }
2911*b1cdbd2cSJim Jagielski 
HasSprm(sal_uInt16 nId,std::vector<const sal_uInt8 * > & rResult)2912*b1cdbd2cSJim Jagielski bool WW8PLCFx_Fc_FKP::WW8Fkp::HasSprm(sal_uInt16 nId,
2913*b1cdbd2cSJim Jagielski     std::vector<const sal_uInt8 *> &rResult)
2914*b1cdbd2cSJim Jagielski {
2915*b1cdbd2cSJim Jagielski     if (mnIdx >= mnIMax)
2916*b1cdbd2cSJim Jagielski        return false;
2917*b1cdbd2cSJim Jagielski 
2918*b1cdbd2cSJim Jagielski     sal_Int32 nLen;
2919*b1cdbd2cSJim Jagielski     sal_uInt8* pSprms = GetLenAndIStdAndSprms( nLen );
2920*b1cdbd2cSJim Jagielski 
2921*b1cdbd2cSJim Jagielski     WW8SprmIter aIter(pSprms, nLen, maSprmParser);
2922*b1cdbd2cSJim Jagielski 
2923*b1cdbd2cSJim Jagielski     while(aIter.GetSprms())
2924*b1cdbd2cSJim Jagielski     {
2925*b1cdbd2cSJim Jagielski         if (aIter.GetAktId() == nId)
2926*b1cdbd2cSJim Jagielski             rResult.push_back(aIter.GetAktParams());
2927*b1cdbd2cSJim Jagielski         aIter++;
2928*b1cdbd2cSJim Jagielski     };
2929*b1cdbd2cSJim Jagielski     return !rResult.empty();
2930*b1cdbd2cSJim Jagielski }
2931*b1cdbd2cSJim Jagielski 
2932*b1cdbd2cSJim Jagielski //-----------------------------------------
GetSprms(WW8PLCFxDesc * p)2933*b1cdbd2cSJim Jagielski void WW8PLCFx::GetSprms( WW8PLCFxDesc* p )
2934*b1cdbd2cSJim Jagielski {
2935*b1cdbd2cSJim Jagielski     ASSERT( !this, "Falsches GetSprms gerufen" );
2936*b1cdbd2cSJim Jagielski     p->nStartPos = p->nEndPos = WW8_CP_MAX;
2937*b1cdbd2cSJim Jagielski     p->pMemPos = 0;
2938*b1cdbd2cSJim Jagielski     p->nSprmsLen = 0;
2939*b1cdbd2cSJim Jagielski     p->bRealLineEnd = false;
2940*b1cdbd2cSJim Jagielski     return;
2941*b1cdbd2cSJim Jagielski }
2942*b1cdbd2cSJim Jagielski 
GetNoSprms(WW8_CP & rStart,WW8_CP & rEnd,sal_Int32 & rLen)2943*b1cdbd2cSJim Jagielski long WW8PLCFx::GetNoSprms( WW8_CP& rStart, WW8_CP& rEnd, sal_Int32& rLen )
2944*b1cdbd2cSJim Jagielski {
2945*b1cdbd2cSJim Jagielski     ASSERT( !this, "Falsches GetNoSprms gerufen" );
2946*b1cdbd2cSJim Jagielski     rStart = rEnd = WW8_CP_MAX;
2947*b1cdbd2cSJim Jagielski     rLen = 0;
2948*b1cdbd2cSJim Jagielski     return 0;
2949*b1cdbd2cSJim Jagielski }
2950*b1cdbd2cSJim Jagielski 
2951*b1cdbd2cSJim Jagielski // ...Idx2: Default: ignorieren
GetIdx2() const2952*b1cdbd2cSJim Jagielski sal_uLong WW8PLCFx::GetIdx2() const
2953*b1cdbd2cSJim Jagielski {
2954*b1cdbd2cSJim Jagielski     return 0;
2955*b1cdbd2cSJim Jagielski }
2956*b1cdbd2cSJim Jagielski 
SetIdx2(sal_uLong)2957*b1cdbd2cSJim Jagielski void WW8PLCFx::SetIdx2(sal_uLong )
2958*b1cdbd2cSJim Jagielski {
2959*b1cdbd2cSJim Jagielski }
2960*b1cdbd2cSJim Jagielski 
2961*b1cdbd2cSJim Jagielski class SamePos :
2962*b1cdbd2cSJim Jagielski     public std::unary_function<const WW8PLCFx_Fc_FKP::WW8Fkp *, bool>
2963*b1cdbd2cSJim Jagielski {
2964*b1cdbd2cSJim Jagielski private:
2965*b1cdbd2cSJim Jagielski     long mnPo;
2966*b1cdbd2cSJim Jagielski public:
SamePos(long nPo)2967*b1cdbd2cSJim Jagielski     SamePos(long nPo) : mnPo(nPo) {};
operator ()(const WW8PLCFx_Fc_FKP::WW8Fkp * pFkp)2968*b1cdbd2cSJim Jagielski     bool operator()(const WW8PLCFx_Fc_FKP::WW8Fkp *pFkp)
2969*b1cdbd2cSJim Jagielski         {return mnPo == pFkp->GetFilePos();}
2970*b1cdbd2cSJim Jagielski };
2971*b1cdbd2cSJim Jagielski 
2972*b1cdbd2cSJim Jagielski //-----------------------------------------
NewFkp()2973*b1cdbd2cSJim Jagielski bool WW8PLCFx_Fc_FKP::NewFkp()
2974*b1cdbd2cSJim Jagielski {
2975*b1cdbd2cSJim Jagielski     WW8_CP nPLCFStart, nPLCFEnd;
2976*b1cdbd2cSJim Jagielski     void* pPage;
2977*b1cdbd2cSJim Jagielski 
2978*b1cdbd2cSJim Jagielski     static const int WW8FkpSizeTabVer2[ PLCF_END ] =
2979*b1cdbd2cSJim Jagielski     {
2980*b1cdbd2cSJim Jagielski         1,  1, 0 /*, 0, 0, 0*/
2981*b1cdbd2cSJim Jagielski     };
2982*b1cdbd2cSJim Jagielski     static const int WW8FkpSizeTabVer6[ PLCF_END ] =
2983*b1cdbd2cSJim Jagielski     {
2984*b1cdbd2cSJim Jagielski         1,  7, 0 /*, 0, 0, 0*/
2985*b1cdbd2cSJim Jagielski     };
2986*b1cdbd2cSJim Jagielski     static const int WW8FkpSizeTabVer8[ PLCF_END ] =
2987*b1cdbd2cSJim Jagielski     {
2988*b1cdbd2cSJim Jagielski         1, 13, 0 /*, 0, 0, 0*/
2989*b1cdbd2cSJim Jagielski     };
2990*b1cdbd2cSJim Jagielski     const int* pFkpSizeTab;
2991*b1cdbd2cSJim Jagielski 
2992*b1cdbd2cSJim Jagielski     switch (GetFIBVersion())
2993*b1cdbd2cSJim Jagielski     {
2994*b1cdbd2cSJim Jagielski         case ww::eWW2:
2995*b1cdbd2cSJim Jagielski             pFkpSizeTab = WW8FkpSizeTabVer2;
2996*b1cdbd2cSJim Jagielski             break;
2997*b1cdbd2cSJim Jagielski         case ww::eWW6:
2998*b1cdbd2cSJim Jagielski         case ww::eWW7:
2999*b1cdbd2cSJim Jagielski             pFkpSizeTab = WW8FkpSizeTabVer6;
3000*b1cdbd2cSJim Jagielski             break;
3001*b1cdbd2cSJim Jagielski         case ww::eWW8:
3002*b1cdbd2cSJim Jagielski             pFkpSizeTab = WW8FkpSizeTabVer8;
3003*b1cdbd2cSJim Jagielski             break;
3004*b1cdbd2cSJim Jagielski         default:
3005*b1cdbd2cSJim Jagielski             // Programm-Fehler!
3006*b1cdbd2cSJim Jagielski             ASSERT( !this, "Es wurde vergessen, nVersion zu kodieren!" );
3007*b1cdbd2cSJim Jagielski             return false;
3008*b1cdbd2cSJim Jagielski     }
3009*b1cdbd2cSJim Jagielski 
3010*b1cdbd2cSJim Jagielski     if (!pPLCF->Get( nPLCFStart, nPLCFEnd, pPage ))
3011*b1cdbd2cSJim Jagielski     {
3012*b1cdbd2cSJim Jagielski         pFkp = 0;
3013*b1cdbd2cSJim Jagielski         return false;                           // PLCF fertig abgearbeitet
3014*b1cdbd2cSJim Jagielski     }
3015*b1cdbd2cSJim Jagielski     (*pPLCF)++;
3016*b1cdbd2cSJim Jagielski     long nPo = SVBT16ToShort( (sal_uInt8 *)pPage );
3017*b1cdbd2cSJim Jagielski     nPo <<= 9;                                  // shift als LONG
3018*b1cdbd2cSJim Jagielski 
3019*b1cdbd2cSJim Jagielski     long nAktFkpFilePos = pFkp ? pFkp->GetFilePos() : -1;
3020*b1cdbd2cSJim Jagielski     if (nAktFkpFilePos == nPo)
3021*b1cdbd2cSJim Jagielski         pFkp->Reset(GetStartFc()); // #79464# //
3022*b1cdbd2cSJim Jagielski     else
3023*b1cdbd2cSJim Jagielski     {
3024*b1cdbd2cSJim Jagielski         myiter aIter =
3025*b1cdbd2cSJim Jagielski             std::find_if(maFkpCache.begin(), maFkpCache.end(), SamePos(nPo));
3026*b1cdbd2cSJim Jagielski         if (aIter != maFkpCache.end())
3027*b1cdbd2cSJim Jagielski         {
3028*b1cdbd2cSJim Jagielski             pFkp = *aIter;
3029*b1cdbd2cSJim Jagielski             pFkp->Reset(GetStartFc());
3030*b1cdbd2cSJim Jagielski         }
3031*b1cdbd2cSJim Jagielski         else if (0 != (pFkp = new WW8Fkp(GetFIBVersion(), pFKPStrm, pDataStrm, nPo,
3032*b1cdbd2cSJim Jagielski             pFkpSizeTab[ ePLCF ], ePLCF, GetStartFc())))
3033*b1cdbd2cSJim Jagielski         {
3034*b1cdbd2cSJim Jagielski             maFkpCache.push_back(pFkp);
3035*b1cdbd2cSJim Jagielski 
3036*b1cdbd2cSJim Jagielski             if (maFkpCache.size() > eMaxCache)
3037*b1cdbd2cSJim Jagielski             {
3038*b1cdbd2cSJim Jagielski                 delete maFkpCache.front();
3039*b1cdbd2cSJim Jagielski                 maFkpCache.pop_front();
3040*b1cdbd2cSJim Jagielski             }
3041*b1cdbd2cSJim Jagielski         }
3042*b1cdbd2cSJim Jagielski     }
3043*b1cdbd2cSJim Jagielski 
3044*b1cdbd2cSJim Jagielski     SetStartFc( -1 );                                   // Nur das erste Mal
3045*b1cdbd2cSJim Jagielski     return true;
3046*b1cdbd2cSJim Jagielski }
3047*b1cdbd2cSJim Jagielski 
WW8PLCFx_Fc_FKP(SvStream * pSt,SvStream * pTblSt,SvStream * pDataSt,const WW8Fib & rFib,ePLCFT ePl,WW8_FC nStartFcL)3048*b1cdbd2cSJim Jagielski WW8PLCFx_Fc_FKP::WW8PLCFx_Fc_FKP(SvStream* pSt, SvStream* pTblSt,
3049*b1cdbd2cSJim Jagielski     SvStream* pDataSt, const WW8Fib& rFib, ePLCFT ePl, WW8_FC nStartFcL)
3050*b1cdbd2cSJim Jagielski     : WW8PLCFx(rFib.GetFIBVersion(), true), pFKPStrm(pSt), pDataStrm(pDataSt),
3051*b1cdbd2cSJim Jagielski     pFkp(0), ePLCF(ePl), pPCDAttrs(0)
3052*b1cdbd2cSJim Jagielski {
3053*b1cdbd2cSJim Jagielski     SetStartFc(nStartFcL);
3054*b1cdbd2cSJim Jagielski     long nLenStruct = (8 > rFib.nVersion) ? 2 : 4;
3055*b1cdbd2cSJim Jagielski     if (ePl == CHP)
3056*b1cdbd2cSJim Jagielski     {
3057*b1cdbd2cSJim Jagielski         pPLCF = new WW8PLCF(pTblSt, rFib.fcPlcfbteChpx, rFib.lcbPlcfbteChpx,
3058*b1cdbd2cSJim Jagielski             nLenStruct, GetStartFc(), rFib.pnChpFirst, rFib.cpnBteChp);
3059*b1cdbd2cSJim Jagielski     }
3060*b1cdbd2cSJim Jagielski     else
3061*b1cdbd2cSJim Jagielski     {
3062*b1cdbd2cSJim Jagielski         pPLCF = new WW8PLCF(pTblSt, rFib.fcPlcfbtePapx, rFib.lcbPlcfbtePapx,
3063*b1cdbd2cSJim Jagielski             nLenStruct, GetStartFc(), rFib.pnPapFirst, rFib.cpnBtePap);
3064*b1cdbd2cSJim Jagielski     }
3065*b1cdbd2cSJim Jagielski }
3066*b1cdbd2cSJim Jagielski 
~WW8PLCFx_Fc_FKP()3067*b1cdbd2cSJim Jagielski WW8PLCFx_Fc_FKP::~WW8PLCFx_Fc_FKP()
3068*b1cdbd2cSJim Jagielski {
3069*b1cdbd2cSJim Jagielski     myiter aEnd = maFkpCache.end();
3070*b1cdbd2cSJim Jagielski     for (myiter aIter = maFkpCache.begin(); aIter != aEnd; ++aIter)
3071*b1cdbd2cSJim Jagielski         delete *aIter;
3072*b1cdbd2cSJim Jagielski     delete pPLCF;
3073*b1cdbd2cSJim Jagielski     delete pPCDAttrs;
3074*b1cdbd2cSJim Jagielski }
3075*b1cdbd2cSJim Jagielski 
HasValidPLCF()3076*b1cdbd2cSJim Jagielski bool WW8PLCFx_Fc_FKP::HasValidPLCF()
3077*b1cdbd2cSJim Jagielski {
3078*b1cdbd2cSJim Jagielski     return pPLCF == 0 || pPLCF->IsValid();
3079*b1cdbd2cSJim Jagielski }
3080*b1cdbd2cSJim Jagielski 
GetIdx() const3081*b1cdbd2cSJim Jagielski sal_uLong WW8PLCFx_Fc_FKP::GetIdx() const
3082*b1cdbd2cSJim Jagielski {
3083*b1cdbd2cSJim Jagielski     sal_uLong u = pPLCF->GetIdx() << 8;
3084*b1cdbd2cSJim Jagielski     if (pFkp)
3085*b1cdbd2cSJim Jagielski         u |= pFkp->GetIdx();
3086*b1cdbd2cSJim Jagielski     return u;
3087*b1cdbd2cSJim Jagielski }
3088*b1cdbd2cSJim Jagielski 
SetIdx(sal_uLong nIdx)3089*b1cdbd2cSJim Jagielski void WW8PLCFx_Fc_FKP::SetIdx( sal_uLong nIdx )
3090*b1cdbd2cSJim Jagielski {
3091*b1cdbd2cSJim Jagielski     if( !( nIdx & 0xffffff00L ) )
3092*b1cdbd2cSJim Jagielski     {
3093*b1cdbd2cSJim Jagielski         pPLCF->SetIdx( nIdx >> 8 );
3094*b1cdbd2cSJim Jagielski         pFkp = 0;
3095*b1cdbd2cSJim Jagielski     }
3096*b1cdbd2cSJim Jagielski     else
3097*b1cdbd2cSJim Jagielski     {                                   //Es gab einen Fkp
3098*b1cdbd2cSJim Jagielski         //Lese PLCF um 1 Pos zurueck, um die Adresse des Fkp wiederzubekommen
3099*b1cdbd2cSJim Jagielski         pPLCF->SetIdx( ( nIdx >> 8 ) - 1 );
3100*b1cdbd2cSJim Jagielski         if (NewFkp())                       // und lese Fkp wieder ein
3101*b1cdbd2cSJim Jagielski         {
3102*b1cdbd2cSJim Jagielski             sal_uInt8 nFkpIdx = static_cast<sal_uInt8>(nIdx & 0xff);
3103*b1cdbd2cSJim Jagielski             pFkp->SetIdx(nFkpIdx);          // Dann stelle Fkp-Pos wieder ein
3104*b1cdbd2cSJim Jagielski         }
3105*b1cdbd2cSJim Jagielski     }
3106*b1cdbd2cSJim Jagielski }
3107*b1cdbd2cSJim Jagielski 
SeekPos(WW8_FC nFcPos)3108*b1cdbd2cSJim Jagielski bool WW8PLCFx_Fc_FKP::SeekPos(WW8_FC nFcPos)
3109*b1cdbd2cSJim Jagielski {
3110*b1cdbd2cSJim Jagielski     // StartPos for next Where()
3111*b1cdbd2cSJim Jagielski     SetStartFc( nFcPos );
3112*b1cdbd2cSJim Jagielski 
3113*b1cdbd2cSJim Jagielski     // find StartPos for next pPLCF->Get()
3114*b1cdbd2cSJim Jagielski     bool bRet = pPLCF->SeekPos(nFcPos);
3115*b1cdbd2cSJim Jagielski 
3116*b1cdbd2cSJim Jagielski     // make FKP invalid?
3117*b1cdbd2cSJim Jagielski     WW8_CP nPLCFStart, nPLCFEnd;
3118*b1cdbd2cSJim Jagielski     void* pPage;
3119*b1cdbd2cSJim Jagielski     if( pFkp && pPLCF->Get( nPLCFStart, nPLCFEnd, pPage ) )
3120*b1cdbd2cSJim Jagielski     {
3121*b1cdbd2cSJim Jagielski         long nPo = SVBT16ToShort( (sal_uInt8 *)pPage );
3122*b1cdbd2cSJim Jagielski         nPo <<= 9;                                          // shift als LONG
3123*b1cdbd2cSJim Jagielski         if (nPo != pFkp->GetFilePos())
3124*b1cdbd2cSJim Jagielski             pFkp = 0;
3125*b1cdbd2cSJim Jagielski         else
3126*b1cdbd2cSJim Jagielski             pFkp->SeekPos( nFcPos );
3127*b1cdbd2cSJim Jagielski     }
3128*b1cdbd2cSJim Jagielski     return bRet;
3129*b1cdbd2cSJim Jagielski }
3130*b1cdbd2cSJim Jagielski 
Where()3131*b1cdbd2cSJim Jagielski WW8_FC WW8PLCFx_Fc_FKP::Where()
3132*b1cdbd2cSJim Jagielski {
3133*b1cdbd2cSJim Jagielski     if( !pFkp )
3134*b1cdbd2cSJim Jagielski     {
3135*b1cdbd2cSJim Jagielski         if( !NewFkp() )
3136*b1cdbd2cSJim Jagielski             return WW8_FC_MAX;
3137*b1cdbd2cSJim Jagielski     }
3138*b1cdbd2cSJim Jagielski     WW8_FC nP = pFkp->Where();
3139*b1cdbd2cSJim Jagielski     if( nP != WW8_FC_MAX )
3140*b1cdbd2cSJim Jagielski         return nP;
3141*b1cdbd2cSJim Jagielski 
3142*b1cdbd2cSJim Jagielski     pFkp = 0;                   // FKP beendet -> hole neuen
3143*b1cdbd2cSJim Jagielski     return Where();                     // am einfachsten rekursiv
3144*b1cdbd2cSJim Jagielski }
3145*b1cdbd2cSJim Jagielski 
GetSprmsAndPos(WW8_FC & rStart,WW8_FC & rEnd,sal_Int32 & rLen)3146*b1cdbd2cSJim Jagielski sal_uInt8* WW8PLCFx_Fc_FKP::GetSprmsAndPos(WW8_FC& rStart, WW8_FC& rEnd, sal_Int32& rLen)
3147*b1cdbd2cSJim Jagielski {
3148*b1cdbd2cSJim Jagielski     rLen = 0;                               // Default
3149*b1cdbd2cSJim Jagielski     rStart = rEnd = WW8_FC_MAX;
3150*b1cdbd2cSJim Jagielski 
3151*b1cdbd2cSJim Jagielski     if( !pFkp )     // Fkp not there ?
3152*b1cdbd2cSJim Jagielski     {
3153*b1cdbd2cSJim Jagielski         if( !NewFkp() )
3154*b1cdbd2cSJim Jagielski             return 0;
3155*b1cdbd2cSJim Jagielski     }
3156*b1cdbd2cSJim Jagielski 
3157*b1cdbd2cSJim Jagielski     sal_uInt8* pPos = pFkp->Get( rStart, rEnd, rLen );
3158*b1cdbd2cSJim Jagielski     if( rStart == WW8_FC_MAX )    //Not found
3159*b1cdbd2cSJim Jagielski         return 0;
3160*b1cdbd2cSJim Jagielski     return pPos;
3161*b1cdbd2cSJim Jagielski }
3162*b1cdbd2cSJim Jagielski 
operator ++(int)3163*b1cdbd2cSJim Jagielski WW8PLCFx& WW8PLCFx_Fc_FKP::operator ++( int )
3164*b1cdbd2cSJim Jagielski {
3165*b1cdbd2cSJim Jagielski     if( !pFkp )
3166*b1cdbd2cSJim Jagielski     {
3167*b1cdbd2cSJim Jagielski         if( !NewFkp() )
3168*b1cdbd2cSJim Jagielski             return *this;
3169*b1cdbd2cSJim Jagielski     }
3170*b1cdbd2cSJim Jagielski 
3171*b1cdbd2cSJim Jagielski     (*pFkp)++;
3172*b1cdbd2cSJim Jagielski     if( pFkp->Where() == WW8_FC_MAX )
3173*b1cdbd2cSJim Jagielski         NewFkp();
3174*b1cdbd2cSJim Jagielski 
3175*b1cdbd2cSJim Jagielski     return *this;
3176*b1cdbd2cSJim Jagielski }
3177*b1cdbd2cSJim Jagielski 
GetIstd() const3178*b1cdbd2cSJim Jagielski sal_uInt16 WW8PLCFx_Fc_FKP::GetIstd() const
3179*b1cdbd2cSJim Jagielski {
3180*b1cdbd2cSJim Jagielski     return pFkp ? pFkp->GetIstd() : 0xFFFF;
3181*b1cdbd2cSJim Jagielski }
3182*b1cdbd2cSJim Jagielski 
GetPCDSprms(WW8PLCFxDesc & rDesc)3183*b1cdbd2cSJim Jagielski void WW8PLCFx_Fc_FKP::GetPCDSprms( WW8PLCFxDesc& rDesc )
3184*b1cdbd2cSJim Jagielski {
3185*b1cdbd2cSJim Jagielski     rDesc.pMemPos   = 0;
3186*b1cdbd2cSJim Jagielski     rDesc.nSprmsLen = 0;
3187*b1cdbd2cSJim Jagielski     if( pPCDAttrs )
3188*b1cdbd2cSJim Jagielski     {
3189*b1cdbd2cSJim Jagielski         if( !pFkp )
3190*b1cdbd2cSJim Jagielski         {
3191*b1cdbd2cSJim Jagielski             DBG_WARNING(
3192*b1cdbd2cSJim Jagielski                 "+Problem: GetPCDSprms: NewFkp necessay (not possible!)" );
3193*b1cdbd2cSJim Jagielski             if( !NewFkp() )
3194*b1cdbd2cSJim Jagielski                 return;
3195*b1cdbd2cSJim Jagielski         }
3196*b1cdbd2cSJim Jagielski         pPCDAttrs->GetSprms(&rDesc);
3197*b1cdbd2cSJim Jagielski     }
3198*b1cdbd2cSJim Jagielski }
3199*b1cdbd2cSJim Jagielski 
HasSprm(sal_uInt16 nId)3200*b1cdbd2cSJim Jagielski const sal_uInt8* WW8PLCFx_Fc_FKP::HasSprm( sal_uInt16 nId )
3201*b1cdbd2cSJim Jagielski {
3202*b1cdbd2cSJim Jagielski     // const waere schoener, aber dafuer muesste NewFkp() ersetzt werden oder
3203*b1cdbd2cSJim Jagielski     // wegfallen
3204*b1cdbd2cSJim Jagielski     if( !pFkp )
3205*b1cdbd2cSJim Jagielski     {
3206*b1cdbd2cSJim Jagielski         DBG_WARNING( "+Motz: HasSprm: NewFkp noetig ( kein const moeglich )" );
3207*b1cdbd2cSJim Jagielski         // Passiert bei BugDoc 31722
3208*b1cdbd2cSJim Jagielski         if( !NewFkp() )
3209*b1cdbd2cSJim Jagielski             return 0;
3210*b1cdbd2cSJim Jagielski     }
3211*b1cdbd2cSJim Jagielski 
3212*b1cdbd2cSJim Jagielski     const sal_uInt8* pRes = pFkp->HasSprm( nId );
3213*b1cdbd2cSJim Jagielski 
3214*b1cdbd2cSJim Jagielski     if( !pRes )
3215*b1cdbd2cSJim Jagielski     {
3216*b1cdbd2cSJim Jagielski         WW8PLCFxDesc aDesc;
3217*b1cdbd2cSJim Jagielski         GetPCDSprms( aDesc );
3218*b1cdbd2cSJim Jagielski 
3219*b1cdbd2cSJim Jagielski         if (aDesc.pMemPos)
3220*b1cdbd2cSJim Jagielski         {
3221*b1cdbd2cSJim Jagielski             WW8SprmIter aIter(aDesc.pMemPos, aDesc.nSprmsLen,
3222*b1cdbd2cSJim Jagielski                 pFkp->GetSprmParser());
3223*b1cdbd2cSJim Jagielski             pRes = aIter.FindSprm(nId);
3224*b1cdbd2cSJim Jagielski         }
3225*b1cdbd2cSJim Jagielski     }
3226*b1cdbd2cSJim Jagielski 
3227*b1cdbd2cSJim Jagielski     return pRes;
3228*b1cdbd2cSJim Jagielski }
3229*b1cdbd2cSJim Jagielski 
HasSprm(sal_uInt16 nId,std::vector<const sal_uInt8 * > & rResult)3230*b1cdbd2cSJim Jagielski bool WW8PLCFx_Fc_FKP::HasSprm(sal_uInt16 nId, std::vector<const sal_uInt8 *> &rResult)
3231*b1cdbd2cSJim Jagielski {
3232*b1cdbd2cSJim Jagielski     // const waere schoener, aber dafuer muesste NewFkp() ersetzt werden oder
3233*b1cdbd2cSJim Jagielski     // wegfallen
3234*b1cdbd2cSJim Jagielski     if (!pFkp)
3235*b1cdbd2cSJim Jagielski     {
3236*b1cdbd2cSJim Jagielski        DBG_WARNING( "+Motz: HasSprm: NewFkp noetig ( kein const moeglich )" );
3237*b1cdbd2cSJim Jagielski        // Passiert bei BugDoc 31722
3238*b1cdbd2cSJim Jagielski        if( !NewFkp() )
3239*b1cdbd2cSJim Jagielski            return 0;
3240*b1cdbd2cSJim Jagielski     }
3241*b1cdbd2cSJim Jagielski 
3242*b1cdbd2cSJim Jagielski     pFkp->HasSprm(nId, rResult);
3243*b1cdbd2cSJim Jagielski 
3244*b1cdbd2cSJim Jagielski     WW8PLCFxDesc aDesc;
3245*b1cdbd2cSJim Jagielski     GetPCDSprms( aDesc );
3246*b1cdbd2cSJim Jagielski 
3247*b1cdbd2cSJim Jagielski     if (aDesc.pMemPos)
3248*b1cdbd2cSJim Jagielski     {
3249*b1cdbd2cSJim Jagielski         WW8SprmIter aIter(aDesc.pMemPos, aDesc.nSprmsLen,
3250*b1cdbd2cSJim Jagielski             pFkp->GetSprmParser());
3251*b1cdbd2cSJim Jagielski         while(aIter.GetSprms())
3252*b1cdbd2cSJim Jagielski         {
3253*b1cdbd2cSJim Jagielski             if (aIter.GetAktId() == nId)
3254*b1cdbd2cSJim Jagielski                 rResult.push_back(aIter.GetAktParams());
3255*b1cdbd2cSJim Jagielski             aIter++;
3256*b1cdbd2cSJim Jagielski         };
3257*b1cdbd2cSJim Jagielski     }
3258*b1cdbd2cSJim Jagielski     return !rResult.empty();
3259*b1cdbd2cSJim Jagielski }
3260*b1cdbd2cSJim Jagielski 
3261*b1cdbd2cSJim Jagielski //-----------------------------------------
3262*b1cdbd2cSJim Jagielski 
WW8PLCFx_Cp_FKP(SvStream * pSt,SvStream * pTblSt,SvStream * pDataSt,const WW8ScannerBase & rBase,ePLCFT ePl)3263*b1cdbd2cSJim Jagielski WW8PLCFx_Cp_FKP::WW8PLCFx_Cp_FKP( SvStream* pSt, SvStream* pTblSt,
3264*b1cdbd2cSJim Jagielski     SvStream* pDataSt, const WW8ScannerBase& rBase, ePLCFT ePl )
3265*b1cdbd2cSJim Jagielski     : WW8PLCFx_Fc_FKP(pSt, pTblSt, pDataSt, *rBase.pWw8Fib, ePl,
3266*b1cdbd2cSJim Jagielski     rBase.WW8Cp2Fc(0)), rSBase(rBase), nAttrStart(-1), nAttrEnd(-1),
3267*b1cdbd2cSJim Jagielski     bLineEnd(false),
3268*b1cdbd2cSJim Jagielski     bComplex( (7 < rBase.pWw8Fib->nVersion) || (0 != rBase.pWw8Fib->fComplex) )
3269*b1cdbd2cSJim Jagielski {
3270*b1cdbd2cSJim Jagielski     ResetAttrStartEnd();
3271*b1cdbd2cSJim Jagielski 
3272*b1cdbd2cSJim Jagielski     pPcd = rSBase.pPiecePLCF ? new WW8PLCFx_PCD(GetFIBVersion(),
3273*b1cdbd2cSJim Jagielski         rBase.pPiecePLCF, 0, IsSevenMinus(GetFIBVersion())) : 0;
3274*b1cdbd2cSJim Jagielski 
3275*b1cdbd2cSJim Jagielski     /*
3276*b1cdbd2cSJim Jagielski     Make a copy of the piece attributes for so that the calls to HasSprm on a
3277*b1cdbd2cSJim Jagielski     Fc_FKP will be able to take into account the current piece attributes,
3278*b1cdbd2cSJim Jagielski     despite the fact that such attributes can only be found through a cp based
3279*b1cdbd2cSJim Jagielski     mechanism.
3280*b1cdbd2cSJim Jagielski     */
3281*b1cdbd2cSJim Jagielski     if (pPcd)
3282*b1cdbd2cSJim Jagielski     {
3283*b1cdbd2cSJim Jagielski         pPCDAttrs = rSBase.pPLCFx_PCDAttrs ? new WW8PLCFx_PCDAttrs(
3284*b1cdbd2cSJim Jagielski             rSBase.pWw8Fib->GetFIBVersion(), pPcd, &rSBase) : 0;
3285*b1cdbd2cSJim Jagielski     }
3286*b1cdbd2cSJim Jagielski 
3287*b1cdbd2cSJim Jagielski     pPieceIter = rSBase.pPieceIter;
3288*b1cdbd2cSJim Jagielski }
3289*b1cdbd2cSJim Jagielski 
~WW8PLCFx_Cp_FKP()3290*b1cdbd2cSJim Jagielski WW8PLCFx_Cp_FKP::~WW8PLCFx_Cp_FKP()
3291*b1cdbd2cSJim Jagielski {
3292*b1cdbd2cSJim Jagielski     delete pPcd;
3293*b1cdbd2cSJim Jagielski }
3294*b1cdbd2cSJim Jagielski 
ResetAttrStartEnd()3295*b1cdbd2cSJim Jagielski void WW8PLCFx_Cp_FKP::ResetAttrStartEnd()
3296*b1cdbd2cSJim Jagielski {
3297*b1cdbd2cSJim Jagielski     nAttrStart = -1;
3298*b1cdbd2cSJim Jagielski     nAttrEnd   = -1;
3299*b1cdbd2cSJim Jagielski     bLineEnd   = false;
3300*b1cdbd2cSJim Jagielski }
3301*b1cdbd2cSJim Jagielski 
GetPCDIMax() const3302*b1cdbd2cSJim Jagielski sal_uLong WW8PLCFx_Cp_FKP::GetPCDIMax() const
3303*b1cdbd2cSJim Jagielski {
3304*b1cdbd2cSJim Jagielski     return pPcd ? pPcd->GetIMax() : 0;
3305*b1cdbd2cSJim Jagielski }
3306*b1cdbd2cSJim Jagielski 
GetPCDIdx() const3307*b1cdbd2cSJim Jagielski sal_uLong WW8PLCFx_Cp_FKP::GetPCDIdx() const
3308*b1cdbd2cSJim Jagielski {
3309*b1cdbd2cSJim Jagielski     return pPcd ? pPcd->GetIdx() : 0;
3310*b1cdbd2cSJim Jagielski }
3311*b1cdbd2cSJim Jagielski 
SetPCDIdx(sal_uLong nIdx)3312*b1cdbd2cSJim Jagielski void WW8PLCFx_Cp_FKP::SetPCDIdx( sal_uLong nIdx )
3313*b1cdbd2cSJim Jagielski {
3314*b1cdbd2cSJim Jagielski     if( pPcd )
3315*b1cdbd2cSJim Jagielski         pPcd->SetIdx( nIdx );
3316*b1cdbd2cSJim Jagielski }
3317*b1cdbd2cSJim Jagielski 
SeekPos(WW8_CP nCpPos)3318*b1cdbd2cSJim Jagielski bool WW8PLCFx_Cp_FKP::SeekPos(WW8_CP nCpPos)
3319*b1cdbd2cSJim Jagielski {
3320*b1cdbd2cSJim Jagielski     if( pPcd )  // Complex
3321*b1cdbd2cSJim Jagielski     {
3322*b1cdbd2cSJim Jagielski         if( !pPcd->SeekPos( nCpPos ) )  // Piece setzen
3323*b1cdbd2cSJim Jagielski             return false;
3324*b1cdbd2cSJim Jagielski         if (pPCDAttrs && !pPCDAttrs->GetIter()->SeekPos(nCpPos))
3325*b1cdbd2cSJim Jagielski             return false;
3326*b1cdbd2cSJim Jagielski         return WW8PLCFx_Fc_FKP::SeekPos(pPcd->AktPieceStartCp2Fc(nCpPos));
3327*b1cdbd2cSJim Jagielski     }
3328*b1cdbd2cSJim Jagielski                                     // KEINE Piece-Table !!!
3329*b1cdbd2cSJim Jagielski     return WW8PLCFx_Fc_FKP::SeekPos( rSBase.WW8Cp2Fc(nCpPos) );
3330*b1cdbd2cSJim Jagielski }
3331*b1cdbd2cSJim Jagielski 
Where()3332*b1cdbd2cSJim Jagielski WW8_CP WW8PLCFx_Cp_FKP::Where()
3333*b1cdbd2cSJim Jagielski {
3334*b1cdbd2cSJim Jagielski     WW8_FC nFc = WW8PLCFx_Fc_FKP::Where();
3335*b1cdbd2cSJim Jagielski     if( pPcd )
3336*b1cdbd2cSJim Jagielski         return pPcd->AktPieceStartFc2Cp( nFc ); // Piece ermitteln
3337*b1cdbd2cSJim Jagielski     return rSBase.WW8Fc2Cp( nFc );      // KEINE Piece-Table !!!
3338*b1cdbd2cSJim Jagielski }
3339*b1cdbd2cSJim Jagielski 
GetSprms(WW8PLCFxDesc * p)3340*b1cdbd2cSJim Jagielski void WW8PLCFx_Cp_FKP::GetSprms(WW8PLCFxDesc* p)
3341*b1cdbd2cSJim Jagielski {
3342*b1cdbd2cSJim Jagielski     WW8_CP nOrigCp = p->nStartPos;
3343*b1cdbd2cSJim Jagielski 
3344*b1cdbd2cSJim Jagielski     if (!GetDirty())        //Normal case
3345*b1cdbd2cSJim Jagielski     {
3346*b1cdbd2cSJim Jagielski         p->pMemPos = WW8PLCFx_Fc_FKP::GetSprmsAndPos(p->nStartPos, p->nEndPos,
3347*b1cdbd2cSJim Jagielski             p->nSprmsLen);
3348*b1cdbd2cSJim Jagielski     }
3349*b1cdbd2cSJim Jagielski     else
3350*b1cdbd2cSJim Jagielski     {
3351*b1cdbd2cSJim Jagielski         /*
3352*b1cdbd2cSJim Jagielski         #93702#
3353*b1cdbd2cSJim Jagielski         For the odd case where we have a location in a fastsaved file which
3354*b1cdbd2cSJim Jagielski         does not have an entry in the FKP, perhaps its para end is in the next
3355*b1cdbd2cSJim Jagielski         piece, or perhaps the cp just doesn't exist at all in this document.
3356*b1cdbd2cSJim Jagielski         AdvSprm doesn't know so it sets the PLCF as dirty and we figure out
3357*b1cdbd2cSJim Jagielski         in this method what the situation is
3358*b1cdbd2cSJim Jagielski 
3359*b1cdbd2cSJim Jagielski         It doesn't exist then the piece iterator will not be able to find it.
3360*b1cdbd2cSJim Jagielski         Otherwise our cool fastsave algorithm can be brought to bear on the
3361*b1cdbd2cSJim Jagielski         problem.
3362*b1cdbd2cSJim Jagielski         */
3363*b1cdbd2cSJim Jagielski         if( !pPieceIter )
3364*b1cdbd2cSJim Jagielski             return;
3365*b1cdbd2cSJim Jagielski         sal_uLong nOldPos = pPieceIter->GetIdx();
3366*b1cdbd2cSJim Jagielski         bool bOk = pPieceIter->SeekPos(nOrigCp);
3367*b1cdbd2cSJim Jagielski         pPieceIter->SetIdx( nOldPos );
3368*b1cdbd2cSJim Jagielski         if (!bOk)
3369*b1cdbd2cSJim Jagielski             return;
3370*b1cdbd2cSJim Jagielski     }
3371*b1cdbd2cSJim Jagielski 
3372*b1cdbd2cSJim Jagielski     if( pPcd )  // Piece-Table vorhanden !!!
3373*b1cdbd2cSJim Jagielski     {
3374*b1cdbd2cSJim Jagielski         // Init ( noch kein ++ gerufen )
3375*b1cdbd2cSJim Jagielski         if( (nAttrStart >  nAttrEnd) || (nAttrStart == -1) )
3376*b1cdbd2cSJim Jagielski         {
3377*b1cdbd2cSJim Jagielski             p->bRealLineEnd = (ePLCF == PAP);
3378*b1cdbd2cSJim Jagielski 
3379*b1cdbd2cSJim Jagielski             if ( ((ePLCF == PAP ) || (ePLCF == CHP)) && (nOrigCp != WW8_CP_MAX) )
3380*b1cdbd2cSJim Jagielski             {
3381*b1cdbd2cSJim Jagielski                 bool bIsUnicode=false;
3382*b1cdbd2cSJim Jagielski                 /*
3383*b1cdbd2cSJim Jagielski                 To find the end of a paragraph for a character in a
3384*b1cdbd2cSJim Jagielski                 complex format file.
3385*b1cdbd2cSJim Jagielski 
3386*b1cdbd2cSJim Jagielski                 It is necessary to know the piece that contains the
3387*b1cdbd2cSJim Jagielski                 character and the FC assigned to the character.
3388*b1cdbd2cSJim Jagielski                 */
3389*b1cdbd2cSJim Jagielski 
3390*b1cdbd2cSJim Jagielski                 //We set the piece iterator to the piece that contains the
3391*b1cdbd2cSJim Jagielski                 //character, now we have the correct piece for this character
3392*b1cdbd2cSJim Jagielski                 sal_uLong nOldPos = pPieceIter->GetIdx();
3393*b1cdbd2cSJim Jagielski                 p->nStartPos = nOrigCp;
3394*b1cdbd2cSJim Jagielski                 pPieceIter->SeekPos( p->nStartPos);
3395*b1cdbd2cSJim Jagielski 
3396*b1cdbd2cSJim Jagielski                 //This is the FC assigned to the character, but we already
3397*b1cdbd2cSJim Jagielski                 //have the result of the next stage, so we can skip this step
3398*b1cdbd2cSJim Jagielski                 //WW8_FC nStartFc = rSBase.WW8Cp2Fc(p->nStartPos, &bIsUnicode);
3399*b1cdbd2cSJim Jagielski 
3400*b1cdbd2cSJim Jagielski                 /*
3401*b1cdbd2cSJim Jagielski                 Using the FC of the character, first search the FKP that
3402*b1cdbd2cSJim Jagielski                 describes the character to find the smallest FC in the rgfc
3403*b1cdbd2cSJim Jagielski                 that is larger than the character FC.
3404*b1cdbd2cSJim Jagielski                 */
3405*b1cdbd2cSJim Jagielski                 //But the search has already been done, the next largest FC is
3406*b1cdbd2cSJim Jagielski                 //p->nEndPos.
3407*b1cdbd2cSJim Jagielski                 WW8_FC nOldEndPos = p->nEndPos;
3408*b1cdbd2cSJim Jagielski 
3409*b1cdbd2cSJim Jagielski                 /*
3410*b1cdbd2cSJim Jagielski                 If the FC found in the FKP is less than or equal to the limit
3411*b1cdbd2cSJim Jagielski                 FC of the piece, the end of the paragraph that contains the
3412*b1cdbd2cSJim Jagielski                 character is at the FKP FC minus 1.
3413*b1cdbd2cSJim Jagielski                 */
3414*b1cdbd2cSJim Jagielski                 WW8_CP nCpStart, nCpEnd;
3415*b1cdbd2cSJim Jagielski                 void* pData=NULL;
3416*b1cdbd2cSJim Jagielski                 pPieceIter->Get(nCpStart, nCpEnd, pData);
3417*b1cdbd2cSJim Jagielski 
3418*b1cdbd2cSJim Jagielski                 WW8_FC nLimitFC = SVBT32ToUInt32( ((WW8_PCD*)pData)->fc );
3419*b1cdbd2cSJim Jagielski                 WW8_FC nBeginLimitFC = nLimitFC;
3420*b1cdbd2cSJim Jagielski                 if (IsEightPlus(GetFIBVersion()))
3421*b1cdbd2cSJim Jagielski                 {
3422*b1cdbd2cSJim Jagielski                     nBeginLimitFC =
3423*b1cdbd2cSJim Jagielski                         WW8PLCFx_PCD::TransformPieceAddress(nLimitFC,
3424*b1cdbd2cSJim Jagielski                         bIsUnicode);
3425*b1cdbd2cSJim Jagielski                 }
3426*b1cdbd2cSJim Jagielski 
3427*b1cdbd2cSJim Jagielski                 nLimitFC = nBeginLimitFC +
3428*b1cdbd2cSJim Jagielski                     (nCpEnd - nCpStart) * (bIsUnicode ? 2 : 1);
3429*b1cdbd2cSJim Jagielski 
3430*b1cdbd2cSJim Jagielski                 if (nOldEndPos <= nLimitFC)
3431*b1cdbd2cSJim Jagielski                 {
3432*b1cdbd2cSJim Jagielski                     p->nEndPos = nCpEnd -
3433*b1cdbd2cSJim Jagielski                         (nLimitFC-nOldEndPos) / (bIsUnicode ? 2 : 1);
3434*b1cdbd2cSJim Jagielski                 }
3435*b1cdbd2cSJim Jagielski                 else
3436*b1cdbd2cSJim Jagielski                 {
3437*b1cdbd2cSJim Jagielski                     if (ePLCF == CHP)
3438*b1cdbd2cSJim Jagielski                         p->nEndPos = nCpEnd;
3439*b1cdbd2cSJim Jagielski                     else
3440*b1cdbd2cSJim Jagielski                     {
3441*b1cdbd2cSJim Jagielski                         /*
3442*b1cdbd2cSJim Jagielski                         If the FKP FC that was found was greater than the FC
3443*b1cdbd2cSJim Jagielski                         of the end of the piece, scan piece by piece toward
3444*b1cdbd2cSJim Jagielski                         the end of the document until a piece is found that
3445*b1cdbd2cSJim Jagielski                         contains a  paragraph end mark.
3446*b1cdbd2cSJim Jagielski                         */
3447*b1cdbd2cSJim Jagielski 
3448*b1cdbd2cSJim Jagielski                         /*
3449*b1cdbd2cSJim Jagielski                         It's possible to check if a piece contains a paragraph
3450*b1cdbd2cSJim Jagielski                         mark by using the FC of the beginning of the piece to
3451*b1cdbd2cSJim Jagielski                         search in the FKPs for the smallest FC in the FKP rgfc
3452*b1cdbd2cSJim Jagielski                         that is greater than the FC of the beginning of the
3453*b1cdbd2cSJim Jagielski                         piece. If the FC found is less than or equal to the
3454*b1cdbd2cSJim Jagielski                         limit FC of the piece, then the character that ends
3455*b1cdbd2cSJim Jagielski                         the paragraph is the character immediately before the
3456*b1cdbd2cSJim Jagielski                         FKP fc
3457*b1cdbd2cSJim Jagielski                         */
3458*b1cdbd2cSJim Jagielski 
3459*b1cdbd2cSJim Jagielski                         (*pPieceIter)++;
3460*b1cdbd2cSJim Jagielski 
3461*b1cdbd2cSJim Jagielski                         for (;pPieceIter->GetIdx() < pPieceIter->GetIMax();
3462*b1cdbd2cSJim Jagielski                             (*pPieceIter)++)
3463*b1cdbd2cSJim Jagielski                         {
3464*b1cdbd2cSJim Jagielski                             if( !pPieceIter->Get( nCpStart, nCpEnd, pData ) )
3465*b1cdbd2cSJim Jagielski                             {
3466*b1cdbd2cSJim Jagielski                                 ASSERT( !this, "piece iter broken!" );
3467*b1cdbd2cSJim Jagielski                                 break;
3468*b1cdbd2cSJim Jagielski                             }
3469*b1cdbd2cSJim Jagielski                             bIsUnicode = false;
3470*b1cdbd2cSJim Jagielski                             sal_Int32 nFcStart=SVBT32ToUInt32(((WW8_PCD*)pData)->fc);
3471*b1cdbd2cSJim Jagielski 
3472*b1cdbd2cSJim Jagielski                             if (IsEightPlus(GetFIBVersion()))
3473*b1cdbd2cSJim Jagielski                             {
3474*b1cdbd2cSJim Jagielski                                 nFcStart =
3475*b1cdbd2cSJim Jagielski                                     WW8PLCFx_PCD::TransformPieceAddress(
3476*b1cdbd2cSJim Jagielski                                     nFcStart,bIsUnicode );
3477*b1cdbd2cSJim Jagielski                             }
3478*b1cdbd2cSJim Jagielski 
3479*b1cdbd2cSJim Jagielski                             nLimitFC = nFcStart + (nCpEnd - nCpStart) *
3480*b1cdbd2cSJim Jagielski                                 (bIsUnicode ? 2 : 1);
3481*b1cdbd2cSJim Jagielski 
3482*b1cdbd2cSJim Jagielski                             //if it doesn't exist, skip it
3483*b1cdbd2cSJim Jagielski                             if (!SeekPos(nCpStart))
3484*b1cdbd2cSJim Jagielski                                 continue;
3485*b1cdbd2cSJim Jagielski 
3486*b1cdbd2cSJim Jagielski                             WW8_FC nOne,nSmallest;
3487*b1cdbd2cSJim Jagielski                             p->pMemPos = WW8PLCFx_Fc_FKP::GetSprmsAndPos(nOne,
3488*b1cdbd2cSJim Jagielski                                 nSmallest, p->nSprmsLen);
3489*b1cdbd2cSJim Jagielski 
3490*b1cdbd2cSJim Jagielski                             if (nSmallest <= nLimitFC)
3491*b1cdbd2cSJim Jagielski                             {
3492*b1cdbd2cSJim Jagielski                                 p->nEndPos = nCpEnd -
3493*b1cdbd2cSJim Jagielski                                     (nLimitFC-nSmallest) / (bIsUnicode ? 2 : 1);
3494*b1cdbd2cSJim Jagielski                                 break;
3495*b1cdbd2cSJim Jagielski                             }
3496*b1cdbd2cSJim Jagielski                         }
3497*b1cdbd2cSJim Jagielski                     }
3498*b1cdbd2cSJim Jagielski                 }
3499*b1cdbd2cSJim Jagielski                 pPieceIter->SetIdx( nOldPos );
3500*b1cdbd2cSJim Jagielski             }
3501*b1cdbd2cSJim Jagielski             else
3502*b1cdbd2cSJim Jagielski                 pPcd->AktPieceFc2Cp( p->nStartPos, p->nEndPos,&rSBase );
3503*b1cdbd2cSJim Jagielski         }
3504*b1cdbd2cSJim Jagielski         else
3505*b1cdbd2cSJim Jagielski         {
3506*b1cdbd2cSJim Jagielski             p->nStartPos = nAttrStart;
3507*b1cdbd2cSJim Jagielski             p->nEndPos = nAttrEnd;
3508*b1cdbd2cSJim Jagielski             p->bRealLineEnd = bLineEnd;
3509*b1cdbd2cSJim Jagielski         }
3510*b1cdbd2cSJim Jagielski     }
3511*b1cdbd2cSJim Jagielski     else        // KEINE Piece-Table !!!
3512*b1cdbd2cSJim Jagielski     {
3513*b1cdbd2cSJim Jagielski         p->nStartPos = rSBase.WW8Fc2Cp( p->nStartPos );
3514*b1cdbd2cSJim Jagielski         p->nEndPos   = rSBase.WW8Fc2Cp( p->nEndPos );
3515*b1cdbd2cSJim Jagielski         p->bRealLineEnd = ePLCF == PAP;
3516*b1cdbd2cSJim Jagielski     }
3517*b1cdbd2cSJim Jagielski }
3518*b1cdbd2cSJim Jagielski 
operator ++(int)3519*b1cdbd2cSJim Jagielski WW8PLCFx& WW8PLCFx_Cp_FKP::operator ++( int )
3520*b1cdbd2cSJim Jagielski {
3521*b1cdbd2cSJim Jagielski     WW8PLCFx_Fc_FKP::operator ++( 0 );
3522*b1cdbd2cSJim Jagielski     // !pPcd: Notbremse
3523*b1cdbd2cSJim Jagielski     if ( !bComplex || !pPcd )
3524*b1cdbd2cSJim Jagielski         return *this;
3525*b1cdbd2cSJim Jagielski 
3526*b1cdbd2cSJim Jagielski     if( GetPCDIdx() >= GetPCDIMax() )           // End of PLCF
3527*b1cdbd2cSJim Jagielski     {
3528*b1cdbd2cSJim Jagielski         nAttrStart = nAttrEnd = WW8_CP_MAX;
3529*b1cdbd2cSJim Jagielski         return *this;
3530*b1cdbd2cSJim Jagielski     }
3531*b1cdbd2cSJim Jagielski 
3532*b1cdbd2cSJim Jagielski     sal_Int32 nFkpLen;                               // Fkp-Eintrag
3533*b1cdbd2cSJim Jagielski     // Fkp-Eintrag holen
3534*b1cdbd2cSJim Jagielski     WW8PLCFx_Fc_FKP::GetSprmsAndPos(nAttrStart, nAttrEnd, nFkpLen);
3535*b1cdbd2cSJim Jagielski 
3536*b1cdbd2cSJim Jagielski     pPcd->AktPieceFc2Cp( nAttrStart, nAttrEnd, &rSBase );
3537*b1cdbd2cSJim Jagielski     bLineEnd = (ePLCF == PAP);
3538*b1cdbd2cSJim Jagielski     return *this;
3539*b1cdbd2cSJim Jagielski }
3540*b1cdbd2cSJim Jagielski 
3541*b1cdbd2cSJim Jagielski //-----------------------------------------
3542*b1cdbd2cSJim Jagielski //-----------------------------------------
3543*b1cdbd2cSJim Jagielski 
WW8PLCFx_SEPX(SvStream * pSt,SvStream * pTblSt,const WW8Fib & rFib,WW8_CP nStartCp)3544*b1cdbd2cSJim Jagielski WW8PLCFx_SEPX::WW8PLCFx_SEPX(
3545*b1cdbd2cSJim Jagielski     SvStream* pSt,
3546*b1cdbd2cSJim Jagielski     SvStream* pTblSt,
3547*b1cdbd2cSJim Jagielski     const WW8Fib& rFib,
3548*b1cdbd2cSJim Jagielski     WW8_CP nStartCp)
3549*b1cdbd2cSJim Jagielski     : WW8PLCFx(rFib.GetFIBVersion(), true)
3550*b1cdbd2cSJim Jagielski     , maSprmParser(rFib.GetFIBVersion())
3551*b1cdbd2cSJim Jagielski     , pStrm(pSt)
3552*b1cdbd2cSJim Jagielski     , nArrMax(256)
3553*b1cdbd2cSJim Jagielski     , nSprmSiz(0)
3554*b1cdbd2cSJim Jagielski {
3555*b1cdbd2cSJim Jagielski     pPLCF =   rFib.lcbPlcfsed
3556*b1cdbd2cSJim Jagielski             ? new WW8PLCF(pTblSt, rFib.fcPlcfsed, rFib.lcbPlcfsed,
3557*b1cdbd2cSJim Jagielski               GetFIBVersion() <= ww::eWW2 ? 6 : 12, nStartCp)
3558*b1cdbd2cSJim Jagielski             : 0;
3559*b1cdbd2cSJim Jagielski 
3560*b1cdbd2cSJim Jagielski     pSprms = new sal_uInt8[nArrMax];     // maximum length
3561*b1cdbd2cSJim Jagielski }
3562*b1cdbd2cSJim Jagielski 
~WW8PLCFx_SEPX()3563*b1cdbd2cSJim Jagielski WW8PLCFx_SEPX::~WW8PLCFx_SEPX()
3564*b1cdbd2cSJim Jagielski {
3565*b1cdbd2cSJim Jagielski     delete pPLCF;
3566*b1cdbd2cSJim Jagielski     delete[] pSprms;
3567*b1cdbd2cSJim Jagielski }
3568*b1cdbd2cSJim Jagielski 
HasValidPLCF()3569*b1cdbd2cSJim Jagielski bool WW8PLCFx_SEPX::HasValidPLCF()
3570*b1cdbd2cSJim Jagielski {
3571*b1cdbd2cSJim Jagielski     return pPLCF == 0 || pPLCF->IsValid();
3572*b1cdbd2cSJim Jagielski }
3573*b1cdbd2cSJim Jagielski 
GetIdx() const3574*b1cdbd2cSJim Jagielski sal_uLong WW8PLCFx_SEPX::GetIdx() const
3575*b1cdbd2cSJim Jagielski {
3576*b1cdbd2cSJim Jagielski     return pPLCF ? pPLCF->GetIdx() : 0;
3577*b1cdbd2cSJim Jagielski }
3578*b1cdbd2cSJim Jagielski 
SetIdx(sal_uLong nIdx)3579*b1cdbd2cSJim Jagielski void WW8PLCFx_SEPX::SetIdx( sal_uLong nIdx )
3580*b1cdbd2cSJim Jagielski {
3581*b1cdbd2cSJim Jagielski     if( pPLCF ) pPLCF->SetIdx( nIdx );
3582*b1cdbd2cSJim Jagielski }
3583*b1cdbd2cSJim Jagielski 
SeekPos(WW8_CP nCpPos)3584*b1cdbd2cSJim Jagielski bool WW8PLCFx_SEPX::SeekPos(WW8_CP nCpPos)
3585*b1cdbd2cSJim Jagielski {
3586*b1cdbd2cSJim Jagielski     return pPLCF ? pPLCF->SeekPos( nCpPos ) : 0;
3587*b1cdbd2cSJim Jagielski }
3588*b1cdbd2cSJim Jagielski 
Where()3589*b1cdbd2cSJim Jagielski WW8_CP WW8PLCFx_SEPX::Where()
3590*b1cdbd2cSJim Jagielski {
3591*b1cdbd2cSJim Jagielski     return pPLCF ? pPLCF->Where() : 0;
3592*b1cdbd2cSJim Jagielski }
3593*b1cdbd2cSJim Jagielski 
GetSprms(WW8PLCFxDesc * p)3594*b1cdbd2cSJim Jagielski void WW8PLCFx_SEPX::GetSprms(WW8PLCFxDesc* p)
3595*b1cdbd2cSJim Jagielski {
3596*b1cdbd2cSJim Jagielski     if( !pPLCF ) return;
3597*b1cdbd2cSJim Jagielski 
3598*b1cdbd2cSJim Jagielski     void* pData;
3599*b1cdbd2cSJim Jagielski 
3600*b1cdbd2cSJim Jagielski     p->bRealLineEnd = false;
3601*b1cdbd2cSJim Jagielski     if (!pPLCF->Get( p->nStartPos, p->nEndPos, pData ))
3602*b1cdbd2cSJim Jagielski     {
3603*b1cdbd2cSJim Jagielski         p->nStartPos = p->nEndPos = WW8_CP_MAX;       // PLCF fertig abgearbeitet
3604*b1cdbd2cSJim Jagielski         p->pMemPos = 0;
3605*b1cdbd2cSJim Jagielski         p->nSprmsLen = 0;
3606*b1cdbd2cSJim Jagielski     }
3607*b1cdbd2cSJim Jagielski     else
3608*b1cdbd2cSJim Jagielski     {
3609*b1cdbd2cSJim Jagielski         sal_uInt32 nPo =  SVBT32ToUInt32( (sal_uInt8*)pData+2 );
3610*b1cdbd2cSJim Jagielski         if (nPo == 0xFFFFFFFF)
3611*b1cdbd2cSJim Jagielski         {
3612*b1cdbd2cSJim Jagielski             p->nStartPos = p->nEndPos = WW8_CP_MAX;   // Sepx empty
3613*b1cdbd2cSJim Jagielski             p->pMemPos = 0;
3614*b1cdbd2cSJim Jagielski             p->nSprmsLen = 0;
3615*b1cdbd2cSJim Jagielski         }
3616*b1cdbd2cSJim Jagielski         else
3617*b1cdbd2cSJim Jagielski         {
3618*b1cdbd2cSJim Jagielski             pStrm->Seek( nPo );
3619*b1cdbd2cSJim Jagielski 
3620*b1cdbd2cSJim Jagielski             // read len
3621*b1cdbd2cSJim Jagielski             if (GetFIBVersion() <= ww::eWW2)	// eWW6 ?, docs say yes, but...
3622*b1cdbd2cSJim Jagielski             {
3623*b1cdbd2cSJim Jagielski                 sal_uInt8 nSiz(0);
3624*b1cdbd2cSJim Jagielski                 *pStrm >> nSiz;
3625*b1cdbd2cSJim Jagielski                 nSprmSiz = nSiz;
3626*b1cdbd2cSJim Jagielski             }
3627*b1cdbd2cSJim Jagielski             else
3628*b1cdbd2cSJim Jagielski                 *pStrm >> nSprmSiz;
3629*b1cdbd2cSJim Jagielski 
3630*b1cdbd2cSJim Jagielski             if( nSprmSiz > nArrMax )
3631*b1cdbd2cSJim Jagielski             {               // passt nicht
3632*b1cdbd2cSJim Jagielski                 delete[] pSprms;
3633*b1cdbd2cSJim Jagielski                 nArrMax = nSprmSiz;                 // Hole mehr Speicher
3634*b1cdbd2cSJim Jagielski                 pSprms = new sal_uInt8[nArrMax];
3635*b1cdbd2cSJim Jagielski             }
3636*b1cdbd2cSJim Jagielski             pStrm->Read( pSprms, nSprmSiz );        // read Sprms
3637*b1cdbd2cSJim Jagielski 
3638*b1cdbd2cSJim Jagielski             p->nSprmsLen = nSprmSiz;
3639*b1cdbd2cSJim Jagielski             p->pMemPos = pSprms;                    // return Position
3640*b1cdbd2cSJim Jagielski         }
3641*b1cdbd2cSJim Jagielski     }
3642*b1cdbd2cSJim Jagielski }
3643*b1cdbd2cSJim Jagielski 
operator ++(int)3644*b1cdbd2cSJim Jagielski WW8PLCFx& WW8PLCFx_SEPX::operator ++( int )
3645*b1cdbd2cSJim Jagielski {
3646*b1cdbd2cSJim Jagielski     if( pPLCF )
3647*b1cdbd2cSJim Jagielski         (*pPLCF)++;
3648*b1cdbd2cSJim Jagielski     return *this;
3649*b1cdbd2cSJim Jagielski }
3650*b1cdbd2cSJim Jagielski 
HasSprm(sal_uInt16 nId) const3651*b1cdbd2cSJim Jagielski const sal_uInt8* WW8PLCFx_SEPX::HasSprm( sal_uInt16 nId ) const
3652*b1cdbd2cSJim Jagielski {
3653*b1cdbd2cSJim Jagielski     return HasSprm( nId, pSprms, nSprmSiz);
3654*b1cdbd2cSJim Jagielski }
3655*b1cdbd2cSJim Jagielski 
HasSprm(sal_uInt16 nId,const sal_uInt8 * pOtherSprms,long nOtherSprmSiz) const3656*b1cdbd2cSJim Jagielski const sal_uInt8* WW8PLCFx_SEPX::HasSprm( sal_uInt16 nId, const sal_uInt8*  pOtherSprms,
3657*b1cdbd2cSJim Jagielski     long nOtherSprmSiz ) const
3658*b1cdbd2cSJim Jagielski {
3659*b1cdbd2cSJim Jagielski     const sal_uInt8 *pRet = 0;
3660*b1cdbd2cSJim Jagielski     if (pPLCF)
3661*b1cdbd2cSJim Jagielski     {
3662*b1cdbd2cSJim Jagielski         WW8SprmIter aIter(pOtherSprms, nOtherSprmSiz, maSprmParser);
3663*b1cdbd2cSJim Jagielski         pRet = aIter.FindSprm(nId);
3664*b1cdbd2cSJim Jagielski     }
3665*b1cdbd2cSJim Jagielski     return pRet;
3666*b1cdbd2cSJim Jagielski }
3667*b1cdbd2cSJim Jagielski 
Find4Sprms(sal_uInt16 nId1,sal_uInt16 nId2,sal_uInt16 nId3,sal_uInt16 nId4,sal_uInt8 * & p1,sal_uInt8 * & p2,sal_uInt8 * & p3,sal_uInt8 * & p4) const3668*b1cdbd2cSJim Jagielski bool WW8PLCFx_SEPX::Find4Sprms(sal_uInt16 nId1,sal_uInt16 nId2,sal_uInt16 nId3,sal_uInt16 nId4,
3669*b1cdbd2cSJim Jagielski     sal_uInt8*& p1, sal_uInt8*& p2, sal_uInt8*& p3, sal_uInt8*& p4) const
3670*b1cdbd2cSJim Jagielski {
3671*b1cdbd2cSJim Jagielski     if( !pPLCF )
3672*b1cdbd2cSJim Jagielski         return 0;
3673*b1cdbd2cSJim Jagielski 
3674*b1cdbd2cSJim Jagielski     bool bFound = false;
3675*b1cdbd2cSJim Jagielski     p1 = 0;
3676*b1cdbd2cSJim Jagielski     p2 = 0;
3677*b1cdbd2cSJim Jagielski     p3 = 0;
3678*b1cdbd2cSJim Jagielski     p4 = 0;
3679*b1cdbd2cSJim Jagielski 
3680*b1cdbd2cSJim Jagielski     sal_uInt8* pSp = pSprms;
3681*b1cdbd2cSJim Jagielski     sal_uInt16 i=0;
3682*b1cdbd2cSJim Jagielski     while (i + maSprmParser.MinSprmLen() <= nSprmSiz)
3683*b1cdbd2cSJim Jagielski     {
3684*b1cdbd2cSJim Jagielski         // Sprm gefunden?
3685*b1cdbd2cSJim Jagielski         sal_uInt16 nAktId = maSprmParser.GetSprmId(pSp);
3686*b1cdbd2cSJim Jagielski         bool bOk = true;
3687*b1cdbd2cSJim Jagielski         if( nAktId  == nId1 )
3688*b1cdbd2cSJim Jagielski             p1 = pSp + maSprmParser.DistanceToData(nId1);
3689*b1cdbd2cSJim Jagielski         else if( nAktId  == nId2 )
3690*b1cdbd2cSJim Jagielski             p2 = pSp + maSprmParser.DistanceToData(nId2);
3691*b1cdbd2cSJim Jagielski         else if( nAktId  == nId3 )
3692*b1cdbd2cSJim Jagielski             p3 = pSp + maSprmParser.DistanceToData(nId3);
3693*b1cdbd2cSJim Jagielski         else if( nAktId  == nId4 )
3694*b1cdbd2cSJim Jagielski             p4 = pSp + maSprmParser.DistanceToData(nId4);
3695*b1cdbd2cSJim Jagielski         else
3696*b1cdbd2cSJim Jagielski             bOk = false;
3697*b1cdbd2cSJim Jagielski         bFound |= bOk;
3698*b1cdbd2cSJim Jagielski         // erhoehe Zeiger, so dass er auf naechsten Sprm zeigt
3699*b1cdbd2cSJim Jagielski         sal_uInt16 x = maSprmParser.GetSprmSize(nAktId, pSp);
3700*b1cdbd2cSJim Jagielski         i = i + x;
3701*b1cdbd2cSJim Jagielski         pSp += x;
3702*b1cdbd2cSJim Jagielski     }
3703*b1cdbd2cSJim Jagielski     return bFound;
3704*b1cdbd2cSJim Jagielski }
3705*b1cdbd2cSJim Jagielski 
HasSprm(sal_uInt16 nId,sal_uInt8 n2nd) const3706*b1cdbd2cSJim Jagielski const sal_uInt8* WW8PLCFx_SEPX::HasSprm( sal_uInt16 nId, sal_uInt8 n2nd ) const
3707*b1cdbd2cSJim Jagielski {
3708*b1cdbd2cSJim Jagielski     if( !pPLCF )
3709*b1cdbd2cSJim Jagielski         return 0;
3710*b1cdbd2cSJim Jagielski 
3711*b1cdbd2cSJim Jagielski     sal_uInt8* pSp = pSprms;
3712*b1cdbd2cSJim Jagielski 
3713*b1cdbd2cSJim Jagielski     sal_uInt16 i=0;
3714*b1cdbd2cSJim Jagielski     while (i + maSprmParser.MinSprmLen() <= nSprmSiz)
3715*b1cdbd2cSJim Jagielski     {
3716*b1cdbd2cSJim Jagielski         // Sprm gefunden?
3717*b1cdbd2cSJim Jagielski         sal_uInt16 nAktId = maSprmParser.GetSprmId(pSp);
3718*b1cdbd2cSJim Jagielski         if (nAktId == nId)
3719*b1cdbd2cSJim Jagielski         {
3720*b1cdbd2cSJim Jagielski             sal_uInt8 *pRet = pSp + maSprmParser.DistanceToData(nId);
3721*b1cdbd2cSJim Jagielski             if (*pRet == n2nd)
3722*b1cdbd2cSJim Jagielski                 return pRet;
3723*b1cdbd2cSJim Jagielski         }
3724*b1cdbd2cSJim Jagielski         // erhoehe Zeiger, so dass er auf naechsten Sprm zeigt
3725*b1cdbd2cSJim Jagielski         sal_uInt16 x = maSprmParser.GetSprmSize(nAktId, pSp);
3726*b1cdbd2cSJim Jagielski         i = i + x;
3727*b1cdbd2cSJim Jagielski         pSp += x;
3728*b1cdbd2cSJim Jagielski     }
3729*b1cdbd2cSJim Jagielski 
3730*b1cdbd2cSJim Jagielski     return 0;   // Sprm nicht gefunden
3731*b1cdbd2cSJim Jagielski }
3732*b1cdbd2cSJim Jagielski 
3733*b1cdbd2cSJim Jagielski //-----------------------------------------
WW8PLCFx_SubDoc(SvStream * pSt,ww::WordVersion eVersion,WW8_CP nStartCp,long nFcRef,long nLenRef,long nFcTxt,long nLenTxt,long nStruct)3734*b1cdbd2cSJim Jagielski WW8PLCFx_SubDoc::WW8PLCFx_SubDoc(
3735*b1cdbd2cSJim Jagielski     SvStream* pSt,
3736*b1cdbd2cSJim Jagielski     ww::WordVersion eVersion,
3737*b1cdbd2cSJim Jagielski     WW8_CP nStartCp,
3738*b1cdbd2cSJim Jagielski     long nFcRef,
3739*b1cdbd2cSJim Jagielski     long nLenRef,
3740*b1cdbd2cSJim Jagielski     long nFcTxt,
3741*b1cdbd2cSJim Jagielski     long nLenTxt,
3742*b1cdbd2cSJim Jagielski     long nStruct)
3743*b1cdbd2cSJim Jagielski     : WW8PLCFx(eVersion, true)
3744*b1cdbd2cSJim Jagielski     , pRef(0)
3745*b1cdbd2cSJim Jagielski     , pTxt(0)
3746*b1cdbd2cSJim Jagielski {
3747*b1cdbd2cSJim Jagielski     if( nLenRef && nLenTxt )
3748*b1cdbd2cSJim Jagielski     {
3749*b1cdbd2cSJim Jagielski         pRef = new WW8PLCF( pSt, nFcRef, nLenRef, nStruct, nStartCp );
3750*b1cdbd2cSJim Jagielski         pTxt = new WW8PLCF( pSt, nFcTxt, nLenTxt, 0, nStartCp );
3751*b1cdbd2cSJim Jagielski     }
3752*b1cdbd2cSJim Jagielski }
3753*b1cdbd2cSJim Jagielski 
~WW8PLCFx_SubDoc()3754*b1cdbd2cSJim Jagielski WW8PLCFx_SubDoc::~WW8PLCFx_SubDoc()
3755*b1cdbd2cSJim Jagielski {
3756*b1cdbd2cSJim Jagielski     delete pRef;
3757*b1cdbd2cSJim Jagielski     delete pTxt;
3758*b1cdbd2cSJim Jagielski }
3759*b1cdbd2cSJim Jagielski 
HasValidPLCF()3760*b1cdbd2cSJim Jagielski bool WW8PLCFx_SubDoc::HasValidPLCF()
3761*b1cdbd2cSJim Jagielski {
3762*b1cdbd2cSJim Jagielski     return ( pRef == 0 || pRef->IsValid() )
3763*b1cdbd2cSJim Jagielski            && ( pTxt == 0 || pTxt->IsValid() );
3764*b1cdbd2cSJim Jagielski }
3765*b1cdbd2cSJim Jagielski 
GetIdx() const3766*b1cdbd2cSJim Jagielski sal_uLong WW8PLCFx_SubDoc::GetIdx() const
3767*b1cdbd2cSJim Jagielski {
3768*b1cdbd2cSJim Jagielski     // Wahrscheinlich pTxt... nicht noetig
3769*b1cdbd2cSJim Jagielski     if( pRef )
3770*b1cdbd2cSJim Jagielski         return ( pRef->GetIdx() << 16 | pTxt->GetIdx() );
3771*b1cdbd2cSJim Jagielski     return 0;
3772*b1cdbd2cSJim Jagielski }
3773*b1cdbd2cSJim Jagielski 
SetIdx(sal_uLong nIdx)3774*b1cdbd2cSJim Jagielski void WW8PLCFx_SubDoc::SetIdx( sal_uLong nIdx )
3775*b1cdbd2cSJim Jagielski {
3776*b1cdbd2cSJim Jagielski     if( pRef )
3777*b1cdbd2cSJim Jagielski     {
3778*b1cdbd2cSJim Jagielski         pRef->SetIdx( nIdx >> 16 );
3779*b1cdbd2cSJim Jagielski         // Wahrscheinlich pTxt... nicht noetig
3780*b1cdbd2cSJim Jagielski         pTxt->SetIdx( nIdx & 0xFFFF );
3781*b1cdbd2cSJim Jagielski     }
3782*b1cdbd2cSJim Jagielski }
3783*b1cdbd2cSJim Jagielski 
SeekPos(WW8_CP nCpPos)3784*b1cdbd2cSJim Jagielski bool WW8PLCFx_SubDoc::SeekPos( WW8_CP nCpPos )
3785*b1cdbd2cSJim Jagielski {
3786*b1cdbd2cSJim Jagielski     return ( pRef ) ? pRef->SeekPos( nCpPos ) : false;
3787*b1cdbd2cSJim Jagielski }
3788*b1cdbd2cSJim Jagielski 
Where()3789*b1cdbd2cSJim Jagielski WW8_CP WW8PLCFx_SubDoc::Where()
3790*b1cdbd2cSJim Jagielski {
3791*b1cdbd2cSJim Jagielski     return ( pRef ) ? pRef->Where() : WW8_CP_MAX;
3792*b1cdbd2cSJim Jagielski }
3793*b1cdbd2cSJim Jagielski 
GetSprms(WW8PLCFxDesc * p)3794*b1cdbd2cSJim Jagielski void WW8PLCFx_SubDoc::GetSprms(WW8PLCFxDesc* p)
3795*b1cdbd2cSJim Jagielski {
3796*b1cdbd2cSJim Jagielski     p->nStartPos = p->nEndPos = WW8_CP_MAX;
3797*b1cdbd2cSJim Jagielski     p->pMemPos = 0;
3798*b1cdbd2cSJim Jagielski     p->nSprmsLen = 0;
3799*b1cdbd2cSJim Jagielski     p->bRealLineEnd = false;
3800*b1cdbd2cSJim Jagielski 
3801*b1cdbd2cSJim Jagielski     if (!pRef)
3802*b1cdbd2cSJim Jagielski         return;
3803*b1cdbd2cSJim Jagielski 
3804*b1cdbd2cSJim Jagielski     sal_uLong nNr = pRef->GetIdx();
3805*b1cdbd2cSJim Jagielski 
3806*b1cdbd2cSJim Jagielski     void *pData;
3807*b1cdbd2cSJim Jagielski     WW8_CP nFoo;
3808*b1cdbd2cSJim Jagielski     if (!pRef->Get(p->nStartPos, nFoo, pData))
3809*b1cdbd2cSJim Jagielski     {
3810*b1cdbd2cSJim Jagielski         p->nEndPos = p->nStartPos = WW8_CP_MAX;
3811*b1cdbd2cSJim Jagielski         return;
3812*b1cdbd2cSJim Jagielski     }
3813*b1cdbd2cSJim Jagielski 
3814*b1cdbd2cSJim Jagielski     p->nEndPos = p->nStartPos + 1;
3815*b1cdbd2cSJim Jagielski 
3816*b1cdbd2cSJim Jagielski     if (!pTxt)
3817*b1cdbd2cSJim Jagielski         return;
3818*b1cdbd2cSJim Jagielski 
3819*b1cdbd2cSJim Jagielski     pTxt->SetIdx(nNr);
3820*b1cdbd2cSJim Jagielski 
3821*b1cdbd2cSJim Jagielski     if (!pTxt->Get(p->nCp2OrIdx, p->nSprmsLen, pData))
3822*b1cdbd2cSJim Jagielski     {
3823*b1cdbd2cSJim Jagielski         p->nEndPos = p->nStartPos = WW8_CP_MAX;
3824*b1cdbd2cSJim Jagielski         p->nSprmsLen = 0;
3825*b1cdbd2cSJim Jagielski         return;
3826*b1cdbd2cSJim Jagielski     }
3827*b1cdbd2cSJim Jagielski 
3828*b1cdbd2cSJim Jagielski     p->nSprmsLen -= p->nCp2OrIdx;
3829*b1cdbd2cSJim Jagielski }
3830*b1cdbd2cSJim Jagielski 
operator ++(int)3831*b1cdbd2cSJim Jagielski WW8PLCFx& WW8PLCFx_SubDoc::operator ++( int )
3832*b1cdbd2cSJim Jagielski {
3833*b1cdbd2cSJim Jagielski     if( pRef && pTxt )
3834*b1cdbd2cSJim Jagielski     {
3835*b1cdbd2cSJim Jagielski         (*pRef)++;
3836*b1cdbd2cSJim Jagielski         (*pTxt)++;
3837*b1cdbd2cSJim Jagielski     }
3838*b1cdbd2cSJim Jagielski     return *this;
3839*b1cdbd2cSJim Jagielski }
3840*b1cdbd2cSJim Jagielski 
3841*b1cdbd2cSJim Jagielski //-----------------------------------------
3842*b1cdbd2cSJim Jagielski //          Felder
3843*b1cdbd2cSJim Jagielski //-----------------------------------------
3844*b1cdbd2cSJim Jagielski 
WW8PLCFx_FLD(SvStream * pSt,const WW8Fib & rMyFib,short nType)3845*b1cdbd2cSJim Jagielski WW8PLCFx_FLD::WW8PLCFx_FLD( SvStream* pSt, const WW8Fib& rMyFib, short nType)
3846*b1cdbd2cSJim Jagielski     : WW8PLCFx(rMyFib.GetFIBVersion(), true), pPLCF(0), rFib(rMyFib)
3847*b1cdbd2cSJim Jagielski {
3848*b1cdbd2cSJim Jagielski     long nFc, nLen;
3849*b1cdbd2cSJim Jagielski 
3850*b1cdbd2cSJim Jagielski     switch( nType )
3851*b1cdbd2cSJim Jagielski     {
3852*b1cdbd2cSJim Jagielski     case MAN_HDFT:
3853*b1cdbd2cSJim Jagielski         nFc = rFib.fcPlcffldHdr;
3854*b1cdbd2cSJim Jagielski         nLen = rFib.lcbPlcffldHdr;
3855*b1cdbd2cSJim Jagielski         break;
3856*b1cdbd2cSJim Jagielski     case MAN_FTN:
3857*b1cdbd2cSJim Jagielski         nFc = rFib.fcPlcffldFtn;
3858*b1cdbd2cSJim Jagielski         nLen = rFib.lcbPlcffldFtn;
3859*b1cdbd2cSJim Jagielski         break;
3860*b1cdbd2cSJim Jagielski     case MAN_EDN:
3861*b1cdbd2cSJim Jagielski         nFc = rFib.fcPlcffldEdn;
3862*b1cdbd2cSJim Jagielski         nLen = rFib.lcbPlcffldEdn;
3863*b1cdbd2cSJim Jagielski         break;
3864*b1cdbd2cSJim Jagielski     case MAN_AND:
3865*b1cdbd2cSJim Jagielski         nFc = rFib.fcPlcffldAtn;
3866*b1cdbd2cSJim Jagielski         nLen = rFib.lcbPlcffldAtn;
3867*b1cdbd2cSJim Jagielski         break;
3868*b1cdbd2cSJim Jagielski     case MAN_TXBX:
3869*b1cdbd2cSJim Jagielski         nFc = rFib.fcPlcffldTxbx;
3870*b1cdbd2cSJim Jagielski         nLen = rFib.lcbPlcffldTxbx;
3871*b1cdbd2cSJim Jagielski         break;
3872*b1cdbd2cSJim Jagielski     case MAN_TXBX_HDFT:
3873*b1cdbd2cSJim Jagielski         nFc = rFib.fcPlcffldHdrTxbx;
3874*b1cdbd2cSJim Jagielski         nLen = rFib.lcbPlcffldHdrTxbx;
3875*b1cdbd2cSJim Jagielski         break;
3876*b1cdbd2cSJim Jagielski     default:
3877*b1cdbd2cSJim Jagielski         nFc = rFib.fcPlcffldMom;
3878*b1cdbd2cSJim Jagielski         nLen = rFib.lcbPlcffldMom;
3879*b1cdbd2cSJim Jagielski         break;
3880*b1cdbd2cSJim Jagielski     }
3881*b1cdbd2cSJim Jagielski 
3882*b1cdbd2cSJim Jagielski     if( nLen )
3883*b1cdbd2cSJim Jagielski         pPLCF = new WW8PLCFspecial( pSt, nFc, nLen, 2 );
3884*b1cdbd2cSJim Jagielski }
3885*b1cdbd2cSJim Jagielski 
~WW8PLCFx_FLD()3886*b1cdbd2cSJim Jagielski WW8PLCFx_FLD::~WW8PLCFx_FLD()
3887*b1cdbd2cSJim Jagielski {
3888*b1cdbd2cSJim Jagielski     delete pPLCF;
3889*b1cdbd2cSJim Jagielski }
3890*b1cdbd2cSJim Jagielski 
HasValidPLCF()3891*b1cdbd2cSJim Jagielski bool WW8PLCFx_FLD::HasValidPLCF()
3892*b1cdbd2cSJim Jagielski {
3893*b1cdbd2cSJim Jagielski     return pPLCF == 0 || pPLCF->IsValid();
3894*b1cdbd2cSJim Jagielski }
3895*b1cdbd2cSJim Jagielski 
GetIdx() const3896*b1cdbd2cSJim Jagielski sal_uLong WW8PLCFx_FLD::GetIdx() const
3897*b1cdbd2cSJim Jagielski {
3898*b1cdbd2cSJim Jagielski     return pPLCF ? pPLCF->GetIdx() : 0;
3899*b1cdbd2cSJim Jagielski }
3900*b1cdbd2cSJim Jagielski 
SetIdx(sal_uLong nIdx)3901*b1cdbd2cSJim Jagielski void WW8PLCFx_FLD::SetIdx( sal_uLong nIdx )
3902*b1cdbd2cSJim Jagielski {
3903*b1cdbd2cSJim Jagielski     if( pPLCF )
3904*b1cdbd2cSJim Jagielski         pPLCF->SetIdx( nIdx );
3905*b1cdbd2cSJim Jagielski }
3906*b1cdbd2cSJim Jagielski 
SeekPos(WW8_CP nCpPos)3907*b1cdbd2cSJim Jagielski bool WW8PLCFx_FLD::SeekPos(WW8_CP nCpPos)
3908*b1cdbd2cSJim Jagielski {
3909*b1cdbd2cSJim Jagielski     return pPLCF ? pPLCF->SeekPosExact( nCpPos ) : false;
3910*b1cdbd2cSJim Jagielski }
3911*b1cdbd2cSJim Jagielski 
Where()3912*b1cdbd2cSJim Jagielski WW8_CP WW8PLCFx_FLD::Where()
3913*b1cdbd2cSJim Jagielski {
3914*b1cdbd2cSJim Jagielski     return pPLCF ? pPLCF->Where() : WW8_CP_MAX;
3915*b1cdbd2cSJim Jagielski }
3916*b1cdbd2cSJim Jagielski 
StartPosIsFieldStart()3917*b1cdbd2cSJim Jagielski bool WW8PLCFx_FLD::StartPosIsFieldStart()
3918*b1cdbd2cSJim Jagielski {
3919*b1cdbd2cSJim Jagielski     void* pData;
3920*b1cdbd2cSJim Jagielski     sal_Int32 nTest;
3921*b1cdbd2cSJim Jagielski     if (
3922*b1cdbd2cSJim Jagielski          (!pPLCF || !pPLCF->Get(nTest, pData) ||
3923*b1cdbd2cSJim Jagielski          ((((sal_uInt8*)pData)[0] & 0x1f) != 0x13))
3924*b1cdbd2cSJim Jagielski        )
3925*b1cdbd2cSJim Jagielski         return false;
3926*b1cdbd2cSJim Jagielski     return true;
3927*b1cdbd2cSJim Jagielski }
3928*b1cdbd2cSJim Jagielski 
EndPosIsFieldEnd(WW8_CP & nCP)3929*b1cdbd2cSJim Jagielski bool WW8PLCFx_FLD::EndPosIsFieldEnd(WW8_CP& nCP)
3930*b1cdbd2cSJim Jagielski {
3931*b1cdbd2cSJim Jagielski     bool bRet = false;
3932*b1cdbd2cSJim Jagielski 
3933*b1cdbd2cSJim Jagielski     if (pPLCF)
3934*b1cdbd2cSJim Jagielski     {
3935*b1cdbd2cSJim Jagielski         long n = pPLCF->GetIdx();
3936*b1cdbd2cSJim Jagielski 
3937*b1cdbd2cSJim Jagielski         (*pPLCF)++;
3938*b1cdbd2cSJim Jagielski 
3939*b1cdbd2cSJim Jagielski         void* pData;
3940*b1cdbd2cSJim Jagielski         sal_Int32 nTest;
3941*b1cdbd2cSJim Jagielski         if ( pPLCF->Get(nTest, pData) && ((((sal_uInt8*)pData)[0] & 0x1f) == 0x15) )
3942*b1cdbd2cSJim Jagielski         {
3943*b1cdbd2cSJim Jagielski             nCP = nTest;
3944*b1cdbd2cSJim Jagielski             bRet = true;
3945*b1cdbd2cSJim Jagielski         }
3946*b1cdbd2cSJim Jagielski 
3947*b1cdbd2cSJim Jagielski         pPLCF->SetIdx(n);
3948*b1cdbd2cSJim Jagielski     }
3949*b1cdbd2cSJim Jagielski 
3950*b1cdbd2cSJim Jagielski     return bRet;
3951*b1cdbd2cSJim Jagielski }
3952*b1cdbd2cSJim Jagielski 
GetSprms(WW8PLCFxDesc * p)3953*b1cdbd2cSJim Jagielski void WW8PLCFx_FLD::GetSprms(WW8PLCFxDesc* p)
3954*b1cdbd2cSJim Jagielski {
3955*b1cdbd2cSJim Jagielski     p->nStartPos = p->nEndPos = WW8_CP_MAX;
3956*b1cdbd2cSJim Jagielski     p->pMemPos = 0;
3957*b1cdbd2cSJim Jagielski     p->nSprmsLen = 0;
3958*b1cdbd2cSJim Jagielski     p->bRealLineEnd = false;
3959*b1cdbd2cSJim Jagielski 
3960*b1cdbd2cSJim Jagielski     if (!pPLCF)
3961*b1cdbd2cSJim Jagielski     {
3962*b1cdbd2cSJim Jagielski         p->nStartPos = WW8_CP_MAX;                    // Es gibt keine Felder
3963*b1cdbd2cSJim Jagielski         return;
3964*b1cdbd2cSJim Jagielski     }
3965*b1cdbd2cSJim Jagielski 
3966*b1cdbd2cSJim Jagielski     long n = pPLCF->GetIdx();
3967*b1cdbd2cSJim Jagielski 
3968*b1cdbd2cSJim Jagielski     sal_Int32 nP;
3969*b1cdbd2cSJim Jagielski     void *pData;
3970*b1cdbd2cSJim Jagielski     if (!pPLCF->Get(nP, pData))             // Ende des PLCFspecial ?
3971*b1cdbd2cSJim Jagielski     {
3972*b1cdbd2cSJim Jagielski         p->nStartPos = WW8_CP_MAX;            // PLCF fertig abgearbeitet
3973*b1cdbd2cSJim Jagielski         return;
3974*b1cdbd2cSJim Jagielski     }
3975*b1cdbd2cSJim Jagielski 
3976*b1cdbd2cSJim Jagielski     p->nStartPos = nP;
3977*b1cdbd2cSJim Jagielski 
3978*b1cdbd2cSJim Jagielski     (*pPLCF)++;
3979*b1cdbd2cSJim Jagielski     if (!pPLCF->Get(nP, pData))             // Ende des PLCFspecial ?
3980*b1cdbd2cSJim Jagielski     {
3981*b1cdbd2cSJim Jagielski         p->nStartPos = WW8_CP_MAX;            // PLCF fertig abgearbeitet
3982*b1cdbd2cSJim Jagielski         return;
3983*b1cdbd2cSJim Jagielski     }
3984*b1cdbd2cSJim Jagielski 
3985*b1cdbd2cSJim Jagielski     p->nEndPos = nP;
3986*b1cdbd2cSJim Jagielski 
3987*b1cdbd2cSJim Jagielski     pPLCF->SetIdx(n);
3988*b1cdbd2cSJim Jagielski 
3989*b1cdbd2cSJim Jagielski     p->nCp2OrIdx = pPLCF->GetIdx();
3990*b1cdbd2cSJim Jagielski }
3991*b1cdbd2cSJim Jagielski 
operator ++(int)3992*b1cdbd2cSJim Jagielski WW8PLCFx& WW8PLCFx_FLD::operator ++( int )
3993*b1cdbd2cSJim Jagielski {
3994*b1cdbd2cSJim Jagielski     (*pPLCF)++;
3995*b1cdbd2cSJim Jagielski     return *this;
3996*b1cdbd2cSJim Jagielski }
3997*b1cdbd2cSJim Jagielski 
GetPara(long nIdx,WW8FieldDesc & rF)3998*b1cdbd2cSJim Jagielski bool WW8PLCFx_FLD::GetPara(long nIdx, WW8FieldDesc& rF)
3999*b1cdbd2cSJim Jagielski {
4000*b1cdbd2cSJim Jagielski     ASSERT( pPLCF, "Aufruf ohne Feld PLCFspecial" );
4001*b1cdbd2cSJim Jagielski     if( !pPLCF )
4002*b1cdbd2cSJim Jagielski         return false;
4003*b1cdbd2cSJim Jagielski 
4004*b1cdbd2cSJim Jagielski     long n = pPLCF->GetIdx();
4005*b1cdbd2cSJim Jagielski     pPLCF->SetIdx(nIdx);
4006*b1cdbd2cSJim Jagielski 
4007*b1cdbd2cSJim Jagielski     bool bOk = WW8GetFieldPara(*pPLCF, rF);
4008*b1cdbd2cSJim Jagielski 
4009*b1cdbd2cSJim Jagielski     pPLCF->SetIdx(n);
4010*b1cdbd2cSJim Jagielski     return bOk;
4011*b1cdbd2cSJim Jagielski }
4012*b1cdbd2cSJim Jagielski 
4013*b1cdbd2cSJim Jagielski //-----------------------------------------
4014*b1cdbd2cSJim Jagielski //      class WW8PLCF_Book
4015*b1cdbd2cSJim Jagielski //-----------------------------------------
4016*b1cdbd2cSJim Jagielski 
4017*b1cdbd2cSJim Jagielski /*  to be optimized like this:    */
WW8ReadSTTBF(bool bVer8,SvStream & rStrm,sal_uInt32 nStart,sal_Int32 nLen,sal_uInt16 nExtraLen,rtl_TextEncoding eCS,std::vector<String> & rArray,std::vector<ww::bytes> * pExtraArray,::std::vector<String> * pValueArray)4018*b1cdbd2cSJim Jagielski void WW8ReadSTTBF(bool bVer8, SvStream& rStrm, sal_uInt32 nStart, sal_Int32 nLen,
4019*b1cdbd2cSJim Jagielski     sal_uInt16 nExtraLen, rtl_TextEncoding eCS, std::vector<String> &rArray,
4020*b1cdbd2cSJim Jagielski     std::vector<ww::bytes>* pExtraArray, ::std::vector<String>* pValueArray)
4021*b1cdbd2cSJim Jagielski {
4022*b1cdbd2cSJim Jagielski     if(nLen==0)     // Handle Empty STTBF
4023*b1cdbd2cSJim Jagielski         return;
4024*b1cdbd2cSJim Jagielski 
4025*b1cdbd2cSJim Jagielski     sal_uLong nOldPos = rStrm.Tell();
4026*b1cdbd2cSJim Jagielski     rStrm.Seek( nStart );
4027*b1cdbd2cSJim Jagielski 
4028*b1cdbd2cSJim Jagielski     sal_uInt16 nLen2;
4029*b1cdbd2cSJim Jagielski     rStrm >> nLen2; // bVer67: total length of structure
4030*b1cdbd2cSJim Jagielski                     // bVer8 : count of strings
4031*b1cdbd2cSJim Jagielski 
4032*b1cdbd2cSJim Jagielski     if( bVer8 )
4033*b1cdbd2cSJim Jagielski     {
4034*b1cdbd2cSJim Jagielski         sal_uInt16 nStrings;
4035*b1cdbd2cSJim Jagielski         bool bUnicode = (0xFFFF == nLen2);
4036*b1cdbd2cSJim Jagielski         if( bUnicode )
4037*b1cdbd2cSJim Jagielski             rStrm >> nStrings;
4038*b1cdbd2cSJim Jagielski         else
4039*b1cdbd2cSJim Jagielski             nStrings = nLen2;
4040*b1cdbd2cSJim Jagielski 
4041*b1cdbd2cSJim Jagielski         rStrm >> nExtraLen;
4042*b1cdbd2cSJim Jagielski 
4043*b1cdbd2cSJim Jagielski         for( sal_uInt16 i=0; i < nStrings; i++ )
4044*b1cdbd2cSJim Jagielski         {
4045*b1cdbd2cSJim Jagielski             if( bUnicode )
4046*b1cdbd2cSJim Jagielski                 rArray.push_back(WW8Read_xstz(rStrm, 0, false));
4047*b1cdbd2cSJim Jagielski             else
4048*b1cdbd2cSJim Jagielski             {
4049*b1cdbd2cSJim Jagielski                 sal_uInt8 nBChar;
4050*b1cdbd2cSJim Jagielski                 rStrm >> nBChar;
4051*b1cdbd2cSJim Jagielski                 ByteString aTmp;
4052*b1cdbd2cSJim Jagielski                 SafeReadString(aTmp,nBChar,rStrm);
4053*b1cdbd2cSJim Jagielski                 rArray.push_back(String(aTmp, eCS));
4054*b1cdbd2cSJim Jagielski             }
4055*b1cdbd2cSJim Jagielski 
4056*b1cdbd2cSJim Jagielski             // Skip the extra data
4057*b1cdbd2cSJim Jagielski             if( nExtraLen )
4058*b1cdbd2cSJim Jagielski             {
4059*b1cdbd2cSJim Jagielski                 if (pExtraArray)
4060*b1cdbd2cSJim Jagielski                 {
4061*b1cdbd2cSJim Jagielski                     ww::bytes extraData;
4062*b1cdbd2cSJim Jagielski                     sal_uInt8 iTmp;
4063*b1cdbd2cSJim Jagielski                     for(int j = 0; j < nExtraLen; ++j)
4064*b1cdbd2cSJim Jagielski                     {
4065*b1cdbd2cSJim Jagielski                         rStrm >> iTmp;
4066*b1cdbd2cSJim Jagielski                         extraData.push_back(iTmp);
4067*b1cdbd2cSJim Jagielski                     }
4068*b1cdbd2cSJim Jagielski                     pExtraArray->push_back(extraData);
4069*b1cdbd2cSJim Jagielski                 }
4070*b1cdbd2cSJim Jagielski                 else
4071*b1cdbd2cSJim Jagielski                     rStrm.SeekRel( nExtraLen );
4072*b1cdbd2cSJim Jagielski             }
4073*b1cdbd2cSJim Jagielski         }
4074*b1cdbd2cSJim Jagielski 		// #129053# read the value of the document variables, if requested.
4075*b1cdbd2cSJim Jagielski 		if (pValueArray)
4076*b1cdbd2cSJim Jagielski 		{
4077*b1cdbd2cSJim Jagielski 				for( sal_uInt16 i=0; i < nStrings; i++ )
4078*b1cdbd2cSJim Jagielski 				{
4079*b1cdbd2cSJim Jagielski 						if( bUnicode )
4080*b1cdbd2cSJim Jagielski 								pValueArray->push_back(WW8Read_xstz(rStrm, 0, false));
4081*b1cdbd2cSJim Jagielski 						else
4082*b1cdbd2cSJim Jagielski 						{
4083*b1cdbd2cSJim Jagielski 								sal_uInt8 nBChar;
4084*b1cdbd2cSJim Jagielski 								rStrm >> nBChar;
4085*b1cdbd2cSJim Jagielski 								ByteString aTmp;
4086*b1cdbd2cSJim Jagielski 								SafeReadString(aTmp,nBChar,rStrm);
4087*b1cdbd2cSJim Jagielski 								pValueArray->push_back(String(aTmp, eCS));
4088*b1cdbd2cSJim Jagielski 						}
4089*b1cdbd2cSJim Jagielski 				}
4090*b1cdbd2cSJim Jagielski 		}
4091*b1cdbd2cSJim Jagielski     }
4092*b1cdbd2cSJim Jagielski     else
4093*b1cdbd2cSJim Jagielski     {
4094*b1cdbd2cSJim Jagielski         sal_uInt8 nBChar;
4095*b1cdbd2cSJim Jagielski         if( nLen2 != nLen )
4096*b1cdbd2cSJim Jagielski         {
4097*b1cdbd2cSJim Jagielski             ASSERT( nLen2 == nLen, "Fib length and read length are different" );
4098*b1cdbd2cSJim Jagielski             if (nLen > USHRT_MAX)
4099*b1cdbd2cSJim Jagielski                 nLen = USHRT_MAX;
4100*b1cdbd2cSJim Jagielski             else if (nLen < 2 )
4101*b1cdbd2cSJim Jagielski                 nLen = 2;
4102*b1cdbd2cSJim Jagielski             nLen2 = static_cast<sal_uInt16>(nLen);
4103*b1cdbd2cSJim Jagielski         }
4104*b1cdbd2cSJim Jagielski         sal_uLong nRead = 0;
4105*b1cdbd2cSJim Jagielski         for( nLen2 -= 2; nRead < nLen2;  )
4106*b1cdbd2cSJim Jagielski         {
4107*b1cdbd2cSJim Jagielski             rStrm >> nBChar; ++nRead;
4108*b1cdbd2cSJim Jagielski             if (nBChar)
4109*b1cdbd2cSJim Jagielski             {
4110*b1cdbd2cSJim Jagielski                 ByteString aTmp;
4111*b1cdbd2cSJim Jagielski                 nRead += SafeReadString(aTmp,nBChar,rStrm);
4112*b1cdbd2cSJim Jagielski                 rArray.push_back(String(aTmp, eCS));
4113*b1cdbd2cSJim Jagielski             }
4114*b1cdbd2cSJim Jagielski             else
4115*b1cdbd2cSJim Jagielski                 rArray.push_back(aEmptyStr);
4116*b1cdbd2cSJim Jagielski 
4117*b1cdbd2cSJim Jagielski             // #89125# Skip the extra data (for bVer67 versions this must come
4118*b1cdbd2cSJim Jagielski             // from external knowledge)
4119*b1cdbd2cSJim Jagielski             if (nExtraLen)
4120*b1cdbd2cSJim Jagielski             {
4121*b1cdbd2cSJim Jagielski                 if (pExtraArray)
4122*b1cdbd2cSJim Jagielski                 {
4123*b1cdbd2cSJim Jagielski                     ww::bytes extraData;
4124*b1cdbd2cSJim Jagielski                     for(int i =0;i < nExtraLen;i++)
4125*b1cdbd2cSJim Jagielski                     {
4126*b1cdbd2cSJim Jagielski                         sal_uInt8 iTmp;
4127*b1cdbd2cSJim Jagielski                         rStrm >> iTmp;
4128*b1cdbd2cSJim Jagielski                         extraData.push_back(iTmp);
4129*b1cdbd2cSJim Jagielski                     }
4130*b1cdbd2cSJim Jagielski                     pExtraArray->push_back(extraData);
4131*b1cdbd2cSJim Jagielski                 }
4132*b1cdbd2cSJim Jagielski                 else
4133*b1cdbd2cSJim Jagielski                     rStrm.SeekRel( nExtraLen );
4134*b1cdbd2cSJim Jagielski                 nRead+=nExtraLen;
4135*b1cdbd2cSJim Jagielski             }
4136*b1cdbd2cSJim Jagielski         }
4137*b1cdbd2cSJim Jagielski     }
4138*b1cdbd2cSJim Jagielski     rStrm.Seek( nOldPos );
4139*b1cdbd2cSJim Jagielski }
4140*b1cdbd2cSJim Jagielski 
WW8PLCFx_Book(SvStream * pTblSt,const WW8Fib & rFib)4141*b1cdbd2cSJim Jagielski WW8PLCFx_Book::WW8PLCFx_Book(SvStream* pTblSt, const WW8Fib& rFib)
4142*b1cdbd2cSJim Jagielski     : WW8PLCFx(rFib.GetFIBVersion(), false), pStatus(0), nIsEnd(0), nBookmarkId(1)
4143*b1cdbd2cSJim Jagielski {
4144*b1cdbd2cSJim Jagielski     if( !rFib.fcPlcfbkf || !rFib.lcbPlcfbkf || !rFib.fcPlcfbkl ||
4145*b1cdbd2cSJim Jagielski         !rFib.lcbPlcfbkl || !rFib.fcSttbfbkmk || !rFib.lcbSttbfbkmk )
4146*b1cdbd2cSJim Jagielski     {
4147*b1cdbd2cSJim Jagielski         pBook[0] = pBook[1] = 0;
4148*b1cdbd2cSJim Jagielski         nIMax = 0;
4149*b1cdbd2cSJim Jagielski     }
4150*b1cdbd2cSJim Jagielski     else
4151*b1cdbd2cSJim Jagielski     {
4152*b1cdbd2cSJim Jagielski         pBook[0] = new WW8PLCFspecial(pTblSt,rFib.fcPlcfbkf,rFib.lcbPlcfbkf,4);
4153*b1cdbd2cSJim Jagielski 
4154*b1cdbd2cSJim Jagielski         pBook[1] = new WW8PLCFspecial(pTblSt,rFib.fcPlcfbkl,rFib.lcbPlcfbkl,0);
4155*b1cdbd2cSJim Jagielski 
4156*b1cdbd2cSJim Jagielski         rtl_TextEncoding eStructChrSet = WW8Fib::GetFIBCharset(rFib.chseTables);
4157*b1cdbd2cSJim Jagielski 
4158*b1cdbd2cSJim Jagielski         WW8ReadSTTBF( (7 < rFib.nVersion), *pTblSt, rFib.fcSttbfbkmk,
4159*b1cdbd2cSJim Jagielski             rFib.lcbSttbfbkmk, 0, eStructChrSet, aBookNames );
4160*b1cdbd2cSJim Jagielski 
4161*b1cdbd2cSJim Jagielski         nIMax = aBookNames.size();
4162*b1cdbd2cSJim Jagielski 
4163*b1cdbd2cSJim Jagielski         if( pBook[0]->GetIMax() < nIMax )   // Count of Bookmarks
4164*b1cdbd2cSJim Jagielski             nIMax = pBook[0]->GetIMax();
4165*b1cdbd2cSJim Jagielski         pStatus = new eBookStatus[ nIMax ];
4166*b1cdbd2cSJim Jagielski         memset( pStatus, 0, nIMax * sizeof( eBookStatus ) );
4167*b1cdbd2cSJim Jagielski     }
4168*b1cdbd2cSJim Jagielski }
4169*b1cdbd2cSJim Jagielski 
~WW8PLCFx_Book()4170*b1cdbd2cSJim Jagielski WW8PLCFx_Book::~WW8PLCFx_Book()
4171*b1cdbd2cSJim Jagielski {
4172*b1cdbd2cSJim Jagielski     delete[] pStatus;
4173*b1cdbd2cSJim Jagielski     delete pBook[1];
4174*b1cdbd2cSJim Jagielski     delete pBook[0];
4175*b1cdbd2cSJim Jagielski }
4176*b1cdbd2cSJim Jagielski 
HasValidPLCF()4177*b1cdbd2cSJim Jagielski bool WW8PLCFx_Book::HasValidPLCF()
4178*b1cdbd2cSJim Jagielski {
4179*b1cdbd2cSJim Jagielski     return ( pBook[0] == 0 || pBook[0]->IsValid() )
4180*b1cdbd2cSJim Jagielski            && ( pBook[1] == 0 || pBook[1]->IsValid() );
4181*b1cdbd2cSJim Jagielski }
4182*b1cdbd2cSJim Jagielski 
GetIdx() const4183*b1cdbd2cSJim Jagielski sal_uLong WW8PLCFx_Book::GetIdx() const
4184*b1cdbd2cSJim Jagielski {
4185*b1cdbd2cSJim Jagielski     return nIMax ? pBook[0]->GetIdx() : 0;
4186*b1cdbd2cSJim Jagielski }
4187*b1cdbd2cSJim Jagielski 
SetIdx(sal_uLong nI)4188*b1cdbd2cSJim Jagielski void WW8PLCFx_Book::SetIdx( sal_uLong nI )
4189*b1cdbd2cSJim Jagielski {
4190*b1cdbd2cSJim Jagielski     if( nIMax )
4191*b1cdbd2cSJim Jagielski         pBook[0]->SetIdx( nI );
4192*b1cdbd2cSJim Jagielski }
4193*b1cdbd2cSJim Jagielski 
GetIdx2() const4194*b1cdbd2cSJim Jagielski sal_uLong WW8PLCFx_Book::GetIdx2() const
4195*b1cdbd2cSJim Jagielski {
4196*b1cdbd2cSJim Jagielski     return nIMax ? ( pBook[1]->GetIdx() | ( ( nIsEnd ) ? 0x80000000 : 0 ) ) : 0;
4197*b1cdbd2cSJim Jagielski }
4198*b1cdbd2cSJim Jagielski 
SetIdx2(sal_uLong nI)4199*b1cdbd2cSJim Jagielski void WW8PLCFx_Book::SetIdx2( sal_uLong nI )
4200*b1cdbd2cSJim Jagielski {
4201*b1cdbd2cSJim Jagielski     if( nIMax )
4202*b1cdbd2cSJim Jagielski     {
4203*b1cdbd2cSJim Jagielski         pBook[1]->SetIdx( nI & 0x7fffffff );
4204*b1cdbd2cSJim Jagielski         nIsEnd = (sal_uInt16)( ( nI >> 31 ) & 1 );  // 0 oder 1
4205*b1cdbd2cSJim Jagielski     }
4206*b1cdbd2cSJim Jagielski }
4207*b1cdbd2cSJim Jagielski 
SeekPos(WW8_CP nCpPos)4208*b1cdbd2cSJim Jagielski bool WW8PLCFx_Book::SeekPos(WW8_CP nCpPos)
4209*b1cdbd2cSJim Jagielski {
4210*b1cdbd2cSJim Jagielski     if( !pBook[0] )
4211*b1cdbd2cSJim Jagielski         return false;
4212*b1cdbd2cSJim Jagielski 
4213*b1cdbd2cSJim Jagielski     bool bOk = pBook[0]->SeekPosExact( nCpPos );
4214*b1cdbd2cSJim Jagielski     bOk &= pBook[1]->SeekPosExact( nCpPos );
4215*b1cdbd2cSJim Jagielski     nIsEnd = 0;
4216*b1cdbd2cSJim Jagielski 
4217*b1cdbd2cSJim Jagielski     return bOk;
4218*b1cdbd2cSJim Jagielski }
4219*b1cdbd2cSJim Jagielski 
Where()4220*b1cdbd2cSJim Jagielski WW8_CP WW8PLCFx_Book::Where()
4221*b1cdbd2cSJim Jagielski {
4222*b1cdbd2cSJim Jagielski     return pBook[nIsEnd]->Where();
4223*b1cdbd2cSJim Jagielski }
4224*b1cdbd2cSJim Jagielski 
GetNoSprms(WW8_CP & rStart,WW8_CP & rEnd,sal_Int32 & rLen)4225*b1cdbd2cSJim Jagielski long WW8PLCFx_Book::GetNoSprms( WW8_CP& rStart, WW8_CP& rEnd, sal_Int32& rLen )
4226*b1cdbd2cSJim Jagielski {
4227*b1cdbd2cSJim Jagielski     void* pData;
4228*b1cdbd2cSJim Jagielski     rEnd = WW8_CP_MAX;
4229*b1cdbd2cSJim Jagielski     rLen = 0;
4230*b1cdbd2cSJim Jagielski 
4231*b1cdbd2cSJim Jagielski     if (!pBook[0] || !pBook[1] || !nIMax || (pBook[nIsEnd]->GetIdx()) >= nIMax)
4232*b1cdbd2cSJim Jagielski     {
4233*b1cdbd2cSJim Jagielski         rStart = rEnd = WW8_CP_MAX;
4234*b1cdbd2cSJim Jagielski         return -1;
4235*b1cdbd2cSJim Jagielski     }
4236*b1cdbd2cSJim Jagielski 
4237*b1cdbd2cSJim Jagielski     pBook[nIsEnd]->Get( rStart, pData );    // Pos. abfragen
4238*b1cdbd2cSJim Jagielski 
4239*b1cdbd2cSJim Jagielski     return pBook[nIsEnd]->GetIdx();
4240*b1cdbd2cSJim Jagielski }
4241*b1cdbd2cSJim Jagielski 
4242*b1cdbd2cSJim Jagielski // Der Operator ++ hat eine Tuecke: Wenn 2 Bookmarks aneinandergrenzen, dann
4243*b1cdbd2cSJim Jagielski // sollte erst das Ende des ersten und dann der Anfang des 2. erreicht werden.
4244*b1cdbd2cSJim Jagielski // Liegen jedoch 2 Bookmarks der Laenge 0 aufeinander, *muss* von jedem Bookmark
4245*b1cdbd2cSJim Jagielski // erst der Anfang und dann das Ende gefunden werden.
4246*b1cdbd2cSJim Jagielski // Der Fall: ][
4247*b1cdbd2cSJim Jagielski //            [...]
4248*b1cdbd2cSJim Jagielski //           ][
4249*b1cdbd2cSJim Jagielski // ist noch nicht geloest, dabei muesste ich in den Anfangs- und Endindices
4250*b1cdbd2cSJim Jagielski // vor- und zurueckspringen, wobei ein weiterer Index oder ein Bitfeld
4251*b1cdbd2cSJim Jagielski // oder etwas aehnliches zum Merken der bereits abgearbeiteten Bookmarks
4252*b1cdbd2cSJim Jagielski // noetig wird.
operator ++(int)4253*b1cdbd2cSJim Jagielski WW8PLCFx& WW8PLCFx_Book::operator ++( int )
4254*b1cdbd2cSJim Jagielski {
4255*b1cdbd2cSJim Jagielski     if( pBook[0] && pBook[1] && nIMax )
4256*b1cdbd2cSJim Jagielski     {
4257*b1cdbd2cSJim Jagielski         (*pBook[nIsEnd])++;
4258*b1cdbd2cSJim Jagielski 
4259*b1cdbd2cSJim Jagielski         sal_uLong l0 = pBook[0]->Where();
4260*b1cdbd2cSJim Jagielski         sal_uLong l1 = pBook[1]->Where();
4261*b1cdbd2cSJim Jagielski         if( l0 < l1 )
4262*b1cdbd2cSJim Jagielski             nIsEnd = 0;
4263*b1cdbd2cSJim Jagielski         else if( l1 < l0 )
4264*b1cdbd2cSJim Jagielski             nIsEnd = 1;
4265*b1cdbd2cSJim Jagielski         else
4266*b1cdbd2cSJim Jagielski         {
4267*b1cdbd2cSJim Jagielski             const void * p = pBook[0]->GetData(pBook[0]->GetIdx());
4268*b1cdbd2cSJim Jagielski             long nPairFor = (p == NULL)? 0L : SVBT16ToShort(*((SVBT16*) p));
4269*b1cdbd2cSJim Jagielski             if (nPairFor == pBook[1]->GetIdx())
4270*b1cdbd2cSJim Jagielski                 nIsEnd = 0;
4271*b1cdbd2cSJim Jagielski             else
4272*b1cdbd2cSJim Jagielski                 nIsEnd = ( nIsEnd ) ? 0 : 1;
4273*b1cdbd2cSJim Jagielski         }
4274*b1cdbd2cSJim Jagielski     }
4275*b1cdbd2cSJim Jagielski     return *this;
4276*b1cdbd2cSJim Jagielski }
4277*b1cdbd2cSJim Jagielski 
GetLen() const4278*b1cdbd2cSJim Jagielski long WW8PLCFx_Book::GetLen() const
4279*b1cdbd2cSJim Jagielski {
4280*b1cdbd2cSJim Jagielski     if( nIsEnd )
4281*b1cdbd2cSJim Jagielski     {
4282*b1cdbd2cSJim Jagielski         ASSERT( !this, "Falscher Aufruf (1) von PLCF_Book::GetLen()" );
4283*b1cdbd2cSJim Jagielski         return 0;
4284*b1cdbd2cSJim Jagielski     }
4285*b1cdbd2cSJim Jagielski     void * p;
4286*b1cdbd2cSJim Jagielski     WW8_CP nStartPos;
4287*b1cdbd2cSJim Jagielski     if( !pBook[0]->Get( nStartPos, p ) )
4288*b1cdbd2cSJim Jagielski     {
4289*b1cdbd2cSJim Jagielski         ASSERT( !this, "Falscher Aufruf (2) von PLCF_Book::GetLen()" );
4290*b1cdbd2cSJim Jagielski         return 0;
4291*b1cdbd2cSJim Jagielski     }
4292*b1cdbd2cSJim Jagielski     sal_uInt16 nEndIdx = SVBT16ToShort( *((SVBT16*)p) );
4293*b1cdbd2cSJim Jagielski     long nNum = pBook[1]->GetPos( nEndIdx );
4294*b1cdbd2cSJim Jagielski     nNum -= nStartPos;
4295*b1cdbd2cSJim Jagielski     return nNum;
4296*b1cdbd2cSJim Jagielski }
4297*b1cdbd2cSJim Jagielski 
SetStatus(sal_uInt16 nIndex,eBookStatus eStat)4298*b1cdbd2cSJim Jagielski void WW8PLCFx_Book::SetStatus(sal_uInt16 nIndex, eBookStatus eStat )
4299*b1cdbd2cSJim Jagielski {
4300*b1cdbd2cSJim Jagielski     ASSERT(nIndex < nIMax, "set status of non existing bookmark!");
4301*b1cdbd2cSJim Jagielski     if ( nIndex < nIMax )
4302*b1cdbd2cSJim Jagielski         pStatus[nIndex] = (eBookStatus)( pStatus[nIndex] | eStat );
4303*b1cdbd2cSJim Jagielski }
4304*b1cdbd2cSJim Jagielski 
GetStatus() const4305*b1cdbd2cSJim Jagielski eBookStatus WW8PLCFx_Book::GetStatus() const
4306*b1cdbd2cSJim Jagielski {
4307*b1cdbd2cSJim Jagielski     if( !pStatus )
4308*b1cdbd2cSJim Jagielski         return BOOK_NORMAL;
4309*b1cdbd2cSJim Jagielski     long nEndIdx = GetHandle();
4310*b1cdbd2cSJim Jagielski     return ( nEndIdx < nIMax ) ? pStatus[nEndIdx] : BOOK_NORMAL;
4311*b1cdbd2cSJim Jagielski }
4312*b1cdbd2cSJim Jagielski 
GetHandle() const4313*b1cdbd2cSJim Jagielski long WW8PLCFx_Book::GetHandle() const
4314*b1cdbd2cSJim Jagielski {
4315*b1cdbd2cSJim Jagielski     if( !pBook[0] || !pBook[1] )
4316*b1cdbd2cSJim Jagielski         return LONG_MAX;
4317*b1cdbd2cSJim Jagielski 
4318*b1cdbd2cSJim Jagielski     if( nIsEnd )
4319*b1cdbd2cSJim Jagielski         return pBook[1]->GetIdx();
4320*b1cdbd2cSJim Jagielski     else
4321*b1cdbd2cSJim Jagielski     {
4322*b1cdbd2cSJim Jagielski         if (const void* p = pBook[0]->GetData(pBook[0]->GetIdx()))
4323*b1cdbd2cSJim Jagielski             return SVBT16ToShort( *((SVBT16*)p) );
4324*b1cdbd2cSJim Jagielski         else
4325*b1cdbd2cSJim Jagielski             return LONG_MAX;
4326*b1cdbd2cSJim Jagielski     }
4327*b1cdbd2cSJim Jagielski }
4328*b1cdbd2cSJim Jagielski 
GetBookmark(long nStart,long nEnd,sal_uInt16 & nIndex)4329*b1cdbd2cSJim Jagielski String WW8PLCFx_Book::GetBookmark(long nStart,long nEnd, sal_uInt16 &nIndex)
4330*b1cdbd2cSJim Jagielski {
4331*b1cdbd2cSJim Jagielski     bool bFound = false;
4332*b1cdbd2cSJim Jagielski     sal_uInt16 i = 0;
4333*b1cdbd2cSJim Jagielski     if( pBook[0] && pBook[1] )
4334*b1cdbd2cSJim Jagielski     {
4335*b1cdbd2cSJim Jagielski         WW8_CP nStartAkt, nEndAkt;
4336*b1cdbd2cSJim Jagielski         do
4337*b1cdbd2cSJim Jagielski         {
4338*b1cdbd2cSJim Jagielski             void* p;
4339*b1cdbd2cSJim Jagielski             sal_uInt16 nEndIdx;
4340*b1cdbd2cSJim Jagielski 
4341*b1cdbd2cSJim Jagielski             if( pBook[0]->GetData( i, nStartAkt, p ) && p )
4342*b1cdbd2cSJim Jagielski                 nEndIdx = SVBT16ToShort( *((SVBT16*)p) );
4343*b1cdbd2cSJim Jagielski             else
4344*b1cdbd2cSJim Jagielski             {
4345*b1cdbd2cSJim Jagielski                 ASSERT( !this, "Bookmark-EndIdx nicht lesbar" );
4346*b1cdbd2cSJim Jagielski                 nEndIdx = i;
4347*b1cdbd2cSJim Jagielski             }
4348*b1cdbd2cSJim Jagielski 
4349*b1cdbd2cSJim Jagielski             nEndAkt = pBook[1]->GetPos( nEndIdx );
4350*b1cdbd2cSJim Jagielski 
4351*b1cdbd2cSJim Jagielski             if ((nStartAkt >= nStart) && (nEndAkt <= nEnd))
4352*b1cdbd2cSJim Jagielski             {
4353*b1cdbd2cSJim Jagielski                 nIndex = i;
4354*b1cdbd2cSJim Jagielski                 bFound=true;
4355*b1cdbd2cSJim Jagielski                 break;
4356*b1cdbd2cSJim Jagielski             }
4357*b1cdbd2cSJim Jagielski             ++i;
4358*b1cdbd2cSJim Jagielski         }
4359*b1cdbd2cSJim Jagielski         while (i < pBook[0]->GetIMax());
4360*b1cdbd2cSJim Jagielski     }
4361*b1cdbd2cSJim Jagielski     return bFound ? aBookNames[i] : aEmptyStr;
4362*b1cdbd2cSJim Jagielski }
4363*b1cdbd2cSJim Jagielski 
GetUniqueBookmarkName(String & suggestedName)4364*b1cdbd2cSJim Jagielski String WW8PLCFx_Book::GetUniqueBookmarkName(String &suggestedName)
4365*b1cdbd2cSJim Jagielski {
4366*b1cdbd2cSJim Jagielski 	String aRet=(suggestedName.Len()==0?String::CreateFromAscii("Unnamed"):suggestedName);
4367*b1cdbd2cSJim Jagielski 	unsigned int i=0;
4368*b1cdbd2cSJim Jagielski 	while(i<aBookNames.size()) {
4369*b1cdbd2cSJim Jagielski 		String &s=aBookNames[i];
4370*b1cdbd2cSJim Jagielski 		if (aRet.CompareTo(s)==0) {
4371*b1cdbd2cSJim Jagielski 			int len=aRet.Len();
4372*b1cdbd2cSJim Jagielski 			int p=len-1;
4373*b1cdbd2cSJim Jagielski 			while(p>0 && aRet.GetChar(static_cast<sal_uInt16>(p))>='0' && aRet.GetChar(static_cast<sal_uInt16>(p))<='9')
4374*b1cdbd2cSJim Jagielski                 p--;
4375*b1cdbd2cSJim Jagielski 			aRet=String(aRet, 0, static_cast<sal_uInt16>(p+1));
4376*b1cdbd2cSJim Jagielski 			aRet += String::CreateFromInt32( nBookmarkId++ );
4377*b1cdbd2cSJim Jagielski 			i=0; // start search from beginning
4378*b1cdbd2cSJim Jagielski 		} else {
4379*b1cdbd2cSJim Jagielski 			i++;
4380*b1cdbd2cSJim Jagielski 		}
4381*b1cdbd2cSJim Jagielski 	}
4382*b1cdbd2cSJim Jagielski 	return aRet;
4383*b1cdbd2cSJim Jagielski }
4384*b1cdbd2cSJim Jagielski 
MapName(String & rName)4385*b1cdbd2cSJim Jagielski bool WW8PLCFx_Book::MapName(String& rName)
4386*b1cdbd2cSJim Jagielski {
4387*b1cdbd2cSJim Jagielski     if( !pBook[0] || !pBook[1] )
4388*b1cdbd2cSJim Jagielski         return false;
4389*b1cdbd2cSJim Jagielski 
4390*b1cdbd2cSJim Jagielski     bool bFound = false;
4391*b1cdbd2cSJim Jagielski     sal_uInt16 i = 0;
4392*b1cdbd2cSJim Jagielski     WW8_CP nStartAkt, nEndAkt;
4393*b1cdbd2cSJim Jagielski     do
4394*b1cdbd2cSJim Jagielski     {
4395*b1cdbd2cSJim Jagielski         void* p;
4396*b1cdbd2cSJim Jagielski         sal_uInt16 nEndIdx;
4397*b1cdbd2cSJim Jagielski 
4398*b1cdbd2cSJim Jagielski         if( pBook[0]->GetData( i, nStartAkt, p ) && p )
4399*b1cdbd2cSJim Jagielski             nEndIdx = SVBT16ToShort( *((SVBT16*)p) );
4400*b1cdbd2cSJim Jagielski         else
4401*b1cdbd2cSJim Jagielski         {
4402*b1cdbd2cSJim Jagielski             ASSERT( !this, "Bookmark-EndIdx nicht lesbar" );
4403*b1cdbd2cSJim Jagielski             nEndIdx = i;
4404*b1cdbd2cSJim Jagielski         }
4405*b1cdbd2cSJim Jagielski         nEndAkt = pBook[1]->GetPos( nEndIdx );
4406*b1cdbd2cSJim Jagielski         if (COMPARE_EQUAL == rName.CompareIgnoreCaseToAscii(aBookNames[i]))
4407*b1cdbd2cSJim Jagielski         {
4408*b1cdbd2cSJim Jagielski             rName = aBookNames[i];
4409*b1cdbd2cSJim Jagielski             bFound = true;
4410*b1cdbd2cSJim Jagielski         }
4411*b1cdbd2cSJim Jagielski         ++i;
4412*b1cdbd2cSJim Jagielski     }
4413*b1cdbd2cSJim Jagielski     while (!bFound && i < pBook[0]->GetIMax());
4414*b1cdbd2cSJim Jagielski     return bFound;
4415*b1cdbd2cSJim Jagielski }
4416*b1cdbd2cSJim Jagielski 
GetName() const4417*b1cdbd2cSJim Jagielski const String* WW8PLCFx_Book::GetName() const
4418*b1cdbd2cSJim Jagielski {
4419*b1cdbd2cSJim Jagielski     const String *pRet = 0;
4420*b1cdbd2cSJim Jagielski     if (!nIsEnd && (pBook[0]->GetIdx() < nIMax))
4421*b1cdbd2cSJim Jagielski         pRet = &(aBookNames[pBook[0]->GetIdx()]);
4422*b1cdbd2cSJim Jagielski     return pRet;
4423*b1cdbd2cSJim Jagielski }
4424*b1cdbd2cSJim Jagielski 
4425*b1cdbd2cSJim Jagielski //-----------------------------------------
4426*b1cdbd2cSJim Jagielski //          WW8PLCFMan
4427*b1cdbd2cSJim Jagielski //-----------------------------------------
4428*b1cdbd2cSJim Jagielski 
4429*b1cdbd2cSJim Jagielski #ifndef DUMP
4430*b1cdbd2cSJim Jagielski 
4431*b1cdbd2cSJim Jagielski // Am Ende eines Absatzes reichen bei WW6 die Attribute bis hinter das <CR>.
4432*b1cdbd2cSJim Jagielski // Das wird fuer die Verwendung mit dem SW um 1 Zeichen zurueckgesetzt, wenn
4433*b1cdbd2cSJim Jagielski // dadurch kein AErger zu erwarten ist.
AdjustEnds(WW8PLCFxDesc & rDesc)4434*b1cdbd2cSJim Jagielski void WW8PLCFMan::AdjustEnds( WW8PLCFxDesc& rDesc )
4435*b1cdbd2cSJim Jagielski {
4436*b1cdbd2cSJim Jagielski     //Store old end position for supercool new property finder that uses
4437*b1cdbd2cSJim Jagielski     //cp instead of fc's as nature intended
4438*b1cdbd2cSJim Jagielski     rDesc.nOrigEndPos = rDesc.nEndPos;
4439*b1cdbd2cSJim Jagielski     rDesc.nOrigStartPos = rDesc.nStartPos;
4440*b1cdbd2cSJim Jagielski 
4441*b1cdbd2cSJim Jagielski     /*
4442*b1cdbd2cSJim Jagielski      Normally given ^XXX{para end}^ we don't actually insert a para end
4443*b1cdbd2cSJim Jagielski      character into the document, so we clip the para end property one to the
4444*b1cdbd2cSJim Jagielski      left to make the para properties end when the paragraph text does. In a
4445*b1cdbd2cSJim Jagielski      drawing textbox we actually do insert a para end character, so we don't
4446*b1cdbd2cSJim Jagielski      clip it. Making the para end properties end after the para end char.
4447*b1cdbd2cSJim Jagielski     */
4448*b1cdbd2cSJim Jagielski     if (GetDoingDrawTextBox())
4449*b1cdbd2cSJim Jagielski         return;
4450*b1cdbd2cSJim Jagielski 
4451*b1cdbd2cSJim Jagielski     if ( (&rDesc == pPap) && rDesc.bRealLineEnd )
4452*b1cdbd2cSJim Jagielski     {
4453*b1cdbd2cSJim Jagielski         if ( pPap->nEndPos != WW8_CP_MAX )    // Para adjust
4454*b1cdbd2cSJim Jagielski         {
4455*b1cdbd2cSJim Jagielski             nLineEnd = pPap->nEndPos;// nLineEnd zeigt *hinter* das <CR>
4456*b1cdbd2cSJim Jagielski             pPap->nEndPos--;        // Absatzende um 1 Zeichen verkuerzen
4457*b1cdbd2cSJim Jagielski 
4458*b1cdbd2cSJim Jagielski             // gibt es bereits ein CharAttr-Ende das auf das jetzige
4459*b1cdbd2cSJim Jagielski             // Absatzende zeigt ?  ... dann auch um 1 Zeichen verkuerzen
4460*b1cdbd2cSJim Jagielski             if (pChp->nEndPos == nLineEnd)
4461*b1cdbd2cSJim Jagielski                 pChp->nEndPos--;
4462*b1cdbd2cSJim Jagielski 
4463*b1cdbd2cSJim Jagielski             // gibt es bereits ein Sep-Ende, das auf das jetzige Absatzende
4464*b1cdbd2cSJim Jagielski             // zeigt ?  ... dann auch um 1 Zeichen verkuerzen
4465*b1cdbd2cSJim Jagielski             if( pSep->nEndPos == nLineEnd )
4466*b1cdbd2cSJim Jagielski                 pSep->nEndPos--;
4467*b1cdbd2cSJim Jagielski         }
4468*b1cdbd2cSJim Jagielski     }
4469*b1cdbd2cSJim Jagielski     else if ( (&rDesc == pChp) || (&rDesc == pSep) )
4470*b1cdbd2cSJim Jagielski     {
4471*b1cdbd2cSJim Jagielski         // Char Adjust oder Sep Adjust Wenn Ende Char-Attr == Absatzende ...
4472*b1cdbd2cSJim Jagielski         if( (rDesc.nEndPos == nLineEnd) && (rDesc.nEndPos > rDesc.nStartPos) )
4473*b1cdbd2cSJim Jagielski             rDesc.nEndPos--;            // ... dann um 1 Zeichen verkuerzen
4474*b1cdbd2cSJim Jagielski     }
4475*b1cdbd2cSJim Jagielski }
4476*b1cdbd2cSJim Jagielski 
ReduceByOffset()4477*b1cdbd2cSJim Jagielski void WW8PLCFxDesc::ReduceByOffset()
4478*b1cdbd2cSJim Jagielski {
4479*b1cdbd2cSJim Jagielski     ASSERT((WW8_CP_MAX == nStartPos) || (nStartPos <= nEndPos),
4480*b1cdbd2cSJim Jagielski             "Attr-Anfang und -Ende ueber Kreuz" );
4481*b1cdbd2cSJim Jagielski 
4482*b1cdbd2cSJim Jagielski     if( nStartPos != WW8_CP_MAX )
4483*b1cdbd2cSJim Jagielski     {
4484*b1cdbd2cSJim Jagielski         /*
4485*b1cdbd2cSJim Jagielski         ##516##,##517##
4486*b1cdbd2cSJim Jagielski         Force the property change to happen at the beginning of this
4487*b1cdbd2cSJim Jagielski         subdocument, same as in GetNewNoSprms, except that the target type is
4488*b1cdbd2cSJim Jagielski         attributes attached to a piece that might span subdocument boundaries
4489*b1cdbd2cSJim Jagielski         */
4490*b1cdbd2cSJim Jagielski         if (nCpOfs > nStartPos)
4491*b1cdbd2cSJim Jagielski             nStartPos = 0;
4492*b1cdbd2cSJim Jagielski         else
4493*b1cdbd2cSJim Jagielski             nStartPos -= nCpOfs;
4494*b1cdbd2cSJim Jagielski     }
4495*b1cdbd2cSJim Jagielski     if( nEndPos != WW8_CP_MAX )
4496*b1cdbd2cSJim Jagielski     {
4497*b1cdbd2cSJim Jagielski         ASSERT(nCpOfs <= nEndPos,
4498*b1cdbd2cSJim Jagielski             "oh oh, so much for the subdocument piece theory");
4499*b1cdbd2cSJim Jagielski         nEndPos   -= nCpOfs;
4500*b1cdbd2cSJim Jagielski     }
4501*b1cdbd2cSJim Jagielski }
4502*b1cdbd2cSJim Jagielski 
GetNewSprms(WW8PLCFxDesc & rDesc)4503*b1cdbd2cSJim Jagielski void WW8PLCFMan::GetNewSprms( WW8PLCFxDesc& rDesc )
4504*b1cdbd2cSJim Jagielski {
4505*b1cdbd2cSJim Jagielski     rDesc.pPLCFx->GetSprms(&rDesc);
4506*b1cdbd2cSJim Jagielski     rDesc.ReduceByOffset();
4507*b1cdbd2cSJim Jagielski 
4508*b1cdbd2cSJim Jagielski     rDesc.bFirstSprm = true;
4509*b1cdbd2cSJim Jagielski     AdjustEnds( rDesc );
4510*b1cdbd2cSJim Jagielski     rDesc.nOrigSprmsLen = rDesc.nSprmsLen;
4511*b1cdbd2cSJim Jagielski }
4512*b1cdbd2cSJim Jagielski 
GetNewNoSprms(WW8PLCFxDesc & rDesc)4513*b1cdbd2cSJim Jagielski void WW8PLCFMan::GetNewNoSprms( WW8PLCFxDesc& rDesc )
4514*b1cdbd2cSJim Jagielski {
4515*b1cdbd2cSJim Jagielski     rDesc.nCp2OrIdx = rDesc.pPLCFx->GetNoSprms(rDesc.nStartPos, rDesc.nEndPos,
4516*b1cdbd2cSJim Jagielski         rDesc.nSprmsLen);
4517*b1cdbd2cSJim Jagielski 
4518*b1cdbd2cSJim Jagielski     ASSERT((WW8_CP_MAX == rDesc.nStartPos) || (rDesc.nStartPos <= rDesc.nEndPos),
4519*b1cdbd2cSJim Jagielski             "Attr-Anfang und -Ende ueber Kreuz" );
4520*b1cdbd2cSJim Jagielski 
4521*b1cdbd2cSJim Jagielski     rDesc.ReduceByOffset();
4522*b1cdbd2cSJim Jagielski 
4523*b1cdbd2cSJim Jagielski     rDesc.bFirstSprm = true;
4524*b1cdbd2cSJim Jagielski     rDesc.nOrigSprmsLen = rDesc.nSprmsLen;
4525*b1cdbd2cSJim Jagielski }
4526*b1cdbd2cSJim Jagielski 
GetId(const WW8PLCFxDesc * p) const4527*b1cdbd2cSJim Jagielski sal_uInt16 WW8PLCFMan::GetId(const WW8PLCFxDesc* p) const
4528*b1cdbd2cSJim Jagielski {
4529*b1cdbd2cSJim Jagielski     sal_uInt16 nId;
4530*b1cdbd2cSJim Jagielski 
4531*b1cdbd2cSJim Jagielski     if (p == pFld)
4532*b1cdbd2cSJim Jagielski         nId = eFLD;
4533*b1cdbd2cSJim Jagielski     else if (p == pFtn)
4534*b1cdbd2cSJim Jagielski         nId = eFTN;
4535*b1cdbd2cSJim Jagielski     else if (p == pEdn)
4536*b1cdbd2cSJim Jagielski         nId = eEDN;
4537*b1cdbd2cSJim Jagielski     else if (p == pAnd)
4538*b1cdbd2cSJim Jagielski         nId = eAND;
4539*b1cdbd2cSJim Jagielski     else if (p->nSprmsLen > 0)
4540*b1cdbd2cSJim Jagielski         nId = maSprmParser.GetSprmId(p->pMemPos);
4541*b1cdbd2cSJim Jagielski     else
4542*b1cdbd2cSJim Jagielski         nId = 0;        // Id = 0 for empty attributes
4543*b1cdbd2cSJim Jagielski 
4544*b1cdbd2cSJim Jagielski     return nId;
4545*b1cdbd2cSJim Jagielski }
4546*b1cdbd2cSJim Jagielski 
WW8PLCFMan(WW8ScannerBase * pBase,ManTypes nType,long nStartCp,bool bDoingDrawTextBox)4547*b1cdbd2cSJim Jagielski WW8PLCFMan::WW8PLCFMan(WW8ScannerBase* pBase, ManTypes nType, long nStartCp,
4548*b1cdbd2cSJim Jagielski     bool bDoingDrawTextBox)
4549*b1cdbd2cSJim Jagielski     : maSprmParser(pBase->pWw8Fib->GetFIBVersion()),
4550*b1cdbd2cSJim Jagielski     mbDoingDrawTextBox(bDoingDrawTextBox)
4551*b1cdbd2cSJim Jagielski {
4552*b1cdbd2cSJim Jagielski     pWwFib = pBase->pWw8Fib;
4553*b1cdbd2cSJim Jagielski 
4554*b1cdbd2cSJim Jagielski     nLastWhereIdxCp = 0;
4555*b1cdbd2cSJim Jagielski     memset( aD, 0, sizeof( aD ) );
4556*b1cdbd2cSJim Jagielski     nLineEnd = WW8_CP_MAX;
4557*b1cdbd2cSJim Jagielski     nManType = nType;
4558*b1cdbd2cSJim Jagielski     sal_uInt16 i;
4559*b1cdbd2cSJim Jagielski 
4560*b1cdbd2cSJim Jagielski     if( MAN_MAINTEXT == nType )
4561*b1cdbd2cSJim Jagielski     {
4562*b1cdbd2cSJim Jagielski         // Suchreihenfolge der Attribute
4563*b1cdbd2cSJim Jagielski         nPLCF = MAN_ANZ_PLCF;
4564*b1cdbd2cSJim Jagielski         pFld = &aD[0];
4565*b1cdbd2cSJim Jagielski         pBkm = &aD[1];
4566*b1cdbd2cSJim Jagielski         pEdn = &aD[2];
4567*b1cdbd2cSJim Jagielski         pFtn = &aD[3];
4568*b1cdbd2cSJim Jagielski         pAnd = &aD[4];
4569*b1cdbd2cSJim Jagielski 
4570*b1cdbd2cSJim Jagielski         pPcd = ( pBase->pPLCFx_PCD ) ? &aD[5] : 0;
4571*b1cdbd2cSJim Jagielski         //pPcdA index == pPcd index + 1
4572*b1cdbd2cSJim Jagielski         pPcdA = ( pBase->pPLCFx_PCDAttrs ) ? &aD[6] : 0;
4573*b1cdbd2cSJim Jagielski 
4574*b1cdbd2cSJim Jagielski         pChp = &aD[7];
4575*b1cdbd2cSJim Jagielski         pPap = &aD[8];
4576*b1cdbd2cSJim Jagielski         pSep = &aD[9];
4577*b1cdbd2cSJim Jagielski 
4578*b1cdbd2cSJim Jagielski         pSep->pPLCFx = pBase->pSepPLCF;
4579*b1cdbd2cSJim Jagielski         pFtn->pPLCFx = pBase->pFtnPLCF;
4580*b1cdbd2cSJim Jagielski         pEdn->pPLCFx = pBase->pEdnPLCF;
4581*b1cdbd2cSJim Jagielski         pBkm->pPLCFx = pBase->pBook;
4582*b1cdbd2cSJim Jagielski         pAnd->pPLCFx = pBase->pAndPLCF;
4583*b1cdbd2cSJim Jagielski 
4584*b1cdbd2cSJim Jagielski     }
4585*b1cdbd2cSJim Jagielski     else
4586*b1cdbd2cSJim Jagielski     {
4587*b1cdbd2cSJim Jagielski         // Suchreihenfolge der Attribute
4588*b1cdbd2cSJim Jagielski         nPLCF = 7;
4589*b1cdbd2cSJim Jagielski         pFld = &aD[0];
4590*b1cdbd2cSJim Jagielski         pBkm = ( pBase->pBook ) ? &aD[1] : 0;
4591*b1cdbd2cSJim Jagielski 
4592*b1cdbd2cSJim Jagielski         pPcd = ( pBase->pPLCFx_PCD ) ? &aD[2] : 0;
4593*b1cdbd2cSJim Jagielski         //pPcdA index == pPcd index + 1
4594*b1cdbd2cSJim Jagielski         pPcdA= ( pBase->pPLCFx_PCDAttrs ) ? &aD[3] : 0;
4595*b1cdbd2cSJim Jagielski 
4596*b1cdbd2cSJim Jagielski         pChp = &aD[4];
4597*b1cdbd2cSJim Jagielski         pPap = &aD[5];
4598*b1cdbd2cSJim Jagielski         pSep = &aD[6]; // Dummy
4599*b1cdbd2cSJim Jagielski 
4600*b1cdbd2cSJim Jagielski         pAnd = pFtn = pEdn = 0;     // unbenutzt bei SpezText
4601*b1cdbd2cSJim Jagielski     }
4602*b1cdbd2cSJim Jagielski 
4603*b1cdbd2cSJim Jagielski     pChp->pPLCFx = pBase->pChpPLCF;
4604*b1cdbd2cSJim Jagielski     pPap->pPLCFx = pBase->pPapPLCF;
4605*b1cdbd2cSJim Jagielski     if( pPcd )
4606*b1cdbd2cSJim Jagielski         pPcd->pPLCFx = pBase->pPLCFx_PCD;
4607*b1cdbd2cSJim Jagielski     if( pPcdA )
4608*b1cdbd2cSJim Jagielski         pPcdA->pPLCFx= pBase->pPLCFx_PCDAttrs;
4609*b1cdbd2cSJim Jagielski     if( pBkm )
4610*b1cdbd2cSJim Jagielski         pBkm->pPLCFx = pBase->pBook;
4611*b1cdbd2cSJim Jagielski 
4612*b1cdbd2cSJim Jagielski     pMagicTables = pBase->pMagicTables;
4613*b1cdbd2cSJim Jagielski     pSubdocs = pBase->pSubdocs;
4614*b1cdbd2cSJim Jagielski     pExtendedAtrds = pBase->pExtendedAtrds;
4615*b1cdbd2cSJim Jagielski 
4616*b1cdbd2cSJim Jagielski     switch( nType )                 // Feld-Initialisierung
4617*b1cdbd2cSJim Jagielski     {
4618*b1cdbd2cSJim Jagielski         case MAN_HDFT:
4619*b1cdbd2cSJim Jagielski             pFld->pPLCFx = pBase->pFldHdFtPLCF;
4620*b1cdbd2cSJim Jagielski             pFdoa = pBase->pHdFtFdoa;
4621*b1cdbd2cSJim Jagielski             pTxbx = pBase->pHdFtTxbx;
4622*b1cdbd2cSJim Jagielski             pTxbxBkd = pBase->pHdFtTxbxBkd;
4623*b1cdbd2cSJim Jagielski             break;
4624*b1cdbd2cSJim Jagielski         case MAN_FTN:
4625*b1cdbd2cSJim Jagielski             pFld->pPLCFx = pBase->pFldFtnPLCF;
4626*b1cdbd2cSJim Jagielski             pFdoa = pTxbx = pTxbxBkd = 0;
4627*b1cdbd2cSJim Jagielski             break;
4628*b1cdbd2cSJim Jagielski         case MAN_EDN:
4629*b1cdbd2cSJim Jagielski             pFld->pPLCFx = pBase->pFldEdnPLCF;
4630*b1cdbd2cSJim Jagielski             pFdoa = pTxbx = pTxbxBkd = 0;
4631*b1cdbd2cSJim Jagielski             break;
4632*b1cdbd2cSJim Jagielski         case MAN_AND:
4633*b1cdbd2cSJim Jagielski             pFld->pPLCFx = pBase->pFldAndPLCF;
4634*b1cdbd2cSJim Jagielski             pFdoa = pTxbx = pTxbxBkd = 0;
4635*b1cdbd2cSJim Jagielski             break;
4636*b1cdbd2cSJim Jagielski         case MAN_TXBX:
4637*b1cdbd2cSJim Jagielski             pFld->pPLCFx = pBase->pFldTxbxPLCF;
4638*b1cdbd2cSJim Jagielski             pTxbx = pBase->pMainTxbx;
4639*b1cdbd2cSJim Jagielski             pTxbxBkd = pBase->pMainTxbxBkd;
4640*b1cdbd2cSJim Jagielski             pFdoa = 0;
4641*b1cdbd2cSJim Jagielski             break;
4642*b1cdbd2cSJim Jagielski         case MAN_TXBX_HDFT:
4643*b1cdbd2cSJim Jagielski             pFld->pPLCFx = pBase->pFldTxbxHdFtPLCF;
4644*b1cdbd2cSJim Jagielski             pTxbx = pBase->pHdFtTxbx;
4645*b1cdbd2cSJim Jagielski             pTxbxBkd = pBase->pHdFtTxbxBkd;
4646*b1cdbd2cSJim Jagielski             pFdoa = 0;
4647*b1cdbd2cSJim Jagielski             break;
4648*b1cdbd2cSJim Jagielski         default:
4649*b1cdbd2cSJim Jagielski             pFld->pPLCFx = pBase->pFldPLCF;
4650*b1cdbd2cSJim Jagielski             pFdoa = pBase->pMainFdoa;
4651*b1cdbd2cSJim Jagielski             pTxbx = pBase->pMainTxbx;
4652*b1cdbd2cSJim Jagielski             pTxbxBkd = pBase->pMainTxbxBkd;
4653*b1cdbd2cSJim Jagielski             break;
4654*b1cdbd2cSJim Jagielski     }
4655*b1cdbd2cSJim Jagielski 
4656*b1cdbd2cSJim Jagielski     nCpO = pWwFib->GetBaseCp(nType);
4657*b1cdbd2cSJim Jagielski 
4658*b1cdbd2cSJim Jagielski     if( nStartCp || nCpO )
4659*b1cdbd2cSJim Jagielski         SeekPos( nStartCp );    // PLCFe auf Text-StartPos einstellen
4660*b1cdbd2cSJim Jagielski 
4661*b1cdbd2cSJim Jagielski     // initialisieren der Member-Vars Low-Level
4662*b1cdbd2cSJim Jagielski     GetChpPLCF()->ResetAttrStartEnd();
4663*b1cdbd2cSJim Jagielski     GetPapPLCF()->ResetAttrStartEnd();
4664*b1cdbd2cSJim Jagielski     for( i=0; i < nPLCF; i++)
4665*b1cdbd2cSJim Jagielski     {
4666*b1cdbd2cSJim Jagielski         WW8PLCFxDesc* p = &aD[i];
4667*b1cdbd2cSJim Jagielski 
4668*b1cdbd2cSJim Jagielski         /*
4669*b1cdbd2cSJim Jagielski         ##516##,##517##
4670*b1cdbd2cSJim Jagielski         For subdocuments we modify the cp of properties to be relative to
4671*b1cdbd2cSJim Jagielski         the beginning of subdocuments, we should also do the same for
4672*b1cdbd2cSJim Jagielski         piecetable changes, and piecetable properties, otherwise a piece
4673*b1cdbd2cSJim Jagielski         change that happens in a subdocument is lost.
4674*b1cdbd2cSJim Jagielski         */
4675*b1cdbd2cSJim Jagielski         p->nCpOfs = ( p == pChp || p == pPap || p == pBkm || p == pPcd ||
4676*b1cdbd2cSJim Jagielski             p == pPcdA ) ? nCpO : 0;
4677*b1cdbd2cSJim Jagielski 
4678*b1cdbd2cSJim Jagielski         p->nCp2OrIdx = 0;
4679*b1cdbd2cSJim Jagielski         p->bFirstSprm = false;
4680*b1cdbd2cSJim Jagielski         p->pIdStk = 0;
4681*b1cdbd2cSJim Jagielski 
4682*b1cdbd2cSJim Jagielski         if ((p == pChp) || (p == pPap))
4683*b1cdbd2cSJim Jagielski             p->nStartPos = p->nEndPos = nStartCp;
4684*b1cdbd2cSJim Jagielski         else
4685*b1cdbd2cSJim Jagielski             p->nStartPos = p->nEndPos = WW8_CP_MAX;
4686*b1cdbd2cSJim Jagielski     }
4687*b1cdbd2cSJim Jagielski 
4688*b1cdbd2cSJim Jagielski     // initialisieren der Member-Vars High-Level
4689*b1cdbd2cSJim Jagielski     for( i=0; i<nPLCF; i++){
4690*b1cdbd2cSJim Jagielski         WW8PLCFxDesc* p = &aD[i];
4691*b1cdbd2cSJim Jagielski 
4692*b1cdbd2cSJim Jagielski         if( !p->pPLCFx )
4693*b1cdbd2cSJim Jagielski         {
4694*b1cdbd2cSJim Jagielski             p->nStartPos = p->nEndPos = WW8_CP_MAX;
4695*b1cdbd2cSJim Jagielski             continue;
4696*b1cdbd2cSJim Jagielski         }
4697*b1cdbd2cSJim Jagielski 
4698*b1cdbd2cSJim Jagielski         if( p->pPLCFx->IsSprm() )
4699*b1cdbd2cSJim Jagielski         {
4700*b1cdbd2cSJim Jagielski             // Vorsicht: nEndPos muss bereits
4701*b1cdbd2cSJim Jagielski             p->pIdStk = new std::stack<sal_uInt16>;
4702*b1cdbd2cSJim Jagielski             if ((p == pChp) || (p == pPap))
4703*b1cdbd2cSJim Jagielski             {
4704*b1cdbd2cSJim Jagielski                 WW8_CP nTemp = p->nEndPos+p->nCpOfs;
4705*b1cdbd2cSJim Jagielski                 p->pMemPos = 0;
4706*b1cdbd2cSJim Jagielski                 p->nSprmsLen = 0;
4707*b1cdbd2cSJim Jagielski                 p->nStartPos = nTemp;
4708*b1cdbd2cSJim Jagielski                 if (!(*p->pPLCFx).SeekPos(p->nStartPos))
4709*b1cdbd2cSJim Jagielski                     p->nEndPos = p->nStartPos = WW8_CP_MAX;
4710*b1cdbd2cSJim Jagielski                 else
4711*b1cdbd2cSJim Jagielski                     GetNewSprms( *p );
4712*b1cdbd2cSJim Jagielski             }
4713*b1cdbd2cSJim Jagielski             else
4714*b1cdbd2cSJim Jagielski                 GetNewSprms( *p );      // bei allen PLCFen initialisiert sein
4715*b1cdbd2cSJim Jagielski         }
4716*b1cdbd2cSJim Jagielski         else if( p->pPLCFx )
4717*b1cdbd2cSJim Jagielski             GetNewNoSprms( *p );
4718*b1cdbd2cSJim Jagielski     }
4719*b1cdbd2cSJim Jagielski }
4720*b1cdbd2cSJim Jagielski 
~WW8PLCFMan()4721*b1cdbd2cSJim Jagielski WW8PLCFMan::~WW8PLCFMan()
4722*b1cdbd2cSJim Jagielski {
4723*b1cdbd2cSJim Jagielski     for( sal_uInt16 i=0; i<nPLCF; i++)
4724*b1cdbd2cSJim Jagielski         delete aD[i].pIdStk;
4725*b1cdbd2cSJim Jagielski }
4726*b1cdbd2cSJim Jagielski 
4727*b1cdbd2cSJim Jagielski // 0. welche Attr.-Klasse,
4728*b1cdbd2cSJim Jagielski // 1. ob ein Attr.-Start ist,
4729*b1cdbd2cSJim Jagielski // 2. CP, wo ist naechste Attr.-Aenderung
WhereIdx(bool * pbStart,long * pPos) const4730*b1cdbd2cSJim Jagielski sal_uInt16 WW8PLCFMan::WhereIdx(bool* pbStart, long* pPos) const
4731*b1cdbd2cSJim Jagielski {
4732*b1cdbd2cSJim Jagielski     ASSERT(nPLCF,"What the hell");
4733*b1cdbd2cSJim Jagielski     long nNext = LONG_MAX;  // SuchReihenfolge:
4734*b1cdbd2cSJim Jagielski     sal_uInt16 nNextIdx = nPLCF;// first ending found ( CHP, PAP, ( SEP ) ),
4735*b1cdbd2cSJim Jagielski     bool bStart = true;     // dann Anfaenge finden ( ( SEP ), PAP, CHP )
4736*b1cdbd2cSJim Jagielski     sal_uInt16 i;
4737*b1cdbd2cSJim Jagielski     const WW8PLCFxDesc* pD;
4738*b1cdbd2cSJim Jagielski     for (i=0; i < nPLCF; i++)
4739*b1cdbd2cSJim Jagielski     {
4740*b1cdbd2cSJim Jagielski         pD = &aD[i];
4741*b1cdbd2cSJim Jagielski         if (pD != pPcdA)
4742*b1cdbd2cSJim Jagielski         {
4743*b1cdbd2cSJim Jagielski             if( (pD->nEndPos < nNext) && (pD->nStartPos == WW8_CP_MAX) )
4744*b1cdbd2cSJim Jagielski             {
4745*b1cdbd2cSJim Jagielski                 // sonst ist Anfang = Ende
4746*b1cdbd2cSJim Jagielski                 nNext = pD->nEndPos;
4747*b1cdbd2cSJim Jagielski                 nNextIdx = i;
4748*b1cdbd2cSJim Jagielski                 bStart = false;
4749*b1cdbd2cSJim Jagielski             }
4750*b1cdbd2cSJim Jagielski         }
4751*b1cdbd2cSJim Jagielski     }
4752*b1cdbd2cSJim Jagielski     for (i=nPLCF; i > 0; i--)
4753*b1cdbd2cSJim Jagielski     {
4754*b1cdbd2cSJim Jagielski         pD = &aD[i-1];
4755*b1cdbd2cSJim Jagielski         if (pD != pPcdA)
4756*b1cdbd2cSJim Jagielski         {
4757*b1cdbd2cSJim Jagielski             if( pD->nStartPos < nNext )
4758*b1cdbd2cSJim Jagielski             {
4759*b1cdbd2cSJim Jagielski                 nNext = pD->nStartPos;
4760*b1cdbd2cSJim Jagielski                 nNextIdx = i-1;
4761*b1cdbd2cSJim Jagielski                 bStart = true;
4762*b1cdbd2cSJim Jagielski             }
4763*b1cdbd2cSJim Jagielski         }
4764*b1cdbd2cSJim Jagielski     }
4765*b1cdbd2cSJim Jagielski     if( pPos )
4766*b1cdbd2cSJim Jagielski         *pPos = nNext;
4767*b1cdbd2cSJim Jagielski     if( pbStart )
4768*b1cdbd2cSJim Jagielski         *pbStart = bStart;
4769*b1cdbd2cSJim Jagielski     return nNextIdx;
4770*b1cdbd2cSJim Jagielski }
4771*b1cdbd2cSJim Jagielski 
4772*b1cdbd2cSJim Jagielski // gibt die CP-Pos der naechsten Attribut-Aenderung zurueck
Where() const4773*b1cdbd2cSJim Jagielski WW8_CP WW8PLCFMan::Where() const
4774*b1cdbd2cSJim Jagielski {
4775*b1cdbd2cSJim Jagielski     long l;
4776*b1cdbd2cSJim Jagielski     WhereIdx(0, &l);
4777*b1cdbd2cSJim Jagielski     return l;
4778*b1cdbd2cSJim Jagielski }
4779*b1cdbd2cSJim Jagielski 
SeekPos(long nNewCp)4780*b1cdbd2cSJim Jagielski void WW8PLCFMan::SeekPos( long nNewCp )
4781*b1cdbd2cSJim Jagielski {
4782*b1cdbd2cSJim Jagielski     pChp->pPLCFx->SeekPos( nNewCp + nCpO ); // Attribute neu
4783*b1cdbd2cSJim Jagielski     pPap->pPLCFx->SeekPos( nNewCp + nCpO ); // aufsetzen
4784*b1cdbd2cSJim Jagielski     pFld->pPLCFx->SeekPos( nNewCp );
4785*b1cdbd2cSJim Jagielski     if( pPcd )
4786*b1cdbd2cSJim Jagielski         pPcd->pPLCFx->SeekPos( nNewCp + nCpO );
4787*b1cdbd2cSJim Jagielski     if( pBkm )
4788*b1cdbd2cSJim Jagielski         pBkm->pPLCFx->SeekPos( nNewCp + nCpO );
4789*b1cdbd2cSJim Jagielski }
4790*b1cdbd2cSJim Jagielski 
SaveAllPLCFx(WW8PLCFxSaveAll & rSave) const4791*b1cdbd2cSJim Jagielski void WW8PLCFMan::SaveAllPLCFx( WW8PLCFxSaveAll& rSave ) const
4792*b1cdbd2cSJim Jagielski {
4793*b1cdbd2cSJim Jagielski     sal_uInt16 i, n=0;
4794*b1cdbd2cSJim Jagielski     if( pPcd )
4795*b1cdbd2cSJim Jagielski         pPcd->Save(  rSave.aS[n++] );
4796*b1cdbd2cSJim Jagielski     if( pPcdA )
4797*b1cdbd2cSJim Jagielski         pPcdA->Save( rSave.aS[n++] );
4798*b1cdbd2cSJim Jagielski 
4799*b1cdbd2cSJim Jagielski     for(i=0; i<nPLCF; ++i)
4800*b1cdbd2cSJim Jagielski         if( pPcd != &aD[i] && pPcdA != &aD[i] )
4801*b1cdbd2cSJim Jagielski             aD[i].Save( rSave.aS[n++] );
4802*b1cdbd2cSJim Jagielski }
4803*b1cdbd2cSJim Jagielski 
RestoreAllPLCFx(const WW8PLCFxSaveAll & rSave)4804*b1cdbd2cSJim Jagielski void WW8PLCFMan::RestoreAllPLCFx( const WW8PLCFxSaveAll& rSave )
4805*b1cdbd2cSJim Jagielski {
4806*b1cdbd2cSJim Jagielski     sal_uInt16 i, n=0;
4807*b1cdbd2cSJim Jagielski     if( pPcd )
4808*b1cdbd2cSJim Jagielski         pPcd->Restore(  rSave.aS[n++] );
4809*b1cdbd2cSJim Jagielski     if( pPcdA )
4810*b1cdbd2cSJim Jagielski         pPcdA->Restore( rSave.aS[n++] );
4811*b1cdbd2cSJim Jagielski 
4812*b1cdbd2cSJim Jagielski     for(i=0; i<nPLCF; ++i)
4813*b1cdbd2cSJim Jagielski         if( pPcd != &aD[i] && pPcdA != &aD[i] )
4814*b1cdbd2cSJim Jagielski             aD[i].Restore( rSave.aS[n++] );
4815*b1cdbd2cSJim Jagielski }
4816*b1cdbd2cSJim Jagielski 
GetSprmStart(short nIdx,WW8PLCFManResult * pRes) const4817*b1cdbd2cSJim Jagielski void WW8PLCFMan::GetSprmStart( short nIdx, WW8PLCFManResult* pRes ) const
4818*b1cdbd2cSJim Jagielski {
4819*b1cdbd2cSJim Jagielski     memset( pRes, 0, sizeof( WW8PLCFManResult ) );
4820*b1cdbd2cSJim Jagielski 
4821*b1cdbd2cSJim Jagielski     // Pruefen !!!
4822*b1cdbd2cSJim Jagielski 
4823*b1cdbd2cSJim Jagielski     pRes->nMemLen = 0;
4824*b1cdbd2cSJim Jagielski 
4825*b1cdbd2cSJim Jagielski     const WW8PLCFxDesc* p = &aD[nIdx];
4826*b1cdbd2cSJim Jagielski 
4827*b1cdbd2cSJim Jagielski     // first Sprm in a Group
4828*b1cdbd2cSJim Jagielski     if( p->bFirstSprm )
4829*b1cdbd2cSJim Jagielski     {
4830*b1cdbd2cSJim Jagielski         if( p == pPap )
4831*b1cdbd2cSJim Jagielski             pRes->nFlags |= MAN_MASK_NEW_PAP;
4832*b1cdbd2cSJim Jagielski         else if( p == pSep )
4833*b1cdbd2cSJim Jagielski             pRes->nFlags |= MAN_MASK_NEW_SEP;
4834*b1cdbd2cSJim Jagielski     }
4835*b1cdbd2cSJim Jagielski     pRes->pMemPos = p->pMemPos;
4836*b1cdbd2cSJim Jagielski     pRes->nSprmId = GetId(p);
4837*b1cdbd2cSJim Jagielski     pRes->nCp2OrIdx = p->nCp2OrIdx;
4838*b1cdbd2cSJim Jagielski     if ((p == pFtn) || (p == pEdn) || (p == pAnd))
4839*b1cdbd2cSJim Jagielski         pRes->nMemLen = p->nSprmsLen;
4840*b1cdbd2cSJim Jagielski     else if (p->nSprmsLen)  //Normal
4841*b1cdbd2cSJim Jagielski     {
4842*b1cdbd2cSJim Jagielski         // Length of actual sprm
4843*b1cdbd2cSJim Jagielski         pRes->nMemLen = maSprmParser.GetSprmSize(pRes->nSprmId, pRes->pMemPos);
4844*b1cdbd2cSJim Jagielski     }
4845*b1cdbd2cSJim Jagielski }
4846*b1cdbd2cSJim Jagielski 
GetSprmEnd(short nIdx,WW8PLCFManResult * pRes) const4847*b1cdbd2cSJim Jagielski void WW8PLCFMan::GetSprmEnd( short nIdx, WW8PLCFManResult* pRes ) const
4848*b1cdbd2cSJim Jagielski {
4849*b1cdbd2cSJim Jagielski     memset( pRes, 0, sizeof( WW8PLCFManResult ) );
4850*b1cdbd2cSJim Jagielski 
4851*b1cdbd2cSJim Jagielski     const WW8PLCFxDesc* p = &aD[nIdx];
4852*b1cdbd2cSJim Jagielski 
4853*b1cdbd2cSJim Jagielski     if (!(p->pIdStk->empty()))
4854*b1cdbd2cSJim Jagielski         pRes->nSprmId = p->pIdStk->top();       // get end position
4855*b1cdbd2cSJim Jagielski     else
4856*b1cdbd2cSJim Jagielski     {
4857*b1cdbd2cSJim Jagielski         ASSERT( !this, "No Id on the Stack" );
4858*b1cdbd2cSJim Jagielski         pRes->nSprmId = 0;
4859*b1cdbd2cSJim Jagielski     }
4860*b1cdbd2cSJim Jagielski }
4861*b1cdbd2cSJim Jagielski 
GetNoSprmStart(short nIdx,WW8PLCFManResult * pRes) const4862*b1cdbd2cSJim Jagielski void WW8PLCFMan::GetNoSprmStart( short nIdx, WW8PLCFManResult* pRes ) const
4863*b1cdbd2cSJim Jagielski {
4864*b1cdbd2cSJim Jagielski     const WW8PLCFxDesc* p = &aD[nIdx];
4865*b1cdbd2cSJim Jagielski 
4866*b1cdbd2cSJim Jagielski     pRes->nCpPos = p->nStartPos;
4867*b1cdbd2cSJim Jagielski     pRes->nMemLen = p->nSprmsLen;
4868*b1cdbd2cSJim Jagielski     pRes->nCp2OrIdx = p->nCp2OrIdx;
4869*b1cdbd2cSJim Jagielski 
4870*b1cdbd2cSJim Jagielski     if( p == pFld )
4871*b1cdbd2cSJim Jagielski         pRes->nSprmId = eFLD;
4872*b1cdbd2cSJim Jagielski     else if( p == pFtn )
4873*b1cdbd2cSJim Jagielski         pRes->nSprmId = eFTN;
4874*b1cdbd2cSJim Jagielski     else if( p == pEdn )
4875*b1cdbd2cSJim Jagielski         pRes->nSprmId = eEDN;
4876*b1cdbd2cSJim Jagielski     else if( p == pBkm )
4877*b1cdbd2cSJim Jagielski         pRes->nSprmId = eBKN;
4878*b1cdbd2cSJim Jagielski     else if( p == pAnd )
4879*b1cdbd2cSJim Jagielski         pRes->nSprmId = eAND;
4880*b1cdbd2cSJim Jagielski     else if( p == pPcd )
4881*b1cdbd2cSJim Jagielski     {
4882*b1cdbd2cSJim Jagielski         //We slave the piece table attributes to the piece table, the piece
4883*b1cdbd2cSJim Jagielski         //table attribute iterator contains the sprms for this piece.
4884*b1cdbd2cSJim Jagielski         GetSprmStart( nIdx+1, pRes );
4885*b1cdbd2cSJim Jagielski     }
4886*b1cdbd2cSJim Jagielski     else
4887*b1cdbd2cSJim Jagielski         pRes->nSprmId = 0;          // default: not found
4888*b1cdbd2cSJim Jagielski }
4889*b1cdbd2cSJim Jagielski 
GetNoSprmEnd(short nIdx,WW8PLCFManResult * pRes) const4890*b1cdbd2cSJim Jagielski void WW8PLCFMan::GetNoSprmEnd( short nIdx, WW8PLCFManResult* pRes ) const
4891*b1cdbd2cSJim Jagielski {
4892*b1cdbd2cSJim Jagielski     pRes->nMemLen = -1;     // Ende-Kennzeichen
4893*b1cdbd2cSJim Jagielski 
4894*b1cdbd2cSJim Jagielski     if( &aD[nIdx] == pBkm )
4895*b1cdbd2cSJim Jagielski         pRes->nSprmId = eBKN;
4896*b1cdbd2cSJim Jagielski     else if( &aD[nIdx] == pPcd )
4897*b1cdbd2cSJim Jagielski     {
4898*b1cdbd2cSJim Jagielski         //We slave the piece table attributes to the piece table, the piece
4899*b1cdbd2cSJim Jagielski         //table attribute iterator contains the sprms for this piece.
4900*b1cdbd2cSJim Jagielski         GetSprmEnd( nIdx+1, pRes );
4901*b1cdbd2cSJim Jagielski     }
4902*b1cdbd2cSJim Jagielski     else
4903*b1cdbd2cSJim Jagielski         pRes->nSprmId = 0;
4904*b1cdbd2cSJim Jagielski }
4905*b1cdbd2cSJim Jagielski 
TransferOpenSprms(std::stack<sal_uInt16> & rStack)4906*b1cdbd2cSJim Jagielski bool WW8PLCFMan::TransferOpenSprms(std::stack<sal_uInt16> &rStack)
4907*b1cdbd2cSJim Jagielski {
4908*b1cdbd2cSJim Jagielski     for (int i = 0; i < nPLCF; ++i)
4909*b1cdbd2cSJim Jagielski     {
4910*b1cdbd2cSJim Jagielski         WW8PLCFxDesc* p = &aD[i];
4911*b1cdbd2cSJim Jagielski         if (!p || !p->pIdStk)
4912*b1cdbd2cSJim Jagielski             continue;
4913*b1cdbd2cSJim Jagielski         while (!p->pIdStk->empty())
4914*b1cdbd2cSJim Jagielski         {
4915*b1cdbd2cSJim Jagielski             rStack.push(p->pIdStk->top());
4916*b1cdbd2cSJim Jagielski             p->pIdStk->pop();
4917*b1cdbd2cSJim Jagielski         }
4918*b1cdbd2cSJim Jagielski     }
4919*b1cdbd2cSJim Jagielski     return rStack.empty();
4920*b1cdbd2cSJim Jagielski }
4921*b1cdbd2cSJim Jagielski 
AdvSprm(short nIdx,bool bStart)4922*b1cdbd2cSJim Jagielski void WW8PLCFMan::AdvSprm(short nIdx, bool bStart)
4923*b1cdbd2cSJim Jagielski {
4924*b1cdbd2cSJim Jagielski     WW8PLCFxDesc* p = &aD[nIdx];    // Sprm-Klasse(!) ermitteln
4925*b1cdbd2cSJim Jagielski 
4926*b1cdbd2cSJim Jagielski     p->bFirstSprm = false;
4927*b1cdbd2cSJim Jagielski     if( bStart )
4928*b1cdbd2cSJim Jagielski     {
4929*b1cdbd2cSJim Jagielski         sal_uInt16 nLastId = GetId(p);
4930*b1cdbd2cSJim Jagielski         p->pIdStk->push(nLastId);   // merke Id fuer Attribut-Ende
4931*b1cdbd2cSJim Jagielski 
4932*b1cdbd2cSJim Jagielski         if( p->nSprmsLen )
4933*b1cdbd2cSJim Jagielski         {   /*
4934*b1cdbd2cSJim Jagielski                 Pruefe, ob noch Sprm(s) abzuarbeiten sind
4935*b1cdbd2cSJim Jagielski             */
4936*b1cdbd2cSJim Jagielski             if( p->pMemPos )
4937*b1cdbd2cSJim Jagielski             {
4938*b1cdbd2cSJim Jagielski                 // Length of last sprm
4939*b1cdbd2cSJim Jagielski                 sal_uInt16 nSprmL = maSprmParser.GetSprmSize(nLastId, p->pMemPos);
4940*b1cdbd2cSJim Jagielski 
4941*b1cdbd2cSJim Jagielski                 // Gesamtlaenge Sprms um SprmLaenge verringern
4942*b1cdbd2cSJim Jagielski                 p->nSprmsLen -= nSprmL;
4943*b1cdbd2cSJim Jagielski 
4944*b1cdbd2cSJim Jagielski                 // Pos des evtl. naechsten Sprm
4945*b1cdbd2cSJim Jagielski                 if (p->nSprmsLen < maSprmParser.MinSprmLen())
4946*b1cdbd2cSJim Jagielski                 {
4947*b1cdbd2cSJim Jagielski                     // sicherheitshalber auf Null setzen, da Enden folgen!
4948*b1cdbd2cSJim Jagielski                     p->pMemPos = 0;
4949*b1cdbd2cSJim Jagielski                     p->nSprmsLen = 0;
4950*b1cdbd2cSJim Jagielski                 }
4951*b1cdbd2cSJim Jagielski                 else
4952*b1cdbd2cSJim Jagielski                     p->pMemPos += nSprmL;
4953*b1cdbd2cSJim Jagielski             }
4954*b1cdbd2cSJim Jagielski             else
4955*b1cdbd2cSJim Jagielski                 p->nSprmsLen = 0;
4956*b1cdbd2cSJim Jagielski         }
4957*b1cdbd2cSJim Jagielski         if (p->nSprmsLen < maSprmParser.MinSprmLen())
4958*b1cdbd2cSJim Jagielski             p->nStartPos = WW8_CP_MAX;    // es folgen Enden
4959*b1cdbd2cSJim Jagielski     }
4960*b1cdbd2cSJim Jagielski     else
4961*b1cdbd2cSJim Jagielski     {
4962*b1cdbd2cSJim Jagielski         if (!(p->pIdStk->empty()))
4963*b1cdbd2cSJim Jagielski             p->pIdStk->pop();
4964*b1cdbd2cSJim Jagielski         if (p->pIdStk->empty())
4965*b1cdbd2cSJim Jagielski         {
4966*b1cdbd2cSJim Jagielski             if ( (p == pChp) || (p == pPap) )
4967*b1cdbd2cSJim Jagielski             {
4968*b1cdbd2cSJim Jagielski                 p->pMemPos = 0;
4969*b1cdbd2cSJim Jagielski                 p->nSprmsLen = 0;
4970*b1cdbd2cSJim Jagielski                 p->nStartPos = p->nOrigEndPos+p->nCpOfs;
4971*b1cdbd2cSJim Jagielski 
4972*b1cdbd2cSJim Jagielski                 /*
4973*b1cdbd2cSJim Jagielski                 #93702#
4974*b1cdbd2cSJim Jagielski                 On failed seek we have run out of sprms, probably.  But if its
4975*b1cdbd2cSJim Jagielski                 a fastsaved file (has pPcd) then we may be just in a sprm free
4976*b1cdbd2cSJim Jagielski                 gap between pieces that have them, so set dirty flag in sprm
4977*b1cdbd2cSJim Jagielski                 finder to consider than.
4978*b1cdbd2cSJim Jagielski                 */
4979*b1cdbd2cSJim Jagielski                 if (!(*p->pPLCFx).SeekPos(p->nStartPos))
4980*b1cdbd2cSJim Jagielski                 {
4981*b1cdbd2cSJim Jagielski                     p->nEndPos = WW8_CP_MAX;
4982*b1cdbd2cSJim Jagielski                     p->pPLCFx->SetDirty(true);
4983*b1cdbd2cSJim Jagielski                 }
4984*b1cdbd2cSJim Jagielski                 if (!p->pPLCFx->GetDirty() || pPcd)
4985*b1cdbd2cSJim Jagielski                     GetNewSprms( *p );
4986*b1cdbd2cSJim Jagielski                 p->pPLCFx->SetDirty(false);
4987*b1cdbd2cSJim Jagielski 
4988*b1cdbd2cSJim Jagielski                 /*
4989*b1cdbd2cSJim Jagielski                 #i2325#
4990*b1cdbd2cSJim Jagielski                 To get the character and paragraph properties you first get
4991*b1cdbd2cSJim Jagielski                 the pap and chp and then apply the fastsaved pPcd properties
4992*b1cdbd2cSJim Jagielski                 to the range. If a pap or chp starts inside the pPcd range
4993*b1cdbd2cSJim Jagielski                 then we must bring the current pPcd range to a halt so as to
4994*b1cdbd2cSJim Jagielski                 end those sprms, then the pap/chp will be processed, and then
4995*b1cdbd2cSJim Jagielski                 we must force a restart of the pPcd on that pap/chp starting
4996*b1cdbd2cSJim Jagielski                 boundary. Doing that effectively means that the pPcd sprms will
4997*b1cdbd2cSJim Jagielski                 be applied to the new range. Not doing it means that the pPcd
4998*b1cdbd2cSJim Jagielski                 sprms will only be applied to the first pap/chp set of
4999*b1cdbd2cSJim Jagielski                 properties contained in the pap/chp range.
5000*b1cdbd2cSJim Jagielski 
5001*b1cdbd2cSJim Jagielski                 So we bring the pPcd to a halt on this location here, by
5002*b1cdbd2cSJim Jagielski                 settings its end to the current start, then store the starting
5003*b1cdbd2cSJim Jagielski                 position of the current range to clipstart. The pPcd sprms
5004*b1cdbd2cSJim Jagielski                 will end as normal (albeit earlier than originally expected),
5005*b1cdbd2cSJim Jagielski                 and the existance of a clipstart will force the pPcd iterater
5006*b1cdbd2cSJim Jagielski                 to reread the current set of sprms instead of advancing to its
5007*b1cdbd2cSJim Jagielski                 next set. Then the clipstart will be set as the starting
5008*b1cdbd2cSJim Jagielski                 position which will force them to be applied directly after
5009*b1cdbd2cSJim Jagielski                 the pap and chps.
5010*b1cdbd2cSJim Jagielski                 */
5011*b1cdbd2cSJim Jagielski                 if (pPcd && ((p->nStartPos > pPcd->nStartPos) ||
5012*b1cdbd2cSJim Jagielski                     (pPcd->nStartPos == WW8_CP_MAX)) &&
5013*b1cdbd2cSJim Jagielski                     (pPcd->nEndPos != p->nStartPos))
5014*b1cdbd2cSJim Jagielski                 {
5015*b1cdbd2cSJim Jagielski                     pPcd->nEndPos = p->nStartPos;
5016*b1cdbd2cSJim Jagielski                     ((WW8PLCFx_PCD *)(pPcd->pPLCFx))->SetClipStart(
5017*b1cdbd2cSJim Jagielski                         p->nStartPos);
5018*b1cdbd2cSJim Jagielski                 }
5019*b1cdbd2cSJim Jagielski 
5020*b1cdbd2cSJim Jagielski             }
5021*b1cdbd2cSJim Jagielski             else
5022*b1cdbd2cSJim Jagielski             {
5023*b1cdbd2cSJim Jagielski                 (*p->pPLCFx)++;     // next Group of Sprms
5024*b1cdbd2cSJim Jagielski                 p->pMemPos = 0;     // !!!
5025*b1cdbd2cSJim Jagielski                 p->nSprmsLen = 0;
5026*b1cdbd2cSJim Jagielski                 GetNewSprms( *p );
5027*b1cdbd2cSJim Jagielski             }
5028*b1cdbd2cSJim Jagielski             ASSERT( p->nStartPos <= p->nEndPos, "Attribut ueber Kreuz" );
5029*b1cdbd2cSJim Jagielski         }
5030*b1cdbd2cSJim Jagielski     }
5031*b1cdbd2cSJim Jagielski }
5032*b1cdbd2cSJim Jagielski 
AdvNoSprm(short nIdx,bool bStart)5033*b1cdbd2cSJim Jagielski void WW8PLCFMan::AdvNoSprm(short nIdx, bool bStart)
5034*b1cdbd2cSJim Jagielski {
5035*b1cdbd2cSJim Jagielski     /*
5036*b1cdbd2cSJim Jagielski     For the case of a piece table we slave the piece table attribute iterator
5037*b1cdbd2cSJim Jagielski     to the piece table and access it through that only. They are two seperate
5038*b1cdbd2cSJim Jagielski     structures, but act together as one logical one. The attributes only go
5039*b1cdbd2cSJim Jagielski     to the next entry when the piece changes
5040*b1cdbd2cSJim Jagielski     */
5041*b1cdbd2cSJim Jagielski     WW8PLCFxDesc* p = &aD[nIdx];
5042*b1cdbd2cSJim Jagielski 
5043*b1cdbd2cSJim Jagielski     if( p == pPcd )
5044*b1cdbd2cSJim Jagielski     {
5045*b1cdbd2cSJim Jagielski         AdvSprm(nIdx+1,bStart);
5046*b1cdbd2cSJim Jagielski         if( bStart )
5047*b1cdbd2cSJim Jagielski             p->nStartPos = aD[nIdx+1].nStartPos;
5048*b1cdbd2cSJim Jagielski         else
5049*b1cdbd2cSJim Jagielski         {
5050*b1cdbd2cSJim Jagielski             if (aD[nIdx+1].pIdStk->empty())
5051*b1cdbd2cSJim Jagielski             {
5052*b1cdbd2cSJim Jagielski                 WW8PLCFx_PCD *pTemp = (WW8PLCFx_PCD*)(pPcd->pPLCFx);
5053*b1cdbd2cSJim Jagielski                 /*
5054*b1cdbd2cSJim Jagielski                 #i2325#
5055*b1cdbd2cSJim Jagielski                 As per normal, go on to the next set of properties, i.e. we
5056*b1cdbd2cSJim Jagielski                 have traversed over to the next piece.  With a clipstart set
5057*b1cdbd2cSJim Jagielski                 we are being told to reread the current piece sprms so as to
5058*b1cdbd2cSJim Jagielski                 reapply them to a new chp or pap range.
5059*b1cdbd2cSJim Jagielski                 */
5060*b1cdbd2cSJim Jagielski                 if (pTemp->GetClipStart() == -1)
5061*b1cdbd2cSJim Jagielski                     (*p->pPLCFx)++;
5062*b1cdbd2cSJim Jagielski                 p->pMemPos = 0;
5063*b1cdbd2cSJim Jagielski                 p->nSprmsLen = 0;
5064*b1cdbd2cSJim Jagielski                 GetNewSprms( aD[nIdx+1] );
5065*b1cdbd2cSJim Jagielski                 GetNewNoSprms( *p );
5066*b1cdbd2cSJim Jagielski                 if (pTemp->GetClipStart() != -1)
5067*b1cdbd2cSJim Jagielski                 {
5068*b1cdbd2cSJim Jagielski                     /*
5069*b1cdbd2cSJim Jagielski                     #i2325#, now we will force our starting position to the
5070*b1cdbd2cSJim Jagielski                     clipping start so as to force the application of these
5071*b1cdbd2cSJim Jagielski                     sprms after the current pap/chp sprms so as to apply the
5072*b1cdbd2cSJim Jagielski                     fastsave sprms to the current range.
5073*b1cdbd2cSJim Jagielski                     */
5074*b1cdbd2cSJim Jagielski                     p->nStartPos = pTemp->GetClipStart();
5075*b1cdbd2cSJim Jagielski                     pTemp->SetClipStart(-1);
5076*b1cdbd2cSJim Jagielski                 }
5077*b1cdbd2cSJim Jagielski             }
5078*b1cdbd2cSJim Jagielski         }
5079*b1cdbd2cSJim Jagielski     }
5080*b1cdbd2cSJim Jagielski     else
5081*b1cdbd2cSJim Jagielski     {                                  // NoSprm ohne Ende
5082*b1cdbd2cSJim Jagielski         (*p->pPLCFx)++;
5083*b1cdbd2cSJim Jagielski         p->pMemPos = 0;                     // MemPos ungueltig
5084*b1cdbd2cSJim Jagielski         p->nSprmsLen = 0;
5085*b1cdbd2cSJim Jagielski         GetNewNoSprms( *p );
5086*b1cdbd2cSJim Jagielski     }
5087*b1cdbd2cSJim Jagielski }
5088*b1cdbd2cSJim Jagielski 
operator ++(int)5089*b1cdbd2cSJim Jagielski WW8PLCFMan& WW8PLCFMan::operator ++(int)
5090*b1cdbd2cSJim Jagielski {
5091*b1cdbd2cSJim Jagielski     bool bStart;
5092*b1cdbd2cSJim Jagielski     sal_uInt16 nIdx = WhereIdx(&bStart);
5093*b1cdbd2cSJim Jagielski     if (nIdx < nPLCF)
5094*b1cdbd2cSJim Jagielski     {
5095*b1cdbd2cSJim Jagielski         WW8PLCFxDesc* p = &aD[nIdx];
5096*b1cdbd2cSJim Jagielski 
5097*b1cdbd2cSJim Jagielski         p->bFirstSprm = true;                       // Default
5098*b1cdbd2cSJim Jagielski 
5099*b1cdbd2cSJim Jagielski         if( p->pPLCFx->IsSprm() )
5100*b1cdbd2cSJim Jagielski             AdvSprm( nIdx, bStart );
5101*b1cdbd2cSJim Jagielski         else                                        // NoSprm
5102*b1cdbd2cSJim Jagielski             AdvNoSprm( nIdx, bStart );
5103*b1cdbd2cSJim Jagielski     }
5104*b1cdbd2cSJim Jagielski     return *this;
5105*b1cdbd2cSJim Jagielski }
5106*b1cdbd2cSJim Jagielski 
5107*b1cdbd2cSJim Jagielski // Rueckgabe true fuer Anfang eines Attributes oder Fehler,
5108*b1cdbd2cSJim Jagielski //           false fuer Ende d. Attr
5109*b1cdbd2cSJim Jagielski // Restliche Rueckgabewerte werden in der vom Aufrufer zu stellenden Struktur
5110*b1cdbd2cSJim Jagielski // WW8PclxManResults geliefert.
Get(WW8PLCFManResult * pRes) const5111*b1cdbd2cSJim Jagielski bool WW8PLCFMan::Get(WW8PLCFManResult* pRes) const
5112*b1cdbd2cSJim Jagielski {
5113*b1cdbd2cSJim Jagielski     memset( pRes, 0, sizeof( WW8PLCFManResult ) );
5114*b1cdbd2cSJim Jagielski     bool bStart;
5115*b1cdbd2cSJim Jagielski     sal_uInt16 nIdx = WhereIdx(&bStart);
5116*b1cdbd2cSJim Jagielski 
5117*b1cdbd2cSJim Jagielski     if( nIdx >= nPLCF )
5118*b1cdbd2cSJim Jagielski     {
5119*b1cdbd2cSJim Jagielski         ASSERT( !this, "Position not found" );
5120*b1cdbd2cSJim Jagielski         return true;
5121*b1cdbd2cSJim Jagielski     }
5122*b1cdbd2cSJim Jagielski 
5123*b1cdbd2cSJim Jagielski     if( aD[nIdx].pPLCFx->IsSprm() )
5124*b1cdbd2cSJim Jagielski     {
5125*b1cdbd2cSJim Jagielski         if( bStart )
5126*b1cdbd2cSJim Jagielski         {
5127*b1cdbd2cSJim Jagielski             GetSprmStart( nIdx, pRes );
5128*b1cdbd2cSJim Jagielski             return true;
5129*b1cdbd2cSJim Jagielski         }
5130*b1cdbd2cSJim Jagielski         else
5131*b1cdbd2cSJim Jagielski         {
5132*b1cdbd2cSJim Jagielski             GetSprmEnd( nIdx, pRes );
5133*b1cdbd2cSJim Jagielski             return false;
5134*b1cdbd2cSJim Jagielski         }
5135*b1cdbd2cSJim Jagielski     }
5136*b1cdbd2cSJim Jagielski     else
5137*b1cdbd2cSJim Jagielski     {
5138*b1cdbd2cSJim Jagielski         if( bStart )
5139*b1cdbd2cSJim Jagielski         {
5140*b1cdbd2cSJim Jagielski             GetNoSprmStart( nIdx, pRes );
5141*b1cdbd2cSJim Jagielski             return true;
5142*b1cdbd2cSJim Jagielski         }
5143*b1cdbd2cSJim Jagielski         else
5144*b1cdbd2cSJim Jagielski         {
5145*b1cdbd2cSJim Jagielski             GetNoSprmEnd( nIdx, pRes );
5146*b1cdbd2cSJim Jagielski             return false;
5147*b1cdbd2cSJim Jagielski         }
5148*b1cdbd2cSJim Jagielski     }
5149*b1cdbd2cSJim Jagielski }
5150*b1cdbd2cSJim Jagielski 
GetColl() const5151*b1cdbd2cSJim Jagielski sal_uInt16 WW8PLCFMan::GetColl() const
5152*b1cdbd2cSJim Jagielski {
5153*b1cdbd2cSJim Jagielski     if( pPap->pPLCFx )
5154*b1cdbd2cSJim Jagielski         return  pPap->pPLCFx->GetIstd();
5155*b1cdbd2cSJim Jagielski     else
5156*b1cdbd2cSJim Jagielski     {
5157*b1cdbd2cSJim Jagielski         ASSERT( !this, "GetColl ohne PLCF_Pap" );
5158*b1cdbd2cSJim Jagielski         return 0;
5159*b1cdbd2cSJim Jagielski     }
5160*b1cdbd2cSJim Jagielski }
5161*b1cdbd2cSJim Jagielski 
GetFld() const5162*b1cdbd2cSJim Jagielski WW8PLCFx_FLD* WW8PLCFMan::GetFld() const
5163*b1cdbd2cSJim Jagielski {
5164*b1cdbd2cSJim Jagielski     return (WW8PLCFx_FLD*)pFld->pPLCFx;
5165*b1cdbd2cSJim Jagielski }
5166*b1cdbd2cSJim Jagielski 
HasParaSprm(sal_uInt16 nId) const5167*b1cdbd2cSJim Jagielski const sal_uInt8* WW8PLCFMan::HasParaSprm( sal_uInt16 nId ) const
5168*b1cdbd2cSJim Jagielski {
5169*b1cdbd2cSJim Jagielski     return ((WW8PLCFx_Cp_FKP*)pPap->pPLCFx)->HasSprm( nId );
5170*b1cdbd2cSJim Jagielski }
5171*b1cdbd2cSJim Jagielski 
HasCharSprm(sal_uInt16 nId) const5172*b1cdbd2cSJim Jagielski const sal_uInt8* WW8PLCFMan::HasCharSprm( sal_uInt16 nId ) const
5173*b1cdbd2cSJim Jagielski {
5174*b1cdbd2cSJim Jagielski     return ((WW8PLCFx_Cp_FKP*)pChp->pPLCFx)->HasSprm( nId );
5175*b1cdbd2cSJim Jagielski }
5176*b1cdbd2cSJim Jagielski 
HasCharSprm(sal_uInt16 nId,std::vector<const sal_uInt8 * > & rResult) const5177*b1cdbd2cSJim Jagielski bool WW8PLCFMan::HasCharSprm(sal_uInt16 nId,
5178*b1cdbd2cSJim Jagielski     std::vector<const sal_uInt8 *> &rResult) const
5179*b1cdbd2cSJim Jagielski {
5180*b1cdbd2cSJim Jagielski     return ((WW8PLCFx_Cp_FKP*)pChp->pPLCFx)->HasSprm(nId, rResult);
5181*b1cdbd2cSJim Jagielski }
5182*b1cdbd2cSJim Jagielski 
5183*b1cdbd2cSJim Jagielski #endif // !DUMP
5184*b1cdbd2cSJim Jagielski 
Save(WW8PLCFxSave1 & rSave) const5185*b1cdbd2cSJim Jagielski void WW8PLCFx::Save( WW8PLCFxSave1& rSave ) const
5186*b1cdbd2cSJim Jagielski {
5187*b1cdbd2cSJim Jagielski     rSave.nPLCFxPos    = GetIdx();
5188*b1cdbd2cSJim Jagielski     rSave.nPLCFxPos2   = GetIdx2();
5189*b1cdbd2cSJim Jagielski     rSave.nPLCFxMemOfs = 0;
5190*b1cdbd2cSJim Jagielski     rSave.nStartFC     = GetStartFc();
5191*b1cdbd2cSJim Jagielski }
5192*b1cdbd2cSJim Jagielski 
Restore(const WW8PLCFxSave1 & rSave)5193*b1cdbd2cSJim Jagielski void WW8PLCFx::Restore( const WW8PLCFxSave1& rSave )
5194*b1cdbd2cSJim Jagielski {
5195*b1cdbd2cSJim Jagielski     SetIdx(     rSave.nPLCFxPos  );
5196*b1cdbd2cSJim Jagielski     SetIdx2(    rSave.nPLCFxPos2 );
5197*b1cdbd2cSJim Jagielski     SetStartFc( rSave.nStartFC   );
5198*b1cdbd2cSJim Jagielski }
5199*b1cdbd2cSJim Jagielski 
GetIdx2() const5200*b1cdbd2cSJim Jagielski sal_uLong WW8PLCFx_Cp_FKP::GetIdx2() const
5201*b1cdbd2cSJim Jagielski {
5202*b1cdbd2cSJim Jagielski     return GetPCDIdx();
5203*b1cdbd2cSJim Jagielski }
5204*b1cdbd2cSJim Jagielski 
SetIdx2(sal_uLong nIdx)5205*b1cdbd2cSJim Jagielski void WW8PLCFx_Cp_FKP::SetIdx2( sal_uLong nIdx )
5206*b1cdbd2cSJim Jagielski {
5207*b1cdbd2cSJim Jagielski     SetPCDIdx( nIdx );
5208*b1cdbd2cSJim Jagielski }
5209*b1cdbd2cSJim Jagielski 
Save(WW8PLCFxSave1 & rSave) const5210*b1cdbd2cSJim Jagielski void WW8PLCFx_Cp_FKP::Save( WW8PLCFxSave1& rSave ) const
5211*b1cdbd2cSJim Jagielski {
5212*b1cdbd2cSJim Jagielski     WW8PLCFx::Save( rSave );
5213*b1cdbd2cSJim Jagielski 
5214*b1cdbd2cSJim Jagielski     rSave.nAttrStart = nAttrStart;
5215*b1cdbd2cSJim Jagielski     rSave.nAttrEnd   = nAttrEnd;
5216*b1cdbd2cSJim Jagielski     rSave.bLineEnd   = bLineEnd;
5217*b1cdbd2cSJim Jagielski }
5218*b1cdbd2cSJim Jagielski 
Restore(const WW8PLCFxSave1 & rSave)5219*b1cdbd2cSJim Jagielski void WW8PLCFx_Cp_FKP::Restore( const WW8PLCFxSave1& rSave )
5220*b1cdbd2cSJim Jagielski {
5221*b1cdbd2cSJim Jagielski     WW8PLCFx::Restore( rSave );
5222*b1cdbd2cSJim Jagielski 
5223*b1cdbd2cSJim Jagielski     nAttrStart = rSave.nAttrStart;
5224*b1cdbd2cSJim Jagielski     nAttrEnd   = rSave.nAttrEnd;
5225*b1cdbd2cSJim Jagielski     bLineEnd   = rSave.bLineEnd;
5226*b1cdbd2cSJim Jagielski }
5227*b1cdbd2cSJim Jagielski 
Save(WW8PLCFxSave1 & rSave) const5228*b1cdbd2cSJim Jagielski void WW8PLCFxDesc::Save( WW8PLCFxSave1& rSave ) const
5229*b1cdbd2cSJim Jagielski {
5230*b1cdbd2cSJim Jagielski     if( pPLCFx )
5231*b1cdbd2cSJim Jagielski     {
5232*b1cdbd2cSJim Jagielski         pPLCFx->Save( rSave );
5233*b1cdbd2cSJim Jagielski         if( pPLCFx->IsSprm() )
5234*b1cdbd2cSJim Jagielski         {
5235*b1cdbd2cSJim Jagielski             WW8PLCFxDesc aD;
5236*b1cdbd2cSJim Jagielski             aD.nStartPos = nOrigStartPos+nCpOfs;
5237*b1cdbd2cSJim Jagielski             aD.nCpOfs = rSave.nCpOfs = nCpOfs;
5238*b1cdbd2cSJim Jagielski             if (!(pPLCFx->SeekPos(aD.nStartPos)))
5239*b1cdbd2cSJim Jagielski             {
5240*b1cdbd2cSJim Jagielski                 aD.nEndPos = WW8_CP_MAX;
5241*b1cdbd2cSJim Jagielski                 pPLCFx->SetDirty(true);
5242*b1cdbd2cSJim Jagielski             }
5243*b1cdbd2cSJim Jagielski             pPLCFx->GetSprms(&aD);
5244*b1cdbd2cSJim Jagielski             pPLCFx->SetDirty(false);
5245*b1cdbd2cSJim Jagielski             aD.ReduceByOffset();
5246*b1cdbd2cSJim Jagielski             rSave.nStartCp = aD.nStartPos;
5247*b1cdbd2cSJim Jagielski             rSave.nPLCFxMemOfs = nOrigSprmsLen - nSprmsLen;
5248*b1cdbd2cSJim Jagielski         }
5249*b1cdbd2cSJim Jagielski     }
5250*b1cdbd2cSJim Jagielski }
5251*b1cdbd2cSJim Jagielski 
Restore(const WW8PLCFxSave1 & rSave)5252*b1cdbd2cSJim Jagielski void WW8PLCFxDesc::Restore( const WW8PLCFxSave1& rSave )
5253*b1cdbd2cSJim Jagielski {
5254*b1cdbd2cSJim Jagielski     if( pPLCFx )
5255*b1cdbd2cSJim Jagielski     {
5256*b1cdbd2cSJim Jagielski         pPLCFx->Restore( rSave );
5257*b1cdbd2cSJim Jagielski         if( pPLCFx->IsSprm() )
5258*b1cdbd2cSJim Jagielski         {
5259*b1cdbd2cSJim Jagielski             WW8PLCFxDesc aD;
5260*b1cdbd2cSJim Jagielski             aD.nStartPos = rSave.nStartCp+rSave.nCpOfs;
5261*b1cdbd2cSJim Jagielski             nCpOfs = aD.nCpOfs = rSave.nCpOfs;
5262*b1cdbd2cSJim Jagielski             if (!(pPLCFx->SeekPos(aD.nStartPos)))
5263*b1cdbd2cSJim Jagielski             {
5264*b1cdbd2cSJim Jagielski                 aD.nEndPos = WW8_CP_MAX;
5265*b1cdbd2cSJim Jagielski                 pPLCFx->SetDirty(true);
5266*b1cdbd2cSJim Jagielski             }
5267*b1cdbd2cSJim Jagielski             pPLCFx->GetSprms(&aD);
5268*b1cdbd2cSJim Jagielski             pPLCFx->SetDirty(false);
5269*b1cdbd2cSJim Jagielski             aD.ReduceByOffset();
5270*b1cdbd2cSJim Jagielski             pMemPos = aD.pMemPos + rSave.nPLCFxMemOfs;
5271*b1cdbd2cSJim Jagielski         }
5272*b1cdbd2cSJim Jagielski     }
5273*b1cdbd2cSJim Jagielski }
5274*b1cdbd2cSJim Jagielski 
5275*b1cdbd2cSJim Jagielski //-----------------------------------------
5276*b1cdbd2cSJim Jagielski 
5277*b1cdbd2cSJim Jagielski namespace
5278*b1cdbd2cSJim Jagielski {
Readcb(SvStream & rSt,ww::WordVersion eVer)5279*b1cdbd2cSJim Jagielski     sal_uInt32 Readcb(SvStream& rSt, ww::WordVersion eVer)
5280*b1cdbd2cSJim Jagielski     {
5281*b1cdbd2cSJim Jagielski         if (eVer <= ww::eWW2)
5282*b1cdbd2cSJim Jagielski         {
5283*b1cdbd2cSJim Jagielski             sal_uInt16 nShort;
5284*b1cdbd2cSJim Jagielski             rSt >> nShort;
5285*b1cdbd2cSJim Jagielski             return nShort;
5286*b1cdbd2cSJim Jagielski         }
5287*b1cdbd2cSJim Jagielski         else
5288*b1cdbd2cSJim Jagielski         {
5289*b1cdbd2cSJim Jagielski             sal_uInt32 nLong;
5290*b1cdbd2cSJim Jagielski             rSt >> nLong;
5291*b1cdbd2cSJim Jagielski             return nLong;
5292*b1cdbd2cSJim Jagielski         }
5293*b1cdbd2cSJim Jagielski     }
5294*b1cdbd2cSJim Jagielski }
5295*b1cdbd2cSJim Jagielski 
GetBaseCp(ManTypes nType) const5296*b1cdbd2cSJim Jagielski WW8_CP WW8Fib::GetBaseCp(ManTypes nType) const
5297*b1cdbd2cSJim Jagielski {
5298*b1cdbd2cSJim Jagielski     WW8_CP nOffset = 0;
5299*b1cdbd2cSJim Jagielski 
5300*b1cdbd2cSJim Jagielski     switch( nType )
5301*b1cdbd2cSJim Jagielski     {
5302*b1cdbd2cSJim Jagielski         default:
5303*b1cdbd2cSJim Jagielski         case MAN_MAINTEXT:
5304*b1cdbd2cSJim Jagielski             break;
5305*b1cdbd2cSJim Jagielski         case MAN_FTN:
5306*b1cdbd2cSJim Jagielski             nOffset = ccpText;
5307*b1cdbd2cSJim Jagielski             break;
5308*b1cdbd2cSJim Jagielski         case MAN_HDFT:
5309*b1cdbd2cSJim Jagielski             nOffset = ccpText + ccpFtn;
5310*b1cdbd2cSJim Jagielski             break;
5311*b1cdbd2cSJim Jagielski /*
5312*b1cdbd2cSJim Jagielski  * A subdocument of this kind probably exists in some defunct version
5313*b1cdbd2cSJim Jagielski  * of MSWord, but now ccpMcr is always 0
5314*b1cdbd2cSJim Jagielski  */
5315*b1cdbd2cSJim Jagielski #if 0
5316*b1cdbd2cSJim Jagielski         case MAN_MACRO:
5317*b1cdbd2cSJim Jagielski             nOffset = ccpText + ccpFtn + ccpHdr;
5318*b1cdbd2cSJim Jagielski             break;
5319*b1cdbd2cSJim Jagielski #endif
5320*b1cdbd2cSJim Jagielski         case MAN_AND:
5321*b1cdbd2cSJim Jagielski             nOffset = ccpText + ccpFtn + ccpHdr + ccpMcr;
5322*b1cdbd2cSJim Jagielski             break;
5323*b1cdbd2cSJim Jagielski         case MAN_EDN:
5324*b1cdbd2cSJim Jagielski             nOffset = ccpText + ccpFtn + ccpHdr + ccpMcr + ccpAtn;
5325*b1cdbd2cSJim Jagielski             break;
5326*b1cdbd2cSJim Jagielski         case MAN_TXBX:
5327*b1cdbd2cSJim Jagielski             nOffset = ccpText + ccpFtn + ccpHdr + ccpMcr + ccpAtn + ccpEdn;
5328*b1cdbd2cSJim Jagielski             break;
5329*b1cdbd2cSJim Jagielski         case MAN_TXBX_HDFT:
5330*b1cdbd2cSJim Jagielski             nOffset = ccpText + ccpFtn + ccpHdr + ccpMcr + ccpAtn + ccpEdn +
5331*b1cdbd2cSJim Jagielski                 ccpTxbx;
5332*b1cdbd2cSJim Jagielski             break;
5333*b1cdbd2cSJim Jagielski     }
5334*b1cdbd2cSJim Jagielski     return nOffset;
5335*b1cdbd2cSJim Jagielski }
5336*b1cdbd2cSJim Jagielski 
GetFIBVersion() const5337*b1cdbd2cSJim Jagielski ww::WordVersion WW8Fib::GetFIBVersion() const
5338*b1cdbd2cSJim Jagielski {
5339*b1cdbd2cSJim Jagielski     ww::WordVersion eVer = ww::eWW8;
5340*b1cdbd2cSJim Jagielski     if (wIdent == 0xa5db)
5341*b1cdbd2cSJim Jagielski         eVer = ww::eWW2;
5342*b1cdbd2cSJim Jagielski     else
5343*b1cdbd2cSJim Jagielski     {
5344*b1cdbd2cSJim Jagielski         switch (nVersion)
5345*b1cdbd2cSJim Jagielski         {
5346*b1cdbd2cSJim Jagielski             case 6:
5347*b1cdbd2cSJim Jagielski                 eVer = ww::eWW6;
5348*b1cdbd2cSJim Jagielski                 break;
5349*b1cdbd2cSJim Jagielski             case 7:
5350*b1cdbd2cSJim Jagielski                 eVer = ww::eWW7;
5351*b1cdbd2cSJim Jagielski                 break;
5352*b1cdbd2cSJim Jagielski             case 8:
5353*b1cdbd2cSJim Jagielski                 eVer = ww::eWW8;
5354*b1cdbd2cSJim Jagielski                 break;
5355*b1cdbd2cSJim Jagielski         }
5356*b1cdbd2cSJim Jagielski     }
5357*b1cdbd2cSJim Jagielski     return eVer;
5358*b1cdbd2cSJim Jagielski }
5359*b1cdbd2cSJim Jagielski 
WW8Fib(SvStream & rSt,sal_uInt8 nWantedVersion,sal_uInt32 nOffset)5360*b1cdbd2cSJim Jagielski WW8Fib::WW8Fib(SvStream& rSt, sal_uInt8 nWantedVersion, sal_uInt32 nOffset)
5361*b1cdbd2cSJim Jagielski     : nFibError( 0 )
5362*b1cdbd2cSJim Jagielski {
5363*b1cdbd2cSJim Jagielski     memset(this, 0, sizeof(*this));
5364*b1cdbd2cSJim Jagielski     sal_uInt8 aBits1;
5365*b1cdbd2cSJim Jagielski     sal_uInt8 aBits2;
5366*b1cdbd2cSJim Jagielski     sal_uInt8 aVer8Bits1;    // nur ab WinWord 8 benutzt
5367*b1cdbd2cSJim Jagielski     rSt.Seek( nOffset );
5368*b1cdbd2cSJim Jagielski     /*
5369*b1cdbd2cSJim Jagielski         Wunsch-Nr vermerken, File-Versionsnummer ermitteln
5370*b1cdbd2cSJim Jagielski         und gegen Wunsch-Nr. checken !
5371*b1cdbd2cSJim Jagielski     */
5372*b1cdbd2cSJim Jagielski     nVersion = nWantedVersion;
5373*b1cdbd2cSJim Jagielski     rSt >> wIdent;
5374*b1cdbd2cSJim Jagielski     rSt >> nFib;
5375*b1cdbd2cSJim Jagielski     rSt >> nProduct;
5376*b1cdbd2cSJim Jagielski     if( 0 != rSt.GetError() )
5377*b1cdbd2cSJim Jagielski     {
5378*b1cdbd2cSJim Jagielski         sal_Int16 nFibMin;
5379*b1cdbd2cSJim Jagielski         sal_Int16 nFibMax;
5380*b1cdbd2cSJim Jagielski         // note: 6 stands for "6 OR 7",  7 stands for "ONLY 7"
5381*b1cdbd2cSJim Jagielski         switch( nVersion )
5382*b1cdbd2cSJim Jagielski         {
5383*b1cdbd2cSJim Jagielski             case 6:
5384*b1cdbd2cSJim Jagielski                 nFibMin = 0x0065;   // von 101 WinWord 6.0
5385*b1cdbd2cSJim Jagielski                                     //     102    "
5386*b1cdbd2cSJim Jagielski                                     // und 103 WinWord 6.0 fuer Macintosh
5387*b1cdbd2cSJim Jagielski                                     //     104    "
5388*b1cdbd2cSJim Jagielski                 nFibMax = 0x0069;   // bis 105 WinWord 95
5389*b1cdbd2cSJim Jagielski                 break;
5390*b1cdbd2cSJim Jagielski             case 7:
5391*b1cdbd2cSJim Jagielski                 nFibMin = 0x0069;   // von 105 WinWord 95
5392*b1cdbd2cSJim Jagielski                 nFibMax = 0x0069;   // bis 105 WinWord 95
5393*b1cdbd2cSJim Jagielski                 break;
5394*b1cdbd2cSJim Jagielski             case 8:
5395*b1cdbd2cSJim Jagielski                 nFibMin = 0x006A;   // von 106 WinWord 97
5396*b1cdbd2cSJim Jagielski                 nFibMax = 0x00c1;   // bis 193 WinWord 97 (?)
5397*b1cdbd2cSJim Jagielski                 break;
5398*b1cdbd2cSJim Jagielski             default:
5399*b1cdbd2cSJim Jagielski                 nFibMin = 0;            // Programm-Fehler!
5400*b1cdbd2cSJim Jagielski                 nFibMax = 0;
5401*b1cdbd2cSJim Jagielski                 nFib    = 1;
5402*b1cdbd2cSJim Jagielski                 ASSERT( !this, "Es wurde vergessen, nVersion zu kodieren!" );
5403*b1cdbd2cSJim Jagielski                 break;
5404*b1cdbd2cSJim Jagielski         }
5405*b1cdbd2cSJim Jagielski         if ( (nFib < nFibMin) || (nFib > nFibMax) )
5406*b1cdbd2cSJim Jagielski         {
5407*b1cdbd2cSJim Jagielski             nFibError = ERR_SWG_READ_ERROR; // Error melden
5408*b1cdbd2cSJim Jagielski             return;                         // und hopp raus!
5409*b1cdbd2cSJim Jagielski         }
5410*b1cdbd2cSJim Jagielski     }
5411*b1cdbd2cSJim Jagielski 
5412*b1cdbd2cSJim Jagielski     ww::WordVersion eVer = GetFIBVersion();
5413*b1cdbd2cSJim Jagielski 
5414*b1cdbd2cSJim Jagielski     // Hilfs-Varis fuer Ver67:
5415*b1cdbd2cSJim Jagielski     sal_Int16 pnChpFirst_Ver67=0;
5416*b1cdbd2cSJim Jagielski     sal_Int16 pnPapFirst_Ver67=0;
5417*b1cdbd2cSJim Jagielski     sal_Int16 cpnBteChp_Ver67=0;
5418*b1cdbd2cSJim Jagielski     sal_Int16 cpnBtePap_Ver67=0;
5419*b1cdbd2cSJim Jagielski 
5420*b1cdbd2cSJim Jagielski     // und auf gehts: FIB einlesen
5421*b1cdbd2cSJim Jagielski     rSt >> lid;
5422*b1cdbd2cSJim Jagielski     rSt >> pnNext;
5423*b1cdbd2cSJim Jagielski     rSt >> aBits1;
5424*b1cdbd2cSJim Jagielski     rSt >> aBits2;
5425*b1cdbd2cSJim Jagielski     rSt >> nFibBack;
5426*b1cdbd2cSJim Jagielski     rSt >> nHash;
5427*b1cdbd2cSJim Jagielski     rSt >> nKey;
5428*b1cdbd2cSJim Jagielski     rSt >> envr;
5429*b1cdbd2cSJim Jagielski     rSt >> aVer8Bits1;      // unter Ver67  nur leeres Reservefeld
5430*b1cdbd2cSJim Jagielski                             // Inhalt von aVer8Bits1
5431*b1cdbd2cSJim Jagielski                             //
5432*b1cdbd2cSJim Jagielski                             // sal_uInt8 fMac              :1;
5433*b1cdbd2cSJim Jagielski                             // sal_uInt8 fEmptySpecial     :1;
5434*b1cdbd2cSJim Jagielski                             // sal_uInt8 fLoadOverridePage :1;
5435*b1cdbd2cSJim Jagielski                             // sal_uInt8 fFuturesavedUndo  :1;
5436*b1cdbd2cSJim Jagielski                             // sal_uInt8 fWord97Saved      :1;
5437*b1cdbd2cSJim Jagielski                             // sal_uInt8 :3;
5438*b1cdbd2cSJim Jagielski     rSt >> chse;
5439*b1cdbd2cSJim Jagielski     rSt >> chseTables;
5440*b1cdbd2cSJim Jagielski     rSt >> fcMin;
5441*b1cdbd2cSJim Jagielski     rSt >> fcMac;
5442*b1cdbd2cSJim Jagielski 
5443*b1cdbd2cSJim Jagielski // Einschub fuer WW8 *****************************************************
5444*b1cdbd2cSJim Jagielski     if (IsEightPlus(eVer))
5445*b1cdbd2cSJim Jagielski     {
5446*b1cdbd2cSJim Jagielski         rSt >> csw;
5447*b1cdbd2cSJim Jagielski 
5448*b1cdbd2cSJim Jagielski         // Marke: "rgsw"  Beginning of the array of shorts
5449*b1cdbd2cSJim Jagielski         rSt >> wMagicCreated;
5450*b1cdbd2cSJim Jagielski         rSt >> wMagicRevised;
5451*b1cdbd2cSJim Jagielski         rSt >> wMagicCreatedPrivate;
5452*b1cdbd2cSJim Jagielski         rSt >> wMagicRevisedPrivate;
5453*b1cdbd2cSJim Jagielski         rSt.SeekRel( 9 * sizeof( sal_Int16 ) );
5454*b1cdbd2cSJim Jagielski 
5455*b1cdbd2cSJim Jagielski         /*
5456*b1cdbd2cSJim Jagielski         // dies sind die 9 unused Felder:
5457*b1cdbd2cSJim Jagielski         && (bVer67 || WW8ReadINT16(  rSt, pnFbpChpFirst_W6          ))  // 1
5458*b1cdbd2cSJim Jagielski         && (bVer67 || WW8ReadINT16(  rSt, pnChpFirst_W6                 ))  // 2
5459*b1cdbd2cSJim Jagielski         && (bVer67 || WW8ReadINT16(  rSt, cpnBteChp_W6                  ))  // 3
5460*b1cdbd2cSJim Jagielski         && (bVer67 || WW8ReadINT16(  rSt, pnFbpPapFirst_W6          ))  // 4
5461*b1cdbd2cSJim Jagielski         && (bVer67 || WW8ReadINT16(  rSt, pnPapFirst_W6                 ))  // 5
5462*b1cdbd2cSJim Jagielski         && (bVer67 || WW8ReadINT16(  rSt, cpnBtePap_W6                  ))  // 6
5463*b1cdbd2cSJim Jagielski         && (bVer67 || WW8ReadINT16(  rSt, pnFbpLvcFirst_W6          ))  // 7
5464*b1cdbd2cSJim Jagielski         && (bVer67 || WW8ReadINT16(  rSt, pnLvcFirst_W6                 ))  // 8
5465*b1cdbd2cSJim Jagielski         && (bVer67 || WW8ReadINT16(  rSt, cpnBteLvc_W6                  ))  // 9
5466*b1cdbd2cSJim Jagielski         */
5467*b1cdbd2cSJim Jagielski         rSt >> lidFE;
5468*b1cdbd2cSJim Jagielski         rSt >> clw;
5469*b1cdbd2cSJim Jagielski     }
5470*b1cdbd2cSJim Jagielski 
5471*b1cdbd2cSJim Jagielski // Ende des Einschubs fuer WW8 *******************************************
5472*b1cdbd2cSJim Jagielski 
5473*b1cdbd2cSJim Jagielski         // Marke: "rglw"  Beginning of the array of longs
5474*b1cdbd2cSJim Jagielski     rSt >> cbMac;
5475*b1cdbd2cSJim Jagielski 
5476*b1cdbd2cSJim Jagielski         // 2 Longs uebergehen, da unwichtiger Quatsch
5477*b1cdbd2cSJim Jagielski     rSt.SeekRel( 2 * sizeof( sal_Int32) );
5478*b1cdbd2cSJim Jagielski 
5479*b1cdbd2cSJim Jagielski         // weitere 2 Longs nur bei Ver67 ueberspringen
5480*b1cdbd2cSJim Jagielski     if (IsSevenMinus(eVer))
5481*b1cdbd2cSJim Jagielski         rSt.SeekRel( 2 * sizeof( sal_Int32) );
5482*b1cdbd2cSJim Jagielski 
5483*b1cdbd2cSJim Jagielski     rSt >> ccpText;
5484*b1cdbd2cSJim Jagielski     rSt >> ccpFtn;
5485*b1cdbd2cSJim Jagielski     rSt >> ccpHdr;
5486*b1cdbd2cSJim Jagielski     rSt >> ccpMcr;
5487*b1cdbd2cSJim Jagielski     rSt >> ccpAtn;
5488*b1cdbd2cSJim Jagielski     rSt >> ccpEdn;
5489*b1cdbd2cSJim Jagielski     rSt >> ccpTxbx;
5490*b1cdbd2cSJim Jagielski     rSt >> ccpHdrTxbx;
5491*b1cdbd2cSJim Jagielski 
5492*b1cdbd2cSJim Jagielski         // weiteres Long nur bei Ver67 ueberspringen
5493*b1cdbd2cSJim Jagielski     if (IsSevenMinus(eVer))
5494*b1cdbd2cSJim Jagielski         rSt.SeekRel( 1 * sizeof( sal_Int32) );
5495*b1cdbd2cSJim Jagielski     else
5496*b1cdbd2cSJim Jagielski     {
5497*b1cdbd2cSJim Jagielski // Einschub fuer WW8 *****************************************************
5498*b1cdbd2cSJim Jagielski         rSt >> pnFbpChpFirst;
5499*b1cdbd2cSJim Jagielski         rSt >> pnChpFirst;
5500*b1cdbd2cSJim Jagielski         rSt >> cpnBteChp;
5501*b1cdbd2cSJim Jagielski         rSt >> pnFbpPapFirst;
5502*b1cdbd2cSJim Jagielski         rSt >> pnPapFirst;
5503*b1cdbd2cSJim Jagielski         rSt >> cpnBtePap;
5504*b1cdbd2cSJim Jagielski         rSt >> pnFbpLvcFirst;
5505*b1cdbd2cSJim Jagielski         rSt >> pnLvcFirst;
5506*b1cdbd2cSJim Jagielski         rSt >> cpnBteLvc;
5507*b1cdbd2cSJim Jagielski         rSt >> fcIslandFirst;
5508*b1cdbd2cSJim Jagielski         rSt >> fcIslandLim;
5509*b1cdbd2cSJim Jagielski         rSt >> cfclcb;
5510*b1cdbd2cSJim Jagielski     }
5511*b1cdbd2cSJim Jagielski 
5512*b1cdbd2cSJim Jagielski // Ende des Einschubs fuer WW8 *******************************************
5513*b1cdbd2cSJim Jagielski 
5514*b1cdbd2cSJim Jagielski     // Marke: "rgfclcb" Beginning of array of FC/LCB pairs.
5515*b1cdbd2cSJim Jagielski     rSt >> fcStshfOrig;
5516*b1cdbd2cSJim Jagielski     lcbStshfOrig = Readcb(rSt, eVer);
5517*b1cdbd2cSJim Jagielski     rSt >> fcStshf;
5518*b1cdbd2cSJim Jagielski     lcbStshf = Readcb(rSt, eVer);
5519*b1cdbd2cSJim Jagielski     rSt >> fcPlcffndRef;
5520*b1cdbd2cSJim Jagielski     lcbPlcffndRef = Readcb(rSt, eVer);
5521*b1cdbd2cSJim Jagielski     rSt >> fcPlcffndTxt;
5522*b1cdbd2cSJim Jagielski     lcbPlcffndTxt = Readcb(rSt, eVer);
5523*b1cdbd2cSJim Jagielski     rSt >> fcPlcfandRef;
5524*b1cdbd2cSJim Jagielski     lcbPlcfandRef = Readcb(rSt, eVer);
5525*b1cdbd2cSJim Jagielski     rSt >> fcPlcfandTxt;
5526*b1cdbd2cSJim Jagielski     lcbPlcfandTxt = Readcb(rSt, eVer);
5527*b1cdbd2cSJim Jagielski     rSt >> fcPlcfsed;
5528*b1cdbd2cSJim Jagielski     lcbPlcfsed = Readcb(rSt, eVer);
5529*b1cdbd2cSJim Jagielski     rSt >> fcPlcfpad;
5530*b1cdbd2cSJim Jagielski     lcbPlcfpad = Readcb(rSt, eVer);
5531*b1cdbd2cSJim Jagielski     rSt >> fcPlcfphe;
5532*b1cdbd2cSJim Jagielski     lcbPlcfphe = Readcb(rSt, eVer);
5533*b1cdbd2cSJim Jagielski     rSt >> fcSttbfglsy;
5534*b1cdbd2cSJim Jagielski     lcbSttbfglsy = Readcb(rSt, eVer);
5535*b1cdbd2cSJim Jagielski     rSt >> fcPlcfglsy;
5536*b1cdbd2cSJim Jagielski     lcbPlcfglsy = Readcb(rSt, eVer);
5537*b1cdbd2cSJim Jagielski     rSt >> fcPlcfhdd;
5538*b1cdbd2cSJim Jagielski     lcbPlcfhdd = Readcb(rSt, eVer);
5539*b1cdbd2cSJim Jagielski     rSt >> fcPlcfbteChpx;
5540*b1cdbd2cSJim Jagielski     lcbPlcfbteChpx = Readcb(rSt, eVer);
5541*b1cdbd2cSJim Jagielski     rSt >> fcPlcfbtePapx;
5542*b1cdbd2cSJim Jagielski     lcbPlcfbtePapx = Readcb(rSt, eVer);
5543*b1cdbd2cSJim Jagielski     rSt >> fcPlcfsea;
5544*b1cdbd2cSJim Jagielski     lcbPlcfsea = Readcb(rSt, eVer);
5545*b1cdbd2cSJim Jagielski     rSt >> fcSttbfffn;
5546*b1cdbd2cSJim Jagielski     lcbSttbfffn = Readcb(rSt, eVer);
5547*b1cdbd2cSJim Jagielski     rSt >> fcPlcffldMom;
5548*b1cdbd2cSJim Jagielski     lcbPlcffldMom = Readcb(rSt, eVer);
5549*b1cdbd2cSJim Jagielski     rSt >> fcPlcffldHdr;
5550*b1cdbd2cSJim Jagielski     lcbPlcffldHdr = Readcb(rSt, eVer);
5551*b1cdbd2cSJim Jagielski     rSt >> fcPlcffldFtn;
5552*b1cdbd2cSJim Jagielski     lcbPlcffldFtn = Readcb(rSt, eVer);
5553*b1cdbd2cSJim Jagielski     rSt >> fcPlcffldAtn;
5554*b1cdbd2cSJim Jagielski     lcbPlcffldAtn = Readcb(rSt, eVer);
5555*b1cdbd2cSJim Jagielski     rSt >> fcPlcffldMcr;
5556*b1cdbd2cSJim Jagielski     lcbPlcffldMcr = Readcb(rSt, eVer);
5557*b1cdbd2cSJim Jagielski     rSt >> fcSttbfbkmk;
5558*b1cdbd2cSJim Jagielski     lcbSttbfbkmk = Readcb(rSt, eVer);
5559*b1cdbd2cSJim Jagielski     rSt >> fcPlcfbkf;
5560*b1cdbd2cSJim Jagielski     lcbPlcfbkf = Readcb(rSt, eVer);
5561*b1cdbd2cSJim Jagielski     rSt >> fcPlcfbkl;
5562*b1cdbd2cSJim Jagielski     lcbPlcfbkl = Readcb(rSt, eVer);
5563*b1cdbd2cSJim Jagielski     rSt >> fcCmds;
5564*b1cdbd2cSJim Jagielski     lcbCmds = Readcb(rSt, eVer);
5565*b1cdbd2cSJim Jagielski     rSt >> fcPlcfmcr;
5566*b1cdbd2cSJim Jagielski     lcbPlcfmcr = Readcb(rSt, eVer);
5567*b1cdbd2cSJim Jagielski     rSt >> fcSttbfmcr;
5568*b1cdbd2cSJim Jagielski     lcbSttbfmcr = Readcb(rSt, eVer);
5569*b1cdbd2cSJim Jagielski     rSt >> fcPrDrvr;
5570*b1cdbd2cSJim Jagielski     lcbPrDrvr = Readcb(rSt, eVer);
5571*b1cdbd2cSJim Jagielski     rSt >> fcPrEnvPort;
5572*b1cdbd2cSJim Jagielski     lcbPrEnvPort = Readcb(rSt, eVer);
5573*b1cdbd2cSJim Jagielski     rSt >> fcPrEnvLand;
5574*b1cdbd2cSJim Jagielski     lcbPrEnvLand = Readcb(rSt, eVer);
5575*b1cdbd2cSJim Jagielski     rSt >> fcWss;
5576*b1cdbd2cSJim Jagielski     lcbWss = Readcb(rSt, eVer);
5577*b1cdbd2cSJim Jagielski     rSt >> fcDop;
5578*b1cdbd2cSJim Jagielski     lcbDop = Readcb(rSt, eVer);
5579*b1cdbd2cSJim Jagielski     rSt >> fcSttbfAssoc;
5580*b1cdbd2cSJim Jagielski     lcbSttbfAssoc = Readcb(rSt, eVer);
5581*b1cdbd2cSJim Jagielski     rSt >> fcClx;
5582*b1cdbd2cSJim Jagielski     lcbClx = Readcb(rSt, eVer);
5583*b1cdbd2cSJim Jagielski     rSt >> fcPlcfpgdFtn;
5584*b1cdbd2cSJim Jagielski     lcbPlcfpgdFtn = Readcb(rSt, eVer);
5585*b1cdbd2cSJim Jagielski     rSt >> fcAutosaveSource;
5586*b1cdbd2cSJim Jagielski     lcbAutosaveSource = Readcb(rSt, eVer);
5587*b1cdbd2cSJim Jagielski     rSt >> fcGrpStAtnOwners;
5588*b1cdbd2cSJim Jagielski     lcbGrpStAtnOwners = Readcb(rSt, eVer);
5589*b1cdbd2cSJim Jagielski     rSt >> fcSttbfAtnbkmk;
5590*b1cdbd2cSJim Jagielski     lcbSttbfAtnbkmk = Readcb(rSt, eVer);
5591*b1cdbd2cSJim Jagielski 
5592*b1cdbd2cSJim Jagielski     // weiteres short nur bei Ver67 ueberspringen
5593*b1cdbd2cSJim Jagielski     if (IsSevenMinus(eVer))
5594*b1cdbd2cSJim Jagielski     {
5595*b1cdbd2cSJim Jagielski         rSt.SeekRel( 1*sizeof( sal_Int16) );
5596*b1cdbd2cSJim Jagielski 
5597*b1cdbd2cSJim Jagielski         // folgende 4 Shorts existieren nur bei Ver67;
5598*b1cdbd2cSJim Jagielski         rSt >> pnChpFirst_Ver67;
5599*b1cdbd2cSJim Jagielski         rSt >> pnPapFirst_Ver67;
5600*b1cdbd2cSJim Jagielski         rSt >> cpnBteChp_Ver67;
5601*b1cdbd2cSJim Jagielski         rSt >> cpnBtePap_Ver67;
5602*b1cdbd2cSJim Jagielski     }
5603*b1cdbd2cSJim Jagielski 
5604*b1cdbd2cSJim Jagielski     if (eVer > ww::eWW2)
5605*b1cdbd2cSJim Jagielski     {
5606*b1cdbd2cSJim Jagielski         rSt >> fcPlcfdoaMom;
5607*b1cdbd2cSJim Jagielski         rSt >> lcbPlcfdoaMom;
5608*b1cdbd2cSJim Jagielski         rSt >> fcPlcfdoaHdr;
5609*b1cdbd2cSJim Jagielski         rSt >> lcbPlcfdoaHdr;
5610*b1cdbd2cSJim Jagielski         rSt >> fcPlcfspaMom;
5611*b1cdbd2cSJim Jagielski         rSt >> lcbPlcfspaMom;
5612*b1cdbd2cSJim Jagielski         rSt >> fcPlcfspaHdr;
5613*b1cdbd2cSJim Jagielski         rSt >> lcbPlcfspaHdr;
5614*b1cdbd2cSJim Jagielski 
5615*b1cdbd2cSJim Jagielski         rSt >> fcPlcfAtnbkf;
5616*b1cdbd2cSJim Jagielski         rSt >> lcbPlcfAtnbkf;
5617*b1cdbd2cSJim Jagielski         rSt >> fcPlcfAtnbkl;
5618*b1cdbd2cSJim Jagielski         rSt >> lcbPlcfAtnbkl;
5619*b1cdbd2cSJim Jagielski         rSt >> fcPms;
5620*b1cdbd2cSJim Jagielski         rSt >> lcbPMS;
5621*b1cdbd2cSJim Jagielski         rSt >> fcFormFldSttbf;
5622*b1cdbd2cSJim Jagielski         rSt >> lcbFormFldSttbf;
5623*b1cdbd2cSJim Jagielski         rSt >> fcPlcfendRef;
5624*b1cdbd2cSJim Jagielski         rSt >> lcbPlcfendRef;
5625*b1cdbd2cSJim Jagielski         rSt >> fcPlcfendTxt;
5626*b1cdbd2cSJim Jagielski         rSt >> lcbPlcfendTxt;
5627*b1cdbd2cSJim Jagielski         rSt >> fcPlcffldEdn;
5628*b1cdbd2cSJim Jagielski         rSt >> lcbPlcffldEdn;
5629*b1cdbd2cSJim Jagielski         rSt >> fcPlcfpgdEdn;
5630*b1cdbd2cSJim Jagielski         rSt >> lcbPlcfpgdEdn;
5631*b1cdbd2cSJim Jagielski         rSt >> fcDggInfo;
5632*b1cdbd2cSJim Jagielski         rSt >> lcbDggInfo;
5633*b1cdbd2cSJim Jagielski         rSt >> fcSttbfRMark;
5634*b1cdbd2cSJim Jagielski         rSt >> lcbSttbfRMark;
5635*b1cdbd2cSJim Jagielski         rSt >> fcSttbfCaption;
5636*b1cdbd2cSJim Jagielski         rSt >> lcbSttbfCaption;
5637*b1cdbd2cSJim Jagielski         rSt >> fcSttbAutoCaption;
5638*b1cdbd2cSJim Jagielski         rSt >> lcbSttbAutoCaption;
5639*b1cdbd2cSJim Jagielski         rSt >> fcPlcfwkb;
5640*b1cdbd2cSJim Jagielski         rSt >> lcbPlcfwkb;
5641*b1cdbd2cSJim Jagielski         rSt >> fcPlcfspl;
5642*b1cdbd2cSJim Jagielski         rSt >> lcbPlcfspl;
5643*b1cdbd2cSJim Jagielski         rSt >> fcPlcftxbxTxt;
5644*b1cdbd2cSJim Jagielski         rSt >> lcbPlcftxbxTxt;
5645*b1cdbd2cSJim Jagielski         rSt >> fcPlcffldTxbx;
5646*b1cdbd2cSJim Jagielski         rSt >> lcbPlcffldTxbx;
5647*b1cdbd2cSJim Jagielski         rSt >> fcPlcfHdrtxbxTxt;
5648*b1cdbd2cSJim Jagielski         rSt >> lcbPlcfHdrtxbxTxt;
5649*b1cdbd2cSJim Jagielski         rSt >> fcPlcffldHdrTxbx;
5650*b1cdbd2cSJim Jagielski         rSt >> lcbPlcffldHdrTxbx;
5651*b1cdbd2cSJim Jagielski         rSt >> fcStwUser;
5652*b1cdbd2cSJim Jagielski         rSt >> lcbStwUser;
5653*b1cdbd2cSJim Jagielski         rSt >> fcSttbttmbd;
5654*b1cdbd2cSJim Jagielski         rSt >> lcbSttbttmbd;
5655*b1cdbd2cSJim Jagielski     }
5656*b1cdbd2cSJim Jagielski 
5657*b1cdbd2cSJim Jagielski     if( 0 == rSt.GetError() )
5658*b1cdbd2cSJim Jagielski     {
5659*b1cdbd2cSJim Jagielski         // Bit-Flags setzen
5660*b1cdbd2cSJim Jagielski         fDot        =   aBits1 & 0x01       ;
5661*b1cdbd2cSJim Jagielski         fGlsy       = ( aBits1 & 0x02 ) >> 1;
5662*b1cdbd2cSJim Jagielski         fComplex    = ( aBits1 & 0x04 ) >> 2;
5663*b1cdbd2cSJim Jagielski         fHasPic     = ( aBits1 & 0x08 ) >> 3;
5664*b1cdbd2cSJim Jagielski         cQuickSaves = ( aBits1 & 0xf0 ) >> 4;
5665*b1cdbd2cSJim Jagielski         fEncrypted  =   aBits2 & 0x01       ;
5666*b1cdbd2cSJim Jagielski         fWhichTblStm= ( aBits2 & 0x02 ) >> 1;
5667*b1cdbd2cSJim Jagielski         fReadOnlyRecommended = (aBits2 & 0x4) >> 2;
5668*b1cdbd2cSJim Jagielski         fWriteReservation = (aBits2 & 0x8) >> 3;
5669*b1cdbd2cSJim Jagielski         fExtChar    = ( aBits2 & 0x10 ) >> 4;
5670*b1cdbd2cSJim Jagielski         // dummy    = ( aBits2 & 0x20 ) >> 5;
5671*b1cdbd2cSJim Jagielski         fFarEast    = ( aBits2 & 0x40 ) >> 6; // #i90932#
5672*b1cdbd2cSJim Jagielski         // dummy    = ( aBits2 & 0x80 ) >> 7;
5673*b1cdbd2cSJim Jagielski 
5674*b1cdbd2cSJim Jagielski         /*
5675*b1cdbd2cSJim Jagielski             ggfs. Ziel-Varaiblen, aus xxx_Ver67 fuellen
5676*b1cdbd2cSJim Jagielski             oder Flags setzen
5677*b1cdbd2cSJim Jagielski         */
5678*b1cdbd2cSJim Jagielski         if (IsSevenMinus(eVer))
5679*b1cdbd2cSJim Jagielski         {
5680*b1cdbd2cSJim Jagielski             pnChpFirst = pnChpFirst_Ver67;
5681*b1cdbd2cSJim Jagielski             pnPapFirst = pnPapFirst_Ver67;
5682*b1cdbd2cSJim Jagielski             cpnBteChp = cpnBteChp_Ver67;
5683*b1cdbd2cSJim Jagielski             cpnBtePap = cpnBtePap_Ver67;
5684*b1cdbd2cSJim Jagielski         }
5685*b1cdbd2cSJim Jagielski         else if (IsEightPlus(eVer))
5686*b1cdbd2cSJim Jagielski         {
5687*b1cdbd2cSJim Jagielski           fMac              =   aVer8Bits1  & 0x01           ;
5688*b1cdbd2cSJim Jagielski           fEmptySpecial     = ( aVer8Bits1  & 0x02 ) >> 1;
5689*b1cdbd2cSJim Jagielski           fLoadOverridePage = ( aVer8Bits1  & 0x04 ) >> 2;
5690*b1cdbd2cSJim Jagielski           fFuturesavedUndo  = ( aVer8Bits1  & 0x08 ) >> 3;
5691*b1cdbd2cSJim Jagielski           fWord97Saved      = ( aVer8Bits1  & 0x10 ) >> 4;
5692*b1cdbd2cSJim Jagielski           fWord2000Saved    = ( aVer8Bits1  & 0x20 ) >> 5;
5693*b1cdbd2cSJim Jagielski 
5694*b1cdbd2cSJim Jagielski             /*
5695*b1cdbd2cSJim Jagielski                 speziell fuer WW8:
5696*b1cdbd2cSJim Jagielski                 ermittle die Werte fuer PLCF LST und PLF LFO
5697*b1cdbd2cSJim Jagielski                 und PLCF fuer TextBox-Break-Deskriptoren
5698*b1cdbd2cSJim Jagielski             */
5699*b1cdbd2cSJim Jagielski             long nOldPos = rSt.Tell();
5700*b1cdbd2cSJim Jagielski 
5701*b1cdbd2cSJim Jagielski 			rSt.Seek( 0x02da );
5702*b1cdbd2cSJim Jagielski 			rSt >> fcSttbFnm;
5703*b1cdbd2cSJim Jagielski 			rSt >> lcbSttbFnm;
5704*b1cdbd2cSJim Jagielski             rSt >> fcPlcfLst;
5705*b1cdbd2cSJim Jagielski             rSt >> lcbPlcfLst;
5706*b1cdbd2cSJim Jagielski             rSt >> fcPlfLfo;
5707*b1cdbd2cSJim Jagielski             rSt >> lcbPlfLfo;
5708*b1cdbd2cSJim Jagielski             rSt >> fcPlcftxbxBkd;
5709*b1cdbd2cSJim Jagielski             rSt >> lcbPlcftxbxBkd;
5710*b1cdbd2cSJim Jagielski             rSt >> fcPlcfHdrtxbxBkd;
5711*b1cdbd2cSJim Jagielski             rSt >> lcbPlcfHdrtxbxBkd;
5712*b1cdbd2cSJim Jagielski             if( 0 != rSt.GetError() )
5713*b1cdbd2cSJim Jagielski             {
5714*b1cdbd2cSJim Jagielski                 nFibError = ERR_SWG_READ_ERROR;
5715*b1cdbd2cSJim Jagielski             }
5716*b1cdbd2cSJim Jagielski 
5717*b1cdbd2cSJim Jagielski             rSt.Seek( 0x372 );          // fcSttbListNames
5718*b1cdbd2cSJim Jagielski             rSt >> fcSttbListNames;
5719*b1cdbd2cSJim Jagielski             rSt >> lcbSttbListNames;
5720*b1cdbd2cSJim Jagielski 
5721*b1cdbd2cSJim Jagielski             if (cfclcb > 93)
5722*b1cdbd2cSJim Jagielski             {
5723*b1cdbd2cSJim Jagielski                 rSt.Seek( 0x382 );          // MagicTables
5724*b1cdbd2cSJim Jagielski                 rSt >> fcPlcfTch;
5725*b1cdbd2cSJim Jagielski                 rSt >> lcbPlcfTch;
5726*b1cdbd2cSJim Jagielski             }
5727*b1cdbd2cSJim Jagielski 
5728*b1cdbd2cSJim Jagielski             if (cfclcb > 113)
5729*b1cdbd2cSJim Jagielski             {
5730*b1cdbd2cSJim Jagielski                 rSt.Seek( 0x41A );          // new ATRD
5731*b1cdbd2cSJim Jagielski                 rSt >> fcAtrdExtra;
5732*b1cdbd2cSJim Jagielski                 rSt >> lcbAtrdExtra;
5733*b1cdbd2cSJim Jagielski             }
5734*b1cdbd2cSJim Jagielski 
5735*b1cdbd2cSJim Jagielski             if( 0 != rSt.GetError() )
5736*b1cdbd2cSJim Jagielski                 nFibError = ERR_SWG_READ_ERROR;
5737*b1cdbd2cSJim Jagielski 
5738*b1cdbd2cSJim Jagielski             rSt.Seek( 0x5bc );          // Actual nFib introduced in Word 2003
5739*b1cdbd2cSJim Jagielski             rSt >> nFib_actual;
5740*b1cdbd2cSJim Jagielski 
5741*b1cdbd2cSJim Jagielski             rSt.Seek( nOldPos );
5742*b1cdbd2cSJim Jagielski         }
5743*b1cdbd2cSJim Jagielski     }
5744*b1cdbd2cSJim Jagielski     else
5745*b1cdbd2cSJim Jagielski     {
5746*b1cdbd2cSJim Jagielski         nFibError = ERR_SWG_READ_ERROR;     // Error melden
5747*b1cdbd2cSJim Jagielski     }
5748*b1cdbd2cSJim Jagielski }
5749*b1cdbd2cSJim Jagielski 
5750*b1cdbd2cSJim Jagielski 
WW8Fib(sal_uInt8 nVer)5751*b1cdbd2cSJim Jagielski WW8Fib::WW8Fib(sal_uInt8 nVer)
5752*b1cdbd2cSJim Jagielski {
5753*b1cdbd2cSJim Jagielski     memset(this, 0, sizeof(*this));
5754*b1cdbd2cSJim Jagielski     nVersion = nVer;
5755*b1cdbd2cSJim Jagielski     if (8 == nVer)
5756*b1cdbd2cSJim Jagielski     {
5757*b1cdbd2cSJim Jagielski         fcMin = 0x800;
5758*b1cdbd2cSJim Jagielski         wIdent = 0xa5ec;
5759*b1cdbd2cSJim Jagielski         nFib = 0x0101;
5760*b1cdbd2cSJim Jagielski         nFibBack = 0xbf;
5761*b1cdbd2cSJim Jagielski         nProduct = 0x204D;
5762*b1cdbd2cSJim Jagielski 
5763*b1cdbd2cSJim Jagielski         csw = 0x0e;     // muss das sein ???
5764*b1cdbd2cSJim Jagielski         cfclcb = 0x88;  //      -""-
5765*b1cdbd2cSJim Jagielski         clw = 0x16;     //      -""-
5766*b1cdbd2cSJim Jagielski         pnFbpChpFirst = pnFbpPapFirst = pnFbpLvcFirst = 0x000fffff;
5767*b1cdbd2cSJim Jagielski         fExtChar = true;
5768*b1cdbd2cSJim Jagielski         fWord97Saved = fWord2000Saved = true;
5769*b1cdbd2cSJim Jagielski 
5770*b1cdbd2cSJim Jagielski         // diese Flags muessen nicht gesetzt werden; koennen aber.
5771*b1cdbd2cSJim Jagielski         //  wMagicCreated = wMagicRevised = 0x6a62;
5772*b1cdbd2cSJim Jagielski         //  wMagicCreatedPrivate = wMagicRevisedPrivate = 0xb3b2;
5773*b1cdbd2cSJim Jagielski         //
5774*b1cdbd2cSJim Jagielski 
5775*b1cdbd2cSJim Jagielski         wMagicCreated = 0x6143;
5776*b1cdbd2cSJim Jagielski         wMagicRevised = 0x6C6F;
5777*b1cdbd2cSJim Jagielski         wMagicCreatedPrivate = 0x6E61;
5778*b1cdbd2cSJim Jagielski         wMagicRevisedPrivate = 0x3038;
5779*b1cdbd2cSJim Jagielski     }
5780*b1cdbd2cSJim Jagielski     else
5781*b1cdbd2cSJim Jagielski     {
5782*b1cdbd2cSJim Jagielski         fcMin = 0x300;
5783*b1cdbd2cSJim Jagielski         wIdent = 0xa5dc;
5784*b1cdbd2cSJim Jagielski         nFib = nFibBack = 0x65;
5785*b1cdbd2cSJim Jagielski         nProduct = 0xc02d;
5786*b1cdbd2cSJim Jagielski     }
5787*b1cdbd2cSJim Jagielski 
5788*b1cdbd2cSJim Jagielski     // --> #i90932#
5789*b1cdbd2cSJim Jagielski     lid = 0x409; // LANGUAGE_ENGLISH_US
5790*b1cdbd2cSJim Jagielski 
5791*b1cdbd2cSJim Jagielski     LanguageType nLang = Application::GetSettings().GetLanguage();
5792*b1cdbd2cSJim Jagielski     switch( nLang )
5793*b1cdbd2cSJim Jagielski     {
5794*b1cdbd2cSJim Jagielski         case LANGUAGE_CHINESE:
5795*b1cdbd2cSJim Jagielski         case LANGUAGE_CHINESE_SIMPLIFIED:
5796*b1cdbd2cSJim Jagielski         case LANGUAGE_CHINESE_HONGKONG:
5797*b1cdbd2cSJim Jagielski         case LANGUAGE_CHINESE_SINGAPORE:
5798*b1cdbd2cSJim Jagielski         case LANGUAGE_CHINESE_MACAU:
5799*b1cdbd2cSJim Jagielski         case LANGUAGE_CHINESE_TRADITIONAL:
5800*b1cdbd2cSJim Jagielski         case LANGUAGE_KOREAN:
5801*b1cdbd2cSJim Jagielski         case LANGUAGE_KOREAN_JOHAB:
5802*b1cdbd2cSJim Jagielski         case LANGUAGE_JAPANESE:
5803*b1cdbd2cSJim Jagielski             lidFE = nLang;
5804*b1cdbd2cSJim Jagielski             fFarEast = true;
5805*b1cdbd2cSJim Jagielski             break;
5806*b1cdbd2cSJim Jagielski         default:
5807*b1cdbd2cSJim Jagielski             lidFE = lid;
5808*b1cdbd2cSJim Jagielski             fFarEast = false;
5809*b1cdbd2cSJim Jagielski             break;
5810*b1cdbd2cSJim Jagielski     };
5811*b1cdbd2cSJim Jagielski     // <-- #i90932#
5812*b1cdbd2cSJim Jagielski }
5813*b1cdbd2cSJim Jagielski 
WriteHeader(SvStream & rStrm)5814*b1cdbd2cSJim Jagielski bool WW8Fib::WriteHeader(SvStream& rStrm)
5815*b1cdbd2cSJim Jagielski {
5816*b1cdbd2cSJim Jagielski 	bool bVer8 = 8 == nVersion;
5817*b1cdbd2cSJim Jagielski 
5818*b1cdbd2cSJim Jagielski 	size_t nUnencryptedHdr = bVer8 ? 0x44 : 0x24;
5819*b1cdbd2cSJim Jagielski 	sal_uInt8 *pDataPtr = new sal_uInt8[ nUnencryptedHdr ];
5820*b1cdbd2cSJim Jagielski     sal_uInt8 *pData = pDataPtr;
5821*b1cdbd2cSJim Jagielski 	memset( pData, 0, nUnencryptedHdr );
5822*b1cdbd2cSJim Jagielski 
5823*b1cdbd2cSJim Jagielski 	sal_uLong nPos = rStrm.Tell();
5824*b1cdbd2cSJim Jagielski 	cbMac = rStrm.Seek( STREAM_SEEK_TO_END );
5825*b1cdbd2cSJim Jagielski 	rStrm.Seek( nPos );
5826*b1cdbd2cSJim Jagielski 
5827*b1cdbd2cSJim Jagielski 	Set_UInt16( pData, wIdent );
5828*b1cdbd2cSJim Jagielski 	Set_UInt16( pData, nFib );
5829*b1cdbd2cSJim Jagielski 	Set_UInt16( pData, nProduct );
5830*b1cdbd2cSJim Jagielski 	Set_UInt16( pData, lid );
5831*b1cdbd2cSJim Jagielski 	Set_UInt16( pData, pnNext );
5832*b1cdbd2cSJim Jagielski 
5833*b1cdbd2cSJim Jagielski 	sal_uInt16 nBits16 = 0;
5834*b1cdbd2cSJim Jagielski 	if( fDot ) 			nBits16 |= 0x0001;
5835*b1cdbd2cSJim Jagielski 	if( fGlsy) 			nBits16 |= 0x0002;
5836*b1cdbd2cSJim Jagielski 	if( fComplex )		nBits16 |= 0x0004;
5837*b1cdbd2cSJim Jagielski 	if( fHasPic ) 		nBits16 |= 0x0008;
5838*b1cdbd2cSJim Jagielski 	nBits16 |= (0xf0 & ( cQuickSaves << 4 ));
5839*b1cdbd2cSJim Jagielski 	if( fEncrypted ) 	nBits16 |= 0x0100;
5840*b1cdbd2cSJim Jagielski 	if( fWhichTblStm ) 	nBits16 |= 0x0200;
5841*b1cdbd2cSJim Jagielski 
5842*b1cdbd2cSJim Jagielski     if (fReadOnlyRecommended)
5843*b1cdbd2cSJim Jagielski         nBits16 |= 0x0400;
5844*b1cdbd2cSJim Jagielski     if (fWriteReservation)
5845*b1cdbd2cSJim Jagielski         nBits16 |= 0x0800;
5846*b1cdbd2cSJim Jagielski 
5847*b1cdbd2cSJim Jagielski 	if( fExtChar ) 		nBits16 |= 0x1000;
5848*b1cdbd2cSJim Jagielski 	if( fFarEast )      nBits16 |= 0x4000;  // #i90932#
5849*b1cdbd2cSJim Jagielski 	if( fObfuscated )	nBits16 |= 0x8000;
5850*b1cdbd2cSJim Jagielski 	Set_UInt16( pData, nBits16 );
5851*b1cdbd2cSJim Jagielski 
5852*b1cdbd2cSJim Jagielski 	Set_UInt16( pData, nFibBack );
5853*b1cdbd2cSJim Jagielski 	Set_UInt16( pData, nHash );
5854*b1cdbd2cSJim Jagielski 	Set_UInt16( pData, nKey );
5855*b1cdbd2cSJim Jagielski 	Set_UInt8( pData, envr );
5856*b1cdbd2cSJim Jagielski 
5857*b1cdbd2cSJim Jagielski 	sal_uInt8 nBits8 = 0;
5858*b1cdbd2cSJim Jagielski 	if( bVer8 )
5859*b1cdbd2cSJim Jagielski 	{
5860*b1cdbd2cSJim Jagielski 		if( fMac ) 					nBits8 |= 0x0001;
5861*b1cdbd2cSJim Jagielski 		if( fEmptySpecial ) 		nBits8 |= 0x0002;
5862*b1cdbd2cSJim Jagielski 		if( fLoadOverridePage )		nBits8 |= 0x0004;
5863*b1cdbd2cSJim Jagielski 		if( fFuturesavedUndo ) 		nBits8 |= 0x0008;
5864*b1cdbd2cSJim Jagielski 		if( fWord97Saved ) 			nBits8 |= 0x0010;
5865*b1cdbd2cSJim Jagielski         if( fWord2000Saved )        nBits8 |= 0x0020;
5866*b1cdbd2cSJim Jagielski 	}
5867*b1cdbd2cSJim Jagielski 	// unter Ver67 these are only reserved
5868*b1cdbd2cSJim Jagielski 	Set_UInt8( pData, nBits8  );
5869*b1cdbd2cSJim Jagielski 
5870*b1cdbd2cSJim Jagielski 	Set_UInt16( pData, chse );
5871*b1cdbd2cSJim Jagielski 	Set_UInt16( pData, chseTables );
5872*b1cdbd2cSJim Jagielski 	Set_UInt32( pData, fcMin );
5873*b1cdbd2cSJim Jagielski 	Set_UInt32( pData, fcMac );
5874*b1cdbd2cSJim Jagielski 
5875*b1cdbd2cSJim Jagielski // Einschub fuer WW8 *****************************************************
5876*b1cdbd2cSJim Jagielski 
5877*b1cdbd2cSJim Jagielski 	// Marke: "rgsw"  Beginning of the array of shorts
5878*b1cdbd2cSJim Jagielski 	if( bVer8 )
5879*b1cdbd2cSJim Jagielski 	{
5880*b1cdbd2cSJim Jagielski 		Set_UInt16( pData, csw );
5881*b1cdbd2cSJim Jagielski 		Set_UInt16( pData, wMagicCreated );
5882*b1cdbd2cSJim Jagielski 		Set_UInt16( pData, wMagicRevised );
5883*b1cdbd2cSJim Jagielski 		Set_UInt16( pData, wMagicCreatedPrivate );
5884*b1cdbd2cSJim Jagielski 		Set_UInt16( pData, wMagicRevisedPrivate );
5885*b1cdbd2cSJim Jagielski 		pData += 9 * sizeof( sal_Int16 );
5886*b1cdbd2cSJim Jagielski 		Set_UInt16( pData, lidFE );
5887*b1cdbd2cSJim Jagielski 		Set_UInt16( pData, clw );
5888*b1cdbd2cSJim Jagielski 	}
5889*b1cdbd2cSJim Jagielski 
5890*b1cdbd2cSJim Jagielski // Ende des Einschubs fuer WW8 *******************************************
5891*b1cdbd2cSJim Jagielski 
5892*b1cdbd2cSJim Jagielski 	// Marke: "rglw"  Beginning of the array of longs
5893*b1cdbd2cSJim Jagielski 	Set_UInt32( pData, cbMac );
5894*b1cdbd2cSJim Jagielski 
5895*b1cdbd2cSJim Jagielski 	rStrm.Write( pDataPtr, nUnencryptedHdr );
5896*b1cdbd2cSJim Jagielski 	delete[] pDataPtr;
5897*b1cdbd2cSJim Jagielski 	return 0 == rStrm.GetError();
5898*b1cdbd2cSJim Jagielski }
5899*b1cdbd2cSJim Jagielski 
Write(SvStream & rStrm)5900*b1cdbd2cSJim Jagielski bool WW8Fib::Write(SvStream& rStrm)
5901*b1cdbd2cSJim Jagielski {
5902*b1cdbd2cSJim Jagielski 	bool bVer8 = 8 == nVersion;
5903*b1cdbd2cSJim Jagielski 
5904*b1cdbd2cSJim Jagielski 	WriteHeader( rStrm );
5905*b1cdbd2cSJim Jagielski 
5906*b1cdbd2cSJim Jagielski 	size_t nUnencryptedHdr = bVer8 ? 0x44 : 0x24;
5907*b1cdbd2cSJim Jagielski 
5908*b1cdbd2cSJim Jagielski     sal_uInt8 *pDataPtr = new sal_uInt8[ fcMin - nUnencryptedHdr ];
5909*b1cdbd2cSJim Jagielski     sal_uInt8 *pData = pDataPtr;
5910*b1cdbd2cSJim Jagielski 	memset( pData, 0, fcMin - nUnencryptedHdr );
5911*b1cdbd2cSJim Jagielski 
5912*b1cdbd2cSJim Jagielski     sal_uLong nPos = rStrm.Tell();
5913*b1cdbd2cSJim Jagielski     cbMac = rStrm.Seek( STREAM_SEEK_TO_END );
5914*b1cdbd2cSJim Jagielski     rStrm.Seek( nPos );
5915*b1cdbd2cSJim Jagielski 
5916*b1cdbd2cSJim Jagielski     // 2 Longs uebergehen, da unwichtiger Quatsch
5917*b1cdbd2cSJim Jagielski     pData += 2 * sizeof( sal_Int32);
5918*b1cdbd2cSJim Jagielski 
5919*b1cdbd2cSJim Jagielski     // weitere 2 Longs nur bei Ver67 ueberspringen
5920*b1cdbd2cSJim Jagielski     if( !bVer8 )
5921*b1cdbd2cSJim Jagielski         pData += 2 * sizeof( sal_Int32);
5922*b1cdbd2cSJim Jagielski 
5923*b1cdbd2cSJim Jagielski     Set_UInt32( pData, ccpText );
5924*b1cdbd2cSJim Jagielski     Set_UInt32( pData, ccpFtn );
5925*b1cdbd2cSJim Jagielski     Set_UInt32( pData, ccpHdr );
5926*b1cdbd2cSJim Jagielski     Set_UInt32( pData, ccpMcr );
5927*b1cdbd2cSJim Jagielski     Set_UInt32( pData, ccpAtn );
5928*b1cdbd2cSJim Jagielski     Set_UInt32( pData, ccpEdn );
5929*b1cdbd2cSJim Jagielski     Set_UInt32( pData, ccpTxbx );
5930*b1cdbd2cSJim Jagielski     Set_UInt32( pData, ccpHdrTxbx );
5931*b1cdbd2cSJim Jagielski 
5932*b1cdbd2cSJim Jagielski         // weiteres Long nur bei Ver67 ueberspringen
5933*b1cdbd2cSJim Jagielski     if( !bVer8 )
5934*b1cdbd2cSJim Jagielski         pData += 1 * sizeof( sal_Int32);
5935*b1cdbd2cSJim Jagielski 
5936*b1cdbd2cSJim Jagielski // Einschub fuer WW8 *****************************************************
5937*b1cdbd2cSJim Jagielski     if( bVer8 )
5938*b1cdbd2cSJim Jagielski     {
5939*b1cdbd2cSJim Jagielski         Set_UInt32( pData, pnFbpChpFirst );
5940*b1cdbd2cSJim Jagielski         Set_UInt32( pData, pnChpFirst );
5941*b1cdbd2cSJim Jagielski         Set_UInt32( pData, cpnBteChp );
5942*b1cdbd2cSJim Jagielski         Set_UInt32( pData, pnFbpPapFirst );
5943*b1cdbd2cSJim Jagielski         Set_UInt32( pData, pnPapFirst );
5944*b1cdbd2cSJim Jagielski         Set_UInt32( pData, cpnBtePap );
5945*b1cdbd2cSJim Jagielski         Set_UInt32( pData, pnFbpLvcFirst );
5946*b1cdbd2cSJim Jagielski         Set_UInt32( pData, pnLvcFirst );
5947*b1cdbd2cSJim Jagielski         Set_UInt32( pData, cpnBteLvc );
5948*b1cdbd2cSJim Jagielski         Set_UInt32( pData, fcIslandFirst );
5949*b1cdbd2cSJim Jagielski         Set_UInt32( pData, fcIslandLim );
5950*b1cdbd2cSJim Jagielski         Set_UInt16( pData, cfclcb );
5951*b1cdbd2cSJim Jagielski     }
5952*b1cdbd2cSJim Jagielski // Ende des Einschubs fuer WW8 *******************************************
5953*b1cdbd2cSJim Jagielski 
5954*b1cdbd2cSJim Jagielski     // Marke: "rgfclcb" Beginning of array of FC/LCB pairs.
5955*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcStshfOrig );
5956*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbStshfOrig );
5957*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcStshf );
5958*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbStshf );
5959*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcffndRef );
5960*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcffndRef );
5961*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcffndTxt );
5962*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcffndTxt );
5963*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfandRef );
5964*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfandRef );
5965*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfandTxt );
5966*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfandTxt );
5967*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfsed );
5968*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfsed );
5969*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfpad );
5970*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfpad );
5971*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfphe );
5972*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfphe );
5973*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcSttbfglsy );
5974*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbSttbfglsy );
5975*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfglsy );
5976*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfglsy );
5977*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfhdd );
5978*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfhdd );
5979*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfbteChpx );
5980*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfbteChpx );
5981*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfbtePapx );
5982*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfbtePapx );
5983*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfsea );
5984*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfsea );
5985*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcSttbfffn );
5986*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbSttbfffn );
5987*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcffldMom );
5988*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcffldMom );
5989*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcffldHdr );
5990*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcffldHdr );
5991*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcffldFtn );
5992*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcffldFtn );
5993*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcffldAtn );
5994*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcffldAtn );
5995*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcffldMcr );
5996*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcffldMcr );
5997*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcSttbfbkmk );
5998*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbSttbfbkmk );
5999*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfbkf );
6000*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfbkf );
6001*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfbkl );
6002*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfbkl );
6003*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcCmds );
6004*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbCmds );
6005*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfmcr );
6006*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfmcr );
6007*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcSttbfmcr );
6008*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbSttbfmcr );
6009*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPrDrvr );
6010*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPrDrvr );
6011*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPrEnvPort );
6012*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPrEnvPort );
6013*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPrEnvLand );
6014*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPrEnvLand );
6015*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcWss );
6016*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbWss );
6017*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcDop );
6018*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbDop );
6019*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcSttbfAssoc );
6020*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbSttbfAssoc );
6021*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcClx );
6022*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbClx );
6023*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfpgdFtn );
6024*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfpgdFtn );
6025*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcAutosaveSource );
6026*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbAutosaveSource );
6027*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcGrpStAtnOwners );
6028*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbGrpStAtnOwners );
6029*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcSttbfAtnbkmk );
6030*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbSttbfAtnbkmk );
6031*b1cdbd2cSJim Jagielski 
6032*b1cdbd2cSJim Jagielski     // weiteres short nur bei Ver67 ueberspringen
6033*b1cdbd2cSJim Jagielski     if( !bVer8 )
6034*b1cdbd2cSJim Jagielski     {
6035*b1cdbd2cSJim Jagielski         pData += 1*sizeof( sal_Int16);
6036*b1cdbd2cSJim Jagielski         Set_UInt16( pData, (sal_uInt16)pnChpFirst );
6037*b1cdbd2cSJim Jagielski         Set_UInt16( pData, (sal_uInt16)pnPapFirst );
6038*b1cdbd2cSJim Jagielski         Set_UInt16( pData, (sal_uInt16)cpnBteChp );
6039*b1cdbd2cSJim Jagielski         Set_UInt16( pData, (sal_uInt16)cpnBtePap );
6040*b1cdbd2cSJim Jagielski     }
6041*b1cdbd2cSJim Jagielski 
6042*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfdoaMom ); // nur bei Ver67, in Ver8 unused
6043*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfdoaMom ); // nur bei Ver67, in Ver8 unused
6044*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfdoaHdr ); // nur bei Ver67, in Ver8 unused
6045*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfdoaHdr ); // nur bei Ver67, in Ver8 unused
6046*b1cdbd2cSJim Jagielski 
6047*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfspaMom ); // in Ver67 leere Reserve
6048*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfspaMom ); // in Ver67 leere Reserve
6049*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfspaHdr ); // in Ver67 leere Reserve
6050*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfspaHdr ); // in Ver67 leere Reserve
6051*b1cdbd2cSJim Jagielski 
6052*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfAtnbkf );
6053*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfAtnbkf );
6054*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfAtnbkl );
6055*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfAtnbkl );
6056*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPms );
6057*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPMS );
6058*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcFormFldSttbf );
6059*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbFormFldSttbf );
6060*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfendRef );
6061*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfendRef );
6062*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfendTxt );
6063*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfendTxt );
6064*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcffldEdn );
6065*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcffldEdn );
6066*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfpgdEdn );
6067*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfpgdEdn );
6068*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcDggInfo ); // in Ver67 leere Reserve
6069*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbDggInfo ); // in Ver67 leere Reserve
6070*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcSttbfRMark );
6071*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbSttbfRMark );
6072*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcSttbfCaption );
6073*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbSttbfCaption );
6074*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcSttbAutoCaption );
6075*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbSttbAutoCaption );
6076*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfwkb );
6077*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfwkb );
6078*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfspl ); // in Ver67 leere Reserve
6079*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfspl ); // in Ver67 leere Reserve
6080*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcftxbxTxt );
6081*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcftxbxTxt );
6082*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcffldTxbx );
6083*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcffldTxbx );
6084*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcfHdrtxbxTxt );
6085*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcfHdrtxbxTxt );
6086*b1cdbd2cSJim Jagielski     Set_UInt32( pData, fcPlcffldHdrTxbx );
6087*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lcbPlcffldHdrTxbx );
6088*b1cdbd2cSJim Jagielski 
6089*b1cdbd2cSJim Jagielski     if( bVer8 )
6090*b1cdbd2cSJim Jagielski     {
6091*b1cdbd2cSJim Jagielski         pData += 0x2da - 0x27a;         // Pos + Offset (fcPlcfLst - fcStwUser)
6092*b1cdbd2cSJim Jagielski 		Set_UInt32( pData, fcSttbFnm);
6093*b1cdbd2cSJim Jagielski 		Set_UInt32( pData, lcbSttbFnm);
6094*b1cdbd2cSJim Jagielski         Set_UInt32( pData, fcPlcfLst );
6095*b1cdbd2cSJim Jagielski         Set_UInt32( pData, lcbPlcfLst );
6096*b1cdbd2cSJim Jagielski         Set_UInt32( pData, fcPlfLfo );
6097*b1cdbd2cSJim Jagielski         Set_UInt32( pData, lcbPlfLfo );
6098*b1cdbd2cSJim Jagielski         Set_UInt32( pData, fcPlcftxbxBkd );
6099*b1cdbd2cSJim Jagielski         Set_UInt32( pData, lcbPlcftxbxBkd );
6100*b1cdbd2cSJim Jagielski         Set_UInt32( pData, fcPlcfHdrtxbxBkd );
6101*b1cdbd2cSJim Jagielski         Set_UInt32( pData, lcbPlcfHdrtxbxBkd );
6102*b1cdbd2cSJim Jagielski 
6103*b1cdbd2cSJim Jagielski         pData += 0x372 - 0x302; // Pos + Offset (fcSttbListNames - fcDocUndo)
6104*b1cdbd2cSJim Jagielski         Set_UInt32( pData, fcSttbListNames );
6105*b1cdbd2cSJim Jagielski         Set_UInt32( pData, lcbSttbListNames );
6106*b1cdbd2cSJim Jagielski 
6107*b1cdbd2cSJim Jagielski         pData += 0x382 - 0x37A;
6108*b1cdbd2cSJim Jagielski         Set_UInt32( pData, fcPlcfTch );
6109*b1cdbd2cSJim Jagielski         Set_UInt32( pData, lcbPlcfTch );
6110*b1cdbd2cSJim Jagielski 
6111*b1cdbd2cSJim Jagielski         pData += 0x3FA - 0x38A;
6112*b1cdbd2cSJim Jagielski         Set_UInt16( pData, (sal_uInt16)0x0002);
6113*b1cdbd2cSJim Jagielski         Set_UInt16( pData, (sal_uInt16)0x00D9);
6114*b1cdbd2cSJim Jagielski 
6115*b1cdbd2cSJim Jagielski         pData += 0x41A - 0x3FE;
6116*b1cdbd2cSJim Jagielski         Set_UInt32( pData, fcAtrdExtra );
6117*b1cdbd2cSJim Jagielski         Set_UInt32( pData, lcbAtrdExtra );
6118*b1cdbd2cSJim Jagielski 
6119*b1cdbd2cSJim Jagielski         pData += 0x4DA - 0x422;
6120*b1cdbd2cSJim Jagielski         Set_UInt32( pData, fcHplxsdr );
6121*b1cdbd2cSJim Jagielski         Set_UInt32( pData, 0);
6122*b1cdbd2cSJim Jagielski     }
6123*b1cdbd2cSJim Jagielski 
6124*b1cdbd2cSJim Jagielski 	rStrm.Write( pDataPtr, fcMin - nUnencryptedHdr );
6125*b1cdbd2cSJim Jagielski 	delete[] pDataPtr;
6126*b1cdbd2cSJim Jagielski 	return 0 == rStrm.GetError();
6127*b1cdbd2cSJim Jagielski }
6128*b1cdbd2cSJim Jagielski 
GetFIBCharset(sal_uInt16 chs)6129*b1cdbd2cSJim Jagielski rtl_TextEncoding WW8Fib::GetFIBCharset(sal_uInt16 chs)
6130*b1cdbd2cSJim Jagielski {
6131*b1cdbd2cSJim Jagielski     ASSERT(chs <= 0x100, "overflowed winword charset set");
6132*b1cdbd2cSJim Jagielski     rtl_TextEncoding eCharSet =
6133*b1cdbd2cSJim Jagielski         (0x0100 == chs)
6134*b1cdbd2cSJim Jagielski         ? RTL_TEXTENCODING_APPLE_ROMAN
6135*b1cdbd2cSJim Jagielski         : rtl_getTextEncodingFromWindowsCharset( static_cast<sal_uInt8>(chs) );
6136*b1cdbd2cSJim Jagielski     return eCharSet;
6137*b1cdbd2cSJim Jagielski }
6138*b1cdbd2cSJim Jagielski 
WW8Style(SvStream & rStream,WW8Fib & rFibPara)6139*b1cdbd2cSJim Jagielski WW8Style::WW8Style(SvStream& rStream, WW8Fib& rFibPara)
6140*b1cdbd2cSJim Jagielski     : rFib(rFibPara), rSt(rStream), cstd(0), cbSTDBaseInFile(0),
6141*b1cdbd2cSJim Jagielski     stiMaxWhenSaved(0), istdMaxFixedWhenSaved(0), nVerBuiltInNamesWhenSaved(0),
6142*b1cdbd2cSJim Jagielski     ftcAsci(0), ftcFE(0), ftcOther(0), ftcBi(0)
6143*b1cdbd2cSJim Jagielski {
6144*b1cdbd2cSJim Jagielski     nStyleStart = rFib.fcStshf;
6145*b1cdbd2cSJim Jagielski     nStyleLen = rFib.lcbStshf;
6146*b1cdbd2cSJim Jagielski 
6147*b1cdbd2cSJim Jagielski     rSt.Seek(nStyleStart);
6148*b1cdbd2cSJim Jagielski 
6149*b1cdbd2cSJim Jagielski     sal_uInt16 cbStshi = 0; //  2 bytes size of the following STSHI structure
6150*b1cdbd2cSJim Jagielski 
6151*b1cdbd2cSJim Jagielski     if (rFib.GetFIBVersion() <= ww::eWW2)
6152*b1cdbd2cSJim Jagielski     {
6153*b1cdbd2cSJim Jagielski         cbStshi = 0;
6154*b1cdbd2cSJim Jagielski         cstd = 256;
6155*b1cdbd2cSJim Jagielski     }
6156*b1cdbd2cSJim Jagielski     else if (rFib.nFib < 67) // old Version ? (need to find this again to fix)
6157*b1cdbd2cSJim Jagielski         cbStshi = 4;    // -> Laengenfeld fehlt
6158*b1cdbd2cSJim Jagielski     else    // neue Version:
6159*b1cdbd2cSJim Jagielski         // lies die Laenge der in der Datei gespeicherten Struktur
6160*b1cdbd2cSJim Jagielski         rSt >> cbStshi;
6161*b1cdbd2cSJim Jagielski 
6162*b1cdbd2cSJim Jagielski     sal_uInt16 nRead = cbStshi;
6163*b1cdbd2cSJim Jagielski     do
6164*b1cdbd2cSJim Jagielski     {
6165*b1cdbd2cSJim Jagielski         sal_uInt16 a16Bit;
6166*b1cdbd2cSJim Jagielski 
6167*b1cdbd2cSJim Jagielski         if(  2 > nRead ) break;
6168*b1cdbd2cSJim Jagielski         rSt >> cstd;
6169*b1cdbd2cSJim Jagielski 
6170*b1cdbd2cSJim Jagielski         if(  4 > nRead ) break;
6171*b1cdbd2cSJim Jagielski         rSt >> cbSTDBaseInFile;
6172*b1cdbd2cSJim Jagielski 
6173*b1cdbd2cSJim Jagielski         if(  6 > nRead ) break;
6174*b1cdbd2cSJim Jagielski         rSt >> a16Bit;
6175*b1cdbd2cSJim Jagielski         fStdStylenamesWritten = a16Bit & 0x0001;
6176*b1cdbd2cSJim Jagielski 
6177*b1cdbd2cSJim Jagielski         if(  8 > nRead ) break;
6178*b1cdbd2cSJim Jagielski         rSt >> stiMaxWhenSaved;
6179*b1cdbd2cSJim Jagielski 
6180*b1cdbd2cSJim Jagielski         if( 10 > nRead ) break;
6181*b1cdbd2cSJim Jagielski         rSt >> istdMaxFixedWhenSaved;
6182*b1cdbd2cSJim Jagielski 
6183*b1cdbd2cSJim Jagielski         if( 12 > nRead ) break;
6184*b1cdbd2cSJim Jagielski         rSt >> nVerBuiltInNamesWhenSaved;
6185*b1cdbd2cSJim Jagielski 
6186*b1cdbd2cSJim Jagielski         if( 14 > nRead ) break;
6187*b1cdbd2cSJim Jagielski         rSt >> ftcAsci;
6188*b1cdbd2cSJim Jagielski 
6189*b1cdbd2cSJim Jagielski         if( 16 > nRead ) break;
6190*b1cdbd2cSJim Jagielski         rSt >> ftcFE;
6191*b1cdbd2cSJim Jagielski 
6192*b1cdbd2cSJim Jagielski         if ( 18 > nRead ) break;
6193*b1cdbd2cSJim Jagielski         rSt >> ftcOther;
6194*b1cdbd2cSJim Jagielski 
6195*b1cdbd2cSJim Jagielski         ftcBi = ftcOther;
6196*b1cdbd2cSJim Jagielski 
6197*b1cdbd2cSJim Jagielski         if ( 20 > nRead ) break;
6198*b1cdbd2cSJim Jagielski         rSt >> ftcBi;
6199*b1cdbd2cSJim Jagielski 
6200*b1cdbd2cSJim Jagielski         // ggfs. den Rest ueberlesen
6201*b1cdbd2cSJim Jagielski         if( 20 < nRead )
6202*b1cdbd2cSJim Jagielski             rSt.SeekRel( nRead-20 );
6203*b1cdbd2cSJim Jagielski     }
6204*b1cdbd2cSJim Jagielski     while( !this ); // Trick: obiger Block wird genau einmal durchlaufen
6205*b1cdbd2cSJim Jagielski                     //   und kann vorzeitig per "break" verlassen werden.
6206*b1cdbd2cSJim Jagielski 
6207*b1cdbd2cSJim Jagielski     if( 0 != rSt.GetError() )
6208*b1cdbd2cSJim Jagielski     {
6209*b1cdbd2cSJim Jagielski         // wie denn nun den Error melden?
6210*b1cdbd2cSJim Jagielski     }
6211*b1cdbd2cSJim Jagielski }
6212*b1cdbd2cSJim Jagielski 
6213*b1cdbd2cSJim Jagielski // Read1STDFixed() liest ein Style ein. Wenn der Style vollstaendig vorhanden
6214*b1cdbd2cSJim Jagielski // ist, d.h. kein leerer Slot, dann wird Speicher alloziert und ein Pointer auf
6215*b1cdbd2cSJim Jagielski // die ( evtl. mit Nullen aufgefuellten ) STD geliefert. Ist es ein leerer
6216*b1cdbd2cSJim Jagielski // Slot, dann wird ein Nullpointer zurueckgeliefert.
Read1STDFixed(short & rSkip,short * pcbStd)6217*b1cdbd2cSJim Jagielski WW8_STD* WW8Style::Read1STDFixed( short& rSkip, short* pcbStd )
6218*b1cdbd2cSJim Jagielski {
6219*b1cdbd2cSJim Jagielski     WW8_STD* pStd = 0;
6220*b1cdbd2cSJim Jagielski 
6221*b1cdbd2cSJim Jagielski     sal_uInt16 cbStd;
6222*b1cdbd2cSJim Jagielski     rSt >> cbStd;   // lies Laenge
6223*b1cdbd2cSJim Jagielski 
6224*b1cdbd2cSJim Jagielski     sal_uInt16 nRead = cbSTDBaseInFile;
6225*b1cdbd2cSJim Jagielski     if( cbStd >= cbSTDBaseInFile )
6226*b1cdbd2cSJim Jagielski     {
6227*b1cdbd2cSJim Jagielski         // Fixed part vollst. vorhanden
6228*b1cdbd2cSJim Jagielski 
6229*b1cdbd2cSJim Jagielski         // read fixed part of STD
6230*b1cdbd2cSJim Jagielski         pStd = new WW8_STD;
6231*b1cdbd2cSJim Jagielski         memset( pStd, 0, sizeof( *pStd ) );
6232*b1cdbd2cSJim Jagielski 
6233*b1cdbd2cSJim Jagielski         do
6234*b1cdbd2cSJim Jagielski         {
6235*b1cdbd2cSJim Jagielski             sal_uInt16 a16Bit;
6236*b1cdbd2cSJim Jagielski 
6237*b1cdbd2cSJim Jagielski             if( 2 > nRead ) break;
6238*b1cdbd2cSJim Jagielski             rSt >> a16Bit;
6239*b1cdbd2cSJim Jagielski             pStd->sti          =        a16Bit & 0x0fff  ;
6240*b1cdbd2cSJim Jagielski             pStd->fScratch     = 0 != ( a16Bit & 0x1000 );
6241*b1cdbd2cSJim Jagielski             pStd->fInvalHeight = 0 != ( a16Bit & 0x2000 );
6242*b1cdbd2cSJim Jagielski             pStd->fHasUpe      = 0 != ( a16Bit & 0x4000 );
6243*b1cdbd2cSJim Jagielski             pStd->fMassCopy    = 0 != ( a16Bit & 0x8000 );
6244*b1cdbd2cSJim Jagielski 
6245*b1cdbd2cSJim Jagielski             if( 4 > nRead ) break;
6246*b1cdbd2cSJim Jagielski             rSt >> a16Bit;
6247*b1cdbd2cSJim Jagielski             pStd->sgc      =   a16Bit & 0x000f       ;
6248*b1cdbd2cSJim Jagielski             pStd->istdBase = ( a16Bit & 0xfff0 ) >> 4;
6249*b1cdbd2cSJim Jagielski 
6250*b1cdbd2cSJim Jagielski             if( 6 > nRead ) break;
6251*b1cdbd2cSJim Jagielski             rSt >> a16Bit;
6252*b1cdbd2cSJim Jagielski             pStd->cupx     =   a16Bit & 0x000f       ;
6253*b1cdbd2cSJim Jagielski             pStd->istdNext = ( a16Bit & 0xfff0 ) >> 4;
6254*b1cdbd2cSJim Jagielski 
6255*b1cdbd2cSJim Jagielski             if( 8 > nRead ) break;
6256*b1cdbd2cSJim Jagielski             rSt >> pStd->bchUpe;
6257*b1cdbd2cSJim Jagielski 
6258*b1cdbd2cSJim Jagielski             // ab Ver8 sollten diese beiden Felder dazukommen:
6259*b1cdbd2cSJim Jagielski             if(10 > nRead ) break;
6260*b1cdbd2cSJim Jagielski             rSt >> a16Bit;
6261*b1cdbd2cSJim Jagielski             pStd->fAutoRedef =   a16Bit & 0x0001       ;
6262*b1cdbd2cSJim Jagielski             pStd->fHidden    = ( a16Bit & 0x0002 ) >> 1;
6263*b1cdbd2cSJim Jagielski 
6264*b1cdbd2cSJim Jagielski             // man kann nie wissen: vorsichtshalber ueberlesen
6265*b1cdbd2cSJim Jagielski             // wir eventuelle Fuellsel, die noch zum BASE-Part gehoeren...
6266*b1cdbd2cSJim Jagielski             if( 10 < nRead )
6267*b1cdbd2cSJim Jagielski                 rSt.SeekRel( nRead-10 );
6268*b1cdbd2cSJim Jagielski         }
6269*b1cdbd2cSJim Jagielski         while( !this ); // Trick: obiger Block wird genau einmal durchlaufen
6270*b1cdbd2cSJim Jagielski                         //   und kann vorzeitig per "break" verlassen werden.
6271*b1cdbd2cSJim Jagielski 
6272*b1cdbd2cSJim Jagielski         if( (0 != rSt.GetError()) || !nRead )
6273*b1cdbd2cSJim Jagielski             DELETEZ( pStd );        // per NULL den Error melden
6274*b1cdbd2cSJim Jagielski 
6275*b1cdbd2cSJim Jagielski       rSkip = cbStd - cbSTDBaseInFile;
6276*b1cdbd2cSJim Jagielski     }
6277*b1cdbd2cSJim Jagielski     else
6278*b1cdbd2cSJim Jagielski     {           // Fixed part zu kurz
6279*b1cdbd2cSJim Jagielski         if( cbStd )
6280*b1cdbd2cSJim Jagielski             rSt.SeekRel( cbStd );           // ueberlies Reste
6281*b1cdbd2cSJim Jagielski         rSkip = 0;
6282*b1cdbd2cSJim Jagielski     }
6283*b1cdbd2cSJim Jagielski     if( pcbStd )
6284*b1cdbd2cSJim Jagielski         *pcbStd = cbStd;
6285*b1cdbd2cSJim Jagielski     return pStd;
6286*b1cdbd2cSJim Jagielski }
6287*b1cdbd2cSJim Jagielski 
Read1Style(short & rSkip,String * pString,short * pcbStd)6288*b1cdbd2cSJim Jagielski WW8_STD* WW8Style::Read1Style( short& rSkip, String* pString, short* pcbStd )
6289*b1cdbd2cSJim Jagielski {
6290*b1cdbd2cSJim Jagielski     // Attention: MacWord-Documents have their Stylenames
6291*b1cdbd2cSJim Jagielski     // always in ANSI, even if eStructCharSet == CHARSET_MAC !!
6292*b1cdbd2cSJim Jagielski 
6293*b1cdbd2cSJim Jagielski     WW8_STD* pStd = Read1STDFixed( rSkip, pcbStd );         // lese STD
6294*b1cdbd2cSJim Jagielski 
6295*b1cdbd2cSJim Jagielski     // String gewuenscht ?
6296*b1cdbd2cSJim Jagielski     if( pString )
6297*b1cdbd2cSJim Jagielski     {   // echter Style ?
6298*b1cdbd2cSJim Jagielski         if ( pStd )
6299*b1cdbd2cSJim Jagielski         {
6300*b1cdbd2cSJim Jagielski             switch( rFib.nVersion )
6301*b1cdbd2cSJim Jagielski             {
6302*b1cdbd2cSJim Jagielski                 case 6:
6303*b1cdbd2cSJim Jagielski                 case 7:
6304*b1cdbd2cSJim Jagielski                     // lies Pascal-String
6305*b1cdbd2cSJim Jagielski                     *pString = WW8ReadPString( rSt, RTL_TEXTENCODING_MS_1252 );
6306*b1cdbd2cSJim Jagielski                     // leading len and trailing zero --> 2
6307*b1cdbd2cSJim Jagielski                     rSkip -= 2+ pString->Len();
6308*b1cdbd2cSJim Jagielski                     break;
6309*b1cdbd2cSJim Jagielski                 case 8:
6310*b1cdbd2cSJim Jagielski                     // handle Unicode-String with leading length short and
6311*b1cdbd2cSJim Jagielski                     // trailing zero
6312*b1cdbd2cSJim Jagielski                     if (ww8String::TestBeltAndBraces(rSt))
6313*b1cdbd2cSJim Jagielski                     {
6314*b1cdbd2cSJim Jagielski                         *pString = WW8Read_xstz(rSt, 0, true);
6315*b1cdbd2cSJim Jagielski                         rSkip -= (pString->Len() + 2) * 2;
6316*b1cdbd2cSJim Jagielski                     }
6317*b1cdbd2cSJim Jagielski                     else
6318*b1cdbd2cSJim Jagielski                     {
6319*b1cdbd2cSJim Jagielski                         /*
6320*b1cdbd2cSJim Jagielski                         #i8114#
6321*b1cdbd2cSJim Jagielski                         This is supposed to be impossible, its just supposed
6322*b1cdbd2cSJim Jagielski                         to be 16 bit count followed by the string and ending
6323*b1cdbd2cSJim Jagielski                         in a 0 short. But "Lotus SmartSuite Product: Word Pro"
6324*b1cdbd2cSJim Jagielski                         is creating invalid style names in ww7- format. So we
6325*b1cdbd2cSJim Jagielski                         use the belt and braces of the ms strings to see if
6326*b1cdbd2cSJim Jagielski                         they are not corrupt. If they are then we try them as
6327*b1cdbd2cSJim Jagielski                         8bit ones
6328*b1cdbd2cSJim Jagielski                         */
6329*b1cdbd2cSJim Jagielski                         *pString = WW8ReadPString(rSt,RTL_TEXTENCODING_MS_1252);
6330*b1cdbd2cSJim Jagielski                         // leading len and trailing zero --> 2
6331*b1cdbd2cSJim Jagielski                         rSkip -= 2+ pString->Len();
6332*b1cdbd2cSJim Jagielski                     }
6333*b1cdbd2cSJim Jagielski                     break;
6334*b1cdbd2cSJim Jagielski                 default:
6335*b1cdbd2cSJim Jagielski                     ASSERT(!this, "Es wurde vergessen, nVersion zu kodieren!");
6336*b1cdbd2cSJim Jagielski                     break;
6337*b1cdbd2cSJim Jagielski             }
6338*b1cdbd2cSJim Jagielski         }
6339*b1cdbd2cSJim Jagielski         else
6340*b1cdbd2cSJim Jagielski             *pString = aEmptyStr;   // Kann keinen Namen liefern
6341*b1cdbd2cSJim Jagielski     }
6342*b1cdbd2cSJim Jagielski     return pStd;
6343*b1cdbd2cSJim Jagielski }
6344*b1cdbd2cSJim Jagielski 
6345*b1cdbd2cSJim Jagielski 
6346*b1cdbd2cSJim Jagielski //-----------------------------------------
6347*b1cdbd2cSJim Jagielski 
6348*b1cdbd2cSJim Jagielski 
6349*b1cdbd2cSJim Jagielski struct WW8_FFN_Ver6 : public WW8_FFN_BASE
6350*b1cdbd2cSJim Jagielski {
6351*b1cdbd2cSJim Jagielski     // ab Ver6
6352*b1cdbd2cSJim Jagielski     sal_Char szFfn[65]; // 0x6 bzw. 0x40 ab Ver8 zero terminated string that
6353*b1cdbd2cSJim Jagielski                         // records name of font.
6354*b1cdbd2cSJim Jagielski                         // Maximal size of szFfn is 65 characters.
6355*b1cdbd2cSJim Jagielski                         // Vorsicht: Dieses Array kann auch kleiner sein!!!
6356*b1cdbd2cSJim Jagielski                         // Possibly followed by a second sz which records the
6357*b1cdbd2cSJim Jagielski                         // name of an alternate font to use if the first named
6358*b1cdbd2cSJim Jagielski                         // font does not exist on this system.
6359*b1cdbd2cSJim Jagielski };
6360*b1cdbd2cSJim Jagielski struct WW8_FFN_Ver8 : public WW8_FFN_BASE
6361*b1cdbd2cSJim Jagielski {
6362*b1cdbd2cSJim Jagielski     // ab Ver8 sind folgende beiden Felder eingeschoben,
6363*b1cdbd2cSJim Jagielski     // werden von uns ignoriert.
6364*b1cdbd2cSJim Jagielski     sal_Char panose[ 10 ];  //  0x6   PANOSE
6365*b1cdbd2cSJim Jagielski     sal_Char fs[ 24     ];  //  0x10  FONTSIGNATURE
6366*b1cdbd2cSJim Jagielski 
6367*b1cdbd2cSJim Jagielski     // ab Ver8 als Unicode
6368*b1cdbd2cSJim Jagielski     sal_uInt16 szFfn[65];   // 0x6 bzw. 0x40 ab Ver8 zero terminated string that
6369*b1cdbd2cSJim Jagielski                         // records name of font.
6370*b1cdbd2cSJim Jagielski                         // Maximal size of szFfn is 65 characters.
6371*b1cdbd2cSJim Jagielski                         // Vorsicht: Dieses Array kann auch kleiner sein!!!
6372*b1cdbd2cSJim Jagielski                         // Possibly followed by a second sz which records the
6373*b1cdbd2cSJim Jagielski                         // name of an alternate font to use if the first named
6374*b1cdbd2cSJim Jagielski                         // font does not exist on this system.
6375*b1cdbd2cSJim Jagielski };
6376*b1cdbd2cSJim Jagielski 
6377*b1cdbd2cSJim Jagielski // #i43762# check font name for illegal characters
lcl_checkFontname(String & sString)6378*b1cdbd2cSJim Jagielski void lcl_checkFontname( String& sString )
6379*b1cdbd2cSJim Jagielski {
6380*b1cdbd2cSJim Jagielski     // for efficiency, we'd like to use String methods as far as possible.
6381*b1cdbd2cSJim Jagielski     // Hence, we will:
6382*b1cdbd2cSJim Jagielski     // 1) convert all invalid chars to \u0001
6383*b1cdbd2cSJim Jagielski     // 2) then erase all \u0001 chars (if any were found), and
6384*b1cdbd2cSJim Jagielski     // 3) erase leading/trailing ';', in case a font name was
6385*b1cdbd2cSJim Jagielski     //    completely removed
6386*b1cdbd2cSJim Jagielski 
6387*b1cdbd2cSJim Jagielski     // convert all invalid chars to \u0001
6388*b1cdbd2cSJim Jagielski     sal_Unicode* pBuffer = sString.GetBufferAccess();
6389*b1cdbd2cSJim Jagielski     xub_StrLen nLen = sString.Len();
6390*b1cdbd2cSJim Jagielski     bool bFound = false;
6391*b1cdbd2cSJim Jagielski     for( xub_StrLen n = 0; n < nLen; n++ )
6392*b1cdbd2cSJim Jagielski     {
6393*b1cdbd2cSJim Jagielski         if( pBuffer[n] < sal_Unicode( 0x20 ) )
6394*b1cdbd2cSJim Jagielski         {
6395*b1cdbd2cSJim Jagielski             pBuffer[n] = sal_Unicode( 1 );
6396*b1cdbd2cSJim Jagielski             bFound = true;
6397*b1cdbd2cSJim Jagielski         }
6398*b1cdbd2cSJim Jagielski     }
6399*b1cdbd2cSJim Jagielski     sString.ReleaseBufferAccess();
6400*b1cdbd2cSJim Jagielski 
6401*b1cdbd2cSJim Jagielski     // if anything was found, remove \u0001 + leading/trailing ';'
6402*b1cdbd2cSJim Jagielski     if( bFound )
6403*b1cdbd2cSJim Jagielski     {
6404*b1cdbd2cSJim Jagielski         sString.EraseAllChars( sal_Unicode( 1 ) );
6405*b1cdbd2cSJim Jagielski         sString.EraseLeadingAndTrailingChars( sal_Unicode( ';' ) );
6406*b1cdbd2cSJim Jagielski     }
6407*b1cdbd2cSJim Jagielski }
6408*b1cdbd2cSJim Jagielski 
WW8Fonts(SvStream & rSt,WW8Fib & rFib)6409*b1cdbd2cSJim Jagielski WW8Fonts::WW8Fonts( SvStream& rSt, WW8Fib& rFib )
6410*b1cdbd2cSJim Jagielski     : pFontA(0), nMax(0)
6411*b1cdbd2cSJim Jagielski {
6412*b1cdbd2cSJim Jagielski     // Attention: MacWord-Documents have their Fontnames
6413*b1cdbd2cSJim Jagielski     // always in ANSI, even if eStructCharSet == CHARSET_MAC !!
6414*b1cdbd2cSJim Jagielski     if( rFib.lcbSttbfffn <= 2 )
6415*b1cdbd2cSJim Jagielski     {
6416*b1cdbd2cSJim Jagielski         ASSERT( !this, "Fonttabelle kaputt! (rFib.lcbSttbfffn < 2)" );
6417*b1cdbd2cSJim Jagielski         pFontA = 0;
6418*b1cdbd2cSJim Jagielski         nMax = 0;
6419*b1cdbd2cSJim Jagielski         return;
6420*b1cdbd2cSJim Jagielski     }
6421*b1cdbd2cSJim Jagielski 
6422*b1cdbd2cSJim Jagielski     rSt.Seek( rFib.fcSttbfffn );
6423*b1cdbd2cSJim Jagielski 
6424*b1cdbd2cSJim Jagielski     sal_Int32 nFFn = rFib.lcbSttbfffn - 2;
6425*b1cdbd2cSJim Jagielski 
6426*b1cdbd2cSJim Jagielski     // allocate Font Array
6427*b1cdbd2cSJim Jagielski     sal_uInt8* pA   = new sal_uInt8[ nFFn ];
6428*b1cdbd2cSJim Jagielski     memset(pA, 0, nFFn);
6429*b1cdbd2cSJim Jagielski     WW8_FFN* p = (WW8_FFN*)pA;
6430*b1cdbd2cSJim Jagielski 
6431*b1cdbd2cSJim Jagielski     ww::WordVersion eVersion = rFib.GetFIBVersion();
6432*b1cdbd2cSJim Jagielski 
6433*b1cdbd2cSJim Jagielski     if( eVersion >= ww::eWW8 )
6434*b1cdbd2cSJim Jagielski     {
6435*b1cdbd2cSJim Jagielski         // bVer8: read the count of strings in nMax
6436*b1cdbd2cSJim Jagielski         rSt >> nMax;
6437*b1cdbd2cSJim Jagielski     }
6438*b1cdbd2cSJim Jagielski 
6439*b1cdbd2cSJim Jagielski     // Ver8:  skip undefined uint16
6440*b1cdbd2cSJim Jagielski     // Ver67: skip the herein stored total byte of structure
6441*b1cdbd2cSJim Jagielski     //        - we already got that information in rFib.lcbSttbfffn
6442*b1cdbd2cSJim Jagielski     rSt.SeekRel( 2 );
6443*b1cdbd2cSJim Jagielski 
6444*b1cdbd2cSJim Jagielski     // read all font information
6445*b1cdbd2cSJim Jagielski     nFFn = rSt.Read( pA, nFFn );
6446*b1cdbd2cSJim Jagielski 
6447*b1cdbd2cSJim Jagielski     if( eVersion < ww::eWW8 )
6448*b1cdbd2cSJim Jagielski     {
6449*b1cdbd2cSJim Jagielski         // try to figure out how many fonts are defined here
6450*b1cdbd2cSJim Jagielski         nMax = 0;
6451*b1cdbd2cSJim Jagielski         long nLeft = nFFn;
6452*b1cdbd2cSJim Jagielski         for(;;)
6453*b1cdbd2cSJim Jagielski         {
6454*b1cdbd2cSJim Jagielski             short nNextSiz;
6455*b1cdbd2cSJim Jagielski 
6456*b1cdbd2cSJim Jagielski             nNextSiz = p->cbFfnM1 + 1;
6457*b1cdbd2cSJim Jagielski             if( nNextSiz > nLeft )
6458*b1cdbd2cSJim Jagielski                 break;
6459*b1cdbd2cSJim Jagielski             nMax++;
6460*b1cdbd2cSJim Jagielski             nLeft -= nNextSiz;
6461*b1cdbd2cSJim Jagielski             if( nLeft < 1 )     // can we read the given ammount of bytes ?
6462*b1cdbd2cSJim Jagielski                 break;
6463*b1cdbd2cSJim Jagielski             // increase p by nNextSiz Bytes
6464*b1cdbd2cSJim Jagielski             p = (WW8_FFN *)( ( (sal_uInt8*)p ) + nNextSiz );
6465*b1cdbd2cSJim Jagielski         }
6466*b1cdbd2cSJim Jagielski     }
6467*b1cdbd2cSJim Jagielski 
6468*b1cdbd2cSJim Jagielski     if( nMax )
6469*b1cdbd2cSJim Jagielski     {
6470*b1cdbd2cSJim Jagielski         // Check size consistency
6471*b1cdbd2cSJim Jagielski         if(nMax > nFFn)
6472*b1cdbd2cSJim Jagielski         {
6473*b1cdbd2cSJim Jagielski 			throw std::out_of_range("WW8 beyond end of buffer");
6474*b1cdbd2cSJim Jagielski         }
6475*b1cdbd2cSJim Jagielski 
6476*b1cdbd2cSJim Jagielski         // allocate Index Array
6477*b1cdbd2cSJim Jagielski         pFontA = new WW8_FFN[ nMax ];
6478*b1cdbd2cSJim Jagielski         p = pFontA;
6479*b1cdbd2cSJim Jagielski 
6480*b1cdbd2cSJim Jagielski 	if( eVersion <= ww::eWW2 )
6481*b1cdbd2cSJim Jagielski 	{
6482*b1cdbd2cSJim Jagielski             WW8_FFN_BASE* pVer2 = (WW8_FFN_BASE*)pA;
6483*b1cdbd2cSJim Jagielski             for(sal_uInt16 i=0; i<nMax; ++i, ++p)
6484*b1cdbd2cSJim Jagielski             {
6485*b1cdbd2cSJim Jagielski                 p->cbFfnM1   = pVer2->cbFfnM1;
6486*b1cdbd2cSJim Jagielski 
6487*b1cdbd2cSJim Jagielski                 p->prg       =  0;
6488*b1cdbd2cSJim Jagielski                 p->fTrueType = 0;
6489*b1cdbd2cSJim Jagielski                 p->ff        = 0;
6490*b1cdbd2cSJim Jagielski 
6491*b1cdbd2cSJim Jagielski                 p->wWeight   = ( *(((sal_uInt8*)pVer2) + 1) );
6492*b1cdbd2cSJim Jagielski                 p->chs   = ( *(((sal_uInt8*)pVer2) + 2) );
6493*b1cdbd2cSJim Jagielski         	/*
6494*b1cdbd2cSJim Jagielski                  #i8726# 7- seems to encode the name in the same encoding as
6495*b1cdbd2cSJim Jagielski                  the font, e.g load the doc in 97 and save to see the unicode
6496*b1cdbd2cSJim Jagielski                  ver of the asian fontnames in that example to confirm.
6497*b1cdbd2cSJim Jagielski                 */
6498*b1cdbd2cSJim Jagielski                 rtl_TextEncoding eEnc = WW8Fib::GetFIBCharset(p->chs);
6499*b1cdbd2cSJim Jagielski                 if ((eEnc == RTL_TEXTENCODING_SYMBOL) || (eEnc == RTL_TEXTENCODING_DONTKNOW))
6500*b1cdbd2cSJim Jagielski                     eEnc = RTL_TEXTENCODING_MS_1252;
6501*b1cdbd2cSJim Jagielski 
6502*b1cdbd2cSJim Jagielski                 p->sFontname = String ( (((const sal_Char*)pVer2) + 1 + 2), eEnc);
6503*b1cdbd2cSJim Jagielski                 pVer2 = (WW8_FFN_BASE*)( ((sal_uInt8*)pVer2) + pVer2->cbFfnM1 + 1 );
6504*b1cdbd2cSJim Jagielski             }
6505*b1cdbd2cSJim Jagielski 	}
6506*b1cdbd2cSJim Jagielski         else if( eVersion < ww::eWW8 )
6507*b1cdbd2cSJim Jagielski         {
6508*b1cdbd2cSJim Jagielski             WW8_FFN_Ver6* pVer6 = (WW8_FFN_Ver6*)pA;
6509*b1cdbd2cSJim Jagielski             sal_uInt8 c2;
6510*b1cdbd2cSJim Jagielski             for(sal_uInt16 i=0; i<nMax; ++i, ++p)
6511*b1cdbd2cSJim Jagielski             {
6512*b1cdbd2cSJim Jagielski                 p->cbFfnM1   = pVer6->cbFfnM1;
6513*b1cdbd2cSJim Jagielski                 c2           = *(((sal_uInt8*)pVer6) + 1);
6514*b1cdbd2cSJim Jagielski 
6515*b1cdbd2cSJim Jagielski                 p->prg       =  c2 & 0x02;
6516*b1cdbd2cSJim Jagielski                 p->fTrueType = (c2 & 0x04) >> 2;
6517*b1cdbd2cSJim Jagielski                 // ein Reserve-Bit ueberspringen
6518*b1cdbd2cSJim Jagielski                 p->ff        = (c2 & 0x70) >> 4;
6519*b1cdbd2cSJim Jagielski 
6520*b1cdbd2cSJim Jagielski                 p->wWeight   = SVBT16ToShort( *(SVBT16*)&pVer6->wWeight );
6521*b1cdbd2cSJim Jagielski                 p->chs       = pVer6->chs;
6522*b1cdbd2cSJim Jagielski                 p->ibszAlt   = pVer6->ibszAlt;
6523*b1cdbd2cSJim Jagielski                 /*
6524*b1cdbd2cSJim Jagielski                  #i8726# 7- seems to encode the name in the same encoding as
6525*b1cdbd2cSJim Jagielski                  the font, e.g load the doc in 97 and save to see the unicode
6526*b1cdbd2cSJim Jagielski                  ver of the asian fontnames in that example to confirm.
6527*b1cdbd2cSJim Jagielski                  */
6528*b1cdbd2cSJim Jagielski                 rtl_TextEncoding eEnc = WW8Fib::GetFIBCharset(p->chs);
6529*b1cdbd2cSJim Jagielski                 if ((eEnc == RTL_TEXTENCODING_SYMBOL) || (eEnc == RTL_TEXTENCODING_DONTKNOW))
6530*b1cdbd2cSJim Jagielski                     eEnc = RTL_TEXTENCODING_MS_1252;
6531*b1cdbd2cSJim Jagielski                 p->sFontname = String(pVer6->szFfn, eEnc);
6532*b1cdbd2cSJim Jagielski                 if (p->ibszAlt)
6533*b1cdbd2cSJim Jagielski                 {
6534*b1cdbd2cSJim Jagielski                     p->sFontname.Append(';');
6535*b1cdbd2cSJim Jagielski                     p->sFontname += String(pVer6->szFfn+p->ibszAlt, eEnc);
6536*b1cdbd2cSJim Jagielski                 }
6537*b1cdbd2cSJim Jagielski                 else
6538*b1cdbd2cSJim Jagielski                 {
6539*b1cdbd2cSJim Jagielski                     //#i18369# if its a symbol font set Symbol as fallback
6540*b1cdbd2cSJim Jagielski                     if (
6541*b1cdbd2cSJim Jagielski                          RTL_TEXTENCODING_SYMBOL == WW8Fib::GetFIBCharset(p->chs)
6542*b1cdbd2cSJim Jagielski                          && !p->sFontname.EqualsAscii("Symbol")
6543*b1cdbd2cSJim Jagielski                        )
6544*b1cdbd2cSJim Jagielski                     {
6545*b1cdbd2cSJim Jagielski                         p->sFontname.APPEND_CONST_ASC(";Symbol");
6546*b1cdbd2cSJim Jagielski                     }
6547*b1cdbd2cSJim Jagielski                 }
6548*b1cdbd2cSJim Jagielski                 pVer6 = (WW8_FFN_Ver6*)( ((sal_uInt8*)pVer6) + pVer6->cbFfnM1 + 1 );
6549*b1cdbd2cSJim Jagielski             }
6550*b1cdbd2cSJim Jagielski         }
6551*b1cdbd2cSJim Jagielski         else
6552*b1cdbd2cSJim Jagielski         {
6553*b1cdbd2cSJim Jagielski             WW8_FFN_Ver8* pVer8 = (WW8_FFN_Ver8*)pA;
6554*b1cdbd2cSJim Jagielski             sal_uInt8 c2;
6555*b1cdbd2cSJim Jagielski             for(sal_uInt16 i=0; i<nMax; ++i, ++p)
6556*b1cdbd2cSJim Jagielski             {
6557*b1cdbd2cSJim Jagielski                 p->cbFfnM1   = pVer8->cbFfnM1;
6558*b1cdbd2cSJim Jagielski                 c2           = *(((sal_uInt8*)pVer8) + 1);
6559*b1cdbd2cSJim Jagielski 
6560*b1cdbd2cSJim Jagielski                 p->prg       =  c2 & 0x02;
6561*b1cdbd2cSJim Jagielski                 p->fTrueType = (c2 & 0x04) >> 2;
6562*b1cdbd2cSJim Jagielski                 // ein Reserve-Bit ueberspringen
6563*b1cdbd2cSJim Jagielski                 p->ff        = (c2 & 0x70) >> 4;
6564*b1cdbd2cSJim Jagielski 
6565*b1cdbd2cSJim Jagielski                 p->wWeight   = SVBT16ToShort( *(SVBT16*)&pVer8->wWeight );
6566*b1cdbd2cSJim Jagielski                 p->chs       = pVer8->chs;
6567*b1cdbd2cSJim Jagielski                 p->ibszAlt   = pVer8->ibszAlt;
6568*b1cdbd2cSJim Jagielski 
6569*b1cdbd2cSJim Jagielski #ifdef __WW8_NEEDS_COPY
6570*b1cdbd2cSJim Jagielski                 {
6571*b1cdbd2cSJim Jagielski                     sal_uInt8 nLen = 0x28;
6572*b1cdbd2cSJim Jagielski                     sal_uInt8 nLength = sizeof( pVer8->szFfn ) / sizeof( SVBT16 );
6573*b1cdbd2cSJim Jagielski                     nLength = std::min( nLength, sal_uInt8( pVer8->cbFfnM1+1 ) );
6574*b1cdbd2cSJim Jagielski                     for( sal_uInt16* pTmp = pVer8->szFfn;
6575*b1cdbd2cSJim Jagielski                         nLen < nLength; ++pTmp, nLen+=2 )
6576*b1cdbd2cSJim Jagielski                     {
6577*b1cdbd2cSJim Jagielski                         *pTmp = SVBT16ToShort( *(SVBT16*)pTmp );
6578*b1cdbd2cSJim Jagielski                     }
6579*b1cdbd2cSJim Jagielski                 }
6580*b1cdbd2cSJim Jagielski #endif // defined __WW8_NEEDS_COPY
6581*b1cdbd2cSJim Jagielski 
6582*b1cdbd2cSJim Jagielski                 p->sFontname = pVer8->szFfn;
6583*b1cdbd2cSJim Jagielski                 if (p->ibszAlt)
6584*b1cdbd2cSJim Jagielski                 {
6585*b1cdbd2cSJim Jagielski                     p->sFontname.Append(';');
6586*b1cdbd2cSJim Jagielski                     p->sFontname.Append(pVer8->szFfn+p->ibszAlt);
6587*b1cdbd2cSJim Jagielski                 }
6588*b1cdbd2cSJim Jagielski 
6589*b1cdbd2cSJim Jagielski                 // #i43762# check font name for illegal characters
6590*b1cdbd2cSJim Jagielski                 lcl_checkFontname( p->sFontname );
6591*b1cdbd2cSJim Jagielski 
6592*b1cdbd2cSJim Jagielski                 // Zeiger auf Ursprungsarray einen Font nach hinten setzen
6593*b1cdbd2cSJim Jagielski                 pVer8 = (WW8_FFN_Ver8*)( ((sal_uInt8*)pVer8) + pVer8->cbFfnM1 + 1 );
6594*b1cdbd2cSJim Jagielski 
6595*b1cdbd2cSJim Jagielski             }
6596*b1cdbd2cSJim Jagielski         }
6597*b1cdbd2cSJim Jagielski     }
6598*b1cdbd2cSJim Jagielski     delete[] pA;
6599*b1cdbd2cSJim Jagielski }
6600*b1cdbd2cSJim Jagielski 
GetFont(sal_uInt16 nNum) const6601*b1cdbd2cSJim Jagielski const WW8_FFN* WW8Fonts::GetFont( sal_uInt16 nNum ) const
6602*b1cdbd2cSJim Jagielski {
6603*b1cdbd2cSJim Jagielski     if( !pFontA || nNum >= nMax )
6604*b1cdbd2cSJim Jagielski         return 0;
6605*b1cdbd2cSJim Jagielski 
6606*b1cdbd2cSJim Jagielski     return &pFontA[ nNum ];
6607*b1cdbd2cSJim Jagielski }
6608*b1cdbd2cSJim Jagielski 
6609*b1cdbd2cSJim Jagielski 
6610*b1cdbd2cSJim Jagielski 
6611*b1cdbd2cSJim Jagielski //-----------------------------------------
6612*b1cdbd2cSJim Jagielski 
6613*b1cdbd2cSJim Jagielski 
6614*b1cdbd2cSJim Jagielski // Suche zu einem Header / Footer den Index in der WW-Liste von Headern / Footern
6615*b1cdbd2cSJim Jagielski //
6616*b1cdbd2cSJim Jagielski // Pferdefuesse bei WinWord6 und -7:
6617*b1cdbd2cSJim Jagielski // 1) Am Anfang des Einlesens muss WWPLCF_HdFt mit Fib und Dop konstruiert werden
6618*b1cdbd2cSJim Jagielski // 2) Der Haupttext muss sequentiell ueber alle Sections gelesen werden
6619*b1cdbd2cSJim Jagielski // 3) Fuer jedes vorkommende Header / Footer - Attribut des Haupttextes
6620*b1cdbd2cSJim Jagielski //  ( Darf pro Section maximal eins sein ) muss UpdateIndex() genau einmal
6621*b1cdbd2cSJim Jagielski //  mit dem Parameter des Attributes gerufen werden. Dieser Aufruf muss *nach*
6622*b1cdbd2cSJim Jagielski //  dem letzten Aufruf von GetTextPos() passieren.
6623*b1cdbd2cSJim Jagielski // 4) GetTextPos() darf mit genau einem der obenstehen WW_... aufgerufen werden
6624*b1cdbd2cSJim Jagielski //   ( nicht verodern ! )
6625*b1cdbd2cSJim Jagielski // -> dann liefert GetTextPos() vielleicht auch ein richtiges Ergebnis
6626*b1cdbd2cSJim Jagielski 
WW8PLCF_HdFt(SvStream * pSt,WW8Fib & rFib,WW8Dop & rDop)6627*b1cdbd2cSJim Jagielski WW8PLCF_HdFt::WW8PLCF_HdFt( SvStream* pSt, WW8Fib& rFib, WW8Dop& rDop )
6628*b1cdbd2cSJim Jagielski     : aPLCF( pSt, rFib.fcPlcfhdd , rFib.lcbPlcfhdd , 0 )
6629*b1cdbd2cSJim Jagielski {
6630*b1cdbd2cSJim Jagielski     nIdxOffset = 0;
6631*b1cdbd2cSJim Jagielski 
6632*b1cdbd2cSJim Jagielski      /*
6633*b1cdbd2cSJim Jagielski       cmc 23/02/2000: This dop.grpfIhdt has a bit set for each special
6634*b1cdbd2cSJim Jagielski       footnote *and endnote!!* seperator,continuation seperator, and
6635*b1cdbd2cSJim Jagielski       continuation notice entry, the documentation does not mention the
6636*b1cdbd2cSJim Jagielski       endnote seperators, the documentation also gets the index numbers
6637*b1cdbd2cSJim Jagielski       backwards when specifiying which bits to test. The bottom six bits
6638*b1cdbd2cSJim Jagielski       of this value must be tested and skipped over. Each section's
6639*b1cdbd2cSJim Jagielski       grpfIhdt is then tested for the existence of the appropiate headers
6640*b1cdbd2cSJim Jagielski       and footers, at the end of each section the nIdxOffset must be updated
6641*b1cdbd2cSJim Jagielski       to point to the beginning of the next section's group of headers and
6642*b1cdbd2cSJim Jagielski       footers in this PLCF, UpdateIndex does that task.
6643*b1cdbd2cSJim Jagielski       */
6644*b1cdbd2cSJim Jagielski     for( sal_uInt8 nI = 0x1; nI <= 0x20; nI <<= 1 )
6645*b1cdbd2cSJim Jagielski         if( nI & rDop.grpfIhdt )                // Bit gesetzt ?
6646*b1cdbd2cSJim Jagielski             nIdxOffset++;
6647*b1cdbd2cSJim Jagielski 
6648*b1cdbd2cSJim Jagielski     nTextOfs = rFib.ccpText + rFib.ccpFtn;  // Groesse des Haupttextes
6649*b1cdbd2cSJim Jagielski                                             // und der Fussnoten
6650*b1cdbd2cSJim Jagielski }
6651*b1cdbd2cSJim Jagielski 
GetTextPos(sal_uInt8 grpfIhdt,sal_uInt8 nWhich,WW8_CP & rStart,long & rLen)6652*b1cdbd2cSJim Jagielski bool WW8PLCF_HdFt::GetTextPos(sal_uInt8 grpfIhdt, sal_uInt8 nWhich, WW8_CP& rStart,
6653*b1cdbd2cSJim Jagielski     long& rLen)
6654*b1cdbd2cSJim Jagielski {
6655*b1cdbd2cSJim Jagielski     sal_uInt8 nI = 0x01;
6656*b1cdbd2cSJim Jagielski     short nIdx = nIdxOffset;
6657*b1cdbd2cSJim Jagielski     while (true)
6658*b1cdbd2cSJim Jagielski     {
6659*b1cdbd2cSJim Jagielski         if( nI & nWhich )
6660*b1cdbd2cSJim Jagielski             break;                      // found
6661*b1cdbd2cSJim Jagielski         if( grpfIhdt & nI )
6662*b1cdbd2cSJim Jagielski             nIdx++;                     // uninteresting Header / Footer
6663*b1cdbd2cSJim Jagielski         nI <<= 1;                       // text next bit
6664*b1cdbd2cSJim Jagielski         if( nI > 0x20 )
6665*b1cdbd2cSJim Jagielski             return false;               // not found
6666*b1cdbd2cSJim Jagielski     }
6667*b1cdbd2cSJim Jagielski                                         // nIdx ist HdFt-Index
6668*b1cdbd2cSJim Jagielski     WW8_CP nEnd;
6669*b1cdbd2cSJim Jagielski     void* pData;
6670*b1cdbd2cSJim Jagielski 
6671*b1cdbd2cSJim Jagielski     aPLCF.SetIdx( nIdx );               // Lookup suitable CP
6672*b1cdbd2cSJim Jagielski     aPLCF.Get( rStart, nEnd, pData );
6673*b1cdbd2cSJim Jagielski     rLen = nEnd - rStart;
6674*b1cdbd2cSJim Jagielski     aPLCF++;
6675*b1cdbd2cSJim Jagielski 
6676*b1cdbd2cSJim Jagielski     return true;
6677*b1cdbd2cSJim Jagielski }
6678*b1cdbd2cSJim Jagielski 
GetTextPosExact(short nIdx,WW8_CP & rStart,long & rLen)6679*b1cdbd2cSJim Jagielski bool WW8PLCF_HdFt::GetTextPosExact(short nIdx, WW8_CP& rStart, long& rLen)
6680*b1cdbd2cSJim Jagielski {
6681*b1cdbd2cSJim Jagielski     WW8_CP nEnd;
6682*b1cdbd2cSJim Jagielski     void* pData;
6683*b1cdbd2cSJim Jagielski 
6684*b1cdbd2cSJim Jagielski     aPLCF.SetIdx( nIdx );               // Lookup suitable CP
6685*b1cdbd2cSJim Jagielski     aPLCF.Get( rStart, nEnd, pData );
6686*b1cdbd2cSJim Jagielski     rLen = nEnd - rStart;
6687*b1cdbd2cSJim Jagielski     return true;
6688*b1cdbd2cSJim Jagielski }
6689*b1cdbd2cSJim Jagielski 
UpdateIndex(sal_uInt8 grpfIhdt)6690*b1cdbd2cSJim Jagielski void WW8PLCF_HdFt::UpdateIndex( sal_uInt8 grpfIhdt )
6691*b1cdbd2cSJim Jagielski {
6692*b1cdbd2cSJim Jagielski     // Caution: Description is not correct
6693*b1cdbd2cSJim Jagielski     for( sal_uInt8 nI = 0x01; nI <= 0x20; nI <<= 1 )
6694*b1cdbd2cSJim Jagielski         if( nI & grpfIhdt )
6695*b1cdbd2cSJim Jagielski             nIdxOffset++;
6696*b1cdbd2cSJim Jagielski }
6697*b1cdbd2cSJim Jagielski 
6698*b1cdbd2cSJim Jagielski //-----------------------------------------
6699*b1cdbd2cSJim Jagielski //          WW8Dop
6700*b1cdbd2cSJim Jagielski //-----------------------------------------
6701*b1cdbd2cSJim Jagielski 
WW8Dop(SvStream & rSt,sal_Int16 nFib,sal_Int32 nPos,sal_uInt32 nSize)6702*b1cdbd2cSJim Jagielski WW8Dop::WW8Dop(SvStream& rSt, sal_Int16 nFib, sal_Int32 nPos, sal_uInt32 nSize) : bUseThaiLineBreakingRules(false)
6703*b1cdbd2cSJim Jagielski {
6704*b1cdbd2cSJim Jagielski     memset( &nDataStart, 0, (&nDataEnd - &nDataStart) );
6705*b1cdbd2cSJim Jagielski     fDontUseHTMLAutoSpacing = true; //default
6706*b1cdbd2cSJim Jagielski     fAcetateShowAtn = true; //default
6707*b1cdbd2cSJim Jagielski     const sal_uInt32 nMaxDopSize = 0x268;
6708*b1cdbd2cSJim Jagielski     sal_uInt8* pDataPtr = new sal_uInt8[ nMaxDopSize ];
6709*b1cdbd2cSJim Jagielski     sal_uInt8* pData = pDataPtr;
6710*b1cdbd2cSJim Jagielski 
6711*b1cdbd2cSJim Jagielski     sal_uInt32 nRead = nMaxDopSize < nSize ? nMaxDopSize : nSize;
6712*b1cdbd2cSJim Jagielski     rSt.Seek( nPos );
6713*b1cdbd2cSJim Jagielski     if (2 > nSize || nRead != rSt.Read(pData, nRead))
6714*b1cdbd2cSJim Jagielski         nDopError = ERR_SWG_READ_ERROR;     // Error melden
6715*b1cdbd2cSJim Jagielski     else
6716*b1cdbd2cSJim Jagielski     {
6717*b1cdbd2cSJim Jagielski         if (nMaxDopSize > nRead)
6718*b1cdbd2cSJim Jagielski             memset( pData + nRead, 0, nMaxDopSize - nRead );
6719*b1cdbd2cSJim Jagielski 
6720*b1cdbd2cSJim Jagielski         // dann mal die Daten auswerten
6721*b1cdbd2cSJim Jagielski         sal_uInt32 a32Bit;
6722*b1cdbd2cSJim Jagielski         sal_uInt16 a16Bit;
6723*b1cdbd2cSJim Jagielski         sal_uInt8   a8Bit;
6724*b1cdbd2cSJim Jagielski 
6725*b1cdbd2cSJim Jagielski         a16Bit = Get_UShort( pData );        // 0 0x00
6726*b1cdbd2cSJim Jagielski         fFacingPages        = 0 != ( a16Bit  &  0x0001 )     ;
6727*b1cdbd2cSJim Jagielski         fWidowControl       = 0 != ( a16Bit  &  0x0002 )     ;
6728*b1cdbd2cSJim Jagielski         fPMHMainDoc         = 0 != ( a16Bit  &  0x0004 )     ;
6729*b1cdbd2cSJim Jagielski         grfSuppression      =      ( a16Bit  &  0x0018 ) >> 3;
6730*b1cdbd2cSJim Jagielski         fpc                 =      ( a16Bit  &  0x0060 ) >> 5;
6731*b1cdbd2cSJim Jagielski         grpfIhdt            =      ( a16Bit  &  0xff00 ) >> 8;
6732*b1cdbd2cSJim Jagielski 
6733*b1cdbd2cSJim Jagielski         a16Bit = Get_UShort( pData );        // 2 0x02
6734*b1cdbd2cSJim Jagielski         rncFtn              =   a16Bit  &  0x0003        ;
6735*b1cdbd2cSJim Jagielski         nFtn                = ( a16Bit  & ~0x0003 ) >> 2 ;
6736*b1cdbd2cSJim Jagielski 
6737*b1cdbd2cSJim Jagielski         a8Bit = Get_Byte( pData );           // 4 0x04
6738*b1cdbd2cSJim Jagielski         fOutlineDirtySave      = 0 != ( a8Bit  &  0x01   );
6739*b1cdbd2cSJim Jagielski 
6740*b1cdbd2cSJim Jagielski         a8Bit = Get_Byte( pData );           // 5 0x05
6741*b1cdbd2cSJim Jagielski         fOnlyMacPics           = 0 != ( a8Bit  &  0x01   );
6742*b1cdbd2cSJim Jagielski         fOnlyWinPics           = 0 != ( a8Bit  &  0x02   );
6743*b1cdbd2cSJim Jagielski         fLabelDoc              = 0 != ( a8Bit  &  0x04   );
6744*b1cdbd2cSJim Jagielski         fHyphCapitals          = 0 != ( a8Bit  &  0x08   );
6745*b1cdbd2cSJim Jagielski         fAutoHyphen            = 0 != ( a8Bit  &  0x10   );
6746*b1cdbd2cSJim Jagielski         fFormNoFields          = 0 != ( a8Bit  &  0x20   );
6747*b1cdbd2cSJim Jagielski         fLinkStyles            = 0 != ( a8Bit  &  0x40   );
6748*b1cdbd2cSJim Jagielski         fRevMarking            = 0 != ( a8Bit  &  0x80   );
6749*b1cdbd2cSJim Jagielski 
6750*b1cdbd2cSJim Jagielski         a8Bit = Get_Byte( pData );           // 6 0x06
6751*b1cdbd2cSJim Jagielski         fBackup                = 0 != ( a8Bit  &  0x01   );
6752*b1cdbd2cSJim Jagielski         fExactCWords           = 0 != ( a8Bit  &  0x02   );
6753*b1cdbd2cSJim Jagielski         fPagHidden             = 0 != ( a8Bit  &  0x04   );
6754*b1cdbd2cSJim Jagielski         fPagResults            = 0 != ( a8Bit  &  0x08   );
6755*b1cdbd2cSJim Jagielski         fLockAtn               = 0 != ( a8Bit  &  0x10   );
6756*b1cdbd2cSJim Jagielski         fMirrorMargins         = 0 != ( a8Bit  &  0x20   );
6757*b1cdbd2cSJim Jagielski         fReadOnlyRecommended   = 0 != ( a8Bit  &  0x40   );
6758*b1cdbd2cSJim Jagielski         fDfltTrueType          = 0 != ( a8Bit  &  0x80   );
6759*b1cdbd2cSJim Jagielski 
6760*b1cdbd2cSJim Jagielski         a8Bit = Get_Byte( pData );           // 7 0x07
6761*b1cdbd2cSJim Jagielski         fPagSuppressTopSpacing = 0 != ( a8Bit  &  0x01   );
6762*b1cdbd2cSJim Jagielski         fProtEnabled           = 0 != ( a8Bit  &  0x02   );
6763*b1cdbd2cSJim Jagielski         fDispFormFldSel        = 0 != ( a8Bit  &  0x04   );
6764*b1cdbd2cSJim Jagielski         fRMView                = 0 != ( a8Bit  &  0x08   );
6765*b1cdbd2cSJim Jagielski         fRMPrint               = 0 != ( a8Bit  &  0x10   );
6766*b1cdbd2cSJim Jagielski         fWriteReservation      = 0 != ( a8Bit  &  0x20   );
6767*b1cdbd2cSJim Jagielski         fLockRev               = 0 != ( a8Bit  &  0x40   );
6768*b1cdbd2cSJim Jagielski         fEmbedFonts            = 0 != ( a8Bit  &  0x80   );
6769*b1cdbd2cSJim Jagielski 
6770*b1cdbd2cSJim Jagielski 
6771*b1cdbd2cSJim Jagielski         a8Bit = Get_Byte( pData );           // 8 0x08
6772*b1cdbd2cSJim Jagielski         copts_fNoTabForInd           = 0 != ( a8Bit  &  0x01   );
6773*b1cdbd2cSJim Jagielski         copts_fNoSpaceRaiseLower     = 0 != ( a8Bit  &  0x02   );
6774*b1cdbd2cSJim Jagielski         copts_fSupressSpbfAfterPgBrk = 0 != ( a8Bit  &  0x04   );
6775*b1cdbd2cSJim Jagielski         copts_fWrapTrailSpaces       = 0 != ( a8Bit  &  0x08   );
6776*b1cdbd2cSJim Jagielski         copts_fMapPrintTextColor     = 0 != ( a8Bit  &  0x10   );
6777*b1cdbd2cSJim Jagielski         copts_fNoColumnBalance       = 0 != ( a8Bit  &  0x20   );
6778*b1cdbd2cSJim Jagielski         copts_fConvMailMergeEsc      = 0 != ( a8Bit  &  0x40   );
6779*b1cdbd2cSJim Jagielski         copts_fSupressTopSpacing     = 0 != ( a8Bit  &  0x80   );
6780*b1cdbd2cSJim Jagielski 
6781*b1cdbd2cSJim Jagielski         a8Bit = Get_Byte( pData );           // 9 0x09
6782*b1cdbd2cSJim Jagielski         copts_fOrigWordTableRules    = 0 != ( a8Bit  &  0x01   );
6783*b1cdbd2cSJim Jagielski         copts_fTransparentMetafiles  = 0 != ( a8Bit  &  0x02   );
6784*b1cdbd2cSJim Jagielski         copts_fShowBreaksInFrames    = 0 != ( a8Bit  &  0x04   );
6785*b1cdbd2cSJim Jagielski         copts_fSwapBordersFacingPgs  = 0 != ( a8Bit  &  0x08   );
6786*b1cdbd2cSJim Jagielski         copts_fExpShRtn              = 0 != ( a8Bit  &  0x20   );  // #i56856#
6787*b1cdbd2cSJim Jagielski 
6788*b1cdbd2cSJim Jagielski         dxaTab = Get_Short( pData );         // 10 0x0a
6789*b1cdbd2cSJim Jagielski         wSpare = Get_UShort( pData );        // 12 0x0c
6790*b1cdbd2cSJim Jagielski         dxaHotZ = Get_UShort( pData );       // 14 0x0e
6791*b1cdbd2cSJim Jagielski         cConsecHypLim = Get_UShort( pData ); // 16 0x10
6792*b1cdbd2cSJim Jagielski         wSpare2 = Get_UShort( pData );       // 18 0x12
6793*b1cdbd2cSJim Jagielski         dttmCreated = Get_Long( pData );     // 20 0x14
6794*b1cdbd2cSJim Jagielski         dttmRevised = Get_Long( pData );     // 24 0x18
6795*b1cdbd2cSJim Jagielski         dttmLastPrint = Get_Long( pData );   // 28 0x1c
6796*b1cdbd2cSJim Jagielski         nRevision = Get_Short( pData );      // 32 0x20
6797*b1cdbd2cSJim Jagielski         tmEdited = Get_Long( pData );        // 34 0x22
6798*b1cdbd2cSJim Jagielski         cWords = Get_Long( pData );          // 38 0x26
6799*b1cdbd2cSJim Jagielski         cCh = Get_Long( pData );             // 42 0x2a
6800*b1cdbd2cSJim Jagielski         cPg = Get_Short( pData );            // 46 0x2e
6801*b1cdbd2cSJim Jagielski         cParas = Get_Long( pData );          // 48 0x30
6802*b1cdbd2cSJim Jagielski 
6803*b1cdbd2cSJim Jagielski         a16Bit = Get_UShort( pData );        // 52 0x34
6804*b1cdbd2cSJim Jagielski         rncEdn =   a16Bit &  0x0003       ;
6805*b1cdbd2cSJim Jagielski         nEdn   = ( a16Bit & ~0x0003 ) >> 2;
6806*b1cdbd2cSJim Jagielski 
6807*b1cdbd2cSJim Jagielski         a16Bit = Get_UShort( pData );        // 54 0x36
6808*b1cdbd2cSJim Jagielski         epc            =   a16Bit &  0x0003       ;
6809*b1cdbd2cSJim Jagielski         nfcFtnRef      = ( a16Bit &  0x003c ) >> 2;
6810*b1cdbd2cSJim Jagielski         nfcEdnRef      = ( a16Bit &  0x03c0 ) >> 6;
6811*b1cdbd2cSJim Jagielski         fPrintFormData = 0 != ( a16Bit &  0x0400 );
6812*b1cdbd2cSJim Jagielski         fSaveFormData  = 0 != ( a16Bit &  0x0800 );
6813*b1cdbd2cSJim Jagielski         fShadeFormData = 0 != ( a16Bit &  0x1000 );
6814*b1cdbd2cSJim Jagielski         fWCFtnEdn      = 0 != ( a16Bit &  0x8000 );
6815*b1cdbd2cSJim Jagielski 
6816*b1cdbd2cSJim Jagielski         cLines = Get_Long( pData );          // 56 0x38
6817*b1cdbd2cSJim Jagielski         cWordsFtnEnd = Get_Long( pData );    // 60 0x3c
6818*b1cdbd2cSJim Jagielski         cChFtnEdn = Get_Long( pData );       // 64 0x40
6819*b1cdbd2cSJim Jagielski         cPgFtnEdn = Get_Short( pData );      // 68 0x44
6820*b1cdbd2cSJim Jagielski         cParasFtnEdn = Get_Long( pData );    // 70 0x46
6821*b1cdbd2cSJim Jagielski         cLinesFtnEdn = Get_Long( pData );    // 74 0x4a
6822*b1cdbd2cSJim Jagielski         lKeyProtDoc = Get_Long( pData );     // 78 0x4e
6823*b1cdbd2cSJim Jagielski 
6824*b1cdbd2cSJim Jagielski         a16Bit = Get_UShort( pData );        // 82 0x52
6825*b1cdbd2cSJim Jagielski         wvkSaved    =   a16Bit & 0x0007        ;
6826*b1cdbd2cSJim Jagielski         wScaleSaved = ( a16Bit & 0x0ff8 ) >> 3 ;
6827*b1cdbd2cSJim Jagielski         zkSaved     = ( a16Bit & 0x3000 ) >> 12;
6828*b1cdbd2cSJim Jagielski         fRotateFontW6 = ( a16Bit & 0x4000 ) >> 14;
6829*b1cdbd2cSJim Jagielski         iGutterPos = ( a16Bit &  0x8000 ) >> 15;
6830*b1cdbd2cSJim Jagielski         /*
6831*b1cdbd2cSJim Jagielski             bei nFib >= 103 gehts weiter:
6832*b1cdbd2cSJim Jagielski         */
6833*b1cdbd2cSJim Jagielski         if (nFib >= 103) // Word 6/32bit, 95, 97, 2000, 2002, 2003, 2007
6834*b1cdbd2cSJim Jagielski         {
6835*b1cdbd2cSJim Jagielski             a32Bit = Get_ULong( pData );     // 84 0x54
6836*b1cdbd2cSJim Jagielski             SetCompatabilityOptions(a32Bit);
6837*b1cdbd2cSJim Jagielski         }
6838*b1cdbd2cSJim Jagielski 
6839*b1cdbd2cSJim Jagielski         //#i22436#, for all WW7- documents
6840*b1cdbd2cSJim Jagielski         if (nFib <= 104) // Word 95
6841*b1cdbd2cSJim Jagielski             fUsePrinterMetrics = 1;
6842*b1cdbd2cSJim Jagielski 
6843*b1cdbd2cSJim Jagielski         /*
6844*b1cdbd2cSJim Jagielski             bei nFib > 105 gehts weiter:
6845*b1cdbd2cSJim Jagielski         */
6846*b1cdbd2cSJim Jagielski         if (nFib > 105) // Word 97, 2000, 2002, 2003, 2007
6847*b1cdbd2cSJim Jagielski         {
6848*b1cdbd2cSJim Jagielski             adt = Get_Short( pData );            // 88 0x58
6849*b1cdbd2cSJim Jagielski 
6850*b1cdbd2cSJim Jagielski             doptypography.ReadFromMem(pData);    // 90 0x5a
6851*b1cdbd2cSJim Jagielski 
6852*b1cdbd2cSJim Jagielski             memcpy( &dogrid, pData, sizeof( WW8_DOGRID )); // 400 0x190
6853*b1cdbd2cSJim Jagielski             pData += sizeof( WW8_DOGRID );
6854*b1cdbd2cSJim Jagielski 
6855*b1cdbd2cSJim Jagielski             a16Bit = Get_UShort( pData );        // 410 0x19a
6856*b1cdbd2cSJim Jagielski             // die untersten 9 Bit sind uninteressant
6857*b1cdbd2cSJim Jagielski             fHtmlDoc                = ( a16Bit &  0x0200 ) >>  9 ;
6858*b1cdbd2cSJim Jagielski             fSnapBorder             = ( a16Bit &  0x0800 ) >> 11 ;
6859*b1cdbd2cSJim Jagielski             fIncludeHeader          = ( a16Bit &  0x1000 ) >> 12 ;
6860*b1cdbd2cSJim Jagielski             fIncludeFooter          = ( a16Bit &  0x2000 ) >> 13 ;
6861*b1cdbd2cSJim Jagielski             fForcePageSizePag       = ( a16Bit &  0x4000 ) >> 14 ;
6862*b1cdbd2cSJim Jagielski             fMinFontSizePag         = ( a16Bit &  0x8000 ) >> 15 ;
6863*b1cdbd2cSJim Jagielski 
6864*b1cdbd2cSJim Jagielski             a16Bit = Get_UShort( pData );        // 412 0x19c
6865*b1cdbd2cSJim Jagielski             fHaveVersions   = 0 != ( a16Bit  &  0x0001 );
6866*b1cdbd2cSJim Jagielski             fAutoVersion    = 0 != ( a16Bit  &  0x0002 );
6867*b1cdbd2cSJim Jagielski 
6868*b1cdbd2cSJim Jagielski             pData += 12;                         // 414 0x19e
6869*b1cdbd2cSJim Jagielski 
6870*b1cdbd2cSJim Jagielski             cChWS = Get_Long( pData );           // 426 0x1aa
6871*b1cdbd2cSJim Jagielski             cChWSFtnEdn = Get_Long( pData );     // 430 0x1ae
6872*b1cdbd2cSJim Jagielski             grfDocEvents = Get_Long( pData );    // 434 0x1b2
6873*b1cdbd2cSJim Jagielski 
6874*b1cdbd2cSJim Jagielski             pData += 4+30+8;  // 438 0x1b6; 442 0x1ba; 472 0x1d8; 476 0x1dc
6875*b1cdbd2cSJim Jagielski 
6876*b1cdbd2cSJim Jagielski             cDBC = Get_Long( pData );            // 480 0x1e0
6877*b1cdbd2cSJim Jagielski             cDBCFtnEdn = Get_Long( pData );      // 484 0x1e4
6878*b1cdbd2cSJim Jagielski 
6879*b1cdbd2cSJim Jagielski             pData += 1 * sizeof( sal_Int32);         // 488 0x1e8
6880*b1cdbd2cSJim Jagielski 
6881*b1cdbd2cSJim Jagielski             nfcFtnRef = Get_Short( pData );      // 492 0x1ec
6882*b1cdbd2cSJim Jagielski             nfcEdnRef = Get_Short( pData );      // 494 0x1ee
6883*b1cdbd2cSJim Jagielski             hpsZoonFontPag = Get_Short( pData ); // 496 0x1f0
6884*b1cdbd2cSJim Jagielski             dywDispPag = Get_Short( pData );     // 498 0x1f2
6885*b1cdbd2cSJim Jagielski 
6886*b1cdbd2cSJim Jagielski             if (nRead >= 516)
6887*b1cdbd2cSJim Jagielski             {
6888*b1cdbd2cSJim Jagielski                 //500 -> 508, Appear to be repeated here in 2000+
6889*b1cdbd2cSJim Jagielski                 pData += 8;                      // 500 0x1f4
6890*b1cdbd2cSJim Jagielski                 a32Bit = Get_Long( pData );      // 508 0x1fc
6891*b1cdbd2cSJim Jagielski                 SetCompatabilityOptions(a32Bit);
6892*b1cdbd2cSJim Jagielski                 a32Bit = Get_Long( pData );      // 512 0x200
6893*b1cdbd2cSJim Jagielski 
6894*b1cdbd2cSJim Jagielski 				// i#78591#
6895*b1cdbd2cSJim Jagielski                 // fDontUseHTMLAutoSpacing = (a32Bit & 0x4) >> 2;
6896*b1cdbd2cSJim Jagielski 				SetCompatabilityOptions2(a32Bit);
6897*b1cdbd2cSJim Jagielski             }
6898*b1cdbd2cSJim Jagielski             if (nRead >= 550)
6899*b1cdbd2cSJim Jagielski             {
6900*b1cdbd2cSJim Jagielski                 pData += 32;
6901*b1cdbd2cSJim Jagielski                 a16Bit = Get_UShort( pData );
6902*b1cdbd2cSJim Jagielski                 fDoNotEmbedSystemFont = ( a16Bit &  0x0001 );
6903*b1cdbd2cSJim Jagielski                 fWordCompat = ( a16Bit &  0x0002 ) >> 1;
6904*b1cdbd2cSJim Jagielski                 fLiveRecover = ( a16Bit &  0x0004 ) >> 2;
6905*b1cdbd2cSJim Jagielski                 fEmbedFactoids = ( a16Bit &  0x0008 ) >> 3;
6906*b1cdbd2cSJim Jagielski                 fFactoidXML = ( a16Bit &  0x00010 ) >> 4;
6907*b1cdbd2cSJim Jagielski                 fFactoidAllDone = ( a16Bit &  0x0020 ) >> 5;
6908*b1cdbd2cSJim Jagielski                 fFolioPrint = ( a16Bit &  0x0040 ) >> 6;
6909*b1cdbd2cSJim Jagielski                 fReverseFolio = ( a16Bit &  0x0080 ) >> 7;
6910*b1cdbd2cSJim Jagielski                 iTextLineEnding = ( a16Bit &  0x0700 ) >> 8;
6911*b1cdbd2cSJim Jagielski                 fHideFcc = ( a16Bit &  0x0800 ) >> 11;
6912*b1cdbd2cSJim Jagielski                 fAcetateShowMarkup = ( a16Bit &  0x1000 ) >> 12;
6913*b1cdbd2cSJim Jagielski                 fAcetateShowAtn = ( a16Bit &  0x2000 ) >> 13;
6914*b1cdbd2cSJim Jagielski                 fAcetateShowInsDel = ( a16Bit &  0x4000 ) >> 14;
6915*b1cdbd2cSJim Jagielski                 fAcetateShowProps = ( a16Bit &  0x8000 ) >> 15;
6916*b1cdbd2cSJim Jagielski             }
6917*b1cdbd2cSJim Jagielski             if (nRead >= 600)
6918*b1cdbd2cSJim Jagielski             {
6919*b1cdbd2cSJim Jagielski                 pData += 48;
6920*b1cdbd2cSJim Jagielski                 a16Bit = Get_Short(pData);
6921*b1cdbd2cSJim Jagielski                 fUseBackGroundInAllmodes = (a16Bit & 0x0080) >> 7;
6922*b1cdbd2cSJim Jagielski             }
6923*b1cdbd2cSJim Jagielski         }
6924*b1cdbd2cSJim Jagielski     }
6925*b1cdbd2cSJim Jagielski     delete[] pDataPtr;
6926*b1cdbd2cSJim Jagielski }
6927*b1cdbd2cSJim Jagielski 
WW8Dop()6928*b1cdbd2cSJim Jagielski WW8Dop::WW8Dop() : bUseThaiLineBreakingRules(false)
6929*b1cdbd2cSJim Jagielski {
6930*b1cdbd2cSJim Jagielski     // first set everything to a default of 0
6931*b1cdbd2cSJim Jagielski     memset( &nDataStart, 0, (&nDataEnd - &nDataStart) );
6932*b1cdbd2cSJim Jagielski 
6933*b1cdbd2cSJim Jagielski     fWidowControl = 1;
6934*b1cdbd2cSJim Jagielski     fpc = 1;
6935*b1cdbd2cSJim Jagielski     nFtn = 1;
6936*b1cdbd2cSJim Jagielski     fOutlineDirtySave = 1;
6937*b1cdbd2cSJim Jagielski     fHyphCapitals = 1;
6938*b1cdbd2cSJim Jagielski     fBackup = 1;
6939*b1cdbd2cSJim Jagielski     fPagHidden = 1;
6940*b1cdbd2cSJim Jagielski     fPagResults = 1;
6941*b1cdbd2cSJim Jagielski     fDfltTrueType = 1;
6942*b1cdbd2cSJim Jagielski 
6943*b1cdbd2cSJim Jagielski     /*
6944*b1cdbd2cSJim Jagielski     Writer acts like this all the time at the moment, ideally we need an
6945*b1cdbd2cSJim Jagielski     option for these two as well to import word docs that are not like
6946*b1cdbd2cSJim Jagielski     this by default
6947*b1cdbd2cSJim Jagielski     */
6948*b1cdbd2cSJim Jagielski     fNoLeading = 1;
6949*b1cdbd2cSJim Jagielski     fUsePrinterMetrics = 1;
6950*b1cdbd2cSJim Jagielski 
6951*b1cdbd2cSJim Jagielski     fRMView = 1;
6952*b1cdbd2cSJim Jagielski     fRMPrint = 1;
6953*b1cdbd2cSJim Jagielski     dxaTab = 0x2d0;
6954*b1cdbd2cSJim Jagielski     dxaHotZ = 0x168;
6955*b1cdbd2cSJim Jagielski     nRevision = 1;
6956*b1cdbd2cSJim Jagielski     nEdn = 1;
6957*b1cdbd2cSJim Jagielski 
6958*b1cdbd2cSJim Jagielski     epc = 3;
6959*b1cdbd2cSJim Jagielski     nfcEdnRef = 2;
6960*b1cdbd2cSJim Jagielski     fShadeFormData = 1;
6961*b1cdbd2cSJim Jagielski 
6962*b1cdbd2cSJim Jagielski     wvkSaved = 2;
6963*b1cdbd2cSJim Jagielski     wScaleSaved = 100;
6964*b1cdbd2cSJim Jagielski     zkSaved = 0;
6965*b1cdbd2cSJim Jagielski 
6966*b1cdbd2cSJim Jagielski     lvl = 9;
6967*b1cdbd2cSJim Jagielski     fIncludeHeader = 1;
6968*b1cdbd2cSJim Jagielski     fIncludeFooter = 1;
6969*b1cdbd2cSJim Jagielski 
6970*b1cdbd2cSJim Jagielski     cChWS = /**!!**/ 0;
6971*b1cdbd2cSJim Jagielski     cChWSFtnEdn = /**!!**/ 0;
6972*b1cdbd2cSJim Jagielski 
6973*b1cdbd2cSJim Jagielski     cDBC = /**!!**/ 0;
6974*b1cdbd2cSJim Jagielski     cDBCFtnEdn = /**!!**/ 0;
6975*b1cdbd2cSJim Jagielski 
6976*b1cdbd2cSJim Jagielski     fAcetateShowAtn = true;
6977*b1cdbd2cSJim Jagielski }
6978*b1cdbd2cSJim Jagielski 
SetCompatabilityOptions(sal_uInt32 a32Bit)6979*b1cdbd2cSJim Jagielski void WW8Dop::SetCompatabilityOptions(sal_uInt32 a32Bit)
6980*b1cdbd2cSJim Jagielski {
6981*b1cdbd2cSJim Jagielski     fNoTabForInd                = ( a32Bit &  0x00000001 )       ;
6982*b1cdbd2cSJim Jagielski     fNoSpaceRaiseLower          = ( a32Bit &  0x00000002 ) >>  1 ;
6983*b1cdbd2cSJim Jagielski     fSupressSpbfAfterPageBreak  = ( a32Bit &  0x00000004 ) >>  2 ;
6984*b1cdbd2cSJim Jagielski     fWrapTrailSpaces            = ( a32Bit &  0x00000008 ) >>  3 ;
6985*b1cdbd2cSJim Jagielski     fMapPrintTextColor          = ( a32Bit &  0x00000010 ) >>  4 ;
6986*b1cdbd2cSJim Jagielski     fNoColumnBalance            = ( a32Bit &  0x00000020 ) >>  5 ;
6987*b1cdbd2cSJim Jagielski     fConvMailMergeEsc           = ( a32Bit &  0x00000040 ) >>  6 ;
6988*b1cdbd2cSJim Jagielski     fSupressTopSpacing          = ( a32Bit &  0x00000080 ) >>  7 ;
6989*b1cdbd2cSJim Jagielski     fOrigWordTableRules         = ( a32Bit &  0x00000100 ) >>  8 ;
6990*b1cdbd2cSJim Jagielski     fTransparentMetafiles       = ( a32Bit &  0x00000200 ) >>  9 ;
6991*b1cdbd2cSJim Jagielski     fShowBreaksInFrames         = ( a32Bit &  0x00000400 ) >> 10 ;
6992*b1cdbd2cSJim Jagielski     fSwapBordersFacingPgs       = ( a32Bit &  0x00000800 ) >> 11 ;
6993*b1cdbd2cSJim Jagielski     fCompatabilityOptions_Unknown1_13       = ( a32Bit &  0x00001000 ) >> 12 ;
6994*b1cdbd2cSJim Jagielski     fExpShRtn                   = ( a32Bit &  0x00002000 ) >> 13 ; // #i56856#
6995*b1cdbd2cSJim Jagielski     fCompatabilityOptions_Unknown1_15       = ( a32Bit &  0x00004000 ) >> 14 ;
6996*b1cdbd2cSJim Jagielski     fCompatabilityOptions_Unknown1_16       = ( a32Bit &  0x00008000 ) >> 15 ;
6997*b1cdbd2cSJim Jagielski     fSuppressTopSpacingMac5     = ( a32Bit &  0x00010000 ) >> 16 ;
6998*b1cdbd2cSJim Jagielski     fTruncDxaExpand             = ( a32Bit &  0x00020000 ) >> 17 ;
6999*b1cdbd2cSJim Jagielski     fPrintBodyBeforeHdr         = ( a32Bit &  0x00040000 ) >> 18 ;
7000*b1cdbd2cSJim Jagielski     fNoLeading                  = ( a32Bit &  0x00080000 ) >> 19 ;
7001*b1cdbd2cSJim Jagielski     fCompatabilityOptions_Unknown1_21       = ( a32Bit &  0x00100000 ) >> 20 ;
7002*b1cdbd2cSJim Jagielski     fMWSmallCaps                = ( a32Bit &  0x00200000 ) >> 21 ;
7003*b1cdbd2cSJim Jagielski     fCompatabilityOptions_Unknown1_23       = ( a32Bit &  0x00400000 ) >> 22 ;
7004*b1cdbd2cSJim Jagielski     fCompatabilityOptions_Unknown1_24       = ( a32Bit &  0x00800800 ) >> 23 ;
7005*b1cdbd2cSJim Jagielski     fCompatabilityOptions_Unknown1_25       = ( a32Bit &  0x01000000 ) >> 24 ;
7006*b1cdbd2cSJim Jagielski     fCompatabilityOptions_Unknown1_26       = ( a32Bit &  0x02000000 ) >> 25 ;
7007*b1cdbd2cSJim Jagielski     fCompatabilityOptions_Unknown1_27       = ( a32Bit &  0x04000000 ) >> 26 ;
7008*b1cdbd2cSJim Jagielski     fCompatabilityOptions_Unknown1_28       = ( a32Bit &  0x08000000 ) >> 27 ;
7009*b1cdbd2cSJim Jagielski     fCompatabilityOptions_Unknown1_29       = ( a32Bit &  0x10000000 ) >> 28 ;
7010*b1cdbd2cSJim Jagielski     fCompatabilityOptions_Unknown1_30       = ( a32Bit &  0x20000000 ) >> 29 ;
7011*b1cdbd2cSJim Jagielski     fCompatabilityOptions_Unknown1_31       = ( a32Bit &  0x40000000 ) >> 30 ;
7012*b1cdbd2cSJim Jagielski 
7013*b1cdbd2cSJim Jagielski     fUsePrinterMetrics          = ( a32Bit &  0x80000000 ) >> 31 ;
7014*b1cdbd2cSJim Jagielski }
7015*b1cdbd2cSJim Jagielski 
GetCompatabilityOptions() const7016*b1cdbd2cSJim Jagielski sal_uInt32 WW8Dop::GetCompatabilityOptions() const
7017*b1cdbd2cSJim Jagielski {
7018*b1cdbd2cSJim Jagielski     sal_uInt32 a32Bit = 0;
7019*b1cdbd2cSJim Jagielski     if (fNoTabForInd)                   a32Bit |= 0x00000001;
7020*b1cdbd2cSJim Jagielski     if (fNoSpaceRaiseLower)             a32Bit |= 0x00000002;
7021*b1cdbd2cSJim Jagielski     if (fSupressSpbfAfterPageBreak)     a32Bit |= 0x00000004;
7022*b1cdbd2cSJim Jagielski     if (fWrapTrailSpaces)               a32Bit |= 0x00000008;
7023*b1cdbd2cSJim Jagielski     if (fMapPrintTextColor)             a32Bit |= 0x00000010;
7024*b1cdbd2cSJim Jagielski     if (fNoColumnBalance)               a32Bit |= 0x00000020;
7025*b1cdbd2cSJim Jagielski     if (fConvMailMergeEsc)              a32Bit |= 0x00000040;
7026*b1cdbd2cSJim Jagielski     if (fSupressTopSpacing)             a32Bit |= 0x00000080;
7027*b1cdbd2cSJim Jagielski     if (fOrigWordTableRules)            a32Bit |= 0x00000100;
7028*b1cdbd2cSJim Jagielski     if (fTransparentMetafiles)          a32Bit |= 0x00000200;
7029*b1cdbd2cSJim Jagielski     if (fShowBreaksInFrames)            a32Bit |= 0x00000400;
7030*b1cdbd2cSJim Jagielski     if (fSwapBordersFacingPgs)          a32Bit |= 0x00000800;
7031*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown1_13)          a32Bit |= 0x00001000;
7032*b1cdbd2cSJim Jagielski     if (fExpShRtn)                      a32Bit |= 0x00002000; // #i56856#
7033*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown1_15)          a32Bit |= 0x00004000;
7034*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown1_16)          a32Bit |= 0x00008000;
7035*b1cdbd2cSJim Jagielski     if (fSuppressTopSpacingMac5)        a32Bit |= 0x00010000;
7036*b1cdbd2cSJim Jagielski     if (fTruncDxaExpand)                a32Bit |= 0x00020000;
7037*b1cdbd2cSJim Jagielski     if (fPrintBodyBeforeHdr)            a32Bit |= 0x00040000;
7038*b1cdbd2cSJim Jagielski     if (fNoLeading)                     a32Bit |= 0x00080000;
7039*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown1_21)          a32Bit |= 0x00100000;
7040*b1cdbd2cSJim Jagielski     if (fMWSmallCaps)                   a32Bit |= 0x00200000;
7041*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown1_23)          a32Bit |= 0x00400000;
7042*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown1_24)          a32Bit |= 0x00800000;
7043*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown1_25)          a32Bit |= 0x01000000;
7044*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown1_26)          a32Bit |= 0x02000000;
7045*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown1_27)          a32Bit |= 0x04000000;
7046*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown1_28)          a32Bit |= 0x08000000;
7047*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown1_29)          a32Bit |= 0x10000000;
7048*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown1_30)          a32Bit |= 0x20000000;
7049*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown1_31)          a32Bit |= 0x40000000;
7050*b1cdbd2cSJim Jagielski     if (fUsePrinterMetrics)             a32Bit |= 0x80000000;
7051*b1cdbd2cSJim Jagielski     return a32Bit;
7052*b1cdbd2cSJim Jagielski }
7053*b1cdbd2cSJim Jagielski 
7054*b1cdbd2cSJim Jagielski // i#78591#
SetCompatabilityOptions2(sal_uInt32 a32Bit)7055*b1cdbd2cSJim Jagielski void WW8Dop::SetCompatabilityOptions2(sal_uInt32 a32Bit)
7056*b1cdbd2cSJim Jagielski {
7057*b1cdbd2cSJim Jagielski 	fCompatabilityOptions_Unknown2_1 						= ( a32Bit &  0x00000001 );
7058*b1cdbd2cSJim Jagielski     fCompatabilityOptions_Unknown2_2						= ( a32Bit &  0x00000002 ) >>  1 ;
7059*b1cdbd2cSJim Jagielski     fDontUseHTMLAutoSpacing		= ( a32Bit &  0x00000004 ) >>  2 ;
7060*b1cdbd2cSJim Jagielski 	fCompatabilityOptions_Unknown2_4					= ( a32Bit &  0x00000008 ) >>  3 ;
7061*b1cdbd2cSJim Jagielski    	fCompatabilityOptions_Unknown2_5					= ( a32Bit &  0x00000010 ) >>  4 ;
7062*b1cdbd2cSJim Jagielski    	fCompatabilityOptions_Unknown2_6					= ( a32Bit &  0x00000020 ) >>  5 ;
7063*b1cdbd2cSJim Jagielski    	fCompatabilityOptions_Unknown2_7					= ( a32Bit &  0x00000040 ) >>  6 ;
7064*b1cdbd2cSJim Jagielski    	fCompatabilityOptions_Unknown2_8					= ( a32Bit &  0x00000080 ) >>  7 ;
7065*b1cdbd2cSJim Jagielski    	fCompatabilityOptions_Unknown2_9					= ( a32Bit &  0x00000100 ) >>  8 ;
7066*b1cdbd2cSJim Jagielski    	fCompatabilityOptions_Unknown2_10					= ( a32Bit &  0x00000200 ) >>  9 ;
7067*b1cdbd2cSJim Jagielski    	fCompatabilityOptions_Unknown2_11					= ( a32Bit &  0x00000400 ) >> 10 ;
7068*b1cdbd2cSJim Jagielski    	fCompatabilityOptions_Unknown2_12					= ( a32Bit &  0x00000800 ) >> 11 ;
7069*b1cdbd2cSJim Jagielski 	fCompatabilityOptions_Unknown2_13					= ( a32Bit &  0x00001000 ) >> 12 ;
7070*b1cdbd2cSJim Jagielski 	fCompatabilityOptions_Unknown2_14					= ( a32Bit &  0x00002000 ) >> 13 ;
7071*b1cdbd2cSJim Jagielski 	fCompatabilityOptions_Unknown2_15					= ( a32Bit &  0x00004000 ) >> 14 ;
7072*b1cdbd2cSJim Jagielski 	fCompatabilityOptions_Unknown2_16					= ( a32Bit &  0x00008000 ) >> 15 ;
7073*b1cdbd2cSJim Jagielski    	fCompatabilityOptions_Unknown2_17					= ( a32Bit &  0x00010000 ) >> 16 ;
7074*b1cdbd2cSJim Jagielski    	fCompatabilityOptions_Unknown2_18					= ( a32Bit &  0x00020000 ) >> 17 ;
7075*b1cdbd2cSJim Jagielski    	fCompatabilityOptions_Unknown2_19					= ( a32Bit &  0x00040000 ) >> 18 ;
7076*b1cdbd2cSJim Jagielski    	fCompatabilityOptions_Unknown2_20					= ( a32Bit &  0x00080000 ) >> 19 ;
7077*b1cdbd2cSJim Jagielski 	fCompatabilityOptions_Unknown2_21					= ( a32Bit &  0x00100000 ) >> 20 ;
7078*b1cdbd2cSJim Jagielski    	fCompatabilityOptions_Unknown2_22					= ( a32Bit &  0x00200000 ) >> 21 ;
7079*b1cdbd2cSJim Jagielski 	fCompatabilityOptions_Unknown2_23					= ( a32Bit &  0x00400000 ) >> 22 ;
7080*b1cdbd2cSJim Jagielski 	fCompatabilityOptions_Unknown2_24					= ( a32Bit &  0x00800800 ) >> 23 ;
7081*b1cdbd2cSJim Jagielski 	fCompatabilityOptions_Unknown2_25					= ( a32Bit &  0x01000800 ) >> 24 ;
7082*b1cdbd2cSJim Jagielski 	fCompatabilityOptions_Unknown2_26					= ( a32Bit &  0x02000800 ) >> 25 ;
7083*b1cdbd2cSJim Jagielski 	fCompatabilityOptions_Unknown2_27					= ( a32Bit &  0x04000800 ) >> 26 ;
7084*b1cdbd2cSJim Jagielski 	fCompatabilityOptions_Unknown2_28					= ( a32Bit &  0x08000800 ) >> 27 ;
7085*b1cdbd2cSJim Jagielski 	fCompatabilityOptions_Unknown2_29					= ( a32Bit &  0x10000800 ) >> 28 ;
7086*b1cdbd2cSJim Jagielski 	fCompatabilityOptions_Unknown2_30					= ( a32Bit &  0x20000800 ) >> 29 ;
7087*b1cdbd2cSJim Jagielski 	fCompatabilityOptions_Unknown2_31					= ( a32Bit &  0x40000800 ) >> 30 ;
7088*b1cdbd2cSJim Jagielski    	fCompatabilityOptions_Unknown2_32					= ( a32Bit &  0x80000000 ) >> 31 ;
7089*b1cdbd2cSJim Jagielski }
7090*b1cdbd2cSJim Jagielski 
GetCompatabilityOptions2() const7091*b1cdbd2cSJim Jagielski sal_uInt32 WW8Dop::GetCompatabilityOptions2() const
7092*b1cdbd2cSJim Jagielski {
7093*b1cdbd2cSJim Jagielski     sal_uInt32 a32Bit = 0;
7094*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_1)			a32Bit |= 0x00000001;
7095*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_2)           a32Bit |= 0x00000002;
7096*b1cdbd2cSJim Jagielski     if (fDontUseHTMLAutoSpacing)     a32Bit |= 0x00000004;
7097*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_4)           a32Bit |= 0x00000008;
7098*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_5)           a32Bit |= 0x00000010;
7099*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_6)           a32Bit |= 0x00000020;
7100*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_7)           a32Bit |= 0x00000040;
7101*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_8)           a32Bit |= 0x00000080;
7102*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_9)           a32Bit |= 0x00000100;
7103*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_10)          a32Bit |= 0x00000200;
7104*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_11)          a32Bit |= 0x00000400;
7105*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_12)          a32Bit |= 0x00000800;
7106*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_13)          a32Bit |= 0x00001000;
7107*b1cdbd2cSJim Jagielski 	//#i42909# set thai "line breaking rules" compatibility option
7108*b1cdbd2cSJim Jagielski 	// pflin, wonder whether bUseThaiLineBreakingRules is correct
7109*b1cdbd2cSJim Jagielski 	// when importing word document.
7110*b1cdbd2cSJim Jagielski     if (bUseThaiLineBreakingRules)          a32Bit |= 0x00002000;
7111*b1cdbd2cSJim Jagielski 	else if (fCompatabilityOptions_Unknown2_14) 		a32Bit |= 0x00002000;
7112*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_15)          a32Bit |= 0x00004000;
7113*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_16)          a32Bit |= 0x00008000;
7114*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_17)        	a32Bit |= 0x00010000;
7115*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_18)          a32Bit |= 0x00020000;
7116*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_19)          a32Bit |= 0x00040000;
7117*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_20)          a32Bit |= 0x00080000;
7118*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_21)          a32Bit |= 0x00100000;
7119*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_22)          a32Bit |= 0x00200000;
7120*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_23)          a32Bit |= 0x00400000;
7121*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_24)          a32Bit |= 0x00800000;
7122*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_25)          a32Bit |= 0x01000000;
7123*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_26)          a32Bit |= 0x02000000;
7124*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_27)          a32Bit |= 0x04000000;
7125*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_28)          a32Bit |= 0x08000000;
7126*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_29)          a32Bit |= 0x10000000;
7127*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_30)          a32Bit |= 0x20000000;
7128*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_31)          a32Bit |= 0x40000000;
7129*b1cdbd2cSJim Jagielski     if (fCompatabilityOptions_Unknown2_32)          a32Bit |= 0x80000000;
7130*b1cdbd2cSJim Jagielski     return a32Bit;
7131*b1cdbd2cSJim Jagielski }
7132*b1cdbd2cSJim Jagielski 
Write(SvStream & rStrm,WW8Fib & rFib) const7133*b1cdbd2cSJim Jagielski bool WW8Dop::Write(SvStream& rStrm, WW8Fib& rFib) const
7134*b1cdbd2cSJim Jagielski {
7135*b1cdbd2cSJim Jagielski     const int nMaxDopLen = 610;
7136*b1cdbd2cSJim Jagielski     sal_uInt32 nLen = 8 == rFib.nVersion ? nMaxDopLen : 84;
7137*b1cdbd2cSJim Jagielski     rFib.fcDop =  rStrm.Tell();
7138*b1cdbd2cSJim Jagielski     rFib.lcbDop = nLen;
7139*b1cdbd2cSJim Jagielski 
7140*b1cdbd2cSJim Jagielski     sal_uInt8 aData[ nMaxDopLen ];
7141*b1cdbd2cSJim Jagielski     memset( aData, 0, nMaxDopLen );
7142*b1cdbd2cSJim Jagielski     sal_uInt8* pData = aData;
7143*b1cdbd2cSJim Jagielski 
7144*b1cdbd2cSJim Jagielski     // dann mal die Daten auswerten
7145*b1cdbd2cSJim Jagielski     sal_uInt16 a16Bit;
7146*b1cdbd2cSJim Jagielski     sal_uInt8   a8Bit;
7147*b1cdbd2cSJim Jagielski 
7148*b1cdbd2cSJim Jagielski     a16Bit = 0;                         // 0 0x00
7149*b1cdbd2cSJim Jagielski     if (fFacingPages)
7150*b1cdbd2cSJim Jagielski         a16Bit |= 0x0001;
7151*b1cdbd2cSJim Jagielski     if (fWidowControl)
7152*b1cdbd2cSJim Jagielski         a16Bit |= 0x0002;
7153*b1cdbd2cSJim Jagielski     if (fPMHMainDoc)
7154*b1cdbd2cSJim Jagielski         a16Bit |= 0x0004;
7155*b1cdbd2cSJim Jagielski     a16Bit |= ( 0x0018 & (grfSuppression << 3));
7156*b1cdbd2cSJim Jagielski     a16Bit |= ( 0x0060 & (fpc << 5));
7157*b1cdbd2cSJim Jagielski     a16Bit |= ( 0xff00 & (grpfIhdt << 8));
7158*b1cdbd2cSJim Jagielski     Set_UInt16( pData, a16Bit );
7159*b1cdbd2cSJim Jagielski 
7160*b1cdbd2cSJim Jagielski     a16Bit = 0;                         // 2 0x02
7161*b1cdbd2cSJim Jagielski     a16Bit |= ( 0x0003 & rncFtn );
7162*b1cdbd2cSJim Jagielski     a16Bit |= ( ~0x0003 & (nFtn << 2));
7163*b1cdbd2cSJim Jagielski     Set_UInt16( pData, a16Bit );
7164*b1cdbd2cSJim Jagielski 
7165*b1cdbd2cSJim Jagielski     a8Bit = 0;                          // 4 0x04
7166*b1cdbd2cSJim Jagielski     if( fOutlineDirtySave ) a8Bit |= 0x01;
7167*b1cdbd2cSJim Jagielski     Set_UInt8( pData, a8Bit );
7168*b1cdbd2cSJim Jagielski 
7169*b1cdbd2cSJim Jagielski     a8Bit = 0;                          // 5 0x05
7170*b1cdbd2cSJim Jagielski     if( fOnlyMacPics )  a8Bit |= 0x01;
7171*b1cdbd2cSJim Jagielski     if( fOnlyWinPics )  a8Bit |= 0x02;
7172*b1cdbd2cSJim Jagielski     if( fLabelDoc )     a8Bit |= 0x04;
7173*b1cdbd2cSJim Jagielski     if( fHyphCapitals ) a8Bit |= 0x08;
7174*b1cdbd2cSJim Jagielski     if( fAutoHyphen )   a8Bit |= 0x10;
7175*b1cdbd2cSJim Jagielski     if( fFormNoFields ) a8Bit |= 0x20;
7176*b1cdbd2cSJim Jagielski     if( fLinkStyles )   a8Bit |= 0x40;
7177*b1cdbd2cSJim Jagielski     if( fRevMarking )   a8Bit |= 0x80;
7178*b1cdbd2cSJim Jagielski     Set_UInt8( pData, a8Bit );
7179*b1cdbd2cSJim Jagielski 
7180*b1cdbd2cSJim Jagielski     a8Bit = 0;                          // 6 0x06
7181*b1cdbd2cSJim Jagielski     if( fBackup )               a8Bit |= 0x01;
7182*b1cdbd2cSJim Jagielski     if( fExactCWords )          a8Bit |= 0x02;
7183*b1cdbd2cSJim Jagielski     if( fPagHidden )            a8Bit |= 0x04;
7184*b1cdbd2cSJim Jagielski     if( fPagResults )           a8Bit |= 0x08;
7185*b1cdbd2cSJim Jagielski     if( fLockAtn )              a8Bit |= 0x10;
7186*b1cdbd2cSJim Jagielski     if( fMirrorMargins )        a8Bit |= 0x20;
7187*b1cdbd2cSJim Jagielski     if( fReadOnlyRecommended )  a8Bit |= 0x40;
7188*b1cdbd2cSJim Jagielski     if( fDfltTrueType )         a8Bit |= 0x80;
7189*b1cdbd2cSJim Jagielski     Set_UInt8( pData, a8Bit );
7190*b1cdbd2cSJim Jagielski 
7191*b1cdbd2cSJim Jagielski     a8Bit = 0;                          // 7 0x07
7192*b1cdbd2cSJim Jagielski     if( fPagSuppressTopSpacing )    a8Bit |= 0x01;
7193*b1cdbd2cSJim Jagielski     if( fProtEnabled )              a8Bit |= 0x02;
7194*b1cdbd2cSJim Jagielski     if( fDispFormFldSel )           a8Bit |= 0x04;
7195*b1cdbd2cSJim Jagielski     if( fRMView )                   a8Bit |= 0x08;
7196*b1cdbd2cSJim Jagielski     if( fRMPrint )                  a8Bit |= 0x10;
7197*b1cdbd2cSJim Jagielski     if( fWriteReservation )         a8Bit |= 0x20;
7198*b1cdbd2cSJim Jagielski     if( fLockRev )                  a8Bit |= 0x40;
7199*b1cdbd2cSJim Jagielski     if( fEmbedFonts )               a8Bit |= 0x80;
7200*b1cdbd2cSJim Jagielski     Set_UInt8( pData, a8Bit );
7201*b1cdbd2cSJim Jagielski 
7202*b1cdbd2cSJim Jagielski 
7203*b1cdbd2cSJim Jagielski     a8Bit = 0;                          // 8 0x08
7204*b1cdbd2cSJim Jagielski     if( copts_fNoTabForInd )            a8Bit |= 0x01;
7205*b1cdbd2cSJim Jagielski     if( copts_fNoSpaceRaiseLower )      a8Bit |= 0x02;
7206*b1cdbd2cSJim Jagielski     if( copts_fSupressSpbfAfterPgBrk )  a8Bit |= 0x04;
7207*b1cdbd2cSJim Jagielski     if( copts_fWrapTrailSpaces )        a8Bit |= 0x08;
7208*b1cdbd2cSJim Jagielski     if( copts_fMapPrintTextColor )      a8Bit |= 0x10;
7209*b1cdbd2cSJim Jagielski     if( copts_fNoColumnBalance )        a8Bit |= 0x20;
7210*b1cdbd2cSJim Jagielski     if( copts_fConvMailMergeEsc )       a8Bit |= 0x40;
7211*b1cdbd2cSJim Jagielski     if( copts_fSupressTopSpacing )      a8Bit |= 0x80;
7212*b1cdbd2cSJim Jagielski     Set_UInt8( pData, a8Bit );
7213*b1cdbd2cSJim Jagielski 
7214*b1cdbd2cSJim Jagielski     a8Bit = 0;                          // 9 0x09
7215*b1cdbd2cSJim Jagielski     if( copts_fOrigWordTableRules )     a8Bit |= 0x01;
7216*b1cdbd2cSJim Jagielski     if( copts_fTransparentMetafiles )   a8Bit |= 0x02;
7217*b1cdbd2cSJim Jagielski     if( copts_fShowBreaksInFrames )     a8Bit |= 0x04;
7218*b1cdbd2cSJim Jagielski     if( copts_fSwapBordersFacingPgs )   a8Bit |= 0x08;
7219*b1cdbd2cSJim Jagielski     if( copts_fExpShRtn )               a8Bit |= 0x20;  // #i56856#
7220*b1cdbd2cSJim Jagielski     Set_UInt8( pData, a8Bit );
7221*b1cdbd2cSJim Jagielski 
7222*b1cdbd2cSJim Jagielski     Set_UInt16( pData, dxaTab );        // 10 0x0a
7223*b1cdbd2cSJim Jagielski     Set_UInt16( pData, wSpare );        // 12 0x0c
7224*b1cdbd2cSJim Jagielski     Set_UInt16( pData, dxaHotZ );       // 14 0x0e
7225*b1cdbd2cSJim Jagielski     Set_UInt16( pData, cConsecHypLim ); // 16 0x10
7226*b1cdbd2cSJim Jagielski     Set_UInt16( pData, wSpare2 );       // 18 0x12
7227*b1cdbd2cSJim Jagielski     Set_UInt32( pData, dttmCreated );   // 20 0x14
7228*b1cdbd2cSJim Jagielski     Set_UInt32( pData, dttmRevised );   // 24 0x18
7229*b1cdbd2cSJim Jagielski     Set_UInt32( pData, dttmLastPrint ); // 28 0x1c
7230*b1cdbd2cSJim Jagielski     Set_UInt16( pData, nRevision );     // 32 0x20
7231*b1cdbd2cSJim Jagielski     Set_UInt32( pData, tmEdited );      // 34 0x22
7232*b1cdbd2cSJim Jagielski     Set_UInt32( pData, cWords );        // 38 0x26
7233*b1cdbd2cSJim Jagielski     Set_UInt32( pData, cCh );           // 42 0x2a
7234*b1cdbd2cSJim Jagielski     Set_UInt16( pData, cPg );           // 46 0x2e
7235*b1cdbd2cSJim Jagielski     Set_UInt32( pData, cParas );        // 48 0x30
7236*b1cdbd2cSJim Jagielski 
7237*b1cdbd2cSJim Jagielski     a16Bit = 0;                         // 52 0x34
7238*b1cdbd2cSJim Jagielski     a16Bit |= ( 0x0003 & rncEdn );
7239*b1cdbd2cSJim Jagielski     a16Bit |= (~0x0003 & ( nEdn << 2));
7240*b1cdbd2cSJim Jagielski     Set_UInt16( pData, a16Bit );
7241*b1cdbd2cSJim Jagielski 
7242*b1cdbd2cSJim Jagielski     a16Bit = 0;                         // 54 0x36
7243*b1cdbd2cSJim Jagielski     a16Bit |= (0x0003 & epc );
7244*b1cdbd2cSJim Jagielski     a16Bit |= (0x003c & (nfcFtnRef << 2));
7245*b1cdbd2cSJim Jagielski     a16Bit |= (0x03c0 & (nfcEdnRef << 6));
7246*b1cdbd2cSJim Jagielski     if( fPrintFormData )    a16Bit |= 0x0400;
7247*b1cdbd2cSJim Jagielski     if( fSaveFormData )     a16Bit |= 0x0800;
7248*b1cdbd2cSJim Jagielski     if( fShadeFormData )    a16Bit |= 0x1000;
7249*b1cdbd2cSJim Jagielski     if( fWCFtnEdn )         a16Bit |= 0x8000;
7250*b1cdbd2cSJim Jagielski     Set_UInt16( pData, a16Bit );
7251*b1cdbd2cSJim Jagielski 
7252*b1cdbd2cSJim Jagielski     Set_UInt32( pData, cLines );        // 56 0x38
7253*b1cdbd2cSJim Jagielski     Set_UInt32( pData, cWordsFtnEnd );  // 60 0x3c
7254*b1cdbd2cSJim Jagielski     Set_UInt32( pData, cChFtnEdn );     // 64 0x40
7255*b1cdbd2cSJim Jagielski     Set_UInt16( pData, cPgFtnEdn );     // 68 0x44
7256*b1cdbd2cSJim Jagielski     Set_UInt32( pData, cParasFtnEdn );  // 70 0x46
7257*b1cdbd2cSJim Jagielski     Set_UInt32( pData, cLinesFtnEdn );  // 74 0x4a
7258*b1cdbd2cSJim Jagielski     Set_UInt32( pData, lKeyProtDoc );   // 78 0x4e
7259*b1cdbd2cSJim Jagielski 
7260*b1cdbd2cSJim Jagielski     a16Bit = 0;                         // 82 0x52
7261*b1cdbd2cSJim Jagielski     if (wvkSaved)
7262*b1cdbd2cSJim Jagielski         a16Bit |= 0x0007;
7263*b1cdbd2cSJim Jagielski     a16Bit |= (0x0ff8 & (wScaleSaved << 3));
7264*b1cdbd2cSJim Jagielski     a16Bit |= (0x3000 & (zkSaved << 12));
7265*b1cdbd2cSJim Jagielski     Set_UInt16( pData, a16Bit );
7266*b1cdbd2cSJim Jagielski 
7267*b1cdbd2cSJim Jagielski     if( 8 == rFib.nVersion )
7268*b1cdbd2cSJim Jagielski     {
7269*b1cdbd2cSJim Jagielski         Set_UInt32(pData, GetCompatabilityOptions());  // 84 0x54
7270*b1cdbd2cSJim Jagielski 
7271*b1cdbd2cSJim Jagielski         Set_UInt16( pData, adt );                      // 88 0x58
7272*b1cdbd2cSJim Jagielski 
7273*b1cdbd2cSJim Jagielski         doptypography.WriteToMem(pData);               // 400 0x190
7274*b1cdbd2cSJim Jagielski 
7275*b1cdbd2cSJim Jagielski         memcpy( pData, &dogrid, sizeof( WW8_DOGRID ));
7276*b1cdbd2cSJim Jagielski         pData += sizeof( WW8_DOGRID );
7277*b1cdbd2cSJim Jagielski 
7278*b1cdbd2cSJim Jagielski         a16Bit = 0x12;      // lvl auf 9 setzen        // 410 0x19a
7279*b1cdbd2cSJim Jagielski         if( fHtmlDoc )          a16Bit |= 0x0200;
7280*b1cdbd2cSJim Jagielski         if( fSnapBorder )       a16Bit |= 0x0800;
7281*b1cdbd2cSJim Jagielski         if( fIncludeHeader )    a16Bit |= 0x1000;
7282*b1cdbd2cSJim Jagielski         if( fIncludeFooter )    a16Bit |= 0x2000;
7283*b1cdbd2cSJim Jagielski         if( fForcePageSizePag ) a16Bit |= 0x4000;
7284*b1cdbd2cSJim Jagielski         if( fMinFontSizePag )   a16Bit |= 0x8000;
7285*b1cdbd2cSJim Jagielski         Set_UInt16( pData, a16Bit );
7286*b1cdbd2cSJim Jagielski 
7287*b1cdbd2cSJim Jagielski         a16Bit = 0;                                    // 412 0x19c
7288*b1cdbd2cSJim Jagielski         if( fHaveVersions ) a16Bit |= 0x0001;
7289*b1cdbd2cSJim Jagielski         if( fAutoVersion )  a16Bit |= 0x0002;
7290*b1cdbd2cSJim Jagielski         Set_UInt16( pData, a16Bit );
7291*b1cdbd2cSJim Jagielski 
7292*b1cdbd2cSJim Jagielski         pData += 12;                                   // 414 0x19e
7293*b1cdbd2cSJim Jagielski 
7294*b1cdbd2cSJim Jagielski         Set_UInt32( pData, cChWS );                    // 426 0x1aa
7295*b1cdbd2cSJim Jagielski         Set_UInt32( pData, cChWSFtnEdn );              // 430 0x1ae
7296*b1cdbd2cSJim Jagielski         Set_UInt32( pData, grfDocEvents );             // 434 0x1b2
7297*b1cdbd2cSJim Jagielski 
7298*b1cdbd2cSJim Jagielski         pData += 4+30+8;  // 438 0x1b6; 442 0x1ba; 472 0x1d8; 476 0x1dc
7299*b1cdbd2cSJim Jagielski 
7300*b1cdbd2cSJim Jagielski         Set_UInt32( pData, cDBC );                     // 480 0x1e0
7301*b1cdbd2cSJim Jagielski         Set_UInt32( pData, cDBCFtnEdn );               // 484 0x1e4
7302*b1cdbd2cSJim Jagielski 
7303*b1cdbd2cSJim Jagielski         pData += 1 * sizeof( sal_Int32);                   // 488 0x1e8
7304*b1cdbd2cSJim Jagielski 
7305*b1cdbd2cSJim Jagielski         Set_UInt16( pData, nfcFtnRef );                // 492 0x1ec
7306*b1cdbd2cSJim Jagielski         Set_UInt16( pData, nfcEdnRef );                // 494 0x1ee
7307*b1cdbd2cSJim Jagielski         Set_UInt16( pData, hpsZoonFontPag );           // 496 0x1f0
7308*b1cdbd2cSJim Jagielski         Set_UInt16( pData, dywDispPag );               // 498 0x1f2
7309*b1cdbd2cSJim Jagielski 
7310*b1cdbd2cSJim Jagielski         //500 -> 508, Appear to be repeated here in 2000+
7311*b1cdbd2cSJim Jagielski         pData += 8;
7312*b1cdbd2cSJim Jagielski         Set_UInt32(pData, GetCompatabilityOptions());
7313*b1cdbd2cSJim Jagielski 		Set_UInt32(pData, GetCompatabilityOptions2());
7314*b1cdbd2cSJim Jagielski         pData += 32;
7315*b1cdbd2cSJim Jagielski 
7316*b1cdbd2cSJim Jagielski         a16Bit = 0;
7317*b1cdbd2cSJim Jagielski         if (fAcetateShowMarkup)
7318*b1cdbd2cSJim Jagielski             a16Bit |= 0x1000;
7319*b1cdbd2cSJim Jagielski         //Word XP at least requires fAcetateShowMarkup to honour fAcetateShowAtn
7320*b1cdbd2cSJim Jagielski         if (fAcetateShowAtn)
7321*b1cdbd2cSJim Jagielski         {
7322*b1cdbd2cSJim Jagielski             a16Bit |= 0x1000;
7323*b1cdbd2cSJim Jagielski             a16Bit |= 0x2000;
7324*b1cdbd2cSJim Jagielski         }
7325*b1cdbd2cSJim Jagielski         Set_UInt16(pData, a16Bit);
7326*b1cdbd2cSJim Jagielski 
7327*b1cdbd2cSJim Jagielski         pData += 48;
7328*b1cdbd2cSJim Jagielski         a16Bit = 0x0080;
7329*b1cdbd2cSJim Jagielski         Set_UInt16(pData, a16Bit);
7330*b1cdbd2cSJim Jagielski     }
7331*b1cdbd2cSJim Jagielski     rStrm.Write( aData, nLen );
7332*b1cdbd2cSJim Jagielski     return 0 == rStrm.GetError();
7333*b1cdbd2cSJim Jagielski }
7334*b1cdbd2cSJim Jagielski 
ReadFromMem(sal_uInt8 * & pData)7335*b1cdbd2cSJim Jagielski void WW8DopTypography::ReadFromMem(sal_uInt8 *&pData)
7336*b1cdbd2cSJim Jagielski {
7337*b1cdbd2cSJim Jagielski     sal_uInt16 a16Bit = Get_UShort(pData);
7338*b1cdbd2cSJim Jagielski     fKerningPunct = (a16Bit & 0x0001);
7339*b1cdbd2cSJim Jagielski     iJustification = (a16Bit & 0x0006) >>  1;
7340*b1cdbd2cSJim Jagielski     iLevelOfKinsoku = (a16Bit & 0x0018) >>  3;
7341*b1cdbd2cSJim Jagielski     f2on1 = (a16Bit & 0x0020) >>  5;
7342*b1cdbd2cSJim Jagielski     reserved1 = (a16Bit & 0x03C0) >>  6;
7343*b1cdbd2cSJim Jagielski     reserved2 = (a16Bit & 0xFC00) >>  10;
7344*b1cdbd2cSJim Jagielski 
7345*b1cdbd2cSJim Jagielski     cchFollowingPunct = Get_Short(pData);
7346*b1cdbd2cSJim Jagielski     cchLeadingPunct = Get_Short(pData);
7347*b1cdbd2cSJim Jagielski 
7348*b1cdbd2cSJim Jagielski     sal_Int16 i;
7349*b1cdbd2cSJim Jagielski     for (i=0; i < nMaxFollowing; ++i)
7350*b1cdbd2cSJim Jagielski         rgxchFPunct[i] = Get_Short(pData);
7351*b1cdbd2cSJim Jagielski     for (i=0; i < nMaxLeading; ++i)
7352*b1cdbd2cSJim Jagielski         rgxchLPunct[i] = Get_Short(pData);
7353*b1cdbd2cSJim Jagielski 
7354*b1cdbd2cSJim Jagielski     if (cchFollowingPunct >= 0 && cchFollowingPunct < nMaxFollowing)
7355*b1cdbd2cSJim Jagielski         rgxchFPunct[cchFollowingPunct]=0;
7356*b1cdbd2cSJim Jagielski     else
7357*b1cdbd2cSJim Jagielski         rgxchFPunct[nMaxFollowing - 1]=0;
7358*b1cdbd2cSJim Jagielski 
7359*b1cdbd2cSJim Jagielski     if (cchLeadingPunct >= 0 && cchLeadingPunct < nMaxLeading)
7360*b1cdbd2cSJim Jagielski         rgxchLPunct[cchLeadingPunct]=0;
7361*b1cdbd2cSJim Jagielski     else
7362*b1cdbd2cSJim Jagielski         rgxchLPunct[nMaxLeading - 1]=0;
7363*b1cdbd2cSJim Jagielski 
7364*b1cdbd2cSJim Jagielski }
7365*b1cdbd2cSJim Jagielski 
WriteToMem(sal_uInt8 * & pData) const7366*b1cdbd2cSJim Jagielski void WW8DopTypography::WriteToMem(sal_uInt8 *&pData) const
7367*b1cdbd2cSJim Jagielski {
7368*b1cdbd2cSJim Jagielski     sal_uInt16 a16Bit = fKerningPunct;
7369*b1cdbd2cSJim Jagielski     a16Bit |= (iJustification << 1) & 0x0006;
7370*b1cdbd2cSJim Jagielski     a16Bit |= (iLevelOfKinsoku << 3) & 0x0018;
7371*b1cdbd2cSJim Jagielski     a16Bit |= (f2on1 << 5) & 0x002;
7372*b1cdbd2cSJim Jagielski     a16Bit |= (reserved1 << 6) & 0x03C0;
7373*b1cdbd2cSJim Jagielski     a16Bit |= (reserved2 << 10) & 0xFC00;
7374*b1cdbd2cSJim Jagielski     Set_UInt16(pData,a16Bit);
7375*b1cdbd2cSJim Jagielski 
7376*b1cdbd2cSJim Jagielski     Set_UInt16(pData,cchFollowingPunct);
7377*b1cdbd2cSJim Jagielski     Set_UInt16(pData,cchLeadingPunct);
7378*b1cdbd2cSJim Jagielski 
7379*b1cdbd2cSJim Jagielski     sal_Int16 i;
7380*b1cdbd2cSJim Jagielski     for (i=0; i < nMaxFollowing; ++i)
7381*b1cdbd2cSJim Jagielski         Set_UInt16(pData,rgxchFPunct[i]);
7382*b1cdbd2cSJim Jagielski     for (i=0; i < nMaxLeading; ++i)
7383*b1cdbd2cSJim Jagielski         Set_UInt16(pData,rgxchLPunct[i]);
7384*b1cdbd2cSJim Jagielski }
7385*b1cdbd2cSJim Jagielski 
GetConvertedLang() const7386*b1cdbd2cSJim Jagielski sal_uInt16 WW8DopTypography::GetConvertedLang() const
7387*b1cdbd2cSJim Jagielski {
7388*b1cdbd2cSJim Jagielski     sal_uInt16 nLang;
7389*b1cdbd2cSJim Jagielski     //I have assumed peoples republic/taiwan == simplified/traditional
7390*b1cdbd2cSJim Jagielski 
7391*b1cdbd2cSJim Jagielski     //This isn't a documented issue, so we might have it all wrong,
7392*b1cdbd2cSJim Jagielski     //i.e. i.e. whats with the powers of two ?
7393*b1cdbd2cSJim Jagielski 
7394*b1cdbd2cSJim Jagielski     /*
7395*b1cdbd2cSJim Jagielski     #84082#
7396*b1cdbd2cSJim Jagielski     One example of 3 for reserved1 which was really Japanese, perhaps last bit
7397*b1cdbd2cSJim Jagielski     is for some other use ?, or redundant. If more examples trigger the assert
7398*b1cdbd2cSJim Jagielski     we might be able to figure it out.
7399*b1cdbd2cSJim Jagielski     */
7400*b1cdbd2cSJim Jagielski     switch(reserved1 & 0xE)
7401*b1cdbd2cSJim Jagielski     {
7402*b1cdbd2cSJim Jagielski         case 2:     //Japan
7403*b1cdbd2cSJim Jagielski             nLang = LANGUAGE_JAPANESE;
7404*b1cdbd2cSJim Jagielski             break;
7405*b1cdbd2cSJim Jagielski         case 4:     //Chinese (Peoples Republic)
7406*b1cdbd2cSJim Jagielski             nLang = LANGUAGE_CHINESE_SIMPLIFIED;
7407*b1cdbd2cSJim Jagielski             break;
7408*b1cdbd2cSJim Jagielski         case 6:     //Korean
7409*b1cdbd2cSJim Jagielski             nLang = LANGUAGE_KOREAN;
7410*b1cdbd2cSJim Jagielski             break;
7411*b1cdbd2cSJim Jagielski         case 8:     //Chinese (Taiwan)
7412*b1cdbd2cSJim Jagielski             nLang = LANGUAGE_CHINESE_TRADITIONAL;
7413*b1cdbd2cSJim Jagielski             break;
7414*b1cdbd2cSJim Jagielski         default:
7415*b1cdbd2cSJim Jagielski             ASSERT(!this, "Unknown MS Asian Typography language, report");
7416*b1cdbd2cSJim Jagielski             nLang = LANGUAGE_CHINESE;
7417*b1cdbd2cSJim Jagielski             break;
7418*b1cdbd2cSJim Jagielski         case 0:
7419*b1cdbd2cSJim Jagielski             //And here we have the possibility that it says 2, but its really
7420*b1cdbd2cSJim Jagielski             //a bug and only japanese level 2 has been selected after a custom
7421*b1cdbd2cSJim Jagielski             //version was chosen on last save!
7422*b1cdbd2cSJim Jagielski             nLang = LANGUAGE_JAPANESE;
7423*b1cdbd2cSJim Jagielski             break;
7424*b1cdbd2cSJim Jagielski     }
7425*b1cdbd2cSJim Jagielski     return nLang;
7426*b1cdbd2cSJim Jagielski }
7427*b1cdbd2cSJim Jagielski 
7428*b1cdbd2cSJim Jagielski //-----------------------------------------
7429*b1cdbd2cSJim Jagielski //              Sprms
7430*b1cdbd2cSJim Jagielski //-----------------------------------------
GetSprmTailLen(sal_uInt16 nId,const sal_uInt8 * pSprm) const7431*b1cdbd2cSJim Jagielski sal_uInt16 wwSprmParser::GetSprmTailLen(sal_uInt16 nId, const sal_uInt8* pSprm)
7432*b1cdbd2cSJim Jagielski     const
7433*b1cdbd2cSJim Jagielski {
7434*b1cdbd2cSJim Jagielski     SprmInfo aSprm = GetSprmInfo(nId);
7435*b1cdbd2cSJim Jagielski     sal_uInt16 nL = 0;                      // number of Bytes to read
7436*b1cdbd2cSJim Jagielski 
7437*b1cdbd2cSJim Jagielski     //sprmPChgTabs
7438*b1cdbd2cSJim Jagielski     switch( nId )
7439*b1cdbd2cSJim Jagielski     {
7440*b1cdbd2cSJim Jagielski         case 23:
7441*b1cdbd2cSJim Jagielski         case 0xC615:
7442*b1cdbd2cSJim Jagielski             if( pSprm[1 + mnDelta] != 255 )
7443*b1cdbd2cSJim Jagielski                 nL = static_cast< sal_uInt16 >(pSprm[1 + mnDelta] + aSprm.nLen);
7444*b1cdbd2cSJim Jagielski             else
7445*b1cdbd2cSJim Jagielski             {
7446*b1cdbd2cSJim Jagielski                 sal_uInt8 nDel = pSprm[2 + mnDelta];
7447*b1cdbd2cSJim Jagielski                 sal_uInt8 nIns = pSprm[3 + mnDelta + 4 * nDel];
7448*b1cdbd2cSJim Jagielski 
7449*b1cdbd2cSJim Jagielski                 nL = 2 + 4 * nDel + 3 * nIns;
7450*b1cdbd2cSJim Jagielski             }
7451*b1cdbd2cSJim Jagielski             break;
7452*b1cdbd2cSJim Jagielski         case 0xD608:
7453*b1cdbd2cSJim Jagielski             nL = SVBT16ToShort( &pSprm[1 + mnDelta] );
7454*b1cdbd2cSJim Jagielski             break;
7455*b1cdbd2cSJim Jagielski         default:
7456*b1cdbd2cSJim Jagielski             switch (aSprm.nVari)
7457*b1cdbd2cSJim Jagielski             {
7458*b1cdbd2cSJim Jagielski                 case L_FIX:
7459*b1cdbd2cSJim Jagielski                     nL = aSprm.nLen;        // Excl. Token
7460*b1cdbd2cSJim Jagielski                     break;
7461*b1cdbd2cSJim Jagielski                 case L_VAR:
7462*b1cdbd2cSJim Jagielski                     // Variable 1-Byte Length?
7463*b1cdbd2cSJim Jagielski                     // Excl. Token + Var-Lengthbyte
7464*b1cdbd2cSJim Jagielski                     nL = static_cast< sal_uInt16 >(pSprm[1 + mnDelta] + aSprm.nLen);
7465*b1cdbd2cSJim Jagielski                     break;
7466*b1cdbd2cSJim Jagielski                 case L_VAR2:
7467*b1cdbd2cSJim Jagielski                     // Variable 2-Byte Length?
7468*b1cdbd2cSJim Jagielski                     // Excl. Token + Var-Lengthbyte
7469*b1cdbd2cSJim Jagielski                     nL = static_cast< sal_uInt16 >(SVBT16ToShort( &pSprm[1 + mnDelta] ) + aSprm.nLen - 1);
7470*b1cdbd2cSJim Jagielski                     break;
7471*b1cdbd2cSJim Jagielski                 default:
7472*b1cdbd2cSJim Jagielski                     ASSERT(!this, "Unknown sprm varient");
7473*b1cdbd2cSJim Jagielski                     break;
7474*b1cdbd2cSJim Jagielski             }
7475*b1cdbd2cSJim Jagielski             break;
7476*b1cdbd2cSJim Jagielski     }
7477*b1cdbd2cSJim Jagielski     return nL;
7478*b1cdbd2cSJim Jagielski }
7479*b1cdbd2cSJim Jagielski 
7480*b1cdbd2cSJim Jagielski // one or two bytes at the beginning at the sprm id
GetSprmId(const sal_uInt8 * pSp) const7481*b1cdbd2cSJim Jagielski sal_uInt16 wwSprmParser::GetSprmId(const sal_uInt8* pSp) const
7482*b1cdbd2cSJim Jagielski {
7483*b1cdbd2cSJim Jagielski     ASSERT_RET_ON_FAIL(pSp, "Why GetSprmId with pSp of 0", 0);
7484*b1cdbd2cSJim Jagielski 
7485*b1cdbd2cSJim Jagielski     sal_uInt16 nId = 0;
7486*b1cdbd2cSJim Jagielski 
7487*b1cdbd2cSJim Jagielski     if (ww::IsSevenMinus(meVersion))
7488*b1cdbd2cSJim Jagielski     {
7489*b1cdbd2cSJim Jagielski         nId = *pSp;
7490*b1cdbd2cSJim Jagielski         if (0x0100 < nId)
7491*b1cdbd2cSJim Jagielski             nId = 0;
7492*b1cdbd2cSJim Jagielski     }
7493*b1cdbd2cSJim Jagielski     else
7494*b1cdbd2cSJim Jagielski     {
7495*b1cdbd2cSJim Jagielski         nId = SVBT16ToShort(pSp);
7496*b1cdbd2cSJim Jagielski         if (0x0800 > nId)
7497*b1cdbd2cSJim Jagielski             nId = 0;
7498*b1cdbd2cSJim Jagielski     }
7499*b1cdbd2cSJim Jagielski 
7500*b1cdbd2cSJim Jagielski     return nId;
7501*b1cdbd2cSJim Jagielski }
7502*b1cdbd2cSJim Jagielski 
7503*b1cdbd2cSJim Jagielski // with tokens and length byte
GetSprmSize(sal_uInt16 nId,const sal_uInt8 * pSprm) const7504*b1cdbd2cSJim Jagielski sal_uInt16 wwSprmParser::GetSprmSize(sal_uInt16 nId, const sal_uInt8* pSprm) const
7505*b1cdbd2cSJim Jagielski {
7506*b1cdbd2cSJim Jagielski     return GetSprmTailLen(nId, pSprm) + 1 + mnDelta + SprmDataOfs(nId);
7507*b1cdbd2cSJim Jagielski }
7508*b1cdbd2cSJim Jagielski 
SprmDataOfs(sal_uInt16 nId) const7509*b1cdbd2cSJim Jagielski sal_uInt8 wwSprmParser::SprmDataOfs(sal_uInt16 nId) const
7510*b1cdbd2cSJim Jagielski {
7511*b1cdbd2cSJim Jagielski     return GetSprmInfo(nId).nVari;
7512*b1cdbd2cSJim Jagielski }
7513*b1cdbd2cSJim Jagielski 
DistanceToData(sal_uInt16 nId) const7514*b1cdbd2cSJim Jagielski sal_uInt16 wwSprmParser::DistanceToData(sal_uInt16 nId) const
7515*b1cdbd2cSJim Jagielski {
7516*b1cdbd2cSJim Jagielski     return 1 + mnDelta + SprmDataOfs(nId);
7517*b1cdbd2cSJim Jagielski }
7518*b1cdbd2cSJim Jagielski 
SEPr()7519*b1cdbd2cSJim Jagielski SEPr::SEPr() :
7520*b1cdbd2cSJim Jagielski     bkc(2), fTitlePage(0), fAutoPgn(0), nfcPgn(0), fUnlocked(0), cnsPgn(0),
7521*b1cdbd2cSJim Jagielski     fPgnRestart(0), fEndNote(1), lnc(0), grpfIhdt(0), nLnnMod(0), dxaLnn(0),
7522*b1cdbd2cSJim Jagielski     dxaPgn(720), dyaPgn(720), fLBetween(0), vjc(0), dmBinFirst(0),
7523*b1cdbd2cSJim Jagielski     dmBinOther(0), dmPaperReq(0), fPropRMark(0), ibstPropRMark(0),
7524*b1cdbd2cSJim Jagielski     dttmPropRMark(0), dxtCharSpace(0), dyaLinePitch(0), clm(0), reserved1(0),
7525*b1cdbd2cSJim Jagielski     dmOrientPage(0), iHeadingPgn(0), pgnStart(1), lnnMin(0), wTextFlow(0),
7526*b1cdbd2cSJim Jagielski     reserved2(0), pgbApplyTo(0), pgbPageDepth(0), pgbOffsetFrom(0),
7527*b1cdbd2cSJim Jagielski     xaPage(lLetterWidth), yaPage(lLetterHeight), xaPageNUp(lLetterWidth), yaPageNUp(lLetterHeight),
7528*b1cdbd2cSJim Jagielski     dxaLeft(1800), dxaRight(1800), dyaTop(1440), dyaBottom(1440), dzaGutter(0),
7529*b1cdbd2cSJim Jagielski     dyaHdrTop(720), dyaHdrBottom(720), ccolM1(0), fEvenlySpaced(1),
7530*b1cdbd2cSJim Jagielski     reserved3(0), fBiDi(0), fFacingCol(0), fRTLGutter(0), fRTLAlignment(0),
7531*b1cdbd2cSJim Jagielski     dxaColumns(720), dxaColumnWidth(0), dmOrientFirst(0), fLayout(0),
7532*b1cdbd2cSJim Jagielski     reserved4(0)
7533*b1cdbd2cSJim Jagielski {
7534*b1cdbd2cSJim Jagielski     memset(rgdxaColumnWidthSpacing, 0, sizeof(rgdxaColumnWidthSpacing));
7535*b1cdbd2cSJim Jagielski }
7536*b1cdbd2cSJim Jagielski 
7537*b1cdbd2cSJim Jagielski /* vi:set tabstop=4 shiftwidth=4 expandtab: */
7538