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