xref: /AOO41X/main/sw/source/filter/ww1/w1class.hxx (revision 1d2dbeb0b7301723c6d13094e87a8714ef81a328)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #include <tools/string.hxx>
24 #include <tools/debug.hxx>
25 
26 // local
27 #ifndef _W1STRUCT_HXX
28 #include <w1struct.hxx>
29 #endif
30 
31 #ifdef DUMP
32 #include <fstream.h>
33 #endif
34 
35 #include <ostream>
36 
37 using std::ostream;
38 
39 class SvxFontItem;
40 class SvxBorderLine;
41 class SvxBoxItem;
42 class SvStream;
43 class SwField;
44 class Ww1Annotation;
45 class Ww1AtnText;
46 class Ww1Chp;
47 class Ww1DocText;
48 class Ww1Dop;
49 class Ww1Fib;
50 class Ww1Fkp;
51 class Ww1FkpChp;
52 class Ww1FkpPap;
53 class Ww1Fonts;
54 class Ww1Manager;
55 class Ww1McrText;
56 class Ww1Pap;
57 class Ww1PlainText;
58 class Ww1Plc;
59 class Ww1PlcAnnotationRef;
60 class Ww1PlcAnnotationTxt;
61 class Ww1PlcChp;
62 class Ww1PlcFields;
63 class Ww1PlcFootnoteRef;
64 class Ww1PlcFootnoteTxt;
65 class Ww1PlcGlossary;
66 class Ww1PlcHdd;
67 class Ww1PlcPap;
68 class Ww1PlcSep;
69 class Ww1Shell;
70 class Ww1Sprm;
71 class Ww1SprmPapx;
72 class Ww1SprmSep;
73 class Ww1Style;
74 class Ww1StyleSheet;
75 
76 ///////////////////////////////////////////////////////////////////////
77 //
78 // nach moeglichkeit wurden in diesem modul methoden aehnlicher
79 // funktionalitaet gleich benannt. Die namen wurden wenn moeglich vom
80 // ww-filter uebernommen.
81 // Where() gibt die position eines elements. dies kann sowohl eine
82 // seek-position im stream als auch ein relativer offset sein, da dies
83 // bei word durcheinander geht.  die methoden sind durch kommentare
84 // gekennzeichnet, ob sie sich auf positionen in der datei oder
85 // innerhalb des textes beziehen. vorsicht: innerhalb des textes kann
86 // verschiedene texte in der datei bedeuten.
87 // Count() gibt die anzahl der elemente zurueck. vorsicht bei
88 // n/n-1-feldern (word speichert strukturen gern in doppel-arrays, in
89 // denen das erste n elemente, das zweite jedoch n-1 elemente
90 // enthaelt.
91 // Fill() fuellt uebergebene referenzen mit daten aus den
92 // word-strukturen.
93 // GetData() gibt zeiger auf den datenbereich zurueck
94 // GetError() gibt zurueck, ob fehler aufgetreten ist
95 // Start(), Stop(), Out(), op<< siehe modul w1filter
96 // Dump() siehe modul w1dump
97 //
98 
99 /////////////////////////////////////////////////////////////////// Fib
100 //
101 // file information block: wurzel des uebels: steht am beginn der
102 // datei (seek(0)) und enthaelt alle positionen der strukturen der
103 // datei
104 //
105 class Ww1Fib
106 {
107     W1_FIB aFib;
108     sal_Bool bOK;
109     SvStream& rStream;
110 public:
111     Ww1Fib(SvStream&);
112     friend ostream& operator <<(ostream&, Ww1Fib&);
GetFIB()113     W1_FIB& GetFIB()        { return aFib; }
GetError()114     sal_Bool GetError()         { return !bOK; }
GetStream()115     SvStream& GetStream()   { return rStream; }
116 };
117 
118 /////////////////////////////////////////////////////////////////// Dop
119 //
120 // document property: eigenschaften des gesamten dokuments
121 //
122 class Ww1Dop
123 {
124     W1_DOP aDop;
125     Ww1Fib& rFib;
126     sal_Bool bOK;
127 public:
128     Ww1Dop(Ww1Fib&);
GetError()129     sal_Bool GetError() {
130         return !bOK; }
GetDOP()131     W1_DOP& GetDOP() {
132         return aDop; }
133     friend ostream& operator <<(ostream&, Ww1Dop&);
134     void Out(Ww1Shell&);
135 };
136 
137 ///////////////////////////////////////////////////////////// PlainText
138 //
139 // ww-dateien koennen mehrere textbloecke enthalten (main-text,
140 // fusznoten etc). PlainText vereinigt die gemeinsamkeiten
141 //
142 class Ww1PlainText
143 {
144 protected:
145     Ww1Fib& rFib;
146     sal_uLong ulFilePos;
147     sal_uLong ulCountBytes;
148     sal_uLong ulSeek;
149     sal_Bool bOK;
150 public:
151     Ww1PlainText(Ww1Fib& rWwFib, sal_uLong nFilePos, sal_uLong nCountBytes);
152     // innerhalb des textes
Where() const153     sal_uLong Where() const                 { return ulSeek; }
Seek(sal_uLong ulNew)154     void Seek( sal_uLong ulNew )
155         {
156             DBG_ASSERT(ulNew < ulCountBytes, "Ww1PlainText");
157             if (ulNew < ulCountBytes)
158                 ulSeek = ulNew;
159         }
160 
Count() const161     sal_uLong Count() const                 { return ulCountBytes; }
SetCount(sal_uLong ulNew)162     void SetCount(sal_uLong ulNew)
163         {
164             ulNew += ulSeek;
165             if (ulCountBytes > ulNew)
166                 ulCountBytes = ulNew;
167         }
operator ++(int)168     void operator++(int)
169     {
170         DBG_ASSERT(ulSeek+1<ulCountBytes, "Ww1PlainText");
171         ulSeek++;
172     }
GetError()173     sal_Bool GetError()                     { return !bOK; }
174     sal_Unicode Out( Ww1Shell&, sal_uLong& );
175     sal_Unicode Out( String&, sal_uLong=0xffffffff);
176     sal_Unicode Out( sal_Unicode& );
177     friend ostream& operator <<(ostream&, Ww1PlainText&);
178     String& Fill( String&, sal_uLong=0, sal_uLong=0xffffffff );
179     sal_Unicode operator []( sal_uLong );
180     String GetText( sal_uLong ulOffset, sal_uLong nLen ) const;
181 
182     enum Consts { MinChar = 32 };
IsChar(sal_Unicode c)183     static sal_Bool IsChar( sal_Unicode c )     { return c >= MinChar; }
184 };
185 
186 /////////////////////////////////////////////////////////////// DocText
187 class Ww1DocText : public Ww1PlainText
188 {
189 public:
Ww1DocText(Ww1Fib & rFibL)190     Ww1DocText(Ww1Fib& rFibL) :
191         Ww1PlainText(rFibL, rFibL.GetFIB().fcMinGet(),
192          rFibL.GetFIB().ccpTextGet()) {
193         }
194 };
195 
196 /////////////////////////////////////////////////////////////// FtnText
197 class Ww1FtnText : public Ww1PlainText
198 {
199 public:
Offset(Ww1Fib & rFibL)200     sal_uLong Offset(Ww1Fib& rFibL) {
201         return rFibL.GetFIB().ccpTextGet(); }
Ww1FtnText(Ww1Fib & rFibL)202     Ww1FtnText(Ww1Fib& rFibL) :
203         Ww1PlainText(rFibL, rFibL.GetFIB().fcMinGet() +
204          Offset(rFibL), rFibL.GetFIB().ccpFtnGet()) {
205         }
206 };
207 
208 /////////////////////////////////////////////////////////////// HddText
209 class Ww1HddText : public Ww1PlainText
210 {
211 public:
Offset(Ww1Fib & rFibL)212     sal_uLong Offset(Ww1Fib& rFibL) {
213         return rFibL.GetFIB().ccpTextGet() + rFibL.GetFIB().ccpFtnGet(); }
Ww1HddText(Ww1Fib & rFibL)214     Ww1HddText(Ww1Fib& rFibL) :
215         Ww1PlainText(rFibL, rFibL.GetFIB().fcMinGet() +
216          Offset(rFibL), rFibL.GetFIB().ccpHddGet()) {
217         }
218 };
219 
220 /////////////////////////////////////////////////////////////// McrText
221 class Ww1McrText : public Ww1PlainText
222 {
223 public:
Offset(Ww1Fib & rFibL)224     sal_uLong Offset(Ww1Fib& rFibL) {
225         return rFibL.GetFIB().ccpTextGet() + rFibL.GetFIB().ccpFtnGet()
226          + rFibL.GetFIB().ccpHddGet(); }
Ww1McrText(Ww1Fib & rFibL)227     Ww1McrText(Ww1Fib& rFibL) :
228         Ww1PlainText(rFibL, rFibL.GetFIB().fcMinGet() +
229          Offset(rFibL), rFibL.GetFIB().ccpMcrGet()) {
230         }
231 };
232 
233 /////////////////////////////////////////////////////////////// AtnText
234 class Ww1AtnText : public Ww1PlainText
235 {
236 public:
Offset(Ww1Fib & rFibL)237     sal_uLong Offset(Ww1Fib& rFibL) {
238         return rFibL.GetFIB().ccpTextGet() + rFibL.GetFIB().ccpFtnGet()
239          + rFibL.GetFIB().ccpHddGet() + rFibL.GetFIB().ccpMcrGet(); }
Ww1AtnText(Ww1Fib & rFibL)240     Ww1AtnText(Ww1Fib& rFibL) :
241         Ww1PlainText(rFibL, rFibL.GetFIB().fcMinGet() +
242          Offset(rFibL), rFibL.GetFIB().ccpAtnGet()) {
243         }
244 };
245 
246 ///////////////////////////////////////////////////////////////// Style
247 //
248 // ein einzelner style oder vorlage
249 //
250 class Ww1Style
251 {
252     String aName;
253     W1_CHP aChpx;
254     Ww1SprmPapx* pPapx;
255     Ww1StyleSheet* pParent;
256     sal_uInt8 stcBase;
257     sal_uInt8 stcNext;
258     sal_Bool bUsed;
259 public:
260     Ww1Style();
261     ~Ww1Style();
IsUsed() const262     sal_Bool IsUsed() const                 { return bUsed; }
263     void SetDefaults(sal_uInt8);
SetParent(Ww1StyleSheet * newParent)264     void SetParent(Ww1StyleSheet* newParent)    { pParent = newParent; }
SetName(const String & rName)265     void SetName(const String& rName)   { bUsed = sal_True; aName = rName; }
GetName() const266     const String& GetName() const       { return aName; }
267 //  Ww1Style& GetNext();
268     Ww1Style& GetBase();
GetnBase() const269     sal_uInt16 GetnBase() const             { return stcBase; }
GetnNext() const270     sal_uInt16 GetnNext() const             { return stcNext; }
271     sal_uInt16 ReadName(sal_uInt8*&, sal_uInt16&, sal_uInt16 stc);
272     sal_uInt16 ReadChpx(sal_uInt8*&, sal_uInt16&);
273     sal_uInt16 ReadPapx(sal_uInt8*&, sal_uInt16&);
274     sal_uInt16 ReadEstcp(sal_uInt8*&, sal_uInt16&);
275     friend ostream& operator <<(ostream&, Ww1Style&);
276     void Out(Ww1Shell&, Ww1Manager&);
277 };
278 
279 //////////////////////////////////////////////////////////// StyleSheet
280 //
281 // die sammlung aller vorlagen (max. 256)
282 //
283 class Ww1StyleSheet
284 {
285     Ww1Style aStyles[256];
286     sal_uInt16 cstcStd; // count style code standard
287     Ww1Fib& rFib;
288     sal_Bool bOK;
289     sal_uInt16 ReadNames(sal_uInt8*&, sal_uInt16&);
290     sal_uInt16 ReadChpx(sal_uInt8*&, sal_uInt16&);
291     sal_uInt16 ReadPapx(sal_uInt8*&, sal_uInt16&);
292     sal_uInt16 ReadEstcp(sal_uInt8*&, sal_uInt16&);
293 
294     void OutDefaults(Ww1Shell& rOut, Ww1Manager& rMan, sal_uInt16 stc);
295     void OutOne(Ww1Shell& rOut, Ww1Manager& rMan, sal_uInt16 stc);
296     void OutOneWithBase(Ww1Shell& rOut, Ww1Manager& rMan, sal_uInt16 stc,
297                         sal_uInt8* pbStopRecur );
298 public:
299     Ww1StyleSheet(Ww1Fib& rFib);
GetStyle(sal_uInt16 stc)300     Ww1Style& GetStyle(sal_uInt16 stc) {
301         return aStyles[stc]; }
Count()302     sal_uInt16 Count() {
303         return 256; }
304     friend ostream& operator <<(ostream&, Ww1StyleSheet&);
305     void Out(Ww1Shell&, Ww1Manager&);
306     friend class Ww1Style;
GetError()307     sal_Bool GetError() {
308         return !bOK; }
309 };
310 
311 ///////////////////////////////////////////////////////////////// Fonts
312 //
313 // ww kennt nur font-nummern beim formatieren. nebenher gibts ein
314 // array von fonts, damit man aus der nummer einen konkreten font
315 // machen kann.
316 //
317 class Ww1Fonts
318 {
319 protected:
320     W1_FFN** pFontA; // Array of Pointers to Font Description
321     Ww1Fib& rFib;
322     sal_uLong nFieldFlags;
323     sal_uInt16 nMax; // Array-Groesse
324     sal_Bool bOK;
325 public:
326     Ww1Fonts(Ww1Fib&, sal_uLong nFieldFlgs);
~Ww1Fonts()327     ~Ww1Fonts() {
328         if (pFontA)
329             DELETEZ(pFontA[0]);
330         DELETEZ(pFontA); }
331     W1_FFN* GetFFN(sal_uInt16 nNum);
Count()332     sal_uInt16 Count() {
333         return nMax; }
334     friend ostream& operator <<(ostream&, Ww1Fonts&);
GetError()335     sal_Bool GetError() {
336         return !bOK; }
337     SvxFontItem GetFont(sal_uInt16);
338 };
339 
340 //////////////////////////////////////////////////////////// SingleSprm
341 //
342 // diese klassen ersetzen die aSprmTab etc des ww6-filters. die
343 // funktionspointer sind hier virtuale methoden, fuer die typen (byte,
344 // word, var-sized etc) gibt es abgeleitete klassen. diese haben
345 // methoden zum bestimmen der groesze, dumpen und shell-ausgeben der
346 // Sprms.
347 // die klassen werden mit new (in InitTab()) erzeugt und nach ihrem
348 // code in die tabelle gestellt. zum aktivieren ruft man nun nur noch
349 // die entsprechende methode des objektes in der tabelle auf.
350 // wohlgemerkt: SingleSprms sind die _beschreibung_ und _funktion_ der
351 // Sprms, nicht deren inhalt. dieser musz uebergeben werden an die
352 // einzelnen methoden wie Size, Dump und Start/Stop.
353 //
354 class Ww1SingleSprm
355 {
356 public:
357 #ifdef DUMP
358 //
359 // allein die virtuellen methoden stehen in der vtab, also je nachdem,
360 // ob fuer dumper oder filter uebersetzt wird ausblenden: das spart
361 // platz. ausserdem stehen die methoden fuer dumper bzw filter in
362 // verschiedenen modulen, die im jeweils anderen projekt nicht
363 // uebersetzt werden. das diese dann beim linken nicht zur verfuegung
364 // stehen faellt dann auch nicht auf. Der Namensstring ist nur im
365 // Dumper noetig: weg damit im Filter.
366 //
367     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
368     void Stop(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
369     virtual ostream& Dump(ostream&, sal_uInt8*, sal_uInt16);
370     const sal_Char* sName;
371 #else
372     virtual void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
373     virtual void Stop(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
374     ostream& Dump(ostream&, sal_uInt8*, sal_uInt16);
375 #endif
376     virtual sal_uInt16 Size(sal_uInt8*);
377     sal_uInt16 nCountBytes;
378 
Ww1SingleSprm(sal_uInt16 nBytes,const sal_Char * =0)379     Ww1SingleSprm(sal_uInt16 nBytes, const sal_Char* /*pName*/ = 0 )
380         : nCountBytes(nBytes)
381 #ifdef DUMP
382         , sName( pName)
383 #endif
384         {
385         }
386 };
387 
388 class Ww1SingleSprmByteSized : public Ww1SingleSprm {
389 public:
390 //  ostream& Dump(ostream&, sal_uInt8*, sal_uInt16);
391     sal_uInt16 Size(sal_uInt8*);
Ww1SingleSprmByteSized(sal_uInt16 nBytes,sal_Char * sName=0)392     Ww1SingleSprmByteSized(sal_uInt16 nBytes, sal_Char* sName = 0) :
393         Ww1SingleSprm(nBytes, sName) {
394         }
395 };
396 
397 class Ww1SingleSprmWordSized : public Ww1SingleSprm {
398 public:
399 //  ostream& Dump(ostream&, sal_uInt8*, sal_uInt16);
400     sal_uInt16 Size(sal_uInt8*);
Ww1SingleSprmWordSized(sal_uInt16 nBytes,sal_Char * sName=0)401     Ww1SingleSprmWordSized(sal_uInt16 nBytes, sal_Char* sName = 0) :
402         Ww1SingleSprm(nBytes, sName) {
403         }
404 };
405 
406 class Ww1SingleSprmByte : public Ww1SingleSprm {
407 public:
408     ostream& Dump(ostream&, sal_uInt8*, sal_uInt16);
409 //  sal_uInt16 Size(sal_uInt8*);
Ww1SingleSprmByte(sal_Char * sName=0)410     Ww1SingleSprmByte(sal_Char* sName = 0) :
411         Ww1SingleSprm(1, sName) {
412         }
413 };
414 
415 class Ww1SingleSprmBool : public Ww1SingleSprmByte {
416 public:
417     ostream& Dump(ostream&, sal_uInt8*, sal_uInt16);
418 //  sal_uInt16 Size(sal_uInt8*);
Ww1SingleSprmBool(sal_Char * sName=0)419     Ww1SingleSprmBool(sal_Char* sName = 0) :
420         Ww1SingleSprmByte(sName) {
421         }
422 };
423 
424 class Ww1SingleSprm4State : public Ww1SingleSprmByte {
425 public:
426     ostream& Dump(ostream&, sal_uInt8*, sal_uInt16);
427 //  sal_uInt16 Size(sal_uInt8*);
Ww1SingleSprm4State(sal_Char * sName=0)428     Ww1SingleSprm4State(sal_Char* sName = 0) :
429         Ww1SingleSprmByte(sName) {
430         }
431 };
432 
433 class Ww1SingleSprmWord : public Ww1SingleSprm {
434 public:
435     ostream& Dump(ostream&, sal_uInt8*, sal_uInt16);
436 //  sal_uInt16 Size(sal_uInt8*);
Ww1SingleSprmWord(sal_Char * sName=0)437     Ww1SingleSprmWord(sal_Char* sName = 0)
438     : Ww1SingleSprm(2, sName) {}
439 };
440 
441 class Ww1SingleSprmLong : public Ww1SingleSprm {
442 public:
443     ostream& Dump(ostream&, sal_uInt8*, sal_uInt16);
444 //  sal_uInt16 Size(sal_uInt8*);
Ww1SingleSprmLong(sal_Char * sName=0)445     Ww1SingleSprmLong(sal_Char* sName = 0) :
446         Ww1SingleSprm(4, sName) {
447         }
448 };
449 
450 class Ww1SingleSprmTab : public Ww1SingleSprm {
451 public:
452     ostream& Dump(ostream&, sal_uInt8*, sal_uInt16);
453     sal_uInt16 Size(sal_uInt8*);
Ww1SingleSprmTab(sal_uInt16 nBytes,sal_Char * sName=0)454     Ww1SingleSprmTab(sal_uInt16 nBytes, sal_Char* sName = 0) :
455         Ww1SingleSprm(nBytes, sName) {
456         }
457 };
458 
459 class Ww1SingleSprmPJc : public Ww1SingleSprmByte {
460 public:
Ww1SingleSprmPJc(sal_Char * sName)461     Ww1SingleSprmPJc(sal_Char* sName) :
462         Ww1SingleSprmByte(sName) {
463         }
464     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
465     void Stop(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
466 };
467 
468 class Ww1SingleSprmPDxa : public Ww1SingleSprmWord {
469 public:
Ww1SingleSprmPDxa(sal_Char * sName)470     Ww1SingleSprmPDxa(sal_Char* sName) :
471         Ww1SingleSprmWord(sName) {
472         }
473     void Stop(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
474 };
475 
476 class Ww1SingleSprmPDxaRight : public Ww1SingleSprmPDxa {
477 public:
Ww1SingleSprmPDxaRight(sal_Char * sName)478     Ww1SingleSprmPDxaRight(sal_Char* sName) :
479         Ww1SingleSprmPDxa(sName) {
480         }
481     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
482 };
483 
484 class Ww1SingleSprmPDxaLeft : public Ww1SingleSprmPDxa {
485 public:
Ww1SingleSprmPDxaLeft(sal_Char * sName)486     Ww1SingleSprmPDxaLeft(sal_Char* sName) :
487         Ww1SingleSprmPDxa(sName) {
488         }
489     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
490 };
491 
492 class Ww1SingleSprmPDxaLeft1 : public Ww1SingleSprmPDxa {
493 public:
Ww1SingleSprmPDxaLeft1(sal_Char * sName)494     Ww1SingleSprmPDxaLeft1(sal_Char* sName) :
495         Ww1SingleSprmPDxa(sName) {
496         }
497     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
498 };
499 
500 class Ww1SingleSprmPFKeep : public Ww1SingleSprmBool {
501 public:
Ww1SingleSprmPFKeep(sal_Char * sName)502     Ww1SingleSprmPFKeep(sal_Char* sName) :
503         Ww1SingleSprmBool(sName) {
504         }
505     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
506     void Stop(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
507 };
508 
509 class Ww1SingleSprmPFKeepFollow : public Ww1SingleSprmBool {
510 public:
Ww1SingleSprmPFKeepFollow(sal_Char * sName)511     Ww1SingleSprmPFKeepFollow(sal_Char* sName) :
512         Ww1SingleSprmBool(sName) {
513         }
514     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
515     void Stop(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
516 };
517 
518 class Ww1SingleSprmPPageBreakBefore : public Ww1SingleSprmBool {
519 public:
Ww1SingleSprmPPageBreakBefore(sal_Char * sName)520     Ww1SingleSprmPPageBreakBefore(sal_Char* sName) :
521         Ww1SingleSprmBool(sName) {
522         }
523     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
524     void Stop(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
525 };
526 
527 class Ww1SingleSprmPBrc : public Ww1SingleSprmWord {
528 protected:
529 //  SvxBorderLine* SetBorder(SvxBorderLine*, W1_BRC*);
530     // spezielle start-routine, je nach sprm verschieden versorgt
531     // mit einem BoxItem.
532     void Start(Ww1Shell&, sal_uInt8, W1_BRC10*, sal_uInt16, Ww1Manager&, SvxBoxItem&);
533     void Start(Ww1Shell&, sal_uInt8, W1_BRC*, sal_uInt16, Ww1Manager&, SvxBoxItem&);
534 
535     using Ww1SingleSprm::Start;
536 
537 public:
Ww1SingleSprmPBrc(sal_Char * sName)538     Ww1SingleSprmPBrc(sal_Char* sName) :
539         Ww1SingleSprmWord(sName) {
540         }
541     void Stop(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
542     // SetBorder() wird auch fuer Tabellen gebraucht, deshalb public
543     static SvxBorderLine* SetBorder(SvxBorderLine*, W1_BRC10*);
544 };
545 
546 #define BRC_TOP ((sal_uInt16)0)
547 #define BRC_LEFT ((sal_uInt16)1)
548 #define BRC_BOTTOM ((sal_uInt16)2)
549 #define BRC_RIGHT ((sal_uInt16)3)
550 #define BRC_ANZ ((sal_uInt16)BRC_RIGHT-BRC_TOP+1)
551 
552 // Die BRC-struktur fuer 1.0 versionen von word sind verschieden von
553 // denen der folgenden versionen. diese werden zum glueck aber auch
554 // von anderen sprms abgerufen.
555 // SH: Ab sofort alle 4 Umrandungen ueber nur 1 Klasse.
556 class Ww1SingleSprmPBrc10 : public Ww1SingleSprmPBrc
557 {
558     sal_uInt16 nLine;   // BRC_TOP, BRC_LEFT, ...
559 
560     using Ww1SingleSprmPBrc::Start;
561 
562 public:
Ww1SingleSprmPBrc10(sal_uInt16 nL,sal_Char * sName)563     Ww1SingleSprmPBrc10(sal_uInt16 nL, sal_Char* sName)
564     : Ww1SingleSprmPBrc(sName), nLine(nL) {}
565 
566     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
567 };
568 
569 class Ww1SingleSprmParaSpace : public Ww1SingleSprmWord {
570 public:
Ww1SingleSprmParaSpace(sal_Char * sName)571     Ww1SingleSprmParaSpace(sal_Char* sName)
572     : Ww1SingleSprmWord(sName) {}
573     void Stop(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
574 };
575 
576 class Ww1SingleSprmPDyaBefore : public Ww1SingleSprmParaSpace {
577 public:
Ww1SingleSprmPDyaBefore(sal_Char * sName)578     Ww1SingleSprmPDyaBefore(sal_Char* sName)
579     : Ww1SingleSprmParaSpace(sName) {}
580     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
581 };
582 
583 class Ww1SingleSprmPDyaAfter : public Ww1SingleSprmParaSpace {
584 public:
Ww1SingleSprmPDyaAfter(sal_Char * sName)585     Ww1SingleSprmPDyaAfter(sal_Char* sName) :
586         Ww1SingleSprmParaSpace(sName) {
587         }
588     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
589 };
590 
591 class Ww1SingleSprmPDyaLine : public Ww1SingleSprmWord {
592 public:
Ww1SingleSprmPDyaLine(sal_Char * sName)593     Ww1SingleSprmPDyaLine(sal_Char* sName) :
594         Ww1SingleSprmWord(sName) {
595         }
596     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
597     void Stop(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
598 };
599 
600 class Ww1SingleSprmPChgTabsPapx : public Ww1SingleSprmByteSized {
601 public:
Ww1SingleSprmPChgTabsPapx(sal_Char * sName)602     Ww1SingleSprmPChgTabsPapx(sal_Char* sName) :
603         Ww1SingleSprmByteSized(0, sName) {
604         }
605   // Size() ist noch nicht aktiviert !!
606     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
607     void Stop(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
608 };
609 
610 class Ww1SingleSprmSGprfIhdt : public Ww1SingleSprmByte {
611 public:
Ww1SingleSprmSGprfIhdt(sal_Char * sName)612     Ww1SingleSprmSGprfIhdt(sal_Char* sName) :
613         Ww1SingleSprmByte(sName) {
614         }
615     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
616 };
617 
618 class Ww1SingleSprmSColumns : public Ww1SingleSprmWord {
619 public:
Ww1SingleSprmSColumns(sal_Char * sName)620     Ww1SingleSprmSColumns(sal_Char* sName) :
621         Ww1SingleSprmWord(sName) {
622         }
623     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
624 };
625 
626 class Ww1SingleSprmPFInTable : public Ww1SingleSprmBool {
627 public:
Ww1SingleSprmPFInTable(sal_Char * sName)628     Ww1SingleSprmPFInTable(sal_Char* sName) :
629         Ww1SingleSprmBool(sName) {
630         }
631     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
632     void Stop(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
633 };
634 
635 class Ww1SingleSprmPTtp : public Ww1SingleSprmBool {
636 public:
Ww1SingleSprmPTtp(sal_Char * sName)637     Ww1SingleSprmPTtp(sal_Char* sName) :
638         Ww1SingleSprmBool(sName) {
639         }
640     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
641     void Stop(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
642 };
643 
644 class Ww1SingleSprmTJc : public Ww1SingleSprmWord {
645 public:
Ww1SingleSprmTJc(sal_Char * sName)646     Ww1SingleSprmTJc(sal_Char* sName)
647     : Ww1SingleSprmWord(sName) {}
648 };
649 
650 //class Ww1SingleSprmTDxaLeft : public Ww1SingleSprmWord {
651 //public:
652 //  Ww1SingleSprmTDxaLeft(sal_Char* sName) :
653 //      Ww1SingleSprmWord(sName) {
654 //      }
655 //  void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
656 //};
657 
658 class Ww1SingleSprmTDxaGapHalf : public Ww1SingleSprmWord {
659 public:
Ww1SingleSprmTDxaGapHalf(sal_Char * sName)660     Ww1SingleSprmTDxaGapHalf(sal_Char* sName) :
661         Ww1SingleSprmWord(sName) {
662         }
663     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
664 };
665 
666 class Ww1SingleSprmTDefTable10 : public Ww1SingleSprmWordSized {
667 public:
Ww1SingleSprmTDefTable10(sal_Char * sName)668     Ww1SingleSprmTDefTable10(sal_Char* sName) :
669         Ww1SingleSprmWordSized(0, sName) {
670         }
671     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
672 };
673 
674 class Ww1SingleSprmTDyaRowHeight : public Ww1SingleSprmWord {
675 public:
Ww1SingleSprmTDyaRowHeight(sal_Char * sName)676     Ww1SingleSprmTDyaRowHeight(sal_Char* sName) :
677         Ww1SingleSprmWord(sName) {
678         }
679     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
680 };
681 
682 // Klassendefinitionen fuer Tabellen-Fastsave-Attribute
683 // Da wir kein Fastsave unterstuetzen, brauchen wir's nicht
684 
685 #if 0
686 
687 class Ww1SingleSprmTInsert : public Ww1SingleSprm {
688 public:
689     Ww1SingleSprmTInsert(sal_Char* sName) :
690         Ww1SingleSprm(4, sName) {
691         }
692     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
693 };
694 
695 class Ww1SingleSprmTDelete : public Ww1SingleSprmWord {
696 public:
697     Ww1SingleSprmTDelete(sal_Char* sName) :
698         Ww1SingleSprmWord(sName) {
699         }
700     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
701 };
702 
703 class Ww1SingleSprmTDxaCol : public Ww1SingleSprm {
704 public:
705     Ww1SingleSprmTDxaCol(sal_Char* sName) :
706         Ww1SingleSprm(4, sName) {
707         }
708     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
709 };
710 
711 class Ww1SingleSprmTMerge : public Ww1SingleSprmWord {
712 public:
713     Ww1SingleSprmTMerge(sal_Char* sName) :
714         Ww1SingleSprmWord(sName) {
715         }
716     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
717 };
718 
719 class Ww1SingleSprmTSplit : public Ww1SingleSprmWord {
720 public:
721     Ww1SingleSprmTSplit(sal_Char* sName) :
722         Ww1SingleSprmWord(sName) {
723         }
724     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
725 };
726 
727 class Ww1SingleSprmTSetBrc10 : public Ww1SingleSprm {
728 public:
729     Ww1SingleSprmTSetBrc10(sal_Char* sName) :
730         Ww1SingleSprm(5, sName) {
731         }
732     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
733 };
734 #endif // 0
735 
736 // Klassendefinitionen fuer Apos ( == Flys )
737 
738 class Ww1SingleSprmPpc : public Ww1SingleSprmByte {
739 public:
Ww1SingleSprmPpc(sal_Char * sName)740     Ww1SingleSprmPpc(sal_Char* sName) :
741         Ww1SingleSprmByte(sName) {
742         }
743     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
744 };
745 
746 class Ww1SingleSprmPDxaAbs : public Ww1SingleSprmWord {
747 public:
Ww1SingleSprmPDxaAbs(sal_Char * sName)748     Ww1SingleSprmPDxaAbs(sal_Char* sName) :
749         Ww1SingleSprmWord(sName) {
750         }
751     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
752 };
753 
754 class Ww1SingleSprmPDyaAbs : public Ww1SingleSprmWord {
755 public:
Ww1SingleSprmPDyaAbs(sal_Char * sName)756     Ww1SingleSprmPDyaAbs(sal_Char* sName) :
757         Ww1SingleSprmWord(sName) {
758         }
759     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
760 };
761 
762 class Ww1SingleSprmPDxaWidth : public Ww1SingleSprmWord {
763 public:
Ww1SingleSprmPDxaWidth(sal_Char * sName)764     Ww1SingleSprmPDxaWidth(sal_Char* sName) :
765         Ww1SingleSprmWord(sName) {
766         }
767     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
768 };
769 
770 class Ww1SingleSprmPFromText : public Ww1SingleSprmWord {
771 public:
Ww1SingleSprmPFromText(sal_Char * sName)772     Ww1SingleSprmPFromText(sal_Char* sName) :
773         Ww1SingleSprmWord(sName) {
774         }
775     void Start(Ww1Shell&, sal_uInt8, sal_uInt8*, sal_uInt16, Ww1Manager&);
776 };
777 
778 ////////////////////////////////////////////////////////////////// Sprm
779 //
780 // der tatsaechlich in der datei auftretende datentyp Sprm
781 //
782 class Ww1Sprm
783 {
784     sal_Bool ReCalc();
785     static Ww1SingleSprm* aTab[256];
786     static Ww1SingleSprm* pSingleSprm;
787 protected:
788     static void InitTab();
GetTab(sal_uInt16 nId)789     Ww1SingleSprm& GetTab(sal_uInt16 nId)
790     {
791         if( !pSingleSprm )
792             InitTab();
793         return aTab[ nId ] ? *aTab[nId] : *pSingleSprm;
794     }
795 
796     sal_uInt8* p;
797     sal_uInt16 nCountBytes;
798     sal_Bool bOK;
799     sal_uInt16* pArr;
800     sal_uInt16 count;
801 // ohne Token, mit laengen-byte/word
802     sal_uInt16 GetSize(sal_uInt8 nId, sal_uInt8* pSprm);
803 // mit Token und LaengenByte
GetSizeBrutto(sal_uInt8 * pSprm)804     sal_uInt16 GetSizeBrutto(sal_uInt8* pSprm) {
805         sal_uInt8 nId = *pSprm++;
806         return GetSize(nId, pSprm) + 1; }
807 // gibt fuer nTh element id, size & zeiger auf daten:
808 //  sal_Bool Fill(sal_uInt16, sal_uInt8&, sal_uInt16&, sal_uInt8*&);
809 public:
810 // SH: brauche ich public
811 // gibt fuer nTh element id, size & zeiger auf daten:
812     sal_Bool Fill(sal_uInt16, sal_uInt8&, sal_uInt16&, sal_uInt8*&);
813 
814     Ww1Sprm(sal_uInt8*, sal_uInt16);
815     Ww1Sprm(SvStream&, sal_uLong);
816     ~Ww1Sprm();
817     friend ostream& operator <<(ostream&, Ww1Sprm&);
818     void Start(Ww1Shell&, Ww1Manager&);
819     void Start(Ww1Shell&, Ww1Manager&, sal_uInt16);
820     void Stop(Ww1Shell&, Ww1Manager&);
IsUsed()821     sal_Bool IsUsed() {
822         return nCountBytes != 255; }
Count()823     sal_uInt16 Count() {
824         return count; }
GetError()825     sal_Bool GetError() {
826         return !bOK; }
827     static void DeinitTab();
828 };
829 
830 /////////////////////////////////////////////////////////////// Picture
831 //
832 // der wrapper um den datentyp PIC, eine struktur, die am beginn eines
833 // bild-dateinamens oder eines eingebetteten bildes steht.
834 //
835 class Ww1Picture
836 {
837     sal_Bool bOK;
838     W1_PIC* pPic;
839 public:
840     Ww1Picture(SvStream&, sal_uLong);
~Ww1Picture()841     ~Ww1Picture() {
842         }
GetError()843     sal_Bool GetError() {
844         return !bOK; }
845     friend ostream& operator <<(ostream&, Ww1Picture&);
846     void Out(Ww1Shell&, Ww1Manager&);
847     void WriteBmp(SvStream&);
848 };
849 
850 /////////////////////////////////////////////////////////////////// Plc
851 //
852 // eine der wichtigen array-strukturen der ww-dateien. sie beinhalten
853 // n+1 dateipositionen und n attribute, die zwischen den
854 // dateipositionen gelten.
855 //
856 class Ww1Plc
857 {
858     sal_uInt8* p;
859     sal_uInt16 nCountBytes;
860     sal_uInt16 iMac;
861     sal_uInt16 nItemSize;
862     sal_Bool bOK;
863 protected:
864     Ww1Fib& rFib;
865     sal_uInt8* GetData(sal_uInt16);
866 public:
867     Ww1Plc(Ww1Fib&, sal_uLong, sal_uInt16, sal_uInt16);
868     ~Ww1Plc();
869     friend ostream& operator <<(ostream&, Ww1Plc&);
870     sal_uLong Where(sal_uInt16); // wie im jeweiligen plc
871     void Seek(sal_uLong, sal_uInt16&);
Fill(sal_uInt16 nIndex,sal_uLong & begin,sal_uLong & end)872     void Fill(sal_uInt16 nIndex, sal_uLong& begin, sal_uLong& end) {
873         begin = Where(nIndex);
874         end = Where(nIndex+1); }
Count()875     sal_uInt16 Count() {
876         return iMac; }
GetError()877     sal_Bool GetError() {
878         return !bOK; }
879 };
880 
881 // Size Tabs from Sven:
882 //    CHP, PAP, SEP, HED, FNR, FNT
883 //Plc 2,   2,   6,   0,   2,   0
884 //Fkp 1,   1,   0,   0,   0,   0
885 
886 /////////////////////////////////////////////////////////// PlcGlossary
887 class Ww1PlcGlossary : public Ww1Plc
888 {
889 public:
Ww1PlcGlossary(Ww1Fib & rFibL)890     Ww1PlcGlossary(Ww1Fib& rFibL) :
891         Ww1Plc(rFibL, rFibL.GetFIB().fcPlcfglsyGet(),
892          rFibL.GetFIB().cbPlcfglsyGet(), 0) {
893         }
894 };
895 
896 ////////////////////////////////////////////////////// PlcAnnotationRef
897 class Ww1PlcAnnotationRef : public Ww1Plc
898 {
899 public:
Ww1PlcAnnotationRef(Ww1Fib & rFibL)900     Ww1PlcAnnotationRef(Ww1Fib& rFibL) :
901         Ww1Plc(rFibL, rFibL.GetFIB().fcPlcfandRefGet(),
902          rFibL.GetFIB().cbPlcfandRefGet(), 0) {
903         }
904 };
905 
906 ////////////////////////////////////////////////////// PlcAnnotationTxt
907 class Ww1PlcAnnotationTxt : public Ww1Plc
908 {
909 public:
Ww1PlcAnnotationTxt(Ww1Fib & rFibL)910     Ww1PlcAnnotationTxt(Ww1Fib& rFibL) :
911         Ww1Plc(rFibL, rFibL.GetFIB().fcPlcfandTxtGet(),
912          rFibL.GetFIB().cbPlcfandTxtGet(), 0) {
913         }
914 };
915 
916 ///////////////////////////////////////////////////////// PlcAnnotation
917 class Ww1Annotation {
918     Ww1PlcAnnotationRef aRef;
919     Ww1PlcAnnotationTxt aTxt;
920 public:
Ww1Annotation(Ww1Fib & rFib)921     Ww1Annotation(Ww1Fib& rFib) :
922         aRef(rFib),
923         aTxt(rFib) {
924         }
925     friend ostream& operator <<(ostream&, Ww1Annotation&);
926 };
927 
928 //////////////////////////////////////////////////////////////// PlcSep
929 class Ww1PlcSep : public Ww1Plc
930 {
931 public:
Ww1PlcSep(Ww1Fib & rFibL)932     Ww1PlcSep(Ww1Fib& rFibL):
933         Ww1Plc(rFibL, rFibL.GetFIB().fcPlcfsedGet(),
934          rFibL.GetFIB().cbPlcfsedGet(), 6) {
935         }
936     friend ostream& operator <<(ostream&, Ww1PlcSep&);
937 };
938 
939 //////////////////////////////////////////////////////////////// PlcChp
940 class Ww1PlcChp : public Ww1Plc
941 {
942 public:
Ww1PlcChp(Ww1Fib & rFibL)943     Ww1PlcChp(Ww1Fib& rFibL) :
944         Ww1Plc(rFibL, rFibL.GetFIB().fcPlcfbteChpxGet(),
945          rFibL.GetFIB().cbPlcfbteChpxGet(), 2) {
946         }
947     friend ostream& operator <<(ostream&, Ww1PlcChp&);
948 };
949 
950 //////////////////////////////////////////////////////////////// PlcPap
951 class Ww1PlcPap : public Ww1Plc
952 {
953 public:
Ww1PlcPap(Ww1Fib & rFibL)954     Ww1PlcPap(Ww1Fib& rFibL) :
955         Ww1Plc(rFibL, rFibL.GetFIB().fcPlcfbtePapxGet(),
956          rFibL.GetFIB().cbPlcfbtePapxGet(), 2) {
957         }
958     friend ostream& operator <<(ostream&, Ww1PlcPap&);
959 };
960 
961 //////////////////////////////////////////////////////// PlcFootnoteRef
962 class Ww1PlcFootnoteRef : public Ww1Plc
963 {
964 public:
Ww1PlcFootnoteRef(Ww1Fib & rFibL)965     Ww1PlcFootnoteRef(Ww1Fib& rFibL) :
966         Ww1Plc(rFibL, rFibL.GetFIB().fcPlcffndRefGet(),
967          rFibL.GetFIB().cbPlcffndRefGet(), 2) {
968         }
969     friend ostream& operator <<(ostream&, Ww1PlcFootnoteRef&);
970 };
971 
972 //////////////////////////////////////////////////////// PlcFootnoteTxt
973 class Ww1PlcFootnoteTxt : public Ww1Plc
974 {
975 public:
Ww1PlcFootnoteTxt(Ww1Fib & rFibL)976     Ww1PlcFootnoteTxt(Ww1Fib& rFibL) :
977         Ww1Plc(rFibL, rFibL.GetFIB().fcPlcffndTxtGet(),
978          rFibL.GetFIB().cbPlcffndTxtGet(), 0) {
979         }
980     friend ostream& operator <<(ostream&, Ww1PlcFootnoteTxt&);
981 };
982 
983 ///////////////////////////////////////////////////////////// PlcFields
984 class Ww1PlcFields : public Ww1Plc
985 {
986     //sal_uInt16 Fill(sal_uInt16, sal_uInt8&, String&, String&, String&);
987 public:
Ww1PlcFields(Ww1Fib & rFibL,sal_uLong start,sal_uInt16 nBytes)988     Ww1PlcFields(Ww1Fib& rFibL, sal_uLong start, sal_uInt16 nBytes)
989         : Ww1Plc(rFibL, start, nBytes, 2)
990     {}
GetData(sal_uInt16 nIndex)991     W1_FLD* GetData(sal_uInt16 nIndex)
992         { return (W1_FLD*)Ww1Plc::GetData(nIndex); }
Where(sal_uInt16 nIndex)993     sal_uLong Where(sal_uInt16 nIndex)  // absolut im file
994         { return Ww1Plc::Where(nIndex) + rFib.GetFIB().fcMinGet(); }
995     friend ostream& operator <<(ostream&, Ww1PlcFields&);
996 };
997 
998 ///////////////////////////////////////////////////////////// PlcBookmarks
999 class Ww1StringList
1000 {
1001     sal_Char** pIdxA;
1002     sal_uInt16 nMax;
1003 public:
1004     Ww1StringList( SvStream& rSt, sal_uLong nFc, sal_uInt16 nCb );
~Ww1StringList()1005     ~Ww1StringList()
1006         {   if( pIdxA ) { delete pIdxA[0]; delete pIdxA; } }
1007     const String GetStr( sal_uInt16 nNum ) const;
Count() const1008     sal_uInt16 Count() const    { return nMax; }
GetError() const1009     sal_Bool GetError() const   { return (nMax != 0) && !pIdxA; }
1010 };
1011 
1012 class Ww1PlcBookmarkTxt: public Ww1StringList
1013 {
1014 public:
Ww1PlcBookmarkTxt(Ww1Fib & rFib)1015     Ww1PlcBookmarkTxt(Ww1Fib& rFib) :
1016         Ww1StringList( rFib.GetStream(), rFib.GetFIB().fcSttbfbkmkGet(),
1017                        rFib.GetFIB().cbSttbfbkmkGet() )
1018     {}
1019 };
1020 
1021 class Ww1PlcBookmarkPos : public Ww1Plc
1022 {
1023 //  sal_uInt16 Fill(sal_uInt16, sal_uInt8&, String&, String&, String&);
1024 public:
Ww1PlcBookmarkPos(Ww1Fib & _rFib,sal_uLong start,sal_uInt16 nBytes,sal_Bool bEnd)1025     Ww1PlcBookmarkPos(Ww1Fib& _rFib, sal_uLong start, sal_uInt16 nBytes, sal_Bool bEnd)
1026         : Ww1Plc(_rFib, start, nBytes, (bEnd) ? 0 : 2)
1027     {}
1028 
GetData(sal_uInt16 nIndex)1029     sal_uInt8* GetData(sal_uInt16 nIndex)   {   return Ww1Plc::GetData(nIndex); }
1030     // Position als CP
WhereCP(sal_uInt16 nIndex)1031     sal_uLong WhereCP(sal_uInt16 nIndex)    { return Ww1Plc::Where(nIndex); }
1032     // absolut im file
Where(sal_uInt16 nIndex)1033     sal_uLong Where(sal_uInt16 nIndex)
1034     {
1035         return ( nIndex < Count() )
1036                ? Ww1Plc::Where(nIndex) + rFib.GetFIB().fcMinGet()
1037                : 0xffffffff;
1038     }
1039 //  friend ostream& operator <<(ostream&, Ww1PlcBookmarks&);
1040 };
1041 
1042 //////////////////////////////////////////////////////////////// PlcHdd
1043 class Ww1PlcHdd : public Ww1Plc
1044 {
1045 public:
Ww1PlcHdd(Ww1Fib & rFibL)1046     Ww1PlcHdd(Ww1Fib& rFibL)
1047         : Ww1Plc(rFibL, rFibL.GetFIB().fcPlcfhddGet(),
1048                     rFibL.GetFIB().cbPlcfhddGet(), 0)
1049     {}
1050 };
1051 
1052 /////////////////////////////////////////////////////////////////// Fkp
1053 //
1054 // aehnlich den plcs aufgebaute arrays, die sich auf eine groesze von
1055 // 512 byte beschraenken.
1056 //
1057 class Ww1Fkp
1058 {
1059 protected:
1060     sal_uInt8 aFkp[512];
1061     sal_uInt16 nItemSize;
1062     sal_Bool bOK;
1063     sal_uInt8* GetData(sal_uInt16);
1064 public:
1065     Ww1Fkp(SvStream&, sal_uLong, sal_uInt16);
1066     friend ostream& operator <<(ostream&, Ww1Fkp&);
Count() const1067     sal_uInt16 Count() const            { return SVBT8ToByte(aFkp+511); }
1068     sal_uLong Where(sal_uInt16); // wie im entsprechenden fkp
1069 };
1070 
1071 //////////////////////////////////////////////////////////////// FkpPap
1072 class Ww1FkpPap : public Ww1Fkp
1073 {
1074 public:
Ww1FkpPap(SvStream & rStream,sal_uLong ulFilePos)1075     Ww1FkpPap(SvStream& rStream, sal_uLong ulFilePos)
1076         : Ww1Fkp(rStream, ulFilePos, 1)
1077     {}
1078     friend ostream& operator <<(ostream&, Ww1FkpPap&);
1079     sal_Bool Fill(sal_uInt16,  sal_uInt8*&, sal_uInt16&);
1080 };
1081 
1082 //////////////////////////////////////////////////////////////// FkpChp
1083 class Ww1FkpChp : public Ww1Fkp
1084 {
1085 #ifdef DUMP
1086     SvStream& rStream;
GetStream()1087     SvStream& GetStream()   { return rStream; }
1088 #endif
1089 public:
Ww1FkpChp(SvStream & rStream,sal_uLong ulFilePos)1090     Ww1FkpChp(SvStream& rStream, sal_uLong ulFilePos)
1091         : Ww1Fkp(rStream, ulFilePos, 1)
1092 #ifdef DUMP
1093         , rStream(rStream)
1094 #endif
1095     {}
1096 
1097     friend ostream& operator <<(ostream&, Ww1FkpChp&);
1098     sal_Bool Fill(sal_uInt16, W1_CHP&);
1099 };
1100 
1101 ////////////////////////////////////////////////////////////// SprmPapx
1102 class Ww1SprmPapx : public Ww1Sprm
1103 {
1104     W1_PAPX aPapx;
1105     sal_uInt8* Sprm(sal_uInt8* p, sal_uInt16 nSize);
1106     sal_uInt16 SprmSize(sal_uInt8* p, sal_uInt16 nSize);
1107 public:
1108     Ww1SprmPapx(sal_uInt8* p, sal_uInt16 nSize);
1109     friend ostream& operator <<(ostream&, Ww1SprmPapx&);
1110     void Start(Ww1Shell&, Ww1Manager&);
1111     void Stop(Ww1Shell&, Ww1Manager&);
1112 };
1113 
1114 /////////////////////////////////////////////////////////////// SprmSep
1115 class Ww1SprmSep : public Ww1Sprm
1116 {
1117 public:
Ww1SprmSep(Ww1Fib & rFib,sal_uLong ulFilePos)1118     Ww1SprmSep(Ww1Fib& rFib, sal_uLong ulFilePos)
1119         : Ww1Sprm(rFib.GetStream(), ulFilePos)
1120     {}
1121     friend ostream& operator <<(ostream&, Ww1SprmSep&);
1122 };
1123 
1124 ///////////////////////////////////////////////////////////////// Assoc
1125 class Ww1Assoc
1126 {
1127     enum fields { FileNext, Dot, Title, Subject, KeyWords, Comments,
1128         Author, LastRevBy, DataDoc, HeaderDoc, Criteria1, Criteria2,
1129         Criteria3, Criteria4, Criteria5, Criteria6, Criteria7, MaxFields };
1130 
1131     Ww1Fib& rFib;
1132     sal_Char* pBuffer;
1133     sal_Char* pStrTbl[ MaxFields ];
1134     sal_Bool bOK;
1135 
1136     String GetStr(sal_uInt16);
1137 
1138 public:
1139     Ww1Assoc(Ww1Fib&);
~Ww1Assoc()1140     ~Ww1Assoc()             { delete pBuffer; }
GetError() const1141     sal_Bool GetError() const   { return !bOK; }
1142     friend ostream& operator <<(ostream&, Ww1Assoc&);
1143     void Out(Ww1Shell&);
1144 };
1145 
1146 ////////////////////////////////////////////////////////// HeaderFooter
1147 //
1148 // Header/Footer/Footnoteseparators sind einer nach dem naechsten in
1149 // einem eigenen text gespeichert. ein plc trennt diesen text in
1150 // einzelne teile.  diese werden durchnummeriert als ihdd. nun gibt es
1151 // 9 verschiedene funktionen fuer diese texte. wird eine davon
1152 // angefordert, ist es der erste, beim naechstern der 2 ihdd und so
1153 // weiter.  welcher textteil also welcher typ sein wird laeszt sich
1154 // nur bei sequenziellem lesen der datei bestimmen. die 9 typen sind:
1155 // fusznoten-trenner, folge-fusznoten-trenner, folge-fusznoten-notiz,
1156 // gerade-seiten kopfzeilen, ungerade seiten kopfzeilen, dto 2*
1157 // fuszzeilen, kopf & fuszzeilen, wenn erste seite andere zeilen hat.
1158 // HeaderFooter merkt sich fuer jede der 9 die momentane einstellung
1159 // (jedoch nicht die alten) und den naechstvergebbaren ihdd.  ist ein
1160 // teil nicht vorhanden bekommt er den wert 0xffff.
1161 //
1162 class Ww1HeaderFooter : public Ww1PlcHdd
1163 {
1164     sal_uInt16 nextIhdd; // naechster textteil im HddText
1165     sal_uInt16 nFtnSep; // fusznoten trenner
1166     sal_uInt16 nFtnFollowSep; // folge fusznoten trenner
1167     sal_uInt16 nFtnNote; // folgefunsznotennotiz
1168     sal_uInt16 nEvenHeadL; // kopfzeilen grader seiten
1169     sal_uInt16 nOddHeadL; // kopfzeilen ungrader seiten
1170     sal_uInt16 nEvenFootL; // fuszzeilen grader seiten
1171     sal_uInt16 nOddFootL; // fuszzeilen ungerader seiten
1172     sal_uInt16 nFirstHeadL; // kopfzeilen der ersten seite
1173     sal_uInt16 nFirstFootL; // fuszzeilen der ersten seite
1174     enum HeaderFooterMode {
1175         None, FtnSep, FtnFollowSep, FtnNote, EvenHeadL, OddHeadL,
1176         EvenFootL, OddFootL, FirstHeadL, MaxHeaderFooterMode
1177     } eHeaderFooterMode;
1178 
1179 public:
Ww1HeaderFooter(Ww1Fib & rFibL,sal_uInt16 grpfIhdt)1180     Ww1HeaderFooter(Ww1Fib& rFibL, sal_uInt16 grpfIhdt)
1181         : Ww1PlcHdd(rFibL),
1182         nextIhdd(0),
1183         nFtnSep(0xffff),
1184         nFtnFollowSep(0xffff),
1185         nFtnNote(0xffff),
1186         nEvenHeadL(0xffff),
1187         nOddHeadL(0xffff),
1188         nEvenFootL(0xffff),
1189         nOddFootL(0xffff),
1190         nFirstHeadL(0xffff),
1191         nFirstFootL(0xffff),
1192         eHeaderFooterMode(None)
1193     {
1194         if (grpfIhdt & 0x0001) nFtnSep = nextIhdd++;
1195         if (grpfIhdt & 0x0002) nFtnFollowSep = nextIhdd++;
1196         if (grpfIhdt & 0x0004) nFtnNote = nextIhdd++;
1197     }
1198 //  ~Ww1HeaderFooter() {}
SetGrpfIhdt(sal_uInt16 grpfIhdt)1199     void SetGrpfIhdt(sal_uInt16 grpfIhdt)
1200     {
1201         if (grpfIhdt & 0x0001) nEvenHeadL = nextIhdd++;
1202         if (grpfIhdt & 0x0002) nOddHeadL = nextIhdd++;
1203         if (grpfIhdt & 0x0004) nEvenFootL = nextIhdd++;
1204         if (grpfIhdt & 0x0008) nOddFootL = nextIhdd++;
1205         if (grpfIhdt & 0x0010) nFirstHeadL = nextIhdd++;
1206         if (grpfIhdt & 0x0020) nFirstFootL = nextIhdd++;
1207         DBG_ASSERT(nextIhdd<=Count(), "Ww1HeaderFooter");
1208     }
operator ++(int)1209     sal_Bool operator++(int)
1210     {
1211         sal_Bool bRet = sal_True;
1212         eHeaderFooterMode = (HeaderFooterMode)((short)eHeaderFooterMode + 1);
1213         if( eHeaderFooterMode == MaxHeaderFooterMode)
1214         {
1215             eHeaderFooterMode = None;
1216             bRet = sal_False;
1217         }
1218         return bRet;
1219     }
FillFtnSep(sal_uLong & begin,sal_uLong & end)1220     sal_Bool FillFtnSep(sal_uLong& begin, sal_uLong& end)
1221     {
1222         if (nFtnSep == 0xffff)
1223             return sal_False;
1224         Fill(nFtnSep, begin, end);
1225         return sal_True;
1226     }
FillFtnFollowSep(sal_uLong & begin,sal_uLong & end)1227     sal_Bool FillFtnFollowSep(sal_uLong& begin, sal_uLong& end)
1228     {
1229         if (nFtnFollowSep == 0xffff)
1230             return sal_False;
1231         Fill(nFtnFollowSep, begin, end);
1232         return sal_True;
1233     }
FillFtnNote(sal_uLong & begin,sal_uLong & end)1234     sal_Bool FillFtnNote(sal_uLong& begin, sal_uLong& end)
1235     {
1236         if (nFtnNote == 0xffff)
1237             return sal_False;
1238         Fill(nFtnNote, begin, end);
1239         return sal_True;
1240     }
FillEvenHeadL(sal_uLong & begin,sal_uLong & end)1241     sal_Bool FillEvenHeadL(sal_uLong& begin, sal_uLong& end)
1242     {
1243         if (nEvenHeadL == 0xffff)
1244             return sal_False;
1245         Fill(nEvenHeadL, begin, end);
1246         return sal_True;
1247     }
FillOddHeadL(sal_uLong & begin,sal_uLong & end)1248     sal_Bool FillOddHeadL(sal_uLong& begin, sal_uLong& end)
1249     {
1250         if (nOddHeadL == 0xffff)
1251             return sal_False;
1252         Fill(nOddHeadL, begin, end);
1253         return sal_True;
1254     }
FillEvenFootL(sal_uLong & begin,sal_uLong & end)1255     sal_Bool FillEvenFootL(sal_uLong& begin, sal_uLong& end)
1256     {
1257         if (nEvenFootL == 0xffff)
1258             return sal_False;
1259         Fill(nEvenFootL, begin, end);
1260         return sal_True;
1261     }
FillOddFootL(sal_uLong & begin,sal_uLong & end)1262     sal_Bool FillOddFootL(sal_uLong& begin, sal_uLong& end)
1263     {
1264         if (nOddFootL == 0xffff)
1265             return sal_False;
1266         Fill(nOddFootL, begin, end);
1267         return sal_True;
1268     }
FillFirstHeadL(sal_uLong & begin,sal_uLong & end)1269     sal_Bool FillFirstHeadL(sal_uLong& begin, sal_uLong& end)
1270     {
1271         if (nFirstHeadL == 0xffff)
1272             return sal_False;
1273         Fill(nFirstHeadL, begin, end);
1274         return sal_True;
1275     }
FillFirstFootL(sal_uLong & begin,sal_uLong & end)1276     sal_Bool FillFirstFootL(sal_uLong& begin, sal_uLong& end)
1277     {
1278         if (nFirstFootL == 0xffff)
1279             return sal_False;
1280         Fill(nFirstFootL, begin, end);
1281         return sal_True;
1282     }
1283     void Start(Ww1Shell&, Ww1Manager&);
1284     void Stop(Ww1Shell&, Ww1Manager&, sal_Unicode&);
1285 };
1286 
1287 //////////////////////////////////////////////////////////////// Fields
1288 class Ww1Fields : public Ww1PlcFields
1289 {
1290     sal_uInt16 nPlcIndex;
1291     String sErgebnis; // das von word errechnete ergebniss
1292     SwField* pField;
Where(sal_uInt16 nIndex)1293     sal_uLong Where(sal_uInt16 nIndex)  // innerhalb des textes
1294         { return Ww1PlcFields::Where(nIndex) - rFib.GetFIB().fcMinGet(); }
1295 
1296 public:
Ww1Fields(Ww1Fib & rFibL,sal_uLong ulFilePos,sal_uInt16 nBytes)1297     Ww1Fields(Ww1Fib& rFibL, sal_uLong ulFilePos, sal_uInt16 nBytes)
1298         : Ww1PlcFields(rFibL, ulFilePos, nBytes), nPlcIndex(0), pField(0)
1299     {}
1300 //  ~Ww1Fields() {}
1301     // innerhalb des textes
Where()1302     sal_uLong Where()       { return Where(nPlcIndex); }
operator ++(int)1303     void operator++(int)
1304     {
1305         DBG_ASSERT(nPlcIndex+1 <= Count(), "Ww1Fields");
1306         nPlcIndex++;
1307     }
Seek(sal_uLong ulNew)1308     void Seek(sal_uLong ulNew)      { Ww1PlcFields::Seek(ulNew, nPlcIndex); }
GetData()1309     W1_FLD* GetData()
1310     {
1311         DBG_ASSERT(nPlcIndex < Count(), "Ww1Fields");
1312         return Ww1PlcFields::GetData(nPlcIndex);
1313     }
1314     sal_uLong GetLength();
1315     friend ostream& operator <<(ostream&, Ww1Manager&);
1316     void Start(Ww1Shell&, Ww1Manager&);
1317     void Stop(Ww1Shell&, Ww1Manager&, sal_Unicode&);
1318     void Out(Ww1Shell&, Ww1Manager&, sal_uInt16=0);
1319 };
1320 
1321 class Ww1TextFields : public Ww1Fields
1322 {
1323 public:
Ww1TextFields(Ww1Fib & rFibL)1324     Ww1TextFields(Ww1Fib& rFibL)
1325         : Ww1Fields(rFibL, rFibL.GetFIB().fcPlcffldMomGet(),
1326                     rFibL.GetFIB().cbPlcffldMomGet())
1327     {}
1328 };
1329 
1330 class Ww1FootnoteFields : public Ww1Fields
1331 {
1332 public:
Ww1FootnoteFields(Ww1Fib & rFibL)1333     Ww1FootnoteFields(Ww1Fib& rFibL)
1334         : Ww1Fields(rFibL, rFibL.GetFIB().fcPlcffldFtnGet(),
1335                     rFibL.GetFIB().cbPlcffldFtnGet())
1336     {}
1337 };
1338 
1339 class Ww1HeaderFooterFields : public Ww1Fields
1340 {
1341 public:
Ww1HeaderFooterFields(Ww1Fib & rFibL)1342     Ww1HeaderFooterFields(Ww1Fib& rFibL)
1343         : Ww1Fields(rFibL, rFibL.GetFIB().fcPlcffldHdrGet(),
1344                     rFibL.GetFIB().cbPlcffldHdrGet())
1345     {}
1346 };
1347 
1348 class Ww1MacroFields : public Ww1Fields
1349 {
1350 public:
Ww1MacroFields(Ww1Fib & rFibL)1351     Ww1MacroFields(Ww1Fib& rFibL)
1352         : Ww1Fields(rFibL, rFibL.GetFIB().fcPlcffldMcrGet(),
1353                     rFibL.GetFIB().cbPlcffldMcrGet())
1354     {}
1355 };
1356 
1357 //////////////////////////////////////////////////////////////// Bookmarks
1358 class Ww1Bookmarks
1359 {
1360     Ww1PlcBookmarkTxt aNames;
1361     Ww1PlcBookmarkPos* pPos[2];
1362     Ww1Fib& rFib;
1363 
1364     sal_uInt16 nPlcIdx[2];
1365     sal_uInt16 nIsEnd;
1366     sal_Bool bOK;
1367 //  sal_uLong Where(sal_uInt16 nIndex) { // innerhalb des textes
1368 //      return Ww1PlcFields::Where(nIndex) - rFib.GetFIB().fcMinGet(); }
1369 public:
1370     Ww1Bookmarks(Ww1Fib& rFib);
~Ww1Bookmarks()1371     ~Ww1Bookmarks()
1372     {
1373             delete pPos[1];
1374             delete pPos[0];
1375     }
Where() const1376     sal_uLong Where() const     { return pPos[nIsEnd]->WhereCP(nPlcIdx[nIsEnd]); }
1377     void operator++(int);
GetError() const1378     sal_Bool GetError() const   { return !bOK; }
1379     long GetHandle() const;
GetIsEnd() const1380     sal_Bool GetIsEnd() const   { return ( nIsEnd ) ? sal_True : sal_False; }
1381     const String GetName() const;
1382     long Len() const;
1383     friend ostream& operator <<(ostream&, Ww1Bookmarks&);
1384     void Start(Ww1Shell&, Ww1Manager&);
1385     void Stop(Ww1Shell&, Ww1Manager&, sal_Unicode&);
1386     void Out(Ww1Shell&, Ww1Manager&, sal_uInt16=0);
1387 };
1388 
1389 ///////////////////////////////////////////////////////////// Footnotes
1390 class Ww1Footnotes : public Ww1PlcFootnoteRef
1391 {
1392     sal_uInt16 nPlcIndex;
1393     Ww1PlcFootnoteTxt aText;
1394     sal_Bool bStarted;
1395 public:
Ww1Footnotes(Ww1Fib & rFibL)1396     Ww1Footnotes(Ww1Fib& rFibL)
1397         : Ww1PlcFootnoteRef(rFibL), nPlcIndex(0), aText(rFibL), bStarted(sal_False)
1398     {}
1399 //  ~Ww1Footnotes() {}
1400     // innerhalb des textes
Where()1401     sal_uLong Where()
1402     {
1403         sal_uLong ulRet = 0xffffffff;
1404         if (Count())
1405             ulRet = Ww1PlcFootnoteRef::Where(nPlcIndex);
1406         return ulRet;
1407     }
operator ++(int)1408     void operator++(int)
1409     {
1410         DBG_ASSERT(nPlcIndex+1 <= Count(), "Ww1Footnotes");
1411         nPlcIndex++;
1412     }
1413     void Start(Ww1Shell&, Ww1Manager&);
1414     void Stop(Ww1Shell&, Ww1Manager&, sal_Unicode&);
1415 };
1416 
1417 /////////////////////////////////////////////////////////////////// Sep
1418 class Ww1Sep : public Ww1PlcSep
1419 {
1420     Ww1HeaderFooter aHdd;
1421     sal_uInt16 nPlcIndex;
1422 public:
Ww1Sep(Ww1Fib & rFibL,sal_uInt16 grpfIhdt)1423     Ww1Sep(Ww1Fib& rFibL, sal_uInt16 grpfIhdt)
1424     : Ww1PlcSep(rFibL), aHdd(rFibL, grpfIhdt), nPlcIndex(0) {}
1425 
GetHdd()1426     Ww1HeaderFooter& GetHdd()   { return aHdd; }
operator ++(int)1427     void operator++(int)        { nPlcIndex++; }
GetData()1428     sal_uInt8* GetData()            { return Ww1PlcSep::GetData(nPlcIndex); }
1429     // innerhalb des textes
Where()1430     sal_uLong Where()               { return Ww1PlcSep::Where(nPlcIndex); }
SetGrpfIhdt(sal_uInt8 grpfIhdt)1431     void SetGrpfIhdt(sal_uInt8 grpfIhdt)
1432     {
1433         GetHdd().SetGrpfIhdt(grpfIhdt);
1434 //      GetHdd().Start(rOut, rMan);
1435     }
1436     void Start(Ww1Shell&, Ww1Manager&);
Stop(Ww1Shell & rOut,Ww1Manager & rMan,sal_Unicode & c)1437     void Stop(Ww1Shell& rOut, Ww1Manager& rMan, sal_Unicode& c)
1438         { aHdd.Stop(rOut, rMan, c); }
1439 };
1440 
1441 /////////////////////////////////////////////////////////////////// Pap
1442 class Ww1Pap : public Ww1PlcPap
1443 {
1444     sal_uInt16 nPlcIndex;
1445     sal_uInt16 nPushedPlcIndex;
1446     sal_uInt16 nFkpIndex;
1447     sal_uInt16 nPushedFkpIndex;
1448     sal_uLong ulOffset;
1449     Ww1FkpPap* pPap;
1450 
1451     sal_Bool FindSprm(sal_uInt16 nId, sal_uInt8* pStart, sal_uInt8* pEnd);
UpdateIdx()1452     void UpdateIdx()
1453     {
1454         if (pPap && nFkpIndex >= pPap->Count() )
1455         {
1456             delete pPap;
1457             pPap = NULL;
1458             nPlcIndex++;
1459         }
1460         if( !pPap )
1461             Where();
1462     }
1463     sal_Bool HasId0(sal_uInt16 nId);
1464 
1465 public:
1466     Ww1Pap(Ww1Fib& rFib);
~Ww1Pap()1467     ~Ww1Pap()   { delete pPap; }
1468     sal_uLong Where( sal_Bool bSetIndex = sal_True ); // innerhalb des textes
1469     void operator++(int);
FillStart(sal_uInt8 * & pB,sal_uInt16 & nSize)1470     sal_Bool FillStart(sal_uInt8*& pB, sal_uInt16& nSize)
1471     {
1472         UpdateIdx();
1473         return pPap->Fill(nFkpIndex, pB, nSize);
1474     }
FillStop(sal_uInt8 * & pB,sal_uInt16 & nSize)1475     sal_Bool FillStop(sal_uInt8*& pB, sal_uInt16& nSize)
1476     {
1477         return nFkpIndex ? pPap->Fill(nFkpIndex-1, pB, nSize) : sal_False;
1478     }
1479     void Start(Ww1Shell&, Ww1Manager&);
1480     void Stop(Ww1Shell&, Ww1Manager&, sal_Unicode&);
1481     void Seek(sal_uLong);
Push(sal_uLong ulOffsetTmp=0)1482     void Push(sal_uLong ulOffsetTmp = 0)
1483     {
1484         DBG_ASSERT(!Pushed(), "Ww1Pap");
1485         nPushedPlcIndex = nPlcIndex;
1486         nPushedFkpIndex = nFkpIndex;
1487         Seek(ulOffsetTmp);
1488         ulOffset = ulOffsetTmp;
1489         delete pPap;
1490         pPap = NULL;
1491     }
Pushed()1492     sal_Bool Pushed()
1493     {
1494         return nPushedPlcIndex != 0xffff;
1495     }
Pop()1496     void Pop()
1497     {
1498         DBG_ASSERT(Pushed(), "Ww1Pap");
1499         ulOffset = 0;
1500         nPlcIndex = nPushedPlcIndex;
1501         nFkpIndex = nPushedFkpIndex;
1502         nPushedPlcIndex = 0xffff;
1503         nPushedFkpIndex = 0xffff;
1504         delete pPap;
1505         pPap = NULL;
1506         Where( sal_False );
1507     }
1508     sal_Bool HasId(sal_uInt16 nId);
1509 };
1510 
1511 /////////////////////////////////////////////////////////////////// Chp
1512 class Ww1Chp : public Ww1PlcChp
1513 {
1514     sal_uInt16 nPlcIndex;
1515     sal_uInt16 nPushedPlcIndex;
1516     sal_uInt16 nFkpIndex;
1517     sal_uInt16 nPushedFkpIndex;
1518     sal_uLong ulOffset;
1519     Ww1FkpChp* pChp;
UpdateIdx()1520     void UpdateIdx()
1521     {
1522         if (pChp && nFkpIndex >= pChp->Count() )
1523         {
1524             delete pChp;
1525             pChp = NULL;
1526             nPlcIndex++;
1527         }
1528         if( !pChp )
1529             Where();
1530     }
1531 
1532 public:
1533     Ww1Chp( Ww1Fib& rFib );
~Ww1Chp()1534     ~Ww1Chp()   { delete pChp; }
1535     sal_uLong Where( sal_Bool bSetIndex = sal_True ); // innerhalb des textes
1536     void operator++(int);
FillStart(W1_CHP & rChp)1537     sal_Bool FillStart(W1_CHP& rChp)
1538     {
1539         UpdateIdx();
1540         return pChp->Fill(nFkpIndex, rChp);
1541     }
FillStop(W1_CHP & rChp)1542     sal_Bool FillStop(W1_CHP& rChp)
1543     { return nFkpIndex ? pChp->Fill(nFkpIndex-1, rChp) : sal_False;  }
1544     void Start(Ww1Shell&, Ww1Manager&);
1545     void Stop(Ww1Shell&, Ww1Manager&, sal_Unicode&);
1546     void Seek(sal_uLong);
Push(sal_uLong ulOffsetTmp=0)1547     void Push(sal_uLong ulOffsetTmp = 0)
1548     {
1549         DBG_ASSERT(!Pushed(), "Ww1Chp");
1550         nPushedPlcIndex = nPlcIndex;
1551         nPushedFkpIndex = nFkpIndex;
1552         Seek(ulOffsetTmp);
1553         ulOffset = ulOffsetTmp;
1554         delete pChp;
1555         pChp = NULL;
1556     }
Pushed()1557     sal_Bool Pushed()               { return nPushedPlcIndex != 0xffff; }
Pop()1558     void Pop()
1559     {
1560         DBG_ASSERT(Pushed(), "Ww1Chp");
1561         ulOffset = 0;
1562         nPlcIndex = nPushedPlcIndex;
1563         nFkpIndex = nPushedFkpIndex;
1564         nPushedPlcIndex = 0xffff;
1565         nPushedFkpIndex = 0xffff;
1566         delete pChp;
1567         pChp = NULL;
1568         Where( sal_False );
1569     }
1570 };
1571 
1572 /////////////////////////////////////////////////////////////// Manager
1573 //
1574 // zentraler aufhaenger der ww-seite des filters, konstruiert aus dem
1575 // inputstream (ww-datei) enthaelt er alles, was noetig ist, um in die
1576 // shell (pm-seite) gepiped zu werden.
1577 //
1578 class Ww1Manager
1579 {
1580     sal_Bool bOK;
1581     sal_Bool bInTtp;
1582     sal_Bool bInStyle;
1583     sal_Bool bStopAll;
1584     Ww1Fib aFib;
1585     Ww1Dop aDop;
1586     Ww1Fonts aFonts;
1587 // ab jetzt alles paarig, fuer 'pushed':
1588     Ww1DocText aDoc;
1589     Ww1PlainText* pDoc;
1590     sal_uLong ulDocSeek;
1591     sal_uLong* pSeek;
1592     Ww1TextFields aFld;
1593     Ww1Fields* pFld;
1594 // selbst 'push'bar:
1595     Ww1Chp aChp;
1596     Ww1Pap aPap;
1597 // nicht in textbereichen vorhanden, wenn ge'pushed'
1598     Ww1Footnotes aFtn;
1599     Ww1Bookmarks aBooks;
1600     Ww1Sep aSep;
1601 
1602     void OutStop( Ww1Shell&, sal_Unicode );
1603     void OutStart( Ww1Shell& );
1604     void Out(Ww1Shell&, sal_Unicode );
1605 
1606 public:
1607     Ww1Manager(SvStream& rStrm, sal_uLong nFieldFlgs);
GetError() const1608     sal_Bool GetError() const       { return !bOK; }
1609 
1610 // Fuer Tabellen
SetInTtp(sal_Bool bSet=sal_True)1611     void SetInTtp(sal_Bool bSet = sal_True)     { bInTtp = bSet; }
IsInTtp() const1612     sal_Bool IsInTtp() const                { return bInTtp; }
SetInStyle(sal_Bool bSet=sal_True)1613     void SetInStyle(sal_Bool bSet = sal_True)   { bInStyle = bSet; }
IsInStyle() const1614     sal_Bool IsInStyle() const              { return bInStyle; }
SetStopAll(sal_Bool bSet=sal_True)1615     void SetStopAll(sal_Bool bSet = sal_True)   { bStopAll = bSet; }
IsStopAll() const1616     sal_Bool IsStopAll() const              { return bStopAll; }
1617     sal_Bool HasInTable();
1618     sal_Bool HasTtp();
1619     sal_Bool LastHasTtp();
1620 
1621 // Fuer Flys
1622     sal_Bool HasPPc();
1623     sal_Bool HasPDxaAbs();
1624 
GetFib()1625     Ww1Fib& GetFib()                    { return aFib; }
GetText()1626     Ww1PlainText& GetText()             { return *pDoc; }
GetDop()1627     Ww1Dop& GetDop()                    { return aDop; }
GetSep()1628     Ww1Sep& GetSep()                    { return aSep; }
1629     // innerhalb des textes
Where()1630     sal_uLong Where()                       { return pDoc->Where(); }
Fill(sal_Unicode & rChr)1631     void Fill( sal_Unicode& rChr )      { pDoc->Out( rChr ); }
Fill(String & rStr,sal_uLong ulLen)1632     sal_uInt8 Fill( String& rStr, sal_uLong ulLen)
1633     {
1634         ulLen += pDoc->Where();
1635         return sal::static_int_cast< sal_uInt8 >(pDoc->Out(rStr, ulLen));
1636     }
1637     SvxFontItem GetFont(sal_uInt16 nFCode);
1638     friend Ww1Shell& operator <<(Ww1Shell&, Ww1Manager&);
1639     friend ostream& operator <<(ostream&, Ww1Manager&);
Pushed()1640     sal_Bool Pushed()                       { return pDoc != &aDoc; }
1641     void Pop();
1642     void Push0(Ww1PlainText* pDoc, sal_uLong, Ww1Fields* = 0);
1643     void Push1(Ww1PlainText* pDoc, sal_uLong ulSeek, sal_uLong ulSeek2 = 0,
1644                Ww1Fields* = 0);
1645 };
1646