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
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26
27
28 //#include <stdio.h> // SEEK_SET
29 #include <string.h> // memset(), ...
30 #include <io.h> // access()
31
32
33 //#include "defs.hxx"
34 #include <tools/solar.h>
35 #include <sot/storage.hxx>
36 #include "ww8struc.hxx"
37 #include "ww8scan.hxx"
38 #include "ww8darr.hxx"
39 #include "ww8dout.hxx"
40
41 #define ASSERT( a, b ) ( (a)?(void)0:(void)(*pOut<<endl1<<"ASSERTION failed "<< __FILE__<<__LINE__<< b <<endl1) )
42
43
44 #define nWW8MaxListLevel 9
45
46 WW8ScannerBase* pSBase = 0;
47 //WW8PLCFMan* pPLCFMan = 0;
48
49 WW8Fib* pWwFib = 0;
50 SvStorageRef* pxStor;
51 SvStorageStreamRef xStrm;
52 SvStorageStreamRef xTableStream; // ist bei Ver6-7 mit xStrm identisch,
53 // ansonsten entweder 0TABLE oder 1TABLE
54 SvStorageStreamRef xDataStream; // ist bei Ver6-7 mit xStrm identisch,
55 // ansonsten DATA
56
57 typedef void (*FNDumpData)( void* );
58
59 sal_Bool DumpChar( sal_uInt8 c );
60 void DumpShortPlainText( WW8_CP nStartCp, long nTextLen, char* pName );
61 void DumpPlainText( WW8_CP nStartCp, long nTextLen, char* pName );
62 void DumpSprms( sal_uInt8 nVersion, SvStream& rSt, short nLen );
63
64
WW8ReadINT32(SvStream & rStrm,sal_Int32 & rTarget)65 sal_Bool WW8ReadINT32( SvStream& rStrm, sal_Int32& rTarget )
66 {
67 rStrm >> rTarget;
68 return sal_True;
69
70
71 SVBT32 nData;
72 sal_Bool bOk = sal_True;
73 if( 4 == rStrm.Read( &nData, 4 ) )
74 rTarget = SVBT32ToUInt32( nData );
75 else
76 bOk = sal_False;
77 return bOk;
78 }
79
WW8ReadINT16(SvStream & rStrm,sal_Int16 & rTarget)80 sal_Bool WW8ReadINT16( SvStream& rStrm, sal_Int16& rTarget )
81 {
82 rStrm >> rTarget;
83 return sal_True;
84
85
86 SVBT16 nData;
87 sal_Bool bOk = sal_True;
88 if( 2 == rStrm.Read( &nData, 2 ) )
89 {
90 rTarget = SVBT16ToShort( nData );
91 }
92 else
93 bOk = sal_False;
94 return bOk;
95 }
96
WW8ReadBYTE(SvStream & rStrm,sal_uInt8 & rTarget)97 sal_Bool WW8ReadBYTE( SvStream& rStrm, sal_uInt8& rTarget )
98 {
99 rStrm >> rTarget;
100 return sal_True;
101
102
103 SVBT8 nData;
104 sal_Bool bOk = sal_True;
105 if( 1 == rStrm.Read( &nData, 1 ) )
106 rTarget = SVBT8ToByte( nData );
107 else
108 bOk = sal_False;
109 return bOk;
110 }
111
WW8ReadUINT32(SvStream & rStrm,sal_uInt32 & rTarget)112 sal_Bool WW8ReadUINT32( SvStream& rStrm, sal_uInt32& rTarget )
113 { return WW8ReadINT32( rStrm, (sal_Int32&) rTarget ); }
114
WW8ReadUINT16(SvStream & rStrm,sal_uInt16 & rTarget)115 sal_Bool WW8ReadUINT16( SvStream& rStrm, sal_uInt16& rTarget )
116 { return WW8ReadINT16( rStrm, (sal_Int16&) rTarget ); }
117
118
Dump_LVL(sal_uInt16 nLevel)119 static void Dump_LVL( sal_uInt16 nLevel )
120 {
121 indent( *pOut, *xTableStream );
122
123 long nStart, dxaSpace, dxaIndent;
124 sal_uInt8 nfc, nFlags, ixchFollow, cbChpx, cbPapx;
125 sal_uInt8 aOfsNumsXCH[nWW8MaxListLevel];
126 *xTableStream >> nStart >> nfc >> nFlags;
127 xTableStream->Read( aOfsNumsXCH, 9 );
128 *xTableStream >> ixchFollow >> dxaSpace >> dxaIndent
129 >> cbChpx >> cbPapx;
130 xTableStream->SeekRel( 2 );
131
132 *pOut << " Level: " << nLevel << endl1;
133 *pOut << indent2 << " Start: " << nStart
134 << " Fmt: " << (sal_uInt16)nfc
135 << " Follow: ";
136 if( 0 == ixchFollow ) *pOut << "tab";
137 else if( 1 == ixchFollow ) *pOut << "blank";
138 else if( 2 == ixchFollow ) *pOut << "nothing";
139 *pOut << endl1 << indent2<< " dxSpace: " << dxaSpace
140 << " dxaIndent: " << dxaIndent << " LevelCharPos: ";
141
142 for( sal_uInt8 x = 0; x < nWW8MaxListLevel; ++x )
143 *pOut << (sal_uInt16)aOfsNumsXCH[ x ] << ", ";
144 *pOut << endl1;
145
146 if( cbPapx )
147 {
148 sal_uLong nXPos = xTableStream->Tell();
149 DumpSprms( pWwFib->nVersion, *xTableStream, cbPapx );
150 xTableStream->Seek( nXPos + cbPapx );
151 }
152 if( cbChpx )
153 {
154 sal_uLong nXPos = xTableStream->Tell();
155 DumpSprms( pWwFib->nVersion, *xTableStream, cbChpx );
156 xTableStream->Seek( nXPos + cbChpx );
157 }
158
159 sal_uInt16 nStrLen, nC;
160 *xTableStream >> nStrLen;
161 char* pStr = new char[ nStrLen+1 ], *p = pStr;
162 while( nStrLen-- )
163 {
164 *xTableStream >> nC;
165 if( 10 > nC ) nC += 0x30;
166 *pStr++ = (char)nC;
167 }
168 *pStr = 0;
169 *pOut << indent2 << "Str: \"" << p << '\"' << endl1 << endl1;
170 }
171
DumpNumList()172 static void DumpNumList()
173 {
174 if( pWwFib->lcbSttbListNames )
175 {
176 sal_uLong nOldPos = xTableStream->Tell();
177 xTableStream->Seek( pWwFib->fcSttbListNames );
178
179 *pOut << endl1;
180 begin( *pOut, *xTableStream ) << "ListNames, Size ";
181
182 sal_uInt16 nDummy;
183 sal_uInt32 nCount;
184 *xTableStream >> nDummy >> nCount;
185
186 *pOut << nCount << ", Dummy: " << nDummy << endl1;
187
188 *pOut << indent2;
189 for( ; nCount; --nCount )
190 {
191 sal_uInt16 nLen, nC;
192 *xTableStream >> nLen;
193 char * pChar = new char[ nLen + 1 ], *p = pChar;
194 while( nLen-- )
195 {
196 *xTableStream >> nC;
197 *pChar++ = (char)nC;
198 }
199 *pChar = 0;
200 *pOut << '\"' << p << '\"';
201 if( 1 < nCount ) *pOut << ", ";
202 delete p;
203 }
204 *pOut << endl1;
205
206 end( *pOut, *xTableStream ) << "ListNames" << endl1;
207 xTableStream->Seek( nOldPos );
208 }
209
210 if( pWwFib->lcbPlcfLst )
211 {
212 sal_uLong nOldPos = xTableStream->Tell();
213 xTableStream->Seek( pWwFib->fcPlcfLst );
214
215 *pOut << endl1;
216 begin( *pOut, *xTableStream ) << "LiST Data on File, Size ";
217
218 sal_uInt16 nCount;
219 *xTableStream >> nCount;
220 *pOut << nCount << endl1;
221
222 sal_uLong nLVLPos = pWwFib->fcPlcfLst + ( nCount * 0x1c ) + 2;
223
224 // 1.1 alle LST einlesen
225 for( sal_uInt16 nList = 0; nList < nCount; nList++ )
226 {
227 indent( *pOut, *xTableStream );
228
229 sal_uInt8 nByte;
230 sal_uInt32 nLstId, nTplId;
231 *xTableStream >> nLstId >> nTplId;
232
233 sal_uInt16 aStyleIdArr[ nWW8MaxListLevel ];
234 for( sal_uInt16 nLevel = 0; nLevel < nWW8MaxListLevel; nLevel++ )
235 *xTableStream >> aStyleIdArr[ nLevel ];
236 *xTableStream >> nByte;
237 xTableStream->SeekRel( 1 ); // Dummy ueberlesen
238
239 *pOut << "ListId: " << nLstId
240 << " TemplateId " << nTplId << endl1
241 << indent2 << " StyleIds: ";
242 for( nLevel = 0; nLevel < nWW8MaxListLevel; nLevel++ )
243 *pOut << aStyleIdArr[ nLevel ] << ", ";
244
245 *pOut << endl1;
246 if( 1 & nByte ) *pOut << " <simple List>";
247 if( 2 & nByte ) *pOut << " <restart at new section>";
248 if( 3 & nByte ) *pOut << endl1;
249
250 sal_uLong nTmpPos = xTableStream->Tell();
251 xTableStream->Seek( nLVLPos );
252
253 // 1.2 alle LVL aller aLST einlesen
254 for( nLevel = 0; nLevel < ((1 & nByte) ? 1 : nWW8MaxListLevel); nLevel++ )
255 Dump_LVL( nLevel );
256
257 nLVLPos = xTableStream->Tell();
258 xTableStream->Seek( nTmpPos );
259 }
260
261 end( *pOut, *xTableStream ) << "LiST Data on File" << endl1;
262 xTableStream->Seek( nOldPos );
263 }
264
265 if( pWwFib->lcbPlfLfo )
266 {
267 sal_uLong nOldPos = xTableStream->Tell();
268 xTableStream->Seek( pWwFib->fcPlfLfo );
269
270 *pOut << endl1;
271 begin( *pOut, *xTableStream ) << "List Format Override, Size ";
272
273 sal_uInt32 nCount, nLstId;
274 *xTableStream >> nCount;
275 *pOut << nCount << endl1;
276
277 sal_uLong nLVLPos = pWwFib->fcPlfLfo + ( nCount * 0x10 ) + 4;
278
279 for( ; nCount; --nCount )
280 {
281 indent( *pOut, *xTableStream );
282
283 sal_uInt8 nLevels;
284 *xTableStream >> nLstId;
285 xTableStream->SeekRel( 8 );
286 *xTableStream >> nLevels;
287 xTableStream->SeekRel( 3 );
288
289 *pOut << "ListId: " << nLstId
290 << " Override Levels: " << (sal_uInt16)nLevels << endl1;
291
292 sal_uLong nTmpPos = xTableStream->Tell();
293 xTableStream->Seek( nLVLPos );
294
295 for( sal_uInt8 nLvl = 0; nLvl < nLevels; ++nLvl )
296 {
297 sal_uInt32 nStartAt;
298 sal_uInt8 nFlags;
299 do {
300 *xTableStream >> nFlags;
301 } while( 0xFF == nFlags );
302 xTableStream->SeekRel( -1 );
303
304 indent( *pOut, *xTableStream );
305 *xTableStream >> nStartAt >> nFlags;
306 xTableStream->SeekRel( 3 );
307
308 if( nFlags & 0x10 ) *pOut << "<Override start>";
309 if( nFlags & 0x20 ) *pOut << "<Override formattting>";
310 if( nFlags & 0x30 ) *pOut << endl1;
311
312 if( nFlags & 0x20 )
313 Dump_LVL( nFlags & 0x0F );
314 }
315 nLVLPos = xTableStream->Tell();
316 xTableStream->Seek( nTmpPos );
317 }
318
319 end( *pOut, *xTableStream ) << "List Format Override" << endl1 << endl1;
320 xTableStream->Seek( nOldPos );
321 }
322 }
323
DumpBookLow()324 static void DumpBookLow()
325 {
326 *pOut << begin2 << "Bookmarks Low" << endl1;
327 *pOut << indent2 <<"Start: Adr " << hex6 << pWwFib->fcPlcfbkf
328 << ", Len: " << pWwFib->lcbPlcfbkf << endl1;
329 *pOut << indent2 << "End: Adr " << hex6 << pWwFib->fcPlcfbkl
330 << ", Len: " << pWwFib->lcbPlcfbkl << endl1;
331 *pOut << indent2 << "Strings: Adr " << hex6 << pWwFib->fcSttbfbkmk
332 << ", Len: " << pWwFib->lcbSttbfbkmk << endl1;
333 *pOut << endl1;
334
335 WW8PLCFspecial aStarts( &xStrm, pWwFib->fcPlcfbkf, pWwFib->lcbPlcfbkf, 4 );
336 WW8PLCFspecial aEnds( &xStrm, pWwFib->fcPlcfbkl, pWwFib->lcbPlcfbkl, 0, -1, sal_True );
337
338 sal_uInt16 i = 0;
339 while( 1 ){
340 long nStart = aStarts.GetPos( i );
341 if( nStart >= LONG_MAX )
342 break;
343
344 *pOut << indent2 << i << ".StartCp: " << hex6 << nStart;
345
346 const void* p = aStarts.GetData( i );
347 if( p ){
348 *pOut << ", EndIdx: ";
349 sal_uInt16 nEndIdx = *((sal_uInt16*)p);
350 *pOut << nEndIdx;
351 long nEnd = aEnds.GetPos( nEndIdx );
352 *pOut << ", End: " << hex6 << nEnd << hex
353 << ", Len: " << nEnd - nStart << dec;
354 }else{
355 *pOut << " aStarts.GetData() ging schief.";
356 }
357
358 *pOut << endl1;
359 i++;
360 }
361 *pOut << end2 << "Bookmarks Low" << endl1 << endl1;
362 }
363
DumpBookHigh()364 static void DumpBookHigh()
365 {
366 WW8PLCFx_Book aBook( &xStrm, &xTableStream, *pWwFib, 0 );
367 if( !aBook.GetIMax() ){
368 *pOut << indent1 << "No Bookmarks" << endl1 << endl1;
369 return;
370 }
371
372 *pOut << indent1 << begin1 << "Bookmarks High" << endl1;
373
374 sal_uInt16 i = 0;
375 while( 1 )
376 {
377 long nPos = aBook.Where();
378 if( nPos >= LONG_MAX )
379 break;
380 *pOut << indent2 << i << ". Cp:" << hex6 << nPos << dec;
381 *pOut << ( ( aBook.GetIsEnd() ) ? " Ende " : " Anfang" );
382 *pOut << " Handle: " << aBook.GetHandle();
383 // *pOut << " Len: " << hex4 << aBook.GetLen() << dec;
384 ByteString sName( *aBook.GetName(), RTL_TEXTENCODING_MS_1252 );
385 if( sName.Len() )
386 *pOut << " Name: " << sName.GetBuffer() << endl1;
387 else
388 *pOut << endl1;
389 aBook++;
390 i++;
391 }
392 *pOut << end2 << "Bookmarks High" << endl1 << endl1;
393 }
394
DumpField3(WW8PLCFspecial & rPlc)395 static sal_Bool DumpField3( WW8PLCFspecial& rPlc )
396 {
397 WW8FieldDesc aF;
398
399 sal_Bool bOk = WW8GetFieldPara( pWwFib->nVersion, rPlc, aF );
400 if( !bOk )
401 {
402 *pOut << " " << indent1 << "no WW8GetFieldPara()" << endl1;
403 return sal_False;
404 }
405 *pOut << " " << indent1 << begin1 << "Field Cp: " << hex
406 << aF.nSCode << ", Len: " << aF.nLCode << "; Cp: " << aF.nSRes
407 << ", Len: "<< aF.nLRes << ", Typ: " << dec << (sal_uInt16)aF.nId
408 << ", Options: " << hex << (sal_uInt16)aF.nOpt;
409 if( aF.bCodeNest )
410 *pOut << " Code Nested";
411 if( aF.bResNest )
412 *pOut << " Result Nested";
413 *pOut << endl1;
414 DumpShortPlainText( aF.nSCode, aF.nLCode, "Code" );
415 DumpShortPlainText( aF.nSRes, aF.nLRes, "Result" );
416 *pOut << " " << end1 << "Field" << endl1;
417 return sal_True;
418 }
419
DumpField2(WW8PLCFspecial & rPlc)420 static sal_Bool DumpField2( WW8PLCFspecial& rPlc )
421 {
422 WW8_CP nSCode, nECode, nSRes, nERes;
423 void* pData;
424 if( !rPlc.Get( nSCode, pData ) ) // Ende des Plc1 ?
425 return sal_False;
426 rPlc++;
427
428 if( ((sal_uInt8*)pData)[0] != 19 ){
429 *pOut << "Field Error, " << (sal_uInt16)((sal_uInt8*)pData)[0] << endl1;
430 return sal_True; // nicht abbrechen
431 }
432
433 *pOut << " " << indent1 << begin1 << "Field" << " Cp: " << hex
434 << nSCode << " Typ: " << dec << (sal_uInt16)((sal_uInt8*)pData)[1] << endl1;
435
436 if( !rPlc.Get( nECode, pData ) ) // Ende des Plc1 ?
437 return sal_False;
438
439 DumpShortPlainText( nSCode, nECode - nSCode, "Code" ); // Code, bei nested abgeschnitten
440 nSRes = nECode; // Default
441
442
443 while( ((sal_uInt8*)pData)[0] == 19 ){ // immer noch neue (nested) Anfaenge ?
444 DumpField2( rPlc ); // nested Field im Beschreibungsteil
445 if( !rPlc.Get( nSRes, pData ) ) // Ende des Plc1 ?
446 return sal_False;
447 }
448
449 if( ((sal_uInt8*)pData)[0] == 20 ){ // Field Separator ?
450 rPlc++;
451 *pOut << " " << indent1 << "Field Seperator" << " Cp: " << hex << nSRes
452 << ", Flags = 0x" << hex << (sal_uInt16)((sal_uInt8*)pData)[1] << dec << endl1;
453 if( !rPlc.Get( nERes, pData ) ) // Ende des Plc1 ?
454 return sal_False;
455
456 while( ((sal_uInt8*)pData)[0] == 19 ){ // immer noch neue (nested) Anfaenge ?
457 DumpField2( rPlc ); // nested Field im Resultatteil
458 if( !rPlc.Get( nERes, pData ) ) // Ende des Plc1 ?
459 return sal_False;
460 }
461 DumpShortPlainText( nSRes, nERes - nSRes, "Result" ); // Result, bei nested incl. nested Field
462
463 }else{
464 nERes = nSRes; // Kein Result vorhanden
465 }
466
467 rPlc++;
468 if( ((sal_uInt8*)pData)[0] == 21 ){ // Field Ende ?
469 *pOut << " " << end1 << " Field " << " Cp: " << hex << nERes
470 << ", Flags = 0x" << hex << (sal_uInt16)((sal_uInt8*)pData)[1] << dec << endl1;
471 }else{
472 *pOut << " Unknown Field Type" << endl1;
473 *pOut << " " << end1 << " Field " << endl1;
474 }
475
476 return sal_True;
477 }
478
DumpField1(WW8_FC nPos,long nLen,char * pName)479 static void DumpField1( WW8_FC nPos, long nLen, char* pName )
480 {
481 if( !nLen )
482 {
483 *pOut << pName << ": No Fields" << endl1 << endl1;
484 return;
485 }
486
487 WW8PLCFspecial aPlc( &xTableStream, nPos, nLen, 2 );
488
489 *pOut << hex6 << nPos << dec2 << ' ' << indent1 << begin1;
490 *pOut << "Plc." << pName << ", Len: ";
491 *pOut << nLen << ", ca. " << aPlc.GetIMax()/3 << " Elements"
492
493 << " Idx: " << (long)aPlc.GetIdx()
494 << " IMax: " << aPlc.GetIMax()
495
496 << endl1;
497
498 // while( DumpField2( aPlc ) ){}
499 while( (long)aPlc.GetIdx() < aPlc.GetIMax() )
500 {
501 DumpField3( aPlc );
502 aPlc++;
503 }
504
505 end( *pOut, *xStrm ) << "Plcx." << pName << endl1 << endl1;
506 }
507
508
509 //-----------------------------------------
DumpFonts()510 static void DumpFonts()
511 {
512 WW8Fonts aFonts( *xTableStream, *pWwFib );
513
514 sal_uInt16 i;
515
516 *pOut << endl1;
517 *pOut << 'T' << hex6 << pWwFib->fcSttbfffn << dec2 << ' ' << indent1 << begin1 << "FFNs" << endl1;
518
519 ByteString sOut;
520
521 for( i=0; i<aFonts.GetMax(); i++){
522 // const
523 WW8_FFN* p = (WW8_FFN*)aFonts.GetFont( i );
524
525 sOut = ByteString( p->sFontname, RTL_TEXTENCODING_MS_1252 );
526 *pOut << "Id:" << i << " Name:\"" << sOut.GetBuffer() << '"'; // Name
527 if( p->ibszAlt ) // gibt es einen alternativen Font ?
528 {
529 sOut = ByteString( p->sFontname.Copy( p->ibszAlt ),
530 RTL_TEXTENCODING_MS_1252 );
531 *pOut << ", Alternativ:" << '"' << sOut.GetBuffer() << '"';
532 }
533 *pOut << ", PitchRequest:" << (short)p->prg << ", TrueType:" << (short)p->fTrueType;
534 *pOut << ", FontFamily:" << (short)p->ff;
535 *pOut << ", BaseWeight:" << p->wWeight;
536 *pOut << ", CharacterSet:" << (short)p->chs;
537 *pOut << endl1;
538 }
539 *pOut << " " << end1 << "FFNs" << endl1 << endl1;
540 }
541
542
543 //-----------------------------------------
544 // class DFib
545 //-----------------------------------------
546
547 class DFib: public WW8Fib
548 {
549 public:
DFib(SvStream & rStrm,sal_uInt8 nVersion)550 DFib( SvStream& rStrm, sal_uInt8 nVersion ) : WW8Fib( rStrm, nVersion ) {}
551 void Dump();
552 };
553
554 //-----------------------------------------
555
Dump()556 void DFib::Dump()
557 {
558 *pOut << "Adressen: FIB " << hex << 0 << ", Text "
559 << fcMin << ", TextLen " << ccpText
560 << ", Styles " << fcStshf << endl1;
561
562 *pOut << "\twIdent: " << wIdent << endl1;
563 *pOut << "\tnFib: " << nFib << endl1;
564 *pOut << "\tnProduct: " << nProduct << endl1;
565 *pOut << "\tlid: " << lid << endl1;
566 *pOut << "\tpnNext: " << pnNext << endl1;
567
568 *pOut << "\tfDot: " << (fDot ? '1' : '0') << endl1;
569 *pOut << "\tfGlsy: " << (fGlsy ? '1' : '0') << endl1;
570 *pOut << "\tfComplex: " << (fComplex ? '1' : '0') << endl1;
571 *pOut << "\tfHasPic: " << (fHasPic ? '1' : '0') << endl1;
572 *pOut << "\tcQuickSaves: " << (sal_uInt16)cQuickSaves << endl1;
573 *pOut << "\tfEncrypted: " << (fEncrypted ? '1' : '0') << endl1;
574 *pOut << "\tfWhichTblStm: " << (fWhichTblStm ? '1' : '0') << endl1;
575 *pOut << "\tfExtChar: " << (fExtChar ? '1' : '0') << endl1;
576
577 *pOut << "\tnFibBack: " << nFibBack << endl1;
578 *pOut << "\tlKey1: " << lKey1 << endl1;
579 *pOut << "\tlKey2: " << lKey2 << endl1;
580 *pOut << "\tenvr: " << envr << endl1;
581
582 *pOut << "\tfMac: " << (fMac ? '1' : '0') << endl1;
583 *pOut << "\tfEmptySpecial: " << (fEmptySpecial ? '1' : '0') << endl1;
584 *pOut << "\tfLoadOverridePage: " << (fLoadOverridePage ? '1' : '0') << endl1;
585 *pOut << "\tfFuturesavedUndo: " << (fFuturesavedUndo ? '1' : '0') << endl1;
586 *pOut << "\tfWord97Saved: " << (fWord97Saved ? '1' : '0') << endl1;
587
588 *pOut << "\tchse: " << chse << endl1;
589 *pOut << "\tchseTables: " << chseTables << endl1;
590 *pOut << "\tfcMin: " << fcMin << endl1;
591 *pOut << "\tfcMac: " << fcMac << endl1;
592 *pOut << "\tcsw: " << csw << endl1;
593 *pOut << "\twMagicCreated: " << wMagicCreated << endl1;
594 *pOut << "\twMagicRevised: " << wMagicRevised << endl1;
595 *pOut << "\twMagicCreatedPrivate: " << wMagicCreatedPrivate << endl1;
596 *pOut << "\twMagicRevisedPrivate: " << wMagicRevisedPrivate << endl1;
597 *pOut << "\tlidFE: " << lidFE << endl1;
598 *pOut << "\tclw: " << clw << endl1;
599 *pOut << "\tcbMac: " << cbMac << endl1;
600 *pOut << "\tccpText: " << ccpText << endl1;
601 *pOut << "\tccpFtn: " << ccpFtn << endl1;
602 *pOut << "\tccpHdr: " << ccpHdr << endl1;
603 *pOut << "\tccpMcr: " << ccpMcr << endl1;
604 *pOut << "\tccpAtn: " << ccpAtn << endl1;
605 *pOut << "\tccpEdn: " << ccpEdn << endl1;
606 *pOut << "\tccpTxbx: " << ccpTxbx << endl1;
607 *pOut << "\tccpHdrTxbx: " << ccpHdrTxbx << endl1;
608 *pOut << "\tpnFbpChpFirst: " << pnFbpChpFirst << endl1;
609 *pOut << "\tpnFbpPapFirst: " << pnFbpPapFirst << endl1;
610 *pOut << "\tpnFbpLvcFirst: " << pnFbpLvcFirst << endl1;
611 *pOut << "\tpnLvcFirst: " << pnLvcFirst << endl1;
612 *pOut << "\tcpnBteLvc: " << cpnBteLvc << endl1;
613 *pOut << "\tfcIslandFirst: " << fcIslandFirst << endl1;
614 *pOut << "\tfcIslandLim: " << fcIslandLim << endl1;
615 *pOut << "\tcfclcb: " << cfclcb << endl1;
616 *pOut << "\tfcStshfOrig: " << fcStshfOrig << endl1;
617 *pOut << "\tlcbStshfOrig: " << lcbStshfOrig << endl1;
618 *pOut << "\tfcStshf: " << fcStshf << endl1;
619 *pOut << "\tlcbStshf: " << lcbStshf << endl1;
620 *pOut << "\tfcPlcffndRef: " << fcPlcffndRef << endl1;
621 *pOut << "\tlcbPlcffndRef: " << lcbPlcffndRef << endl1;
622 *pOut << "\tfcPlcffndTxt: " << fcPlcffndTxt << endl1;
623 *pOut << "\tlcbPlcffndTxt: " << lcbPlcffndTxt << endl1;
624 *pOut << "\tfcPlcfandRef: " << fcPlcfandRef << endl1;
625 *pOut << "\tlcbPlcfandRef: " << lcbPlcfandRef << endl1;
626 *pOut << "\tfcPlcfandTxt: " << fcPlcfandTxt << endl1;
627 *pOut << "\tlcbPlcfandTxt: " << lcbPlcfandTxt << endl1;
628 *pOut << "\tfcPlcfsed: " << fcPlcfsed << endl1;
629 *pOut << "\tlcbPlcfsed: " << lcbPlcfsed << endl1;
630 *pOut << "\tfcPlcfpad: " << fcPlcfpad << endl1;
631 *pOut << "\tlcbPlcfpad: " << lcbPlcfpad << endl1;
632 *pOut << "\tfcPlcfphe: " << fcPlcfphe << endl1;
633 *pOut << "\tlcbPlcfphe: " << lcbPlcfphe << endl1;
634 *pOut << "\tfcSttbfglsy: " << fcSttbfglsy << endl1;
635 *pOut << "\tlcbSttbfglsy: " << lcbSttbfglsy << endl1;
636 *pOut << "\tfcPlcfglsy: " << fcPlcfglsy << endl1;
637 *pOut << "\tlcbPlcfglsy: " << lcbPlcfglsy << endl1;
638 *pOut << "\tfcPlcfhdd: " << fcPlcfhdd << endl1;
639 *pOut << "\tlcbPlcfhdd: " << lcbPlcfhdd << endl1;
640 *pOut << "\tfcPlcfbteChpx: " << fcPlcfbteChpx << endl1;
641 *pOut << "\tlcbPlcfbteChpx: " << lcbPlcfbteChpx << endl1;
642 *pOut << "\tfcPlcfbtePapx: " << fcPlcfbtePapx << endl1;
643 *pOut << "\tlcbPlcfbtePapx: " << lcbPlcfbtePapx << endl1;
644 *pOut << "\tfcPlcfsea: " << fcPlcfsea << endl1;
645 *pOut << "\tlcbPlcfsea: " << lcbPlcfsea << endl1;
646 *pOut << "\tfcSttbfffn: " << fcSttbfffn << endl1;
647 *pOut << "\tlcbSttbfffn: " << lcbSttbfffn << endl1;
648 *pOut << "\tfcPlcffldMom: " << fcPlcffldMom << endl1;
649 *pOut << "\tlcbPlcffldMom: " << lcbPlcffldMom << endl1;
650 *pOut << "\tfcPlcffldHdr: " << fcPlcffldHdr << endl1;
651 *pOut << "\tlcbPlcffldHdr: " << lcbPlcffldHdr << endl1;
652 *pOut << "\tfcPlcffldFtn: " << fcPlcffldFtn << endl1;
653 *pOut << "\tlcbPlcffldFtn: " << lcbPlcffldFtn << endl1;
654 *pOut << "\tfcPlcffldAtn: " << fcPlcffldAtn << endl1;
655 *pOut << "\tlcbPlcffldAtn: " << lcbPlcffldAtn << endl1;
656 *pOut << "\tfcPlcffldMcr: " << fcPlcffldMcr << endl1;
657 *pOut << "\tlcbPlcffldMcr: " << lcbPlcffldMcr << endl1;
658 *pOut << "\tfcSttbfbkmk: " << fcSttbfbkmk << endl1;
659 *pOut << "\tlcbSttbfbkmk: " << lcbSttbfbkmk << endl1;
660 *pOut << "\tfcPlcfbkf: " << fcPlcfbkf << endl1;
661 *pOut << "\tlcbPlcfbkf: " << lcbPlcfbkf << endl1;
662 *pOut << "\tfcPlcfbkl: " << fcPlcfbkl << endl1;
663 *pOut << "\tlcbPlcfbkl: " << lcbPlcfbkl << endl1;
664 *pOut << "\tfcCmds: " << fcCmds << endl1;
665 *pOut << "\tlcbCmds: " << lcbCmds << endl1;
666 *pOut << "\tfcPlcfmcr: " << fcPlcfmcr << endl1;
667 *pOut << "\tlcbPlcfmcr: " << lcbPlcfmcr << endl1;
668 *pOut << "\tfcSttbfmcr: " << fcSttbfmcr << endl1;
669 *pOut << "\tlcbSttbfmcr: " << lcbSttbfmcr << endl1;
670 *pOut << "\tfcPrDrvr: " << fcPrDrvr << endl1;
671 *pOut << "\tlcbPrDrvr: " << lcbPrDrvr << endl1;
672 *pOut << "\tfcPrEnvPort: " << fcPrEnvPort << endl1;
673 *pOut << "\tlcbPrEnvPort: " << lcbPrEnvPort << endl1;
674 *pOut << "\tfcPrEnvLand: " << fcPrEnvLand << endl1;
675 *pOut << "\tlcbPrEnvLand: " << lcbPrEnvLand << endl1;
676 *pOut << "\tfcWss: " << fcWss << endl1;
677 *pOut << "\tlcbWss: " << lcbWss << endl1;
678 *pOut << "\tfcDop: " << fcDop << endl1;
679 *pOut << "\tlcbDop: " << lcbDop << endl1;
680 *pOut << "\tfcSttbfAssoc: " << fcSttbfAssoc << endl1;
681 *pOut << "\tcbSttbfAssoc: " << cbSttbfAssoc << endl1;
682 *pOut << "\tfcClx: " << fcClx << endl1;
683 *pOut << "\tlcbClx: " << lcbClx << endl1;
684 *pOut << "\tfcPlcfpgdFtn: " << fcPlcfpgdFtn << endl1;
685 *pOut << "\tlcbPlcfpgdFtn: " << lcbPlcfpgdFtn << endl1;
686 *pOut << "\tfcAutosaveSource: " << fcAutosaveSource << endl1;
687 *pOut << "\tlcbAutosaveSource: " << lcbAutosaveSource << endl1;
688 *pOut << "\tfcGrpStAtnOwners: " << fcGrpStAtnOwners << endl1;
689 *pOut << "\tlcbGrpStAtnOwners: " << lcbGrpStAtnOwners << endl1;
690 *pOut << "\tfcSttbfAtnbkmk: " << fcSttbfAtnbkmk << endl1;
691 *pOut << "\tlcbSttbfAtnbkmk: " << lcbSttbfAtnbkmk << endl1;
692 *pOut << "\tfcPlcfdoaMom: " << fcPlcfdoaMom << endl1;
693 *pOut << "\tlcbPlcfdoaMom: " << lcbPlcfdoaMom << endl1;
694 *pOut << "\tfcPlcfdoaHdr: " << fcPlcfdoaHdr << endl1;
695 *pOut << "\tlcbPlcfdoaHdr: " << lcbPlcfdoaHdr << endl1;
696 *pOut << "\tfcPlcfspaMom: " << fcPlcfspaMom << endl1;
697 *pOut << "\tlcbPlcfspaMom: " << lcbPlcfspaMom << endl1;
698 *pOut << "\tfcPlcfspaHdr: " << fcPlcfspaHdr << endl1;
699 *pOut << "\tlcbPlcfspaHdr: " << lcbPlcfspaHdr << endl1;
700 *pOut << "\tfcPlcfAtnbkf: " << fcPlcfAtnbkf << endl1;
701 *pOut << "\tlcbPlcfAtnbkf: " << lcbPlcfAtnbkf << endl1;
702 *pOut << "\tfcPlcfAtnbkl: " << fcPlcfAtnbkl << endl1;
703 *pOut << "\tlcbPlcfAtnbkl: " << lcbPlcfAtnbkl << endl1;
704 *pOut << "\tfcPms: " << fcPms << endl1;
705 *pOut << "\tlcbPMS: " << lcbPMS << endl1;
706 *pOut << "\tfcFormFldSttbf: " << fcFormFldSttbf << endl1;
707 *pOut << "\tlcbFormFldSttbf: " << lcbFormFldSttbf << endl1;
708 *pOut << "\tfcPlcfendRef: " << fcPlcfendRef << endl1;
709 *pOut << "\tlcbPlcfendRef: " << lcbPlcfendRef << endl1;
710 *pOut << "\tfcPlcfendTxt: " << fcPlcfendTxt << endl1;
711 *pOut << "\tlcbPlcfendTxt: " << lcbPlcfendTxt << endl1;
712 *pOut << "\tfcPlcffldEdn: " << fcPlcffldEdn << endl1;
713 *pOut << "\tlcbPlcffldEdn: " << lcbPlcffldEdn << endl1;
714 *pOut << "\tfcPlcfpgdEdn: " << fcPlcfpgdEdn << endl1;
715 *pOut << "\tlcbPlcfpgdEdn: " << lcbPlcfpgdEdn << endl1;
716 *pOut << "\tfcDggInfo: " << fcDggInfo << endl1;
717 *pOut << "\tlcbDggInfo: " << lcbDggInfo << endl1;
718 *pOut << "\tfcSttbfRMark: " << fcSttbfRMark << endl1;
719 *pOut << "\tlcbSttbfRMark: " << lcbSttbfRMark << endl1;
720 *pOut << "\tfcSttbfCaption: " << fcSttbfCaption << endl1;
721 *pOut << "\tlcbSttbfCaption: " << lcbSttbfCaption << endl1;
722 *pOut << "\tfcSttbAutoCaption: " << fcSttbAutoCaption << endl1;
723 *pOut << "\tlcbSttbAutoCaption: " << lcbSttbAutoCaption << endl1;
724 *pOut << "\tfcPlcfwkb: " << fcPlcfwkb << endl1;
725 *pOut << "\tlcbPlcfwkb: " << lcbPlcfwkb << endl1;
726 *pOut << "\tfcPlcfspl: " << fcPlcfspl << endl1;
727 *pOut << "\tlcbPlcfspl: " << lcbPlcfspl << endl1;
728 *pOut << "\tfcPlcftxbxTxt: " << fcPlcftxbxTxt << endl1;
729 *pOut << "\tlcbPlcftxbxTxt: " << lcbPlcftxbxTxt << endl1;
730 *pOut << "\tfcPlcffldTxbx: " << fcPlcffldTxbx << endl1;
731 *pOut << "\tlcbPlcffldTxbx: " << lcbPlcffldTxbx << endl1;
732 *pOut << "\tfcPlcfHdrtxbxTxt: " << fcPlcfHdrtxbxTxt << endl1;
733 *pOut << "\tlcbPlcfHdrtxbxTxt: " << lcbPlcfHdrtxbxTxt << endl1;
734 *pOut << "\tfcPlcffldHdrTxbx: " << fcPlcffldHdrTxbx << endl1;
735 *pOut << "\tlcbPlcffldHdrTxbx: " << lcbPlcffldHdrTxbx << endl1;
736 *pOut << "\tfcPlcfLst: " << fcPlcfLst << endl1;
737 *pOut << "\tlcbPlcfLst: " << lcbPlcfLst << endl1;
738 *pOut << "\tfcPlfLfo: " << fcPlfLfo << endl1;
739 *pOut << "\tlcbPlfLfo: " << lcbPlfLfo << endl1;
740 *pOut << "\tfcPlcftxbxBkd: " << fcPlcftxbxBkd << endl1;
741 *pOut << "\tlcbPlcftxbxBkd: " << lcbPlcftxbxBkd << endl1;
742 *pOut << "\tfcPlcfHdrtxbxBkd: " << fcPlcfHdrtxbxBkd << endl1;
743 *pOut << "\tlcbPlcfHdrtxbxBkd: " << lcbPlcfHdrtxbxBkd << endl1;
744 *pOut << "\tfcSttbListNames: " << fcSttbListNames << endl1;
745 *pOut << "\tlcbSttbListNames: " << lcbSttbListNames << endl1;
746
747 *pOut << "\tpnChpFirst: " << pnChpFirst << endl1;
748 *pOut << "\tpnPapFirst: " << pnPapFirst << endl1;
749 *pOut << "\tcpnBteChp: " << cpnBteChp << endl1;
750 *pOut << "\tcpnBtePap: " << cpnBtePap << endl1;
751
752
753 *pOut << dec << "END FIB" << endl1 << endl1;
754 }
755
756 //-----------------------------------------
757 // class DStyle
758 //-----------------------------------------
759
760 class DStyle: public WW8Style
761 {
762 sal_uInt8 nVersion;
763 public:
DStyle(SvStream & rStream,WW8Fib & rFib)764 DStyle( SvStream& rStream, WW8Fib& rFib )
765 : WW8Style( rStream, rFib ){ nVersion = rFib.nVersion; }
766 void Dump1Style( sal_uInt16 nNr );
767 void Dump();
768 };
769
770 //-----------------------------------------
771 // universelle Hilfsroutinen
772 //-----------------------------------------
773
DumpIt(SvStream & rSt,short nLen)774 static void DumpIt( SvStream& rSt, short nLen )
775 {
776 indent( *pOut, rSt );
777 if( nLen <= 0 ){
778 *pOut << endl1;
779 return;
780 }
781 while ( nLen ){
782 sal_uInt8 c;
783 xStrm->Read( &c, sizeof(c) );
784 *pOut << "<0x" << hex2 << (sal_uInt16)c << dec2 << "> ";
785 nLen--;
786 }
787 *pOut << endl1;
788 }
789
DumpItSmall(SvStream & rStrm,short nLen)790 static void DumpItSmall( SvStream& rStrm, short nLen )
791 {
792 if( nLen <= 0 )
793 return;
794
795 while ( nLen )
796 {
797 sal_uInt8 c;
798
799 rStrm.Read( &c, sizeof(c) );
800
801 if( c <= 9 )
802 *pOut << (sal_uInt16)c;
803 else
804 *pOut << "0x" << hex2 << (sal_uInt16)c << dec2;
805
806 nLen--;
807
808 if( nLen )
809 *pOut << ',';
810 }
811 }
812
DumpSprm(sal_uInt8 nVersion,SvStream & rSt,short nSprmsLen)813 static short DumpSprm( sal_uInt8 nVersion, SvStream& rSt, short nSprmsLen )
814 {
815 long nSprmPos = rSt.Tell();
816 sal_uInt8 nDelta;
817
818 indent( *pOut, rSt );
819
820 sal_uInt8 x[512];
821 rSt.Read( x, 512 ); // Token und folgende lesen
822
823 sal_uInt16 nId = WW8GetSprmId( nVersion, x, &nDelta );
824
825 short nSprmL = WW8GetSprmSizeBrutto( nVersion, x, &nId );
826 short nSprmNL = WW8GetSprmSizeNetto( nVersion, x, &nId );
827
828 nSprmsLen -= nSprmL;
829 if( nSprmsLen < 0 )
830 *pOut << "!UEberhang um " << -nSprmsLen << " Bytes!" << endl1;
831
832 // Ausgabe: Token in Dez
833 if( 8 > nVersion )
834 *pOut << (sal_uInt16)x[0];
835 else
836 *pOut << hex << nId << dec;
837 *pOut << '/' << nSprmL; // Laenge incl. alles in Dez
838 *pOut << '/' << nSprmNL; // Laenge excl Token in Dez
839
840
841 const SprmDumpInfo& rSprm = WW8GetSprmDumpInfo( nId );
842
843 *pOut << " = " << rSprm.pName << ' ';
844
845 rSt.Seek( nSprmPos + 1 + nDelta + WW8SprmDataOfs( nId ) );// gehe zum eigentlichen
846 // Inhalt
847 if( rSprm.pOutFnc )
848 rSprm.pOutFnc( rSt, nSprmNL ); // Rufe Ausgabefunktion
849 else
850 DumpItSmall( rSt, nSprmNL ); // oder Dumper
851 *pOut << endl1;
852
853 return nSprmsLen;
854 }
855
DumpSprms(sal_uInt8 nVersion,SvStream & rSt,short nLen)856 void DumpSprms( sal_uInt8 nVersion, SvStream& rSt, short nLen )
857 {
858 if( nLen <= 1 || rSt.IsEof() ){
859 return;
860 }
861 begin( *pOut, rSt ) << "Sprms" << endl1;
862 while ( nLen > 1 )
863 {
864 nLen = DumpSprm( nVersion, rSt, nLen );
865 }
866 end( *pOut, rSt ) << "Sprms" << endl1;
867 }
868
869 // DumpMemSprm() dumpt ein 2-Byte-Sprm, der im WW8_PCD eingebaut ist
DumpMemSprm(sal_uInt8 nVersion,sal_Int16 * pSprm)870 static void DumpMemSprm( sal_uInt8 nVersion, sal_Int16* pSprm )
871 {
872 sal_uInt8* p = (sal_uInt8*)pSprm;
873 sal_uInt16 nId = WW8GetSprmId( nVersion, p, 0 );
874
875 *pOut << (sal_uInt16)p[0]; // Ausgabe: Token in Dez
876 *pOut << '/' << WW8GetSprmSizeBrutto( nVersion, p, &nId ); // Laenge incl. alles in Dez
877 *pOut << '/' << WW8GetSprmSizeNetto( nVersion, p, &nId ); // Laenge excl Token in Dez
878
879 *pOut << " = " << WW8GetSprmDumpInfo( nId ).pName;
880
881 *pOut << " 0x" << hex2 << *(p + 1);
882 }
883
884
885 //-----------------------------------------
886 // Hilfsroutinen: SEPX
887 //-----------------------------------------
DumpSepx(sal_uInt8 nVersion,long nPos)888 void DumpSepx( sal_uInt8 nVersion, long nPos )
889 {
890 sal_uInt16 nLen;
891 xStrm->Seek( nPos );
892 begin( *pOut, *xStrm ) << "Sepx, Len: ";
893 xStrm->Read( &nLen, 2 );
894 *pOut << nLen << endl1;
895
896 DumpSprms( nVersion, *xStrm, nLen );
897
898 end( *pOut, *xStrm ) << "Sepx" << endl1;
899 }
900
901
902 //-----------------------------------------
903 // Hilfsroutinen: FKP.CHPX, FKP.PAPX
904 //-----------------------------------------
DumpPhe(WW8_PHE_Base & rPhe)905 static void DumpPhe( WW8_PHE_Base& rPhe )
906 {
907 if( rPhe.aBits1 == 0 && rPhe.nlMac == 0
908 && SVBT16ToShort( rPhe.dxaCol ) == 0
909 && SVBT16ToShort( rPhe.dyl ) == 0 )
910 {
911 *pOut << indent2 << " empty PHE" << endl1;
912 }
913 else
914 {
915 *pOut << begin2 << "PHE" << endl1;
916 *pOut << indent2 << "fSpare: " << ( rPhe.aBits1 & 0x1 );
917 *pOut << ", fUnk: " << (( rPhe.aBits1 >> 1 ) & 1 );
918 *pOut << ", fDiffLines: " << (( rPhe.aBits1 >> 2 ) & 1 );
919 *pOut << ", unused: " << (( rPhe.aBits1 >> 3 ) & 0x1F )
920 << " (" << (short)(( rPhe.aBits1 >> 2 ) & 0x3F ) +
921 (((short)rPhe.nlMac) << 8)
922 << ")";
923 *pOut << ", nLines: " << (short)rPhe.nlMac << ',' << endl1;
924 *pOut << indent2 << "dxaCol: " << (short)SVBT16ToShort( rPhe.dxaCol );
925 if( rPhe.aBits1 & 0x4 )
926 {
927 *pOut << ", total height: " << (sal_uInt16)SVBT16ToShort( rPhe.dyl );
928 }
929 else
930 {
931 *pOut << ", height per line: " << (short)SVBT16ToShort( rPhe.dyl );
932 *pOut << ", total height: " << rPhe.nlMac * (short)SVBT16ToShort( rPhe.dyl );
933 }
934 *pOut << endl1;
935 *pOut << end2 << "PHE" << endl1;
936 }
937 }
938
939 //typedef enum{ CHP=0, PAP, SEP, PLC_END }ePlcT;
940 static char* NameTab[PLCF_END+4]={ "chpx", "papx", "sepx", "head",
941 "FootnoteRef", "EndnoteRef",
942 "AnnotationRef" };
943
DumpFkp(sal_uInt8 nVersion,long nPos,short nItemSize,ePLCFT ePlc)944 void DumpFkp( sal_uInt8 nVersion, long nPos, short nItemSize, ePLCFT ePlc )
945 {
946 char nElem;
947
948 xStrm->Seek( nPos+511 );
949 xStrm->Read( &nElem, 1 );
950
951
952 *pOut << 'D' << hex6 << nPos << dec2 << ' ' << indent1 << begin1 << "Fkp.";
953 *pOut << NameTab[ePlc] << ", ";
954 *pOut << (sal_uInt16)nElem << " Elements" << endl1;
955
956 int i;
957 WW8_FC aF[2];
958 sal_uInt8 c;
959 long nStartOfs = nPos + ( nElem + 1 ) * 4; // bei dieser Pos faengt Offset-Array an
960 short nOfs;
961 WW8_PHE_Base aPhe;
962
963 for( i=0; i<nElem; i++ )
964 {
965 xStrm->Seek( nPos + i * 4 );
966 indent( *pOut, *xStrm );
967 xStrm->Read( aF, sizeof( aF ) ); // lese 2 FCs
968
969 xStrm->Seek( nStartOfs + i * nItemSize );
970 xStrm->Read( &c, 1 ); // lese Word Offset ( evtl. Teil von BX )
971 if( ePlc == PAP )
972 xStrm->Read( &aPhe, sizeof( aPhe ) );
973
974 nOfs= c * 2; // -> Byte Offset
975 xStrm->Seek( nPos + nOfs );
976 xStrm->Read( &c, 1 );
977
978 if( !c )
979 xStrm->Read( &c, 1 );
980
981 *pOut << "Fc: " << hex << aF[0] << ".." << aF[1];
982 *pOut << " Cp: " << pSBase->WW8Fc2Cp( aF[0] )
983 << ".." << pSBase->WW8Fc2Cp( aF[1] );
984 *pOut << " Offset: " << nOfs << dec2;
985 if ( nOfs )
986 {
987 switch ( ePlc )
988 {
989 case CHP:
990 *pOut << ", Len: " << (short)c << endl1;
991 DumpSprms( nVersion, *xStrm, (short)c );
992 break;
993
994 case PAP:
995 short nLen = c * 2; // So weit bis zum naechsten !
996
997 short nIStd;
998
999 WW8ReadINT16( *xStrm, nIStd );
1000
1001 *pOut << ", Len max: " << nLen << ", ID:" << nIStd << endl1;
1002 DumpSprms( nVersion, *xStrm, nLen - 2 );
1003 DumpPhe( aPhe );
1004 break;
1005 }
1006 }
1007 else
1008 {
1009 *pOut << dec2 << " No attribute" << endl1;
1010 }
1011
1012 }
1013 end( *pOut, *xStrm ) << "Fkp." << NameTab[ePlc] << endl1;
1014 }
1015
1016 //-----------------------------------------
1017 // WW8_DOP ( Document Properties )
1018 //-----------------------------------------
1019
1020 //!!! WW8LoadDop gibt's jetzt auch in WW8scan.cxx
DumpDop(WW8Fib & rFib)1021 void DumpDop( WW8Fib& rFib )
1022 {
1023 // nicht loeschen!
1024 xTableStream->Seek( rFib.fcDop ); // diese Aktion dient lediglich dazu, die
1025 // Positions-Ausgabe der folgenden Anweisung
1026 // mit dem alten Dumper uebereinstimmen zu lassen.
1027
1028 // *pOut << begin( *pOut, *xTableStream ) << "Dop, Size " << rFib.lcbDop << ", DefaultSize 84" << endl1;
1029 begin( *pOut, *xTableStream ) << "Dop, Size " << rFib.lcbDop << ", DefaultSize 84" << endl1;
1030
1031 WW8Dop* pD = new WW8Dop( *xTableStream, rFib.nFib, rFib.fcDop, rFib.lcbDop );
1032
1033 *pOut << indent2 << "fFacingPages : " << pD->fFacingPages << endl1;
1034 *pOut << indent2 << "fWidowControl : " << pD->fWidowControl << endl1;
1035 *pOut << indent2 << "fPMHMainDoc : " << pD->fPMHMainDoc << endl1;
1036 *pOut << indent2 << "grfSuppression : " << pD->grfSuppression << endl1;
1037 *pOut << indent2 << "fpc : " << pD->fpc << endl1;
1038 *pOut << indent2 << "grpfIhdt : " << pD->grpfIhdt << endl1;
1039 *pOut << indent2 << "rncFtn : " << pD->rncFtn << endl1;
1040 *pOut << indent2 << "nFtn : " << pD->nFtn << endl1;
1041 *pOut << indent2 << "fOutlineDirtySave : " << pD->fOutlineDirtySave << endl1;
1042 *pOut << indent2 << "fOnlyMacPics : " << pD->fOnlyMacPics << endl1;
1043 *pOut << indent2 << "fOnlyWinPics : " << pD->fOnlyWinPics << endl1;
1044 *pOut << indent2 << "fLabelDoc : " << pD->fLabelDoc << endl1;
1045 *pOut << indent2 << "fHyphCapitals : " << pD->fHyphCapitals << endl1;
1046 *pOut << indent2 << "fAutoHyphen : " << pD->fAutoHyphen << endl1;
1047 *pOut << indent2 << "fFormNoFields : " << pD->fFormNoFields << endl1;
1048 *pOut << indent2 << "fLinkStyles : " << pD->fLinkStyles << endl1;
1049 *pOut << indent2 << "fRevMarking : " << pD->fRevMarking << endl1;
1050 *pOut << indent2 << "fBackup : " << pD->fBackup << endl1;
1051 *pOut << indent2 << "fExactCWords : " << pD->fExactCWords << endl1;
1052 *pOut << indent2 << "fPagHidden : " << pD->fPagHidden << endl1;
1053 *pOut << indent2 << "fPagResults : " << pD->fPagResults << endl1;
1054 *pOut << indent2 << "fLockAtn : " << pD->fLockAtn << endl1;
1055 *pOut << indent2 << "fMirrorMargins : " << pD->fMirrorMargins << endl1;
1056 *pOut << indent2 << "fReadOnlyRecommended : " << pD->fReadOnlyRecommended << endl1;
1057 *pOut << indent2 << "fDfltTrueType : " << pD->fDfltTrueType << endl1;
1058 *pOut << indent2 << "fPagSuppressTopSpacing : " << pD->fPagSuppressTopSpacing << endl1;
1059 *pOut << indent2 << "fProtEnabled : " << pD->fProtEnabled << endl1;
1060 *pOut << indent2 << "fDispFormFldSel : " << pD->fDispFormFldSel << endl1;
1061 *pOut << indent2 << "fRMView : " << pD->fRMView << endl1;
1062 *pOut << indent2 << "fRMPrint : " << pD->fRMPrint << endl1;
1063 *pOut << indent2 << "fWriteReservation : " << pD->fWriteReservation << endl1;
1064 *pOut << indent2 << "fLockRev : " << pD->fLockRev << endl1;
1065 *pOut << indent2 << "fEmbedFonts : " << pD->fEmbedFonts << endl1;
1066 *pOut << indent2 << "copts_fNoTabForInd : " << pD->copts_fNoTabForInd << endl1;
1067 *pOut << indent2 << "copts_fNoSpaceRaiseLower : " << pD->copts_fNoSpaceRaiseLower << endl1;
1068 *pOut << indent2 << "copts_fSupressSpbfAfterPgBrk : " << pD->copts_fSupressSpbfAfterPgBrk << endl1;
1069 *pOut << indent2 << "copts_fWrapTrailSpaces : " << pD->copts_fWrapTrailSpaces << endl1;
1070 *pOut << indent2 << "copts_fMapPrintTextColor : " << pD->copts_fMapPrintTextColor << endl1;
1071 *pOut << indent2 << "copts_fNoColumnBalance : " << pD->copts_fNoColumnBalance << endl1;
1072 *pOut << indent2 << "copts_fConvMailMergeEsc : " << pD->copts_fConvMailMergeEsc << endl1;
1073 *pOut << indent2 << "copts_fSupressTopSpacing : " << pD->copts_fSupressTopSpacing << endl1;
1074 *pOut << indent2 << "copts_fOrigWordTableRules : " << pD->copts_fOrigWordTableRules << endl1;
1075 *pOut << indent2 << "copts_fTransparentMetafiles : " << pD->copts_fTransparentMetafiles << endl1;
1076 *pOut << indent2 << "copts_fShowBreaksInFrames : " << pD->copts_fShowBreaksInFrames << endl1;
1077 *pOut << indent2 << "copts_fSwapBordersFacingPgs : " << pD->copts_fSwapBordersFacingPgs << endl1;
1078 *pOut << indent2 << "dxaTab : " << pD->dxaTab << endl1;
1079 *pOut << indent2 << "wSpare : " << pD->wSpare << endl1;
1080 *pOut << indent2 << "dxaHotZ : " << pD->dxaHotZ << endl1;
1081 *pOut << indent2 << "cConsecHypLim : " << pD->cConsecHypLim << endl1;
1082 *pOut << indent2 << "wSpare2 : " << pD->wSpare2 << endl1;
1083 *pOut << indent2 << "dttmCreated : " << pD->dttmCreated << endl1;
1084 *pOut << indent2 << "dttmRevised : " << pD->dttmRevised << endl1;
1085 *pOut << indent2 << "dttmLastPrint : " << pD->dttmLastPrint << endl1;
1086 *pOut << indent2 << "nRevision : " << pD->nRevision << endl1;
1087 *pOut << indent2 << "tmEdited : " << pD->tmEdited << endl1;
1088 *pOut << indent2 << "cWords : " << pD->cWords << endl1;
1089 *pOut << indent2 << "cCh : " << pD->cCh << endl1;
1090 *pOut << indent2 << "cPg : " << pD->cPg << endl1;
1091 *pOut << indent2 << "cParas : " << pD->cParas << endl1;
1092 *pOut << indent2 << "rncEdn : " << pD->rncEdn << endl1;
1093 *pOut << indent2 << "nEdn : " << pD->nEdn << endl1;
1094 *pOut << indent2 << "epc : " << pD->epc << endl1;
1095 *pOut << indent2 << "fPrintFormData : " << pD->fPrintFormData << endl1;
1096 *pOut << indent2 << "fSaveFormData : " << pD->fSaveFormData << endl1;
1097 *pOut << indent2 << "fShadeFormData : " << pD->fShadeFormData << endl1;
1098 *pOut << indent2 << "fWCFtnEdn : " << pD->fWCFtnEdn << endl1;
1099 *pOut << indent2 << "cLines : " << pD->cLines << endl1;
1100 *pOut << indent2 << "cWordsFtnEnd : " << pD->cWordsFtnEnd << endl1;
1101 *pOut << indent2 << "cChFtnEdn : " << pD->cChFtnEdn << endl1;
1102 *pOut << indent2 << "cPgFtnEdn : " << pD->cPgFtnEdn << endl1;
1103 *pOut << indent2 << "cParasFtnEdn : " << pD->cParasFtnEdn << endl1;
1104 *pOut << indent2 << "cLinesFtnEdn : " << pD->cLinesFtnEdn << endl1;
1105 *pOut << indent2 << "lKeyProtDoc : " << pD->lKeyProtDoc << endl1;
1106 *pOut << indent2 << "wvkSaved : " << pD->wvkSaved << endl1;
1107 *pOut << indent2 << "wScaleSaved : " << pD->wScaleSaved << endl1;
1108 *pOut << indent2 << "zkSaved : " << pD->zkSaved << endl1;
1109 *pOut << indent2 << "fNoTabForInd : " << pD->fNoTabForInd << endl1;
1110 *pOut << indent2 << "fNoSpaceRaiseLower : " << pD->fNoSpaceRaiseLower << endl1;
1111 *pOut << indent2 << "fSupressSpbfAfterPageBreak : " << pD->fSupressSpbfAfterPageBreak << endl1;
1112 *pOut << indent2 << "fWrapTrailSpaces : " << pD->fWrapTrailSpaces << endl1;
1113 *pOut << indent2 << "fMapPrintTextColor : " << pD->fMapPrintTextColor << endl1;
1114 *pOut << indent2 << "fNoColumnBalance : " << pD->fNoColumnBalance << endl1;
1115 *pOut << indent2 << "fConvMailMergeEsc : " << pD->fConvMailMergeEsc << endl1;
1116 *pOut << indent2 << "fSupressTopSpacing : " << pD->fSupressTopSpacing << endl1;
1117 *pOut << indent2 << "fOrigWordTableRules : " << pD->fOrigWordTableRules << endl1;
1118 *pOut << indent2 << "fTransparentMetafiles : " << pD->fTransparentMetafiles << endl1;
1119 *pOut << indent2 << "fShowBreaksInFrames : " << pD->fShowBreaksInFrames << endl1;
1120 *pOut << indent2 << "fSwapBordersFacingPgs : " << pD->fSwapBordersFacingPgs << endl1;
1121 *pOut << indent2 << "fSuppressTopSpacingMac5 : " << pD->fSuppressTopSpacingMac5 << endl1;
1122 *pOut << indent2 << "fTruncDxaExpand : " << pD->fTruncDxaExpand << endl1;
1123 *pOut << indent2 << "fPrintBodyBeforeHdr : " << pD->fPrintBodyBeforeHdr << endl1;
1124 *pOut << indent2 << "fNoLeading : " << pD->fNoLeading << endl1;
1125 *pOut << indent2 << "fMWSmallCaps : " << pD->fMWSmallCaps << endl1;
1126
1127 *pOut << indent2 << "adt : " << pD->adt << endl1;
1128
1129 *pOut << indent2 << "lvl : " << pD->lvl << endl1;
1130 *pOut << indent2 << "fHtmlDoc : " << pD->fHtmlDoc << endl1;
1131 *pOut << indent2 << "fSnapBorder : " << pD->fSnapBorder << endl1;
1132 *pOut << indent2 << "fIncludeHeader : " << pD->fIncludeHeader << endl1;
1133 *pOut << indent2 << "fIncludeFooter : " << pD->fIncludeFooter << endl1;
1134 *pOut << indent2 << "fForcePageSizePag : " << pD->fForcePageSizePag << endl1;
1135 *pOut << indent2 << "fMinFontSizePag : " << pD->fMinFontSizePag << endl1;
1136
1137 *pOut << indent2 << "fHaveVersions : " << pD->fHaveVersions << endl1;
1138 *pOut << indent2 << "fAutoVersion : " << pD->fAutoVersion << endl1;
1139 *pOut << indent2 << "cChWS : " << pD->cChWS << endl1;
1140 *pOut << indent2 << "cChWSFtnEdn : " << pD->cChWSFtnEdn << endl1;
1141 *pOut << indent2 << "grfDocEvents : " << pD->grfDocEvents << endl1;
1142 *pOut << indent2 << "cDBC : " << pD->cDBC << endl1;
1143 *pOut << indent2 << "cDBCFtnEdn : " << pD->cDBCFtnEdn << endl1;
1144 *pOut << indent2 << "nfcFtnRef : " << pD->nfcFtnRef << endl1;
1145 *pOut << indent2 << "nfcEdnRef : " << pD->nfcEdnRef << endl1;
1146 *pOut << indent2 << "hpsZoonFontPag : " << pD->hpsZoonFontPag << endl1;
1147 *pOut << indent2 << "dywDispPag : " << pD->dywDispPag << endl1;
1148
1149 end( *pOut, *xStrm ) << "Dop" << endl1 << endl1;
1150
1151 DELETEZ( pD );
1152 }
1153
1154 //-----------------------------------------
1155 // PLCF.PCD ( Piece Table )
1156 //-----------------------------------------
1157
1158 #ifdef __WW8_NEEDS_PACK
1159 # pragma pack(2)
1160 #endif
1161
1162 struct WW8_PCD1
1163 {
1164 sal_uInt8 aBits1;
1165 sal_uInt8 aBits2;
1166 // sal_Int16 fNoParaLast : 1; // when 1, means that piece contains no end of parag
1167 // sal_uInt8 fPaphNil : 1; // used internally by Word
1168 // sal_uInt8 fCopied : 1; // used internally by Word
1169 // * int :5
1170 // sal_uInt8 aBits2; // fn int:8, used internally by Word
1171 sal_Int32 fc; // file offset of beginning of piece. The size of th
1172 sal_Int16 prm; // PRM contains either a single sprm or else an inde
1173 };
1174
1175 #ifdef __WW8_NEEDS_PACK
1176 # pragma pack()
1177 #endif
1178
DumpPLCFPcd(sal_uInt8 nVersion,long nPos,long nLen)1179 static void DumpPLCFPcd( sal_uInt8 nVersion, long nPos, long nLen )
1180 {
1181 WW8PLCF aPlc( &xTableStream, nPos , nLen, 8 );
1182
1183 *pOut << 'D' << hex6 << nPos << dec2 << ' ' << indent1 << begin1;
1184 *pOut << "Plcx.Pcd, Len: ";
1185 *pOut << nLen << ", " << aPlc.GetIMax() << " Elements" << endl1;
1186
1187 int i;
1188 for( i=0; i<aPlc.GetIMax(); i++ )
1189 {
1190 long start, ende;
1191 void* pData;
1192 aPlc.Get( start, ende, pData );
1193 *pOut << indent2 << " Cp: " << hex6 << start << ".." << hex6 << ende;
1194
1195 WW8_PCD1* p = (WW8_PCD1*) pData;
1196 *pOut << ", Bits: " << hex2 << (sal_uInt16)p->aBits1 << ' '
1197 << hex2 << (sal_uInt16)p->aBits2;
1198 *pOut << ", FcStart: ";
1199 if( 8 <= nVersion )
1200 {
1201 sal_Bool bUniCode;
1202 *pOut << hex6
1203 << WW8PLCFx_PCD::TransformPieceAddress( p->fc, bUniCode );
1204 if( bUniCode )
1205 *pOut << " (UniCode)";
1206 }
1207 else
1208 *pOut << hex6 << p->fc;
1209
1210 *pOut << dec << ", prm ";
1211 if( p->prm & 0x1 ){
1212 *pOut << "No: " << ( p->prm >> 1 );
1213 }else if ( p-> prm == 0 ){
1214 *pOut << "-";
1215 }else{
1216 *pOut << "(Sprm): ";
1217 DumpMemSprm( nVersion, &(p->prm) );
1218 }
1219 *pOut << endl1;
1220
1221 aPlc++;
1222 }
1223 end( *pOut, *xTableStream ) << "Plcx.Pcd" << endl1;
1224 }
1225
DumpPcd(sal_uInt8 nVersion,long nPos,long nLen)1226 static void DumpPcd( sal_uInt8 nVersion, long nPos, long nLen )
1227 {
1228 long nLen1 = nLen;
1229 xTableStream->Seek( nPos );
1230
1231 *pOut << 'D' << hex6 << nPos << dec2 << ' ' << indent1 << begin1;
1232 *pOut << "PieceTable, Len: " << nLen << endl1;
1233 if( sizeof( WW8_PCD1 ) != 8 )
1234 *pOut << "!!! Alignment-Problem !!! sizeof( WW8_PCD1 ) != 8 !!! " << endl1;
1235
1236 long i = 0;
1237 while (1){
1238 sal_uInt8 c;
1239 sal_Int16 cb;
1240
1241 xTableStream->Read( &c, 1 );
1242 nLen1 --;
1243 if( c == 2 )
1244 break;
1245 xTableStream->Read( &cb, 2 );
1246 nLen1 -= 2;
1247 indent( *pOut, *xTableStream ) << "grpprl No. " << i << ", Len: " << cb << endl1;
1248
1249 long nPos = xTableStream->Tell();
1250 DumpSprms( nVersion, *xTableStream, cb ); // Dumpe Sprms
1251 xTableStream->Seek( nPos + cb ); // gehe hinter grpprl
1252 nLen1 -= cb;
1253 i++;
1254 // *pOut << " " << indent1 << "grpprl: " << cb << "Bytes ueberlesen";
1255 // *pOut << endl1;
1256 }
1257 sal_Int32 nLen2;
1258 xTableStream->Read( &nLen2, 4 );
1259 nLen1 -= 4;
1260 if( nLen1 != nLen2 )
1261 *pOut << "!!! nLen1 ( " << nLen1 << " ) != nLen2 ( " << nLen2 << " ) !"
1262 << endl1;
1263
1264 DumpPLCFPcd( nVersion, xTableStream->Tell(), nLen2 );
1265
1266 end( *pOut, *xTableStream ) << "PieceTable" << endl1 << endl1;
1267 }
1268
1269 //-----------------------------------------
1270 // PLCF.CHPX, PLCF.PAPX, PLCF.SEPX
1271 //-----------------------------------------
1272
DumpPLCF(long nPos,long nLen,ePLCFT ePlc)1273 static void DumpPLCF( long nPos, long nLen, ePLCFT ePlc )
1274 {
1275 static int __READONLY_DATA WW8FkpSizeTabVer6[ PLCF_END ] = {
1276 1, 7, 0 /*, 0, 0, 0*/ };
1277 static int __READONLY_DATA PlcSizeTabVer6[ PLCF_END+4 ] = {
1278 2, 2, 12, 0, 2, 2, 20 };
1279
1280 static int __READONLY_DATA WW8FkpSizeTabVer8[ PLCF_END ] = {
1281 1, 13, 0 /*, 0, 0, 0*/ };
1282 static int __READONLY_DATA PlcSizeTabVer8[ PLCF_END+4 ] = {
1283 4, 4, 12, 0, 2, 2, 30 };
1284
1285 const int* pFkpSizeTab;
1286 const int* pPlcSizeTab;
1287
1288 switch( pWwFib->nVersion )
1289 {
1290 case 6:
1291 case 7: pFkpSizeTab = WW8FkpSizeTabVer6;
1292 pPlcSizeTab = PlcSizeTabVer6;
1293 break;
1294 case 8: pFkpSizeTab = WW8FkpSizeTabVer8;
1295 pPlcSizeTab = PlcSizeTabVer8;
1296 break;
1297 default:// Programm-Fehler!
1298 /*
1299 ACHTUNG: im FILTER nicht "sal_False" sondern "!this()" schreiben,
1300 da sonst Warning unter OS/2
1301 */
1302 ASSERT( sal_False, "Es wurde vergessen, nVersion zu kodieren!" );
1303 return;
1304 }
1305
1306 // SvStream* pSt = (SEP == ePlc) ? &xTableStream : &xStrm;
1307 SvStream* pSt = &xTableStream;
1308
1309 WW8PLCF aPlc( pSt, nPos, nLen, pPlcSizeTab[ ePlc ] );
1310
1311 *pOut << 'T' << hex6 << nPos << dec2 << ' ' << indent1 << begin1;
1312 *pOut << "Plcx." << NameTab[ePlc] << ", Len: ";
1313 *pOut << nLen << ", " << aPlc.GetIMax() << " Elements" << endl1;
1314
1315 int i;
1316 for( i=0; i<aPlc.GetIMax(); i++ )
1317 {
1318 long start, ende;
1319 void* pData;
1320 aPlc.Get( start, ende, pData );
1321 *pOut << indent2 << "Plcx." << NameTab[ePlc];
1322 switch( ePlc ){
1323 case SEP: {
1324 *pOut << " Cp: " << hex << start << ".." << ende ;
1325 long nPo = *((long*)((char*)pData+2));
1326 if( nPo == 0xffffffffL )
1327 {
1328 *pOut << " Empty" << endl1;
1329 }
1330 else
1331 {
1332 *pOut << ", Sepx-Position: " << nPo << dec << endl1;
1333 DumpSepx( pWwFib->nVersion, nPo );
1334 }
1335 }
1336 break;
1337 case CHP:
1338 case PAP: {
1339 *pOut << " Fc: " << hex << start << ".." << ende ;
1340 long nPo;
1341 switch( pWwFib->nVersion )
1342 {
1343 case 6:
1344 case 7: nPo = *((sal_uInt16*)pData);
1345 break;
1346 case 8: nPo = *((sal_uInt32*)pData);
1347 break;
1348 default:// Programm-Fehler!
1349 /*
1350 ACHTUNG: im FILTER nicht "sal_False" sondern "!this()" schreiben,
1351 da sonst Warning unter OS/2
1352 */
1353 ASSERT( sal_False, "Es wurde vergessen, nVersion zu kodieren!" );
1354 return;
1355 }
1356
1357 nPo <<= 9;
1358 *pOut << ", Offset: " << nPo << dec << endl1;
1359 DumpFkp( pWwFib->nVersion, nPo, pFkpSizeTab[ ePlc ], ePlc );
1360 }
1361 break;
1362
1363 case PLCF_END+0:
1364 *pOut << " Cp: " << hex << start << ".." << ende << dec << endl1;
1365 break;
1366
1367 case PLCF_END+1:
1368 case PLCF_END+2:
1369 {
1370 *pOut << " Cp: " << hex << start;
1371 sal_uInt16 nFlags= *((sal_uInt16*)pData);
1372 *pOut << ", Flags: 0x" << nFlags << dec << endl1;
1373 }
1374 break;
1375
1376 case PLCF_END+3:
1377 {
1378 *pOut << " Cp: " << hex << start << ", Initial: \"";
1379 const char* p = (char*)pData;
1380 sal_uInt8 n = *p++;
1381 while( n-- )
1382 {
1383 if( 8 == pWwFib->nVersion )
1384 ++p;
1385 *pOut << *p++;
1386 }
1387
1388 long nBkmkId;
1389 sal_uInt16 nId;
1390 if( 8 == pWwFib->nVersion )
1391 {
1392 nId = SVBT16ToShort( ((WW8_ATRD*)pData)->ibst );
1393 nBkmkId = SVBT32ToUInt32( ((WW8_ATRD*)pData)->ITagBkmk );
1394 }
1395 else
1396 {
1397 nId = SVBT16ToShort( ((WW67_ATRD*)pData )->ibst );
1398 nBkmkId = SVBT32ToUInt32( ((WW67_ATRD*)pData )->ITagBkmk );
1399 }
1400
1401 *pOut << "\", AutorId: " << hex << nId
1402 << " BkmkId: " << nBkmkId << dec <<endl1;
1403 }
1404 break;
1405
1406 }
1407 aPlc++;
1408 }
1409 end( *pOut, *xTableStream ) << "Plcx." << NameTab[ePlc] << endl1 << endl1;
1410 }
1411
1412 //-----------------------------------------
1413 // Text ohne Attribute
1414 //-----------------------------------------
1415
DumpPlainText1(WW8_CP nStartCp,long nTextLen)1416 static void DumpPlainText1( WW8_CP nStartCp, long nTextLen )
1417 {
1418 long l;
1419 sal_uInt8 c;
1420
1421
1422 xStrm->Seek( pSBase->WW8Cp2Fc( nStartCp ) );
1423
1424 for (l=0; l<nTextLen; l++)
1425 {
1426 xStrm->Read( &c, sizeof(c) );
1427 if ( DumpChar( c ) )
1428 {
1429 *pOut << endl1;
1430 indent( *pOut, *xStrm );
1431 }
1432 // DumpChar( c );
1433 }
1434 }
1435
DumpShortPlainText(WW8_CP nStartCp,long nTextLen,char * pName)1436 void DumpShortPlainText( WW8_CP nStartCp, long nTextLen, char* pName )
1437 {
1438 indent( *pOut, *xStrm ) << pName << " PlainText: Cp: "
1439 << hex << nStartCp
1440 << ".." << nStartCp + nTextLen << dec
1441 << " :\"";
1442 DumpPlainText1( nStartCp, nTextLen );
1443 *pOut << "\"" << endl1;
1444 }
1445
DumpPlainText(WW8_CP nStartCp,long nTextLen,char * pName)1446 void DumpPlainText( WW8_CP nStartCp, long nTextLen, char* pName )
1447 {
1448 begin( *pOut, *xStrm ) << pName << " Text: Cp: " << hex << nStartCp
1449 << ".." << nStartCp + nTextLen << dec
1450 << endl1;
1451 indent( *pOut, *xStrm );
1452 DumpPlainText1( nStartCp, nTextLen );
1453 *pOut << endl1;
1454 end( *pOut, *xStrm ) << pName << " Text" << endl1;
1455 }
1456
1457 //-----------------------------------------
1458 // Text mit Attributen
1459 //-----------------------------------------
1460
DumpChar(sal_uInt8 c)1461 sal_Bool DumpChar( sal_uInt8 c )
1462 {
1463 if ( ( c >= 32 ) && ( c <= 127 ) ){
1464 *pOut << c;
1465 return sal_False;
1466 }else{
1467 switch (c){
1468 case 0xe4: // dt. Umlaute
1469 case 0xf6:
1470 case 0xfc:
1471 case 0xdf:
1472 case 0xc4:
1473 case 0xd6:
1474 case 0xdc: *pOut << c; return sal_False;
1475
1476 case 0xd: *pOut << "<CR>";
1477 return sal_True;
1478 case 0x7:
1479 case 0xc: *pOut << "<0x" << hex2 << (sal_uInt16)c << dec2 << '>';
1480 return sal_True;
1481 default: *pOut << "<0x" << hex2 << (sal_uInt16)c << dec2 << '>';
1482 return sal_False;
1483 }
1484 }
1485 }
1486
1487 //-----------------------------------------
1488 // Header / Footer
1489 //-----------------------------------------
1490
DumpPlcText(WW8_FC nPos,long nLen,long nOfs,char * pName,WW8ScannerBase * pBase,long nStruct=0,FNDumpData pOutFnc=0)1491 static void DumpPlcText( WW8_FC nPos, long nLen, long nOfs,
1492 char* pName, WW8ScannerBase* pBase,
1493 long nStruct = 0, FNDumpData pOutFnc = 0 )
1494 {
1495 if( !nLen ) return;
1496
1497 WW8PLCF aPlc( &xTableStream, nPos , nLen, nStruct );
1498
1499 *pOut << 'T' << hex6 << nPos << dec2 << ' ' << indent1 << begin1;
1500 *pOut << "Plc." << pName << " Text, Len: ";
1501 *pOut << nLen << ", " << aPlc.GetIMax() << " Elements" << endl1;
1502
1503 int i;
1504 for( i=0; i < aPlc.GetIMax(); ++i )
1505 {
1506 WW8_CP start, ende;
1507 WW8_FC start2, ende2;
1508 void* pData;
1509 aPlc.Get( start, ende, pData );
1510 start2 = pSBase->WW8Cp2Fc(start + nOfs );
1511 ende2 = pSBase->WW8Cp2Fc(ende + nOfs );
1512
1513 *pOut << " " << indent1 << "Plcx." << pName;
1514 *pOut << " Cp: " << hex << start << ".." << ende;
1515 *pOut << " entspricht Fc: " << start2 << ".." << ende2 << dec << endl1;
1516
1517 DumpPlainText( nOfs + start, ende - start - 1, pName );
1518
1519 if( pOutFnc )
1520 (*pOutFnc)( pData );
1521 aPlc++;
1522 }
1523 end( *pOut, *xTableStream ) << "Plcx." << pName << endl1 << endl1;
1524 }
1525
DumpHeader(WW8ScannerBase * pBase)1526 void DumpHeader( WW8ScannerBase* pBase )
1527 {
1528 DumpPlcText( pWwFib->fcPlcfhdd,
1529 pWwFib->lcbPlcfhdd,
1530 pWwFib->ccpText + pWwFib->ccpFtn,
1531 "Header/Footer", pBase );
1532 }
1533
DumpFootnotes(WW8ScannerBase * pBase)1534 static void DumpFootnotes( WW8ScannerBase* pBase )
1535 {
1536 if( !pWwFib->lcbPlcffndRef ){
1537 *pOut << "No Footnotes" << endl1 << endl1;
1538 return;
1539 }
1540
1541 DumpPLCF( pWwFib->fcPlcffndRef,
1542 pWwFib->lcbPlcffndRef,
1543 ePLCFT(/*FNR*/PLCF_END + 1) );
1544 DumpPlcText( pWwFib->fcPlcffndTxt,
1545 pWwFib->lcbPlcffndTxt,
1546 pWwFib->ccpText,
1547 "FootNote" , pBase );
1548 }
1549
DumpEndnotes(WW8ScannerBase * pBase)1550 static void DumpEndnotes( WW8ScannerBase* pBase )
1551 {
1552 if( !pWwFib->lcbPlcfendRef ){
1553 *pOut << "No Endnotes" << endl1 << endl1;
1554 return;
1555 }
1556
1557 DumpPLCF( pWwFib->fcPlcfendRef,
1558 pWwFib->lcbPlcfendRef,
1559 ePLCFT(/*ENR*/PLCF_END + 2) );
1560 DumpPlcText( pWwFib->fcPlcfendTxt,
1561 pWwFib->lcbPlcfendTxt,
1562 pWwFib->ccpText + pWwFib->ccpFtn
1563 + pWwFib->ccpHdr + pWwFib->ccpAtn,
1564 "EndNote", pBase );
1565 }
1566
DumpAnnotations(WW8ScannerBase * pBase)1567 static void DumpAnnotations( WW8ScannerBase* pBase )
1568 {
1569 if( !pWwFib->lcbPlcfandRef ){
1570 *pOut << "No Annotations" << endl1 << endl1;
1571 return;
1572 }
1573
1574 DumpPLCF( pWwFib->fcPlcfandRef,
1575 pWwFib->lcbPlcfandRef,
1576 ePLCFT(/*ENR*/PLCF_END + 3) );
1577 DumpPlcText( pWwFib->fcPlcfandTxt,
1578 pWwFib->lcbPlcfandTxt,
1579 pWwFib->ccpText + pWwFib->ccpFtn
1580 + pWwFib->ccpHdr,
1581 "Annotation", pBase );
1582 }
1583
DumpTxtStoryEntry(void * pData)1584 void DumpTxtStoryEntry( void* pData )
1585 {
1586 if( 8 == pWwFib->nVersion )
1587 {
1588 long* p = (long*)pData;
1589 begin( *pOut, *xStrm )
1590 << "TextboxStory" << hex << endl1;
1591
1592 *pOut << " " << indent1 << "cTxbx/iNextReuse: 0x" << *p++;
1593 *pOut << " cReusable: 0x" << *p++;
1594 short* ps = (short*)p;
1595 *pOut << " fReusable: 0x" << *ps++ << endl1;
1596 p = (long*)ps;
1597 ++p; // reserved
1598 *pOut << " " << indent1 << "lid: 0x" << *p++;
1599 *pOut << " txidUndo: 0x" << *p++ << dec << endl1;
1600
1601 end( *pOut, *xStrm ) << "TextboxStory" << endl1 << endl1;
1602 }
1603 }
1604
DumpTextBoxs(WW8ScannerBase * pBase)1605 static void DumpTextBoxs( WW8ScannerBase* pBase )
1606 {
1607 if( pWwFib->lcbPlcftxbxTxt )
1608 {
1609 DumpPlcText( pWwFib->fcPlcftxbxTxt,
1610 pWwFib->lcbPlcftxbxTxt,
1611 pWwFib->ccpText + pWwFib->ccpFtn
1612 + pWwFib->ccpHdr + pWwFib->ccpAtn + pWwFib->ccpEdn,
1613 "TextBoxes", pBase,
1614 8 == pWwFib->nVersion ? 22 : 0, &DumpTxtStoryEntry );
1615 }
1616 else
1617 *pOut << "No Textboxes" << endl1 << endl1;
1618
1619 if( pWwFib->lcbPlcfHdrtxbxTxt )
1620 DumpPlcText( pWwFib->fcPlcfHdrtxbxTxt,
1621 pWwFib->lcbPlcfHdrtxbxTxt,
1622 pWwFib->ccpText + pWwFib->ccpFtn
1623 + pWwFib->ccpHdr + pWwFib->ccpAtn + pWwFib->ccpEdn
1624 + pWwFib->ccpTxbx,
1625 "HeaderTextBoxes", pBase,
1626 8 == pWwFib->nVersion ? 22 : 0, &DumpTxtStoryEntry );
1627 else
1628 *pOut << "No HeaderTextboxes" << endl1 << endl1;
1629
1630 }
1631
1632
DumpDrawObjects(const char * pNm,long nStart,long nLen,long nOffset)1633 static void DumpDrawObjects( const char* pNm, long nStart, long nLen,
1634 long nOffset )
1635 {
1636 if( nStart && nLen )
1637 {
1638 WW8PLCFspecial aPLCF( &xTableStream, nStart, nLen,
1639 8 == pWwFib->nVersion ? 26 : 6 );
1640 *pOut << 'T' << hex6 << nStart << dec2 << ' ' << indent1 << begin1
1641 << pNm << ", Len: " << nLen
1642 << ", " << aPLCF.GetIMax() << " Elements" << endl1;
1643
1644 for( sal_uInt16 i = 0; i < aPLCF.GetIMax(); ++i )
1645 {
1646 long nCp = aPLCF.GetPos( i );
1647 if( nCp >= LONG_MAX )
1648 break;
1649
1650 *pOut << indent2 << i << ".Cp: 0x" << hex << nCp + nOffset;
1651 long* pFSPA = (long*)aPLCF.GetData( i );
1652 if( 8 == pWwFib->nVersion )
1653 {
1654 *pOut << " ShapeId: 0x" << *pFSPA++;
1655 *pOut << " left: " << dec << *pFSPA++;
1656 *pOut << " top: " << *pFSPA++;
1657 *pOut << " right: " << *pFSPA++;
1658 *pOut << " bottom: " << *pFSPA++;
1659 sal_uInt16* pU = (sal_uInt16*)pFSPA;
1660 *pOut << " flags: 0x" << hex << *pU++;
1661 pFSPA = (long*)pU;
1662 *pOut << " xTxbx: " << dec << *pFSPA;
1663 }
1664 else
1665 {
1666 *pOut << " FC of DO: 0x" << *pFSPA++;
1667 *pOut << " ctcbx: " << dec << *(sal_uInt16*)pFSPA;
1668 }
1669
1670 *pOut << endl1;
1671 }
1672 *pOut << end1;
1673 }
1674 else
1675 *pOut << "No ";
1676 *pOut << pNm << endl1 << endl1;
1677 }
1678
DumpTxtboxBrks(const char * pNm,long nStart,long nLen,long nOffset)1679 static void DumpTxtboxBrks( const char* pNm, long nStart, long nLen,
1680 long nOffset )
1681 {
1682 if( nStart && nLen )
1683 {
1684 WW8PLCFspecial aPLCF( &xTableStream, nStart, nLen, 6 );
1685 *pOut << 'T' << hex6 << nStart << dec2 << ' ' << indent1 << begin1
1686 << pNm << ", Len: " << nLen
1687 << ", " << aPLCF.GetIMax() << " Elements" << endl1;
1688
1689 for( sal_uInt16 i = 0; i < aPLCF.GetIMax(); ++i )
1690 {
1691 long nCp = aPLCF.GetPos( i );
1692 if( nCp >= LONG_MAX )
1693 break;
1694
1695 sal_uInt16* pBKD = (sal_uInt16*)aPLCF.GetData( i );
1696 *pOut << indent2 << i << ".Cp: 0x" << hex << nCp + nOffset
1697 << " itxbxs: 0x" << *pBKD++;
1698 *pOut << " dcpDepend: 0x" << *pBKD++;
1699 *pOut << " flags: 0x" << hex << *pBKD << dec << endl1;
1700 }
1701 *pOut << end2;
1702 }
1703 else
1704 *pOut << "No ";
1705 *pOut << pNm << endl1 << endl1;
1706 }
1707
DumpFdoa(WW8ScannerBase * pBase)1708 static void DumpFdoa( WW8ScannerBase* pBase )
1709 {
1710 long nOffset = pWwFib->ccpText + pWwFib->ccpFtn
1711 + pWwFib->ccpHdr + pWwFib->ccpAtn + pWwFib->ccpEdn;
1712
1713 if( 8 == pWwFib->nVersion )
1714 {
1715 DumpDrawObjects( "DrawObjects in Maintext",
1716 pWwFib->fcPlcfspaMom, pWwFib->lcbPlcfspaMom,
1717 /*nOffset*/0 );
1718 // PLCF fuer TextBox-Break-Deskriptoren im Maintext
1719 DumpTxtboxBrks( "TextBox-Break-Desk. im Maintext",
1720 pWwFib->fcPlcftxbxBkd, pWwFib->lcbPlcftxbxBkd,
1721 nOffset );
1722 }
1723 else
1724 DumpDrawObjects( "DrawObjects in Maintext",
1725 pWwFib->fcPlcfdoaMom, pWwFib->lcbPlcfdoaMom,
1726 /*nOffset*/0 );
1727
1728 nOffset += pWwFib->ccpHdrTxbx;
1729
1730 if( 8 == pWwFib->nVersion )
1731 {
1732 DumpDrawObjects( "DrawObjects in Head/Foot",
1733 pWwFib->fcPlcfspaHdr, pWwFib->lcbPlcfspaHdr,
1734 /*nOffset*/0 );
1735 // PLCF fuer TextBox-Break-Deskriptoren im Header-/Footer-Bereich
1736 DumpTxtboxBrks( "TextBox-Break-Desk. im Head/Foot",
1737 pWwFib->fcPlcfHdrtxbxBkd, pWwFib->lcbPlcfHdrtxbxBkd,
1738 nOffset );
1739 }
1740 else
1741 DumpDrawObjects( "DrawObjects in Head/Foot",
1742 pWwFib->fcPlcfdoaHdr, pWwFib->lcbPlcfdoaHdr,
1743 /*nOffset*/0 );
1744 }
1745
ReadEsherRec(SvStream & rStrm,sal_uInt8 & rVer,sal_uInt16 & rInst,sal_uInt16 & rFbt,sal_uInt32 & rLength)1746 sal_Bool ReadEsherRec( SvStream& rStrm, sal_uInt8& rVer, sal_uInt16& rInst,
1747 sal_uInt16& rFbt, sal_uInt32& rLength )
1748 {
1749 sal_uInt16 aBits;
1750 if( !WW8ReadUINT16( rStrm, aBits ) ) return sal_False;
1751 rVer = aBits & 0x000F;
1752 rInst = (aBits & 0xFFF0) >> 4;
1753 //----------------------------------------------
1754 if( !WW8ReadUINT16( rStrm, rFbt ) ) return sal_False;
1755 //----------------------------------------------
1756 return WW8ReadUINT32( rStrm, rLength );
1757 }
1758
_GetShapeTypeNm(sal_uInt16 nId)1759 const char* _GetShapeTypeNm( sal_uInt16 nId )
1760 {
1761 const char* aNmArr[ 202 + 2 + 1 ] = {
1762 /* 0*/ "NotPrimitive","Rectangle","RoundRectangle","Ellipse","Diamond","IsocelesTriangle","RightTriangle","Parallelogram","Trapezoid","Hexagon",
1763 /* 10*/ "Octagon","Plus","Star","Arrow","ThickArrow","HomePlate","Cube","Balloon","Seal","Arc",
1764 /* 20*/ "Line","Plaque","Can","Donut","TextSimple","TextOctagon","TextHexagon","TextCurve","TextWave","TextRing",
1765 /* 30*/ "TextOnCurve","TextOnRing","StraightConnector1","BentConnector2","BentConnector3","BentConnector4","BentConnector5","CurvedConnector2","CurvedConnector3","CurvedConnector4",
1766 /* 40*/ "CurvedConnector5","Callout1","Callout2","Callout3","AccentCallout1","AccentCallout2","AccentCallout3","BorderCallout1","BorderCallout2","BorderCallout3",
1767 /* 50*/ "AccentBorderCallout1","AccentBorderCallout2","AccentBorderCallout3","Ribbon","Ribbon2","Chevron","Pentagon","NoSmoking","Seal8","Seal16",
1768 /* 60*/ "Seal32","WedgeRectCallout","WedgeRRectCallout","WedgeEllipseCallout","Wave","FoldedCorner","LeftArrow","DownArrow","UpArrow","LeftRightArrow",
1769 /* 70*/ "UpDownArrow","IrregularSeal1","IrregularSeal2","LightningBolt","Heart","PictureFrame","QuadArrow","LeftArrowCallout","RightArrowCallout","UpArrowCallout",
1770 /* 80*/ "DownArrowCallout","LeftRightArrowCallout","UpDownArrowCallout","QuadArrowCallout","Bevel","LeftBracket","RightBracket","LeftBrace","RightBrace","LeftUpArrow",
1771 /* 90*/ "BentUpArrow","BentArrow","Seal24","StripedRightArrow","NotchedRightArrow","BlockArc","SmileyFace","VerticalScroll","HorizontalScroll","CircularArrow",
1772 /* 100*/ "NotchedCircularArrow","UturnArrow","CurvedRightArrow","CurvedLeftArrow","CurvedUpArrow","CurvedDownArrow","CloudCallout","EllipseRibbon","EllipseRibbon2","FlowChartProcess",
1773 /* 110*/ "FlowChartDecision","FlowChartInputOutput","FlowChartPredefinedProcess","FlowChartInternalStorage","FlowChartDocument","FlowChartMultidocument","FlowChartTerminator","FlowChartPreparation","FlowChartManualInput","FlowChartManualOperation",
1774 /* 120*/ "FlowChartConnector","FlowChartPunchedCard","FlowChartPunchedTape","FlowChartSummingJunction","FlowChartOr","FlowChartCollate","FlowChartSort","FlowChartExtract","FlowChartMerge","FlowChartOfflineStorage",
1775 /* 130*/ "FlowChartOnlineStorage","FlowChartMagneticTape","FlowChartMagneticDisk","FlowChartMagneticDrum","FlowChartDisplay","FlowChartDelay","TextPlainText","TextStop","TextTriangle","TextTriangleInverted",
1776 /* 140*/ "TextChevron","TextChevronInverted","TextRingInside","TextRingOutside","TextArchUpCurve","TextArchDownCurve","TextCircleCurve","TextButtonCurve","TextArchUpPour","TextArchDownPour",
1777 /* 150*/ "TextCirclePour","TextButtonPour","TextCurveUp","TextCurveDown","TextCascadeUp","TextCascadeDown","TextWave1","TextWave2","TextWave3","TextWave4",
1778 /* 160*/ "TextInflate","TextDeflate","TextInflateBottom","TextDeflateBottom","TextInflateTop","TextDeflateTop","TextDeflateInflate","TextDeflateInflateDeflate","TextFadeRight","TextFadeLeft",
1779 /* 170*/ "TextFadeUp","TextFadeDown","TextSlantUp","TextSlantDown","TextCanUp","TextCanDown","FlowChartAlternateProcess","FlowChartOffpageConnector","Callout90","AccentCallout90",
1780 /* 180*/ "BorderCallout90","AccentBorderCallout90","LeftRightUpArrow","Sun","Moon","BracketPair","BracePair","Seal4","DoubleWave","ActionButtonBlank",
1781 /* 190*/ "ActionButtonHome","ActionButtonHelp","ActionButtonInformation","ActionButtonForwardNext","ActionButtonBackPrevious","ActionButtonEnd","ActionButtonBeginning","ActionButtonReturn","ActionButtonDocument","ActionButtonSound",
1782 /* 200*/ "ActionButtonMovie","HostControl","TextBox","Nil", "???"
1783 };
1784 if( 203 < nId )
1785 nId = 204;
1786 return aNmArr[ nId ];
1787 }
1788
DumpEscherProp(sal_uInt16 nId,sal_Bool bBid,sal_Bool bComplex,sal_uInt32 nOp,sal_uInt32 & rStreamOffset)1789 void DumpEscherProp( sal_uInt16 nId, sal_Bool bBid, sal_Bool bComplex, sal_uInt32 nOp,
1790 sal_uInt32& rStreamOffset )
1791 {
1792 const char* pRecNm = 0;
1793 switch( nId )
1794 {
1795 case 4: pRecNm = "DFF_Prop_Rotation"; break;
1796 // Protection
1797 case 119: pRecNm = "DFF_Prop_LockRotation"; break;
1798 case 120: pRecNm = "DFF_Prop_LockAspectRatio"; break;
1799 case 121: pRecNm = "DFF_Prop_LockPosition"; break;
1800 case 122: pRecNm = "DFF_Prop_LockAgainstSelect"; break;
1801 case 123: pRecNm = "DFF_Prop_LockCropping"; break;
1802 case 124: pRecNm = "DFF_Prop_LockVertices"; break;
1803 case 125: pRecNm = "DFF_Prop_LockText"; break;
1804 case 126: pRecNm = "DFF_Prop_LockAdjustHandles"; break;
1805 case 127: pRecNm = "DFF_Prop_LockAgainstGrouping"; break;
1806 // Text
1807 case 128: pRecNm = "DFF_Prop_lTxid"; break;
1808 case 129: pRecNm = "DFF_Prop_dxTextLeft"; break;
1809 case 130: pRecNm = "DFF_Prop_dyTextTop"; break;
1810 case 131: pRecNm = "DFF_Prop_dxTextRight"; break;
1811 case 132: pRecNm = "DFF_Prop_dyTextBottom"; break;
1812 case 133: pRecNm = "DFF_Prop_WrapText"; break;
1813 case 134: pRecNm = "DFF_Prop_scaleText"; break;
1814 case 135: pRecNm = "DFF_Prop_anchorText"; break;
1815 case 136: pRecNm = "DFF_Prop_txflTextFlow"; break;
1816 case 137: pRecNm = "DFF_Prop_cdirFont"; break;
1817 case 138: pRecNm = "DFF_Prop_hspNext"; break;
1818 case 139: pRecNm = "DFF_Prop_txdir"; break;
1819 case 187: pRecNm = "DFF_Prop_SelectText"; break;
1820 case 188: pRecNm = "DFF_Prop_AutoTextMargin"; break;
1821 case 189: pRecNm = "DFF_Prop_RotateText"; break;
1822 case 190: pRecNm = "DFF_Prop_FitShapeToText"; break;
1823 case 191: pRecNm = "DFF_Prop_FitTextToShape"; break;
1824 // GeoText
1825 case 192: pRecNm = "DFF_Prop_gtextUNICODE"; break;
1826 case 193: pRecNm = "DFF_Prop_gtextRTF"; break;
1827 case 194: pRecNm = "DFF_Prop_gtextAlign"; break;
1828 case 195: pRecNm = "DFF_Prop_gtextSize"; break;
1829 case 196: pRecNm = "DFF_Prop_gtextSpacing"; break;
1830 case 197: pRecNm = "DFF_Prop_gtextFont"; break;
1831 case 240: pRecNm = "DFF_Prop_gtextFReverseRows"; break;
1832 case 241: pRecNm = "DFF_Prop_fGtext"; break;
1833 case 242: pRecNm = "DFF_Prop_gtextFVertical"; break;
1834 case 243: pRecNm = "DFF_Prop_gtextFKern"; break;
1835 case 244: pRecNm = "DFF_Prop_gtextFTight"; break;
1836 case 245: pRecNm = "DFF_Prop_gtextFStretch"; break;
1837 case 246: pRecNm = "DFF_Prop_gtextFShrinkFit"; break;
1838 case 247: pRecNm = "DFF_Prop_gtextFBestFit"; break;
1839 case 248: pRecNm = "DFF_Prop_gtextFNormalize"; break;
1840 case 249: pRecNm = "DFF_Prop_gtextFDxMeasure"; break;
1841 case 250: pRecNm = "DFF_Prop_gtextFBold"; break;
1842 case 251: pRecNm = "DFF_Prop_gtextFItalic"; break;
1843 case 252: pRecNm = "DFF_Prop_gtextFUnderline"; break;
1844 case 253: pRecNm = "DFF_Prop_gtextFShadow"; break;
1845 case 254: pRecNm = "DFF_Prop_gtextFSmallcaps"; break;
1846 case 255: pRecNm = "DFF_Prop_gtextFStrikethrough"; break;
1847 // Blip
1848 case 256: pRecNm = "DFF_Prop_cropFromTop"; break;
1849 case 257: pRecNm = "DFF_Prop_cropFromBottom"; break;
1850 case 258: pRecNm = "DFF_Prop_cropFromLeft"; break;
1851 case 259: pRecNm = "DFF_Prop_cropFromRight"; break;
1852 case 260: pRecNm = "DFF_Prop_pib"; break;
1853 case 261: pRecNm = "DFF_Prop_pibName"; break;
1854 case 262: pRecNm = "DFF_Prop_pibFlags"; break;
1855 case 263: pRecNm = "DFF_Prop_pictureTransparent"; break;
1856 case 264: pRecNm = "DFF_Prop_pictureContrast"; break;
1857 case 265: pRecNm = "DFF_Prop_pictureBrightness"; break;
1858 case 266: pRecNm = "DFF_Prop_pictureGamma"; break;
1859 case 267: pRecNm = "DFF_Prop_pictureId"; break;
1860 case 268: pRecNm = "DFF_Prop_pictureDblCrMod"; break;
1861 case 269: pRecNm = "DFF_Prop_pictureFillCrMod"; break;
1862 case 270: pRecNm = "DFF_Prop_pictureLineCrMod"; break;
1863 case 271: pRecNm = "DFF_Prop_pibPrint"; break;
1864 case 272: pRecNm = "DFF_Prop_pibPrintName"; break;
1865 case 273: pRecNm = "DFF_Prop_pibPrintFlags"; break;
1866 case 316: pRecNm = "DFF_Prop_fNoHitTestPicture"; break;
1867 case 317: pRecNm = "DFF_Prop_pictureGray"; break;
1868 case 318: pRecNm = "DFF_Prop_pictureBiLevel"; break;
1869 case 319: pRecNm = "DFF_Prop_pictureActive"; break;
1870 // Geometry
1871 case 320: pRecNm = "DFF_Prop_geoLeft"; break;
1872 case 321: pRecNm = "DFF_Prop_geoTop"; break;
1873 case 322: pRecNm = "DFF_Prop_geoRight"; break;
1874 case 323: pRecNm = "DFF_Prop_geoBottom"; break;
1875 case 324: pRecNm = "DFF_Prop_shapePath"; break;
1876 case 325: pRecNm = "DFF_Prop_pVertices"; break;
1877 case 326: pRecNm = "DFF_Prop_pSegmentInfo"; break;
1878 case 327: pRecNm = "DFF_Prop_adjustValue"; break;
1879 case 328: pRecNm = "DFF_Prop_adjust2Value"; break;
1880 case 329: pRecNm = "DFF_Prop_adjust3Value"; break;
1881 case 330: pRecNm = "DFF_Prop_adjust4Value"; break;
1882 case 331: pRecNm = "DFF_Prop_adjust5Value"; break;
1883 case 332: pRecNm = "DFF_Prop_adjust6Value"; break;
1884 case 333: pRecNm = "DFF_Prop_adjust7Value"; break;
1885 case 334: pRecNm = "DFF_Prop_adjust8Value"; break;
1886 case 335: pRecNm = "DFF_Prop_adjust9Value"; break;
1887 case 336: pRecNm = "DFF_Prop_adjust10Value"; break;
1888 case 378: pRecNm = "DFF_Prop_fShadowOK"; break;
1889 case 379: pRecNm = "DFF_Prop_f3DOK"; break;
1890 case 380: pRecNm = "DFF_Prop_fLineOK"; break;
1891 case 381: pRecNm = "DFF_Prop_fGtextOK"; break;
1892 case 382: pRecNm = "DFF_Prop_fFillShadeShapeOK"; break;
1893 case 383: pRecNm = "DFF_Prop_fFillOK"; break;
1894 // FillStyle
1895 case 384: pRecNm = "DFF_Prop_fillType"; break;
1896 case 385: pRecNm = "DFF_Prop_fillColor"; break;
1897 case 386: pRecNm = "DFF_Prop_fillOpacity"; break;
1898 case 387: pRecNm = "DFF_Prop_fillBackColor"; break;
1899 case 388: pRecNm = "DFF_Prop_fillBackOpacity"; break;
1900 case 389: pRecNm = "DFF_Prop_fillCrMod"; break;
1901 case 390: pRecNm = "DFF_Prop_fillBlip"; break;
1902 case 391: pRecNm = "DFF_Prop_fillBlipName"; break;
1903 case 392: pRecNm = "DFF_Prop_fillBlipFlags"; break;
1904 case 393: pRecNm = "DFF_Prop_fillWidth"; break;
1905 case 394: pRecNm = "DFF_Prop_fillHeight"; break;
1906 case 395: pRecNm = "DFF_Prop_fillAngle"; break;
1907 case 396: pRecNm = "DFF_Prop_fillFocus"; break;
1908 case 397: pRecNm = "DFF_Prop_fillToLeft"; break;
1909 case 398: pRecNm = "DFF_Prop_fillToTop"; break;
1910 case 399: pRecNm = "DFF_Prop_fillToRight"; break;
1911 case 400: pRecNm = "DFF_Prop_fillToBottom"; break;
1912 case 401: pRecNm = "DFF_Prop_fillRectLeft"; break;
1913 case 402: pRecNm = "DFF_Prop_fillRectTop"; break;
1914 case 403: pRecNm = "DFF_Prop_fillRectRight"; break;
1915 case 404: pRecNm = "DFF_Prop_fillRectBottom"; break;
1916 case 405: pRecNm = "DFF_Prop_fillDztype"; break;
1917 case 406: pRecNm = "DFF_Prop_fillShadePreset"; break;
1918 case 407: pRecNm = "DFF_Prop_fillShadeColors"; break;
1919 case 408: pRecNm = "DFF_Prop_fillOriginX"; break;
1920 case 409: pRecNm = "DFF_Prop_fillOriginY"; break;
1921 case 410: pRecNm = "DFF_Prop_fillShapeOriginX"; break;
1922 case 411: pRecNm = "DFF_Prop_fillShapeOriginY"; break;
1923 case 412: pRecNm = "DFF_Prop_fillShadeType"; break;
1924 case 443: pRecNm = "DFF_Prop_fFilled"; break;
1925 case 444: pRecNm = "DFF_Prop_fHitTestFill"; break;
1926 case 445: pRecNm = "DFF_Prop_fillShape"; break;
1927 case 446: pRecNm = "DFF_Prop_fillUseRect"; break;
1928 case 447: pRecNm = "DFF_Prop_fNoFillHitTest"; break;
1929 // LineStyle
1930 case 448: pRecNm = "DFF_Prop_lineColor"; break;
1931 case 449: pRecNm = "DFF_Prop_lineOpacity"; break;
1932 case 450: pRecNm = "DFF_Prop_lineBackColor"; break;
1933 case 451: pRecNm = "DFF_Prop_lineCrMod"; break;
1934 case 452: pRecNm = "DFF_Prop_lineType"; break;
1935 case 453: pRecNm = "DFF_Prop_lineFillBlip"; break;
1936 case 454: pRecNm = "DFF_Prop_lineFillBlipName"; break;
1937 case 455: pRecNm = "DFF_Prop_lineFillBlipFlags"; break;
1938 case 456: pRecNm = "DFF_Prop_lineFillWidth"; break;
1939 case 457: pRecNm = "DFF_Prop_lineFillHeight"; break;
1940 case 458: pRecNm = "DFF_Prop_lineFillDztype"; break;
1941 case 459: pRecNm = "DFF_Prop_lineWidth"; break;
1942 case 460: pRecNm = "DFF_Prop_lineMiterLimit"; break;
1943 case 461: pRecNm = "DFF_Prop_lineStyle"; break;
1944 case 462: pRecNm = "DFF_Prop_lineDashing"; break;
1945 case 463: pRecNm = "DFF_Prop_lineDashStyle"; break;
1946 case 464: pRecNm = "DFF_Prop_lineStartArrowhead"; break;
1947 case 465: pRecNm = "DFF_Prop_lineEndArrowhead"; break;
1948 case 466: pRecNm = "DFF_Prop_lineStartArrowWidth"; break;
1949 case 467: pRecNm = "DFF_Prop_lineStartArrowLength"; break;
1950 case 468: pRecNm = "DFF_Prop_lineEndArrowWidth"; break;
1951 case 469: pRecNm = "DFF_Prop_lineEndArrowLength"; break;
1952 case 470: pRecNm = "DFF_Prop_lineJoinStyle"; break;
1953 case 471: pRecNm = "DFF_Prop_lineEndCapStyle"; break;
1954 case 507: pRecNm = "DFF_Prop_fArrowheadsOK"; break;
1955 case 508: pRecNm = "DFF_Prop_fLine"; break;
1956 case 509: pRecNm = "DFF_Prop_fHitTestLine"; break;
1957 case 510: pRecNm = "DFF_Prop_lineFillShape"; break;
1958 case 511: pRecNm = "DFF_Prop_fNoLineDrawDash"; break;
1959 // ShadowStyle
1960 case 512: pRecNm = "DFF_Prop_shadowType"; break;
1961 case 513: pRecNm = "DFF_Prop_shadowColor"; break;
1962 case 514: pRecNm = "DFF_Prop_shadowHighlight"; break;
1963 case 515: pRecNm = "DFF_Prop_shadowCrMod"; break;
1964 case 516: pRecNm = "DFF_Prop_shadowOpacity"; break;
1965 case 517: pRecNm = "DFF_Prop_shadowOffsetX"; break;
1966 case 518: pRecNm = "DFF_Prop_shadowOffsetY"; break;
1967 case 519: pRecNm = "DFF_Prop_shadowSecondOffsetX"; break;
1968 case 520: pRecNm = "DFF_Prop_shadowSecondOffsetY"; break;
1969 case 521: pRecNm = "DFF_Prop_shadowScaleXToX"; break;
1970 case 522: pRecNm = "DFF_Prop_shadowScaleYToX"; break;
1971 case 523: pRecNm = "DFF_Prop_shadowScaleXToY"; break;
1972 case 524: pRecNm = "DFF_Prop_shadowScaleYToY"; break;
1973 case 525: pRecNm = "DFF_Prop_shadowPerspectiveX"; break;
1974 case 526: pRecNm = "DFF_Prop_shadowPerspectiveY"; break;
1975 case 527: pRecNm = "DFF_Prop_shadowWeight"; break;
1976 case 528: pRecNm = "DFF_Prop_shadowOriginX"; break;
1977 case 529: pRecNm = "DFF_Prop_shadowOriginY"; break;
1978 case 574: pRecNm = "DFF_Prop_fShadow"; break;
1979 case 575: pRecNm = "DFF_Prop_fshadowObscured"; break;
1980 // PerspectiveStyle
1981 case 576: pRecNm = "DFF_Prop_perspectiveType"; break;
1982 case 577: pRecNm = "DFF_Prop_perspectiveOffsetX"; break;
1983 case 578: pRecNm = "DFF_Prop_perspectiveOffsetY"; break;
1984 case 579: pRecNm = "DFF_Prop_perspectiveScaleXToX"; break;
1985 case 580: pRecNm = "DFF_Prop_perspectiveScaleYToX"; break;
1986 case 581: pRecNm = "DFF_Prop_perspectiveScaleXToY"; break;
1987 case 582: pRecNm = "DFF_Prop_perspectiveScaleYToY"; break;
1988 case 583: pRecNm = "DFF_Prop_perspectivePerspectiveX"; break;
1989 case 584: pRecNm = "DFF_Prop_perspectivePerspectiveY"; break;
1990 case 585: pRecNm = "DFF_Prop_perspectiveWeight"; break;
1991 case 586: pRecNm = "DFF_Prop_perspectiveOriginX"; break;
1992 case 587: pRecNm = "DFF_Prop_perspectiveOriginY"; break;
1993 case 639: pRecNm = "DFF_Prop_fPerspective"; break;
1994 // 3D Object
1995 case 640: pRecNm = "DFF_Prop_c3DSpecularAmt"; break;
1996 case 641: pRecNm = "DFF_Prop_c3DDiffuseAmt"; break;
1997 case 642: pRecNm = "DFF_Prop_c3DShininess"; break;
1998 case 643: pRecNm = "DFF_Prop_c3DEdgeThickness"; break;
1999 case 644: pRecNm = "DFF_Prop_c3DExtrudeForward"; break;
2000 case 645: pRecNm = "DFF_Prop_c3DExtrudeBackward"; break;
2001 case 646: pRecNm = "DFF_Prop_c3DExtrudePlane"; break;
2002 case 647: pRecNm = "DFF_Prop_c3DExtrusionColor"; break;
2003 case 648: pRecNm = "DFF_Prop_c3DCrMod"; break;
2004 case 700: pRecNm = "DFF_Prop_f3D"; break;
2005 case 701: pRecNm = "DFF_Prop_fc3DMetallic"; break;
2006 case 702: pRecNm = "DFF_Prop_fc3DUseExtrusionColor"; break;
2007 case 703: pRecNm = "DFF_Prop_fc3DLightFace"; break;
2008 // 3D Style
2009 case 704: pRecNm = "DFF_Prop_c3DYRotationAngle"; break;
2010 case 705: pRecNm = "DFF_Prop_c3DXRotationAngle"; break;
2011 case 706: pRecNm = "DFF_Prop_c3DRotationAxisX"; break;
2012 case 707: pRecNm = "DFF_Prop_c3DRotationAxisY"; break;
2013 case 708: pRecNm = "DFF_Prop_c3DRotationAxisZ"; break;
2014 case 709: pRecNm = "DFF_Prop_c3DRotationAngle"; break;
2015 case 710: pRecNm = "DFF_Prop_c3DRotationCenterX"; break;
2016 case 711: pRecNm = "DFF_Prop_c3DRotationCenterY"; break;
2017 case 712: pRecNm = "DFF_Prop_c3DRotationCenterZ"; break;
2018 case 713: pRecNm = "DFF_Prop_c3DRenderMode"; break;
2019 case 714: pRecNm = "DFF_Prop_c3DTolerance"; break;
2020 case 715: pRecNm = "DFF_Prop_c3DXViewpoint"; break;
2021 case 716: pRecNm = "DFF_Prop_c3DYViewpoint"; break;
2022 case 717: pRecNm = "DFF_Prop_c3DZViewpoint"; break;
2023 case 718: pRecNm = "DFF_Prop_c3DOriginX"; break;
2024 case 719: pRecNm = "DFF_Prop_c3DOriginY"; break;
2025 case 720: pRecNm = "DFF_Prop_c3DSkewAngle"; break;
2026 case 721: pRecNm = "DFF_Prop_c3DSkewAmount"; break;
2027 case 722: pRecNm = "DFF_Prop_c3DAmbientIntensity"; break;
2028 case 723: pRecNm = "DFF_Prop_c3DKeyX"; break;
2029 case 724: pRecNm = "DFF_Prop_c3DKeyY"; break;
2030 case 725: pRecNm = "DFF_Prop_c3DKeyZ"; break;
2031 case 726: pRecNm = "DFF_Prop_c3DKeyIntensity"; break;
2032 case 727: pRecNm = "DFF_Prop_c3DFillX"; break;
2033 case 728: pRecNm = "DFF_Prop_c3DFillY"; break;
2034 case 729: pRecNm = "DFF_Prop_c3DFillZ"; break;
2035 case 730: pRecNm = "DFF_Prop_c3DFillIntensity"; break;
2036 case 763: pRecNm = "DFF_Prop_fc3DConstrainRotation"; break;
2037 case 764: pRecNm = "DFF_Prop_fc3DRotationCenterAuto"; break;
2038 case 765: pRecNm = "DFF_Prop_fc3DParallel"; break;
2039 case 766: pRecNm = "DFF_Prop_fc3DKeyHarsh"; break;
2040 case 767: pRecNm = "DFF_Prop_fc3DFillHarsh"; break;
2041 // Shape
2042 case 769: pRecNm = "DFF_Prop_hspMaster"; break;
2043 case 771: pRecNm = "DFF_Prop_cxstyle"; break;
2044 case 772: pRecNm = "DFF_Prop_bWMode"; break;
2045 case 773: pRecNm = "DFF_Prop_bWModePureBW"; break;
2046 case 774: pRecNm = "DFF_Prop_bWModeBW"; break;
2047 case 826: pRecNm = "DFF_Prop_fOleIcon"; break;
2048 case 827: pRecNm = "DFF_Prop_fPreferRelativeResize"; break;
2049 case 828: pRecNm = "DFF_Prop_fLockShapeType"; break;
2050 case 830: pRecNm = "DFF_Prop_fDeleteAttachedObject"; break;
2051 case 831: pRecNm = "DFF_Prop_fBackground"; break;
2052
2053 // Callout
2054 case 832: pRecNm = "DFF_Prop_spcot"; break;
2055 case 833: pRecNm = "DFF_Prop_dxyCalloutGap"; break;
2056 case 834: pRecNm = "DFF_Prop_spcoa"; break;
2057 case 835: pRecNm = "DFF_Prop_spcod"; break;
2058 case 836: pRecNm = "DFF_Prop_dxyCalloutDropSpecified"; break;
2059 case 837: pRecNm = "DFF_Prop_dxyCalloutLengthSpecified"; break;
2060 case 889: pRecNm = "DFF_Prop_fCallout"; break;
2061 case 890: pRecNm = "DFF_Prop_fCalloutAccentBar"; break;
2062 case 891: pRecNm = "DFF_Prop_fCalloutTextBorder"; break;
2063 case 892: pRecNm = "DFF_Prop_fCalloutMinusX"; break;
2064 case 893: pRecNm = "DFF_Prop_fCalloutMinusY"; break;
2065 case 894: pRecNm = "DFF_Prop_fCalloutDropAuto"; break;
2066 case 895: pRecNm = "DFF_Prop_fCalloutLengthSpecified"; break;
2067
2068 // GroupShape
2069 case 896: pRecNm = "DFF_Prop_wzName"; break;
2070 case 897: pRecNm = "DFF_Prop_wzDescription"; break;
2071 case 898: pRecNm = "DFF_Prop_pihlShape"; break;
2072 case 899: pRecNm = "DFF_Prop_pWrapPolygonVertices"; break;
2073 case 900: pRecNm = "DFF_Prop_dxWrapDistLeft"; break;
2074 case 901: pRecNm = "DFF_Prop_dyWrapDistTop"; break;
2075 case 902: pRecNm = "DFF_Prop_dxWrapDistRight"; break;
2076 case 903: pRecNm = "DFF_Prop_dyWrapDistBottom"; break;
2077 case 904: pRecNm = "DFF_Prop_lidRegroup"; break;
2078 case 953: pRecNm = "DFF_Prop_fEditedWrap"; break;
2079 case 954: pRecNm = "DFF_Prop_fBehindDocument"; break;
2080 case 955: pRecNm = "DFF_Prop_fOnDblClickNotify"; break;
2081 case 956: pRecNm = "DFF_Prop_fIsButton"; break;
2082 case 957: pRecNm = "DFF_Prop_fOneD"; break;
2083 case 958: pRecNm = "DFF_Prop_fHidden"; break;
2084 case 959: pRecNm = "DFF_Prop_fPrint"; break;
2085 }
2086
2087 *pOut << " " << indent1 << ' ';
2088 if( pRecNm )
2089 *pOut << pRecNm;
2090 else
2091 *pOut << "Prop" ;
2092
2093 *pOut << " Id: " << dec << nId << " (=0x" << hex << nId << ')';
2094 if( bBid )
2095 *pOut << " Bid: 0x" << (sal_uInt16)bBid;
2096
2097 if( bComplex )
2098 {
2099 *pOut << " Cmpl: 0x" << (sal_uInt16)bComplex;
2100 // ....
2101 rStreamOffset += nOp;
2102 }
2103 // else
2104 *pOut << " op: 0x" << nOp;
2105
2106 *pOut << dec << endl1;
2107 }
2108
DumpEscherRec(sal_uLong nPos,sal_uInt8 nVer,sal_uInt16 nInst,sal_uInt16 nFbt,sal_uInt32 nLength)2109 void DumpEscherRec( sal_uLong nPos, sal_uInt8 nVer, sal_uInt16 nInst,
2110 sal_uInt16 nFbt, sal_uInt32 nLength )
2111 {
2112 const char* pRecNm = 0;
2113 switch( nFbt )
2114 {
2115 case 0xF000: pRecNm = "DFF_msofbtDggContainer"; break;
2116 case 0xF006: pRecNm = "DFF_msofbtDgg"; break;
2117 case 0xF016: pRecNm = "DFF_msofbtCLSID"; break;
2118 case 0xF00B: pRecNm = "DFF_msofbtOPT"; break;
2119 case 0xF11A: pRecNm = "DFF_msofbtColorMRU"; break;
2120 case 0xF11E: pRecNm = "DFF_msofbtSplitMenuColors"; break;
2121 case 0xF001: pRecNm = "DFF_msofbtBstoreContainer"; break;
2122 case 0xF007: pRecNm = "DFF_msofbtBSE"; break;
2123 case 0xF018: pRecNm = "DFF_msofbtBlipFirst"; break;
2124 case 0xF117: pRecNm = "DFF_msofbtBlipLast"; break;
2125 case 0xF002: pRecNm = "DFF_msofbtDgContainer"; break;
2126 case 0xF008: pRecNm = "DFF_msofbtDg"; break;
2127 case 0xF118: pRecNm = "DFF_msofbtRegroupItems"; break;
2128 case 0xF120: pRecNm = "DFF_msofbtColorScheme"; break;
2129 case 0xF003: pRecNm = "DFF_msofbtSpgrContainer"; break;
2130 case 0xF004: pRecNm = "DFF_msofbtSpContainer"; break;
2131 case 0xF009: pRecNm = "DFF_msofbtSpgr"; break;
2132 case 0xF00A: pRecNm = "DFF_msofbtSp"; break;
2133 case 0xF00C: pRecNm = "DFF_msofbtTextbox"; break;
2134 case 0xF00D: pRecNm = "DFF_msofbtClientTextbox"; break;
2135 case 0xF00E: pRecNm = "DFF_msofbtAnchor"; break;
2136 case 0xF00F: pRecNm = "DFF_msofbtChildAnchor"; break;
2137 case 0xF010: pRecNm = "DFF_msofbtClientAnchor"; break;
2138 case 0xF011: pRecNm = "DFF_msofbtClientData"; break;
2139 case 0xF11F: pRecNm = "DFF_msofbtOleObject"; break;
2140 case 0xF11D: pRecNm = "DFF_msofbtDeletedPspl"; break;
2141 case 0xF005: pRecNm = "DFF_msofbtSolverContainer"; break;
2142 case 0xF012: pRecNm = "DFF_msofbtConnectorRule"; break;
2143 case 0xF013: pRecNm = "DFF_msofbtAlignRule"; break;
2144 case 0xF014: pRecNm = "DFF_msofbtArcRule"; break;
2145 case 0xF015: pRecNm = "DFF_msofbtClientRule"; break;
2146 case 0xF017: pRecNm = "DFF_msofbtCalloutRule"; break;
2147 case 0xF122: pRecNm = "DFF_msofbtUDefProp"; break;
2148 }
2149
2150 *pOut << hex6 << nPos << indent1;
2151 if( pRecNm )
2152 *pOut << pRecNm;
2153 else
2154 *pOut << "Record:";
2155 *pOut << " Id: 0x" << hex << nFbt << " Instance: 0x" << nInst
2156 << " Version: 0x" << (sal_uInt16)nVer << " Laenge: 0x" << nLength
2157 << dec << endl1;
2158
2159 switch( nFbt )
2160 {
2161 case 0xf00b: // DFF_msofbtOPT
2162 {
2163 sal_uInt16 nId; sal_uInt32 nOp, nStreamOffset = nInst * 6;
2164 sal_Bool bBid, bComplex;
2165 for( sal_uInt16 n = 0; n < nInst; ++n )
2166 {
2167 if( !WW8ReadUINT16( *xTableStream, nId ) ||
2168 !WW8ReadUINT32( *xTableStream, nOp ))
2169 break;
2170 bBid = ( nId >> 14 ) & 1;
2171 bComplex = ( nId >> 15 ) & 1;
2172 nId &= 0x3fff;
2173
2174 ::DumpEscherProp( nId, bBid, bComplex, nOp, nStreamOffset );
2175 }
2176 }
2177 break;
2178
2179 case 0xF00d: // DFF_msofbtClientTextbox
2180 case 0xF010: // DFF_msofbtClientAnchor
2181 case 0xF011: // DFF_msofbtClientData
2182 {
2183 sal_uInt32 nData;
2184 if( 4 == nLength && WW8ReadUINT32( *xTableStream, nData ))
2185 *pOut << " " << indent1 << " Data: "
2186 << hex << nData << dec << endl1;
2187 }
2188 break;
2189
2190 case 0xf00a: // DFF_msofbtSp
2191 {
2192 sal_uInt32 nId, nData;
2193 if( WW8ReadUINT32( *xTableStream, nId ) &&
2194 WW8ReadUINT32( *xTableStream, nData ))
2195 {
2196 *pOut << " " << indent1 << " \""
2197 << _GetShapeTypeNm( nInst )
2198 << "\" Id: 0x" << hex << nId
2199 << " Flags: 0x" << nData << dec << endl1;
2200 }
2201 }
2202 break;
2203
2204 case 0xf009: // DFF_msofbtSpgr
2205 case 0xf00f: // DFF_msofbtChildAnchor
2206 {
2207 sal_uInt32 nL, nT, nR, nB;
2208 if( WW8ReadUINT32( *xTableStream, nL ) &&
2209 WW8ReadUINT32( *xTableStream, nT ) &&
2210 WW8ReadUINT32( *xTableStream, nR ) &&
2211 WW8ReadUINT32( *xTableStream, nB ) )
2212 {
2213 *pOut << " " << indent1 << " Rect: (L/T/R/B): " << dec
2214 << nL << '/' << nT << '/' << nR << '/' << nB << endl;
2215 }
2216 }
2217 break;
2218
2219 case 0xf006: //ESCHER_Dgg
2220 {
2221 sal_uInt32 spidMax, // The current maximum shape ID
2222 cidcl, // The number of ID clusters (FIDCLs)
2223 cspSaved, // The total number of shapes saved
2224 // (including deleted shapes, if undo
2225 // information was saved)
2226 cdgSaved; // The total number of drawings saved
2227
2228 if( WW8ReadUINT32( *xTableStream, spidMax ) &&
2229 WW8ReadUINT32( *xTableStream, cidcl ) &&
2230 WW8ReadUINT32( *xTableStream, cspSaved ) &&
2231 WW8ReadUINT32( *xTableStream, cdgSaved ))
2232 {
2233 *pOut << " " << indent1 << " " << hex
2234 << " spidMax: 0x" << spidMax
2235 << " cidcl: 0x" << cidcl
2236 << " cspSaved: 0x" << cspSaved
2237 << " cdgSaved: 0x" << cdgSaved
2238 << dec << endl1;
2239
2240
2241 sal_uInt32 dgid, // DG owning the SPIDs in this cluster
2242 cspidCur; // number of SPIDs used so far
2243
2244 for( sal_uInt32 n = 1; n < cidcl; ++n )
2245 {
2246 if( !WW8ReadUINT32( *xTableStream, dgid ) ||
2247 !WW8ReadUINT32( *xTableStream, cspidCur ))
2248 break;
2249
2250 *pOut << " " << indent1 << " " << hex
2251 << " dgid: 0x" << dgid
2252 << " cspidCur: 0x" << cspidCur
2253 << dec << endl1;
2254 }
2255 }
2256 }
2257 break;
2258
2259 case 0xF122:
2260 {
2261 if( 3 < nLength )
2262 {
2263 *pOut << " " << indent1 << " Data:" << hex;
2264 sal_uInt8 nParam;
2265 for( sal_uInt32 n = 0; n < nLength; ++n )
2266 {
2267 if( !WW8ReadBYTE( *xTableStream, nParam ) )
2268 break;
2269
2270 sal_uInt16 nHexParam = nParam;
2271 *pOut << " 0x" << nHexParam;
2272 }
2273 *pOut << dec << endl1;
2274 }
2275 }
2276 break;
2277
2278 case 0xF016: //ESCHER_CLSID
2279 case 0xF11A: //ESCHER_ColorMRU
2280 case 0xF11E: //ESCHER_SplitMenuColors
2281 // case 0xF001: //ESCHER_BstoreContainer
2282 case 0xF007: //ESCHER_BSE
2283 case 0xF018: //ESCHER_BlipFirst
2284 case 0xF117: //ESCHER_BlipLast
2285 case 0xF118: //ESCHER_RegroupItems
2286 case 0xF120: //ESCHER_ColorScheme
2287 case 0xF00C: //ESCHER_Textbox
2288 case 0xF00E: //ESCHER_Anchor
2289 case 0xF11F: //ESCHER_OleObject
2290 case 0xF11D: //ESCHER_DeletedPspl
2291 case 0xF005: //ESCHER_SolverContainer
2292 case 0xF012: //ESCHER_ConnectorRule
2293 case 0xF013: //ESCHER_AlignRule
2294 case 0xF014: //ESCHER_ArcRule
2295 case 0xF015: //ESCHER_ClientRule
2296 case 0xF017: //ESCHER_CalloutRule
2297 case 0xF119: //ESCHER_Selection
2298 case 0xf008: //ESCHER_Dg
2299 {
2300 int nCnt = 128;
2301 while( nLength )
2302 {
2303 if( 128 == nCnt || 16 == ++nCnt )
2304 {
2305 if( 128 != nCnt )
2306 *pOut << endl1;
2307 *pOut << " " << indent1 << " Data: ";
2308 nCnt = 0;
2309 }
2310
2311 static char __READONLY_DATA sHex[17] = { "0123456789abcdef" };
2312 sal_uInt8 c;
2313 *xTableStream >> c;
2314 *pOut << sHex[ ( c & 0xf0 ) >> 4 ] << sHex[ c & 0x0f ] << ' ';
2315 --nLength;
2316 }
2317 *pOut << dec << endl1;
2318 }
2319 break;
2320 }
2321
2322
2323 }
2324
2325
DumpEscherRecs(sal_uLong nPos,sal_uInt32 nLength)2326 void DumpEscherRecs( sal_uLong nPos, sal_uInt32 nLength )
2327 {
2328 begin( *pOut, *xTableStream ) << endl1;
2329
2330 sal_uInt16 nOldFbt = 0;
2331 sal_uLong nReadLen = 0;
2332 while( nReadLen < nLength )
2333 {
2334 sal_uInt8 nVer;
2335 sal_uInt16 nInst, nFbt;
2336 sal_uInt32 nRecLen;
2337
2338 if( !::ReadEsherRec( *xTableStream, nVer, nInst, nFbt, nRecLen ))
2339 break;
2340
2341 if( (0xf000 > nFbt) )//|| (0xf122 < nFbt) )
2342 {
2343 xTableStream->Seek( nPos + nReadLen );
2344 unsigned char c;
2345 *xTableStream >> c;
2346
2347 ++nReadLen;
2348 if( ( !::ReadEsherRec( *xTableStream, nVer, nInst, nFbt, nRecLen ) )
2349 || ( 0xf000 > nFbt )
2350 //|| ( 0xf122 < nFbt )
2351 )
2352 break;
2353
2354 *pOut << hex6 << nPos + nReadLen - 1 << indent1
2355 << "DummyChar: 0x" << hex << (int)c << dec << endl1;
2356 }
2357
2358 ::DumpEscherRec( nPos + nReadLen, nVer, nInst,
2359 nFbt, nRecLen );
2360
2361 nReadLen += 2 * sizeof( sal_uInt32 );
2362 switch( nFbt )
2363 {
2364 case 0xF000:
2365 case 0xF001: //ESCHER_BstoreContainer
2366 case 0xF002:
2367 case 0xF003:
2368 case 0xF004:
2369 DumpEscherRecs( nPos + nReadLen, nRecLen );
2370 break;
2371 }
2372
2373 nReadLen += nRecLen;
2374 xTableStream->Seek( nPos + nReadLen );
2375 nOldFbt = nFbt;
2376 }
2377 end( *pOut, *xTableStream ) << endl1;
2378 }
2379
2380
DumpDrawing()2381 void DumpDrawing()
2382 {
2383 if( pWwFib->lcbDggInfo )
2384 {
2385 sal_uLong nOldPos = xTableStream->Tell(), nReadLen = 0;
2386 xTableStream->Seek( pWwFib->fcDggInfo );
2387
2388 *pOut << endl << hex6 << pWwFib->fcDggInfo << dec2 << ' ' << indent1
2389 << begin1 << "Escher (DggInfo): Len: " << pWwFib->lcbDggInfo
2390 << endl1;
2391
2392 ::DumpEscherRecs( pWwFib->fcDggInfo, (sal_uLong)pWwFib->lcbDggInfo );
2393
2394 end( *pOut, *xTableStream ) << endl1 << endl1;
2395 xTableStream->Seek( nOldPos );
2396 }
2397 }
2398
2399
2400 //-----------------------------------------
2401 // Hilfroutinen fuer Styles
2402 //-----------------------------------------
2403
DumpStyleUPX(sal_uInt8 nVersion,short nLen,sal_Bool bPAP)2404 static short DumpStyleUPX( sal_uInt8 nVersion, short nLen, sal_Bool bPAP )
2405 {
2406 short cbUPX;
2407 sal_Bool bEmpty;
2408
2409
2410 if( nLen <= 0 ){
2411 indent( *pOut, *xTableStream );
2412 *pOut << "very empty UPX." << ((bPAP) ? "papx " : "chpx ");
2413 *pOut << "Len:" << nLen << endl1;
2414 return nLen;
2415 }
2416
2417 nLen -= WW8SkipOdd( &xTableStream );
2418 indent( *pOut, *xTableStream );
2419
2420 xTableStream->Read( &cbUPX, 2 );
2421 nLen-= 2;
2422
2423 if ( cbUPX > nLen )
2424 {
2425 *pOut << "!cbUPX auf nLen verkleinert! ";
2426 cbUPX = nLen;
2427 }
2428
2429 bEmpty = ( cbUPX <= 0 ) || ( bPAP && ( cbUPX <= 2 ) );
2430
2431 if ( bEmpty )
2432 *pOut << "empty ";
2433 else
2434 *pOut << begin1;
2435
2436 *pOut << "UPX." << ((bPAP) ? "papx " : "chpx ");
2437 *pOut << "Len:" << nLen << " cbUPX:" << cbUPX << ' ';
2438
2439 if( bPAP )
2440 {
2441 sal_uInt16 id;
2442
2443 xTableStream->Read( &id, 2 );
2444 cbUPX-= 2;
2445 nLen-= 2;
2446 *pOut << "ID:" << id;
2447 }
2448
2449 *pOut << endl1;
2450
2451 sal_uLong nPos = xTableStream->Tell(); // falls etwas falsch interpretiert
2452 // wird, gehts danach wieder richtig
2453 DumpSprms( nVersion, *xTableStream, cbUPX );
2454
2455 if ( xTableStream->Tell() != nPos + cbUPX ){
2456 *pOut << "!Um " << xTableStream->Tell() - nPos + cbUPX
2457 << " Bytes falsch positioniert!" << endl1;
2458 xTableStream->Seek( nPos+cbUPX );
2459 }
2460
2461 nLen -= cbUPX;
2462
2463 if ( !bEmpty )
2464 end( *pOut, *xTableStream ) << "UPX." << ((bPAP) ? "papx " : "chpx ") << endl1;
2465
2466 return nLen;
2467 }
2468
DumpStyleGrupx(sal_uInt8 nVersion,short nLen,sal_Bool bPara)2469 static void DumpStyleGrupx( sal_uInt8 nVersion, short nLen, sal_Bool bPara )
2470 {
2471 if( nLen <= 0 )
2472 return;
2473 nLen -= WW8SkipOdd( &xTableStream );
2474
2475 begin( *pOut, *xTableStream ) << "Grupx, Len:" << nLen << endl1;
2476
2477 if( bPara ) nLen = DumpStyleUPX( nVersion, nLen, sal_True ); // Grupx.Papx
2478 DumpStyleUPX( nVersion, nLen, sal_False ); // Grupx.Chpx
2479
2480 end( *pOut, *xTableStream ) << "Grupx" << endl1;
2481 }
2482
PrintStyleId(sal_uInt16 nId)2483 static void PrintStyleId( sal_uInt16 nId )
2484 {
2485 switch ( nId ){
2486 case 0xffe: *pOut << "User "; break;
2487 case 0xfff: *pOut << "Nil "; break;
2488 default: *pOut << nId << ' '; break;
2489 }
2490 }
2491
2492 //-----------------------------------------
2493 // Styles
2494 //-----------------------------------------
2495
Dump1Style(sal_uInt16 nNr)2496 void DStyle::Dump1Style( sal_uInt16 nNr )
2497 {
2498 short nSkip, cbStd;
2499 String aStr;
2500 char c;
2501 indent( *pOut, *xTableStream );
2502
2503 WW8_STD* pStd = Read1Style( nSkip, &aStr, &cbStd ); // lese Style
2504
2505 if ( aStr.Len() ) // echter Style
2506 {
2507 *pOut << begin1;
2508 switch ( pStd->sgc ){
2509 case 1: c = 'P'; break;
2510 case 2: c = 'C'; break;
2511 default: c = '?'; break;
2512 }
2513 *pOut << c << "-Style Nr:" << nNr << ' ';
2514 *pOut << "ID:"; PrintStyleId( pStd->sti );
2515 *pOut << "BasedOn:"; PrintStyleId( pStd->istdBase );
2516 ByteString sName( aStr, RTL_TEXTENCODING_MS_1252 );
2517 *pOut << "Next:" << pStd->istdNext << " Name:\"" << sName.GetBuffer() << "\"";
2518 *pOut << endl1 << " ";
2519 *pOut << "cbStd:" << cbStd << ' ';
2520 *pOut << "No of Upx & Upe:" << pStd->cupx << ' ';
2521 *pOut << "bchUpe:" << pStd->bchUpe << ' ';
2522 *pOut << "nSkip:" << nSkip << endl1;
2523 }else{ // leerer Slot
2524 *pOut << "empty Slot Nr:" << nNr << endl1;
2525 }
2526
2527 long nPos = xTableStream->Tell(); // falls etwas falsch interpretiert
2528 // wird, gehts danach wieder richtig
2529
2530 if( pStd && ( pStd->sgc == 1 || pStd->sgc == 2 ) )
2531 DumpStyleGrupx( nVersion, nSkip, pStd->sgc == 1 );
2532
2533 if ( aStr.Len() ) // echter Style
2534 end( *pOut, *xTableStream ) << c << "-Style" << endl1;
2535
2536 xTableStream->Seek( nPos+nSkip );
2537
2538 DELETEZ( pStd );
2539 }
2540
Dump()2541 void DStyle::Dump()
2542 {
2543 *pOut << hex6 << nStyleStart << ' ' << dec2 << indent1;
2544
2545 *pOut << begin1 << cstd << " Styles, ";
2546 *pOut << "Base:" << cbSTDBaseInFile;
2547 *pOut << ", Written:" << (fStdStylenamesWritten) ? 'T' : 'F';
2548 *pOut << ", MaxSti:" << stiMaxWhenSaved;
2549 *pOut << ", MaxFix:" << istdMaxFixedWhenSaved;
2550 *pOut << ", BuildIn:" << nVerBuiltInNamesWhenSaved;
2551 *pOut << ", StdFnt:" << ftcStandardChpStsh << endl1;
2552
2553 sal_uInt16 i;
2554 for( i=0; i<cstd; i++ )
2555 Dump1Style( i );
2556
2557 end( *pOut, *xTableStream ) << "Styles" << endl1 << endl1;
2558 }
2559
2560 //-----------------------------------------
2561 // Main
2562 //-----------------------------------------
2563
2564 //char cName [266];
2565 //char cOutName [266];
2566
PrepareConvert(String & rName,String & rOutName,String & rMess)2567 int PrepareConvert( String& rName, String& rOutName, String& rMess )
2568 {
2569 pxStor = new SvStorageRef( new SvStorage( rName, STREAM_STD_READ ) );
2570 xStrm = (*pxStor)->OpenStream( String::CreateFromAscii( "WordDocument" ),
2571 STREAM_STD_READ );
2572
2573 if ( !xStrm.Is() /* || xStrm->GetError() */ ){
2574 rMess.AppendAscii( "Kann StorageStream \"WordDocument\" in " );
2575 rMess += rName;
2576 rMess.AppendAscii( " nicht zum Lesen oeffnen" );
2577 DELETEZ( pxStor );
2578 return 1;
2579 }
2580
2581 sal_uLong nL;
2582 if ( xStrm->Read( &nL, sizeof( nL ) ) == 0 ){
2583 rMess.AppendAscii( "Kann aus StorageStream \"WordDocument\" in ");
2584 rMess += rName;
2585 rMess.AppendAscii( " nicht Lesen" );
2586 return 1;
2587 }
2588 xStrm->Seek( 0 );
2589
2590 ByteString sOutName( rOutName, RTL_TEXTENCODING_MS_1252 );
2591 pOut = new fstream( sOutName.GetBuffer(), ios::out );
2592 if ( !pOut )
2593 {
2594 rMess.AppendAscii( "Kann Ausgabedatei " );
2595 rMess += rOutName;
2596 rMess.AppendAscii( " nicht zum Schreiben oeffnen" );
2597 return 1;
2598 }
2599
2600 rMess.AppendAscii( "Ausgabe von " );
2601 rMess += rName;
2602 rMess.AppendAscii( " in Datei " );
2603 rMess += rOutName;
2604 rMess.AppendAscii( "......" );
2605
2606 if ( xStrm->Read( &nL, sizeof( nL ) ) == 0 ){
2607 return 1;
2608 }
2609 xStrm->Seek( 0 );
2610
2611 return 0;
2612 }
2613
DoConvert(const String & rName,sal_uInt8 nVersion)2614 int DoConvert( const String& rName, sal_uInt8 nVersion )
2615 {
2616 sal_uLong nL;
2617 if ( xStrm->Read( &nL, sizeof( nL ) ) == 0 ){
2618 return 1;
2619 }
2620 xStrm->Seek( 0 );
2621
2622 pWwFib = new DFib( *xStrm, nVersion );
2623
2624 if ( pWwFib->nFibError )
2625 return 1;
2626
2627 // Nachdem wir nun den FIB eingelesen haben, wissen wir ja,
2628 // welcher Table-Stream gueltig ist.
2629 // Diesen oeffnen wir nun.
2630
2631 switch( pWwFib->nVersion ) // 6 steht fuer "6 ODER 7", 7 steht fuer "NUR 7"
2632 {
2633 case 6:
2634 case 7:
2635 xTableStream = &xStrm;
2636 xDataStream = &xStrm;
2637 break;
2638 case 8:
2639 xTableStream = (*pxStor)->OpenStream( String::CreateFromAscii(
2640 ( 1 == pWwFib->fWhichTblStm ) ? "1Table" : "0Table" ),
2641 STREAM_STD_READ );
2642 xDataStream = (*pxStor)->OpenStream( String::CreateFromAscii(
2643 "Data" ), STREAM_STD_READ | STREAM_NOCREATE );
2644 if( !xDataStream.Is() || SVSTREAM_OK != xDataStream->GetError() )
2645 xDataStream = &xStrm;
2646 break;
2647 default:// Programm-Fehler!
2648 /*
2649 ACHTUNG: im FILTER nicht "sal_False" sondern "!this()" schreiben,
2650 da sonst Warning unter OS/2
2651 */
2652 ASSERT( sal_False, "Es wurde vergessen, nVersion zu kodieren!" );
2653 return 1;
2654 }
2655
2656
2657 // dann erstmal den Dateinamen schreiben:
2658 {
2659 ByteString sName( rName, RTL_TEXTENCODING_MS_1252 );
2660 *pOut << "Datei: " << sName.GetBuffer() << endl;
2661 }
2662 pSBase = new WW8ScannerBase( &xStrm, &xTableStream, &xDataStream, pWwFib );
2663
2664 // erstmal die Lowlevel-Funktionen
2665
2666 ((DFib*)pWwFib)->Dump(); // FIB
2667 DumpDop( *pWwFib ); // WW8_DOP
2668
2669 if( ( 8 > pWwFib->nVersion && pWwFib->fComplex ) ||
2670 pWwFib->lcbClx )
2671 DumpPcd( pWwFib->nVersion, pWwFib->fcClx, pWwFib->lcbClx );
2672
2673 DumpBookLow();
2674
2675 DumpBookHigh();
2676
2677
2678 DumpPLCF( pWwFib->fcPlcfsed, pWwFib->lcbPlcfsed, SEP ); // SEPX
2679
2680 DumpPLCF( pWwFib->fcPlcfbteChpx, pWwFib->lcbPlcfbteChpx, CHP ); // CHPX
2681
2682 DumpPLCF( pWwFib->fcPlcfbtePapx, pWwFib->lcbPlcfbtePapx, PAP ); // PAPX
2683
2684 {
2685 DStyle aStyle( *xTableStream, *pWwFib ); // Styles
2686 aStyle.Dump();
2687 }
2688
2689 DumpFonts(); // WW8_FFN
2690
2691 // ... und jetzt die High-Level-Funktionen
2692
2693 WW8_CP nStartCp = 0;
2694
2695 DumpPlainText( nStartCp, pWwFib->ccpText, "Main" );
2696 *pOut << endl1;
2697 DumpField1( pWwFib->fcPlcffldMom, pWwFib->lcbPlcffldMom,
2698 "MainText Fields" );
2699
2700 DumpHeader( pSBase ); // Header / Footer
2701 DumpField1( pWwFib->fcPlcffldHdr, pWwFib->lcbPlcffldHdr,
2702 "Header/Footer Fields" );
2703
2704 DumpFootnotes( pSBase );
2705 DumpField1( pWwFib->fcPlcffldFtn, pWwFib->lcbPlcffldFtn,
2706 "Footnote Fields" );
2707
2708 DumpEndnotes( pSBase );
2709 DumpField1( pWwFib->fcPlcffldEdn, pWwFib->lcbPlcffldEdn,
2710 "Endnote Fields" );
2711
2712 DumpAnnotations( pSBase );
2713
2714 DumpTextBoxs( pSBase );
2715
2716 DumpField1( pWwFib->fcPlcffldTxbx, pWwFib->lcbPlcffldTxbx,
2717 "Textbox Fields" );
2718 DumpField1( pWwFib->fcPlcffldHdrTxbx, pWwFib->lcbPlcffldHdrTxbx,
2719 "Header/Footer Textbox Fields" );
2720
2721 if( 8 == pWwFib->nVersion )
2722 DumpNumList();
2723
2724 DumpFdoa( pSBase );
2725
2726 if( pWwFib->lcbPlcfspaHdr || pWwFib->lcbPlcfspaMom )
2727 DumpDrawing();
2728
2729 DELETEZ( pSBase );
2730 DELETEZ( pWwFib );
2731 return 0;
2732 }
2733
DeInit()2734 void DeInit()
2735 {
2736 // DELETEZ( aWwStor );
2737 xStrm.Clear();
2738 DELETEZ( pxStor );
2739 DELETEZ( pOut );
2740 }
2741
2742
2743