xref: /AOO41X/main/sw/source/filter/ww8/dump/dump8a.cxx (revision efeef26f81c84063fb0a91bde3856d4a51172d90)
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