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