1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 #ifndef OOX_DUMP_BIFFDUMPER_HXX 29 #define OOX_DUMP_BIFFDUMPER_HXX 30 31 #include "oox/dump/dumperbase.hxx" 32 #include "oox/dump/dffdumper.hxx" 33 #include "oox/dump/oledumper.hxx" 34 #include "oox/xls/richstring.hxx" 35 #include "oox/xls/biffinputstream.hxx" 36 37 #if OOX_INCLUDE_DUMPER 38 39 namespace oox { namespace xls { 40 class BiffInputStream; 41 class FontPortionModelList; 42 struct FunctionInfo; 43 class FunctionProvider; 44 } } 45 46 namespace oox { 47 namespace dump { 48 namespace biff { 49 50 typedef ::boost::shared_ptr< ::oox::xls::BiffInputStream > BiffInputStreamRef; 51 52 // ============================================================================ 53 // ============================================================================ 54 55 class BiffDffStreamObject : public DffStreamObject 56 { 57 public: 58 explicit BiffDffStreamObject( 59 const OutputObjectBase& rParent, 60 const BinaryInputStreamRef& rxStrm ); 61 62 protected: 63 virtual void implDumpClientAnchor(); 64 }; 65 66 // ============================================================================ 67 68 class BiffCtlsStreamObject : public InputObjectBase 69 { 70 public: 71 explicit BiffCtlsStreamObject( const OutputObjectBase& rParent, const BinaryInputStreamRef& rxStrm ); 72 73 void dumpControl( sal_uInt32 nStartPos, sal_uInt32 nLength ); 74 75 protected: 76 virtual void implDump(); 77 78 private: 79 sal_uInt32 mnStartPos; 80 sal_uInt32 mnLength; 81 }; 82 83 // ============================================================================ 84 // ============================================================================ 85 86 class BiffConfig : public Config 87 { 88 public: 89 explicit BiffConfig( const Config& rParent, ::oox::xls::BiffType eBiff ); 90 91 protected: 92 virtual bool implIsValid() const; 93 virtual NameListRef implGetNameList( const ::rtl::OUString& rKey ) const; 94 95 private: 96 ::oox::xls::BiffType meBiff; 97 }; 98 99 // ============================================================================ 100 101 class BiffSharedData : public Base 102 { 103 public: 104 explicit BiffSharedData( ::oox::xls::BiffType eBiff ); 105 106 void initializePerSheet(); 107 108 inline ::oox::xls::BiffType getBiff() const { return meBiff; } 109 110 inline rtl_TextEncoding getTextEncoding() const { return meTextEnc; } 111 void setTextEncoding( rtl_TextEncoding eTextEnc ); 112 113 sal_uInt16 getFontCount() const; 114 rtl_TextEncoding getFontEncoding( sal_uInt16 nFontId ) const; 115 void appendFontEncoding( rtl_TextEncoding eFontEnc ); 116 117 sal_uInt16 getXfCount() const; 118 rtl_TextEncoding getXfEncoding( sal_uInt16 nXfId ) const; 119 void appendXfFontId( sal_uInt16 nFontId ); 120 121 protected: 122 virtual bool implIsValid() const; 123 124 private: 125 typedef ::std::vector< rtl_TextEncoding > TextEncVec; 126 typedef ::std::vector< sal_uInt16 > FontIdVec; 127 128 TextEncVec maFontEncs; 129 FontIdVec maXfFontIds; 130 ::oox::xls::BiffType meBiff; 131 rtl_TextEncoding meTextEnc; 132 }; 133 134 // ============================================================================ 135 136 class BiffObjectBase : public RecordObjectBase 137 { 138 public: 139 inline BiffSharedData& getBiffData() const { return *mxBiffData; } 140 inline ::oox::xls::BiffInputStream& getBiffStream() const { return *mxBiffStrm; } 141 inline ::oox::xls::BiffType getBiff() const { return mxBiffData->getBiff(); } 142 143 protected: 144 inline explicit BiffObjectBase() {} 145 virtual ~BiffObjectBase(); 146 147 using InputObjectBase::construct; 148 void construct( const ObjectBase& rParent, const BinaryInputStreamRef& rxStrm, ::oox::xls::BiffType eBiff, const ::rtl::OUString& rSysFileName ); 149 void construct( const BiffObjectBase& rParent ); 150 151 virtual bool implIsValid() const; 152 virtual bool implStartRecord( BinaryInputStream& rBaseStrm, sal_Int64& ornRecPos, sal_Int64& ornRecId, sal_Int64& ornRecSize ); 153 154 inline sal_uInt16 getLastRecId() const { return mnLastRecId; } 155 ::rtl::OUString getErrorName( sal_uInt8 nErrCode ) const; 156 157 // ------------------------------------------------------------------------ 158 159 sal_Int32 readCol( bool bCol16Bit ); 160 sal_Int32 readRow( bool bRow32Bit ); 161 void readAddress( Address& orAddress, bool bCol16Bit = true, bool bRow32Bit = false ); 162 void readRange( Range& orRange, bool bCol16Bit = true, bool bRow32Bit = false ); 163 void readRangeList( RangeList& orRanges, bool bCol16Bit = true, bool bRow32Bit = false ); 164 165 // ------------------------------------------------------------------------ 166 167 void writeBooleanItem( const String& rName, sal_uInt8 nBool ); 168 void writeErrorCodeItem( const String& rName, sal_uInt8 nErrCode ); 169 170 void writeFontPortions( const ::oox::xls::FontPortionModelList& rPortions ); 171 172 template< typename Type > 173 void writeRectItem( const String& rName, 174 Type nLeft, Type nTop, Type nWidth, Type nHeight, 175 const NameListWrapper& rListWrp = NO_LIST, 176 FormatType eFmtType = FORMATTYPE_DEC ); 177 178 // ------------------------------------------------------------------------ 179 180 ::rtl::OUString dumpByteString( 181 const String& rName, 182 ::oox::xls::BiffStringFlags nFlags = ::oox::xls::BIFF_STR_DEFAULT, 183 rtl_TextEncoding eDefaultTextEnc = RTL_TEXTENCODING_DONTKNOW ); 184 ::rtl::OUString dumpUniString( 185 const String& rName, 186 ::oox::xls::BiffStringFlags nFlags = ::oox::xls::BIFF_STR_DEFAULT ); 187 ::rtl::OUString dumpString( 188 const String& rName, 189 ::oox::xls::BiffStringFlags nByteFlags = ::oox::xls::BIFF_STR_DEFAULT, 190 ::oox::xls::BiffStringFlags nUniFlags = ::oox::xls::BIFF_STR_DEFAULT, 191 rtl_TextEncoding eDefaultTextEnc = RTL_TEXTENCODING_DONTKNOW ); 192 193 ::rtl::OUString dumpSegmentedUniString( const String& rName ); 194 void dumpSegmentedUniStringArray( const String& rName ); 195 196 sal_uInt8 dumpBoolean( const String& rName = EMPTY_STRING ); 197 sal_uInt8 dumpErrorCode( const String& rName = EMPTY_STRING ); 198 199 rtl_TextEncoding dumpCodePage( const String& rName = EMPTY_STRING ); 200 void dumpFormulaResult( const String& rName = EMPTY_STRING ); 201 202 sal_Int32 dumpColIndex( const String& rName = EMPTY_STRING, bool bCol16Bit = true ); 203 sal_Int32 dumpRowIndex( const String& rName = EMPTY_STRING, bool bRow32Bit = false ); 204 sal_Int32 dumpColRange( const String& rName = EMPTY_STRING, bool bCol16Bit = true ); 205 sal_Int32 dumpRowRange( const String& rName = EMPTY_STRING, bool bRow32Bit = false ); 206 207 Address dumpAddress( const String& rName = EMPTY_STRING, bool bCol16Bit = true, bool bRow32Bit = false ); 208 Range dumpRange( const String& rName = EMPTY_STRING, bool bCol16Bit = true, bool bRow32Bit = false ); 209 void dumpRangeList( const String& rName = EMPTY_STRING, bool bCol16Bit = true, bool bRow32Bit = false ); 210 211 void dumpConstArrayHeader( sal_uInt32& rnCols, sal_uInt32& rnRows ); 212 ::rtl::OUString dumpConstValue( sal_Unicode cStrQuote = OOX_DUMP_STRQUOTE ); 213 214 template< typename Type > 215 void dumpRect( const String& rName, 216 const NameListWrapper& rListWrp = NO_LIST, 217 FormatType eFmtType = FORMATTYPE_DEC ); 218 template< typename Type > 219 void dumpRectWithGaps( const String& rName, sal_Int32 nGap, 220 const NameListWrapper& rListWrp = NO_LIST, 221 FormatType eFmtType = FORMATTYPE_DEC ); 222 223 sal_uInt16 dumpRepeatedRecId(); 224 void dumpFrHeader( bool bWithFlags, bool bWithRange ); 225 226 void dumpDffClientRect(); 227 void dumpEmbeddedDff(); 228 void dumpControl(); 229 230 private: 231 typedef ::boost::shared_ptr< BiffSharedData > BiffSharedDataRef; 232 typedef ::boost::shared_ptr< BiffDffStreamObject > BiffDffStreamObjRef; 233 typedef ::boost::shared_ptr< BiffCtlsStreamObject > BiffCtlsStrmObjRef; 234 235 BiffSharedDataRef mxBiffData; 236 BiffInputStreamRef mxBiffStrm; 237 BiffDffStreamObjRef mxDffObj; 238 BiffCtlsStrmObjRef mxCtlsObj; 239 NameListRef mxErrCodes; 240 NameListRef mxConstType; 241 NameListRef mxResultType; 242 sal_uInt16 mnLastRecId; 243 bool mbMergeContRec; 244 }; 245 246 // ---------------------------------------------------------------------------- 247 248 template< typename Type > 249 void BiffObjectBase::writeRectItem( const String& rName, 250 Type nLeft, Type nTop, Type nWidth, Type nHeight, 251 const NameListWrapper& rListWrp, FormatType eFmtType ) 252 { 253 MultiItemsGuard aMultiGuard( mxOut ); 254 writeEmptyItem( rName ); 255 writeValueItem( "x-pos", nLeft, eFmtType, rListWrp ); 256 writeValueItem( "y-pos", nTop, eFmtType, rListWrp ); 257 writeValueItem( "x-size", nWidth, eFmtType, rListWrp ); 258 writeValueItem( "y-size", nHeight, eFmtType, rListWrp ); 259 } 260 261 template< typename Type > 262 void BiffObjectBase::dumpRect( const String& rName, 263 const NameListWrapper& rListWrp, FormatType eFmtType ) 264 { 265 Type nLeft, nTop, nWidth, nHeight; 266 *mxBiffStrm >> nLeft >> nTop >> nWidth >> nHeight; 267 writeRectItem( rName, nLeft, nTop, nWidth, nHeight, rListWrp, eFmtType ); 268 } 269 270 template< typename Type > 271 void BiffObjectBase::dumpRectWithGaps( const String& rName, sal_Int32 nGap, 272 const NameListWrapper& rListWrp, FormatType eFmtType ) 273 { 274 Type nLeft, nTop, nWidth, nHeight; 275 *mxBiffStrm >> nLeft; 276 mxBiffStrm->skip( nGap ); 277 *mxBiffStrm >> nTop; 278 mxBiffStrm->skip( nGap ); 279 *mxBiffStrm >> nWidth; 280 mxBiffStrm->skip( nGap ); 281 *mxBiffStrm >> nHeight; 282 mxBiffStrm->skip( nGap ); 283 writeRectItem( rName, nLeft, nTop, nWidth, nHeight, rListWrp, eFmtType ); 284 } 285 286 // ============================================================================ 287 // ============================================================================ 288 289 class FormulaObject : public BiffObjectBase 290 { 291 public: 292 explicit FormulaObject( const BiffObjectBase& rParent ); 293 virtual ~FormulaObject(); 294 295 sal_uInt16 readFormulaSize(); 296 sal_uInt16 dumpFormulaSize( const String& rName = EMPTY_STRING ); 297 298 void dumpCellFormula( const String& rName, sal_uInt16 nSize ); 299 void dumpCellFormula( const String& rName = EMPTY_STRING ); 300 void dumpNameFormula( const String& rName, sal_uInt16 nSize ); 301 void dumpNameFormula( const String& rName = EMPTY_STRING ); 302 303 protected: 304 virtual void implDump(); 305 306 private: 307 void constructFmlaObj(); 308 309 void dumpFormula( const String& rName, sal_uInt16 nSize, bool bNameMode ); 310 void dumpFormula( const String& rName, bool bNameMode ); 311 312 TokenAddress createTokenAddress( sal_uInt16 nCol, sal_uInt16 nRow, bool bRelC, bool bRelR, bool bNameMode ) const; 313 ::rtl::OUString createRef( const ::rtl::OUString& rData ) const; 314 ::rtl::OUString createName( sal_uInt16 nNameIdx ) const; 315 ::rtl::OUString createPlaceHolder( size_t nIdx ) const; 316 ::rtl::OUString createPlaceHolder() const; 317 318 sal_uInt16 readFuncId(); 319 ::rtl::OUString writeFuncIdItem( sal_uInt16 nFuncId, const ::oox::xls::FunctionInfo** oppFuncInfo = 0 ); 320 321 sal_uInt16 dumpTokenCol( const String& rName, bool& rbRelC, bool& rbRelR ); 322 sal_uInt16 dumpTokenRow( const String& rName, bool& rbRelC, bool& rbRelR ); 323 TokenAddress dumpTokenAddress( bool bNameMode ); 324 TokenRange dumpTokenRange( bool bNameMode ); 325 326 sal_Int16 readTokenRefIdx(); 327 ::rtl::OUString dumpTokenRefIdx(); 328 ::rtl::OUString dumpTokenRefTabIdxs(); 329 330 void dumpIntToken(); 331 void dumpDoubleToken(); 332 void dumpStringToken(); 333 void dumpBoolToken(); 334 void dumpErrorToken(); 335 void dumpMissArgToken(); 336 337 void dumpArrayToken( const ::rtl::OUString& rTokClass ); 338 void dumpNameToken( const ::rtl::OUString& rTokClass ); 339 void dumpNameXToken( const ::rtl::OUString& rTokClass ); 340 void dumpRefToken( const ::rtl::OUString& rTokClass, bool bNameMode ); 341 void dumpAreaToken( const ::rtl::OUString& rTokClass, bool bNameMode ); 342 void dumpRefErrToken( const ::rtl::OUString& rTokClass, bool bArea ); 343 void dumpRef3dToken( const ::rtl::OUString& rTokClass, bool bNameMode ); 344 void dumpArea3dToken( const ::rtl::OUString& rTokClass, bool bNameMode ); 345 void dumpRefErr3dToken( const ::rtl::OUString& rTokClass, bool bArea ); 346 void dumpMemFuncToken( const ::rtl::OUString& rTokClass ); 347 void dumpMemAreaToken( const ::rtl::OUString& rTokClass, bool bAddData ); 348 349 void dumpExpToken( const String& rName ); 350 void dumpUnaryOpToken( const String& rLOp, const String& rROp ); 351 void dumpBinaryOpToken( const String& rOp ); 352 void dumpFuncToken( const ::rtl::OUString& rTokClass ); 353 void dumpFuncVarToken( const ::rtl::OUString& rTokClass ); 354 void dumpCmdToken( const ::rtl::OUString& rTokClass ); 355 356 void dumpSheetToken(); 357 void dumpEndSheetToken(); 358 bool dumpAttrToken(); 359 360 bool dumpNlrToken(); 361 void dumpNlrErrToken(); 362 void dumpNlrColRowToken( const ::rtl::OUString& rTokClass, bool bAddData ); 363 void dumpNlrRangeToken( const ::rtl::OUString& rTokClass, bool bAddData ); 364 void dumpNlrRangeErrToken(); 365 366 void dumpAddTokenData(); 367 void dumpAddDataNlr( size_t nIdx ); 368 void dumpAddDataArray( size_t nIdx ); 369 void dumpAddDataMemArea( size_t nIdx ); 370 371 private: 372 enum AddDataType { ADDDATA_NLR, ADDDATA_ARRAY, ADDDATA_MEMAREA }; 373 374 typedef ::boost::shared_ptr< FormulaStack > FormulaStackRef; 375 typedef ::boost::shared_ptr< ::oox::xls::FunctionProvider > FuncProvRef; 376 typedef ::std::vector< AddDataType > AddDataTypeVec; 377 378 NameListRef mxTokens; 379 NameListRef mxClasses; 380 NameListRef mxRelFlags; 381 NameListRef mxNlrTypes; 382 NameListRef mxAttrTypes; 383 NameListRef mxSpTypes; 384 sal_Int32 mnColCount; 385 sal_Int32 mnRowCount; 386 387 FormulaStackRef mxStack; 388 FuncProvRef mxFuncProv; 389 AddDataTypeVec maAddData; 390 ::rtl::OUString maRefPrefix; 391 ::rtl::OUString maName; 392 sal_uInt16 mnSize; 393 bool mbNameMode; 394 }; 395 396 // ============================================================================ 397 // ============================================================================ 398 399 class RecordStreamObject : public BiffObjectBase 400 { 401 protected: 402 inline explicit RecordStreamObject() {} 403 virtual ~RecordStreamObject(); 404 405 using BiffObjectBase::construct; 406 void construct( const ObjectBase& rParent, const BinaryInputStreamRef& rxStrm, ::oox::xls::BiffType eBiff, const ::rtl::OUString& rSysFileName ); 407 408 virtual bool implIsValid() const; 409 410 inline FormulaObject& getFormulaDumper() const { return *mxFmlaObj; } 411 412 private: 413 typedef ::boost::shared_ptr< FormulaObject > FormulaObjectRef; 414 FormulaObjectRef mxFmlaObj; 415 }; 416 417 // ============================================================================ 418 419 class WorkbookStreamObject : public RecordStreamObject 420 { 421 public: 422 explicit WorkbookStreamObject( const ObjectBase& rParent, const BinaryInputStreamRef& rxStrm, const ::rtl::OUString& rSysFileName ); 423 virtual ~WorkbookStreamObject(); 424 425 protected: 426 virtual void implDumpRecordBody(); 427 428 private: 429 void initializePerSheet(); 430 431 ::rtl::OUString createFontName( const ::rtl::OUString& rName, sal_uInt16 nHeight, bool bBold, bool bItalic ) const; 432 433 sal_uInt16 dumpPatternIdx( const String& rName = EMPTY_STRING, bool b16Bit = true ); 434 sal_uInt16 dumpColorIdx( const String& rName = EMPTY_STRING, bool b16Bit = true ); 435 sal_uInt16 dumpFontIdx( const String& rName = EMPTY_STRING, bool b16Bit = true ); 436 sal_uInt16 dumpFormatIdx( const String& rName = EMPTY_STRING ); 437 sal_uInt16 dumpXfIdx( const String& rName = EMPTY_STRING, bool bBiff2Style = false ); 438 439 template< typename Type > 440 inline Type dumpExtColorType() { return dumpDec< Type >( "color-type", "EXTCOLOR-TYPE" ); } 441 void dumpExtColorValue( sal_uInt32 nColorType ); 442 void dumpExtColor( const String& rName = EMPTY_STRING ); 443 void dumpExtCfColor( const String& rName = EMPTY_STRING ); 444 void dumpExtGradientHead(); 445 446 sal_uInt8 dumpFilterColumnOperator( const String& rName ); 447 448 ::rtl::OUString dumpPivotString( const String& rName, sal_uInt16 nStrLen ); 449 ::rtl::OUString dumpPivotString( const String& rName ); 450 451 sal_uInt16 dumpCellHeader( bool bBiff2Style = false ); 452 void dumpBoolErr(); 453 454 void dumpCfRuleProp(); 455 void dumpXfExtProp(); 456 void dumpDxfProp(); 457 void dumpDxf12Prop(); 458 void dumpCfRule12Param( sal_uInt16 nSubType ); 459 460 void dumpFontRec(); 461 void dumpFormatRec(); 462 void dumpXfRec(); 463 464 void dumpObjRec(); 465 void dumpObjRecBiff3(); 466 void dumpObjRecBiff4(); 467 void dumpObjRecBiff5(); 468 void dumpObjRecBiff8(); 469 470 void dumpObjRecLineData(); 471 void dumpObjRecFillData(); 472 void dumpObjRecRectData(); 473 void dumpObjRecTextDataBiff3( sal_uInt16& ornTextLen, sal_uInt16& ornFormatSize ); 474 void dumpObjRecTextDataBiff5( sal_uInt16& ornTextLen, sal_uInt16& ornFormatSize, sal_uInt16& ornLinkSize ); 475 void dumpObjRecSbsData(); 476 void dumpObjRecGboData(); 477 void dumpObjRecEdoData(); 478 void dumpObjRecRboData(); 479 void dumpObjRecCblsData(); 480 void dumpObjRecLbsData(); 481 482 void dumpObjRecPadding(); 483 void dumpObjRecString( const String& rName, sal_uInt16 nTextLen, bool bRepeatLen ); 484 void dumpObjRecTextFmt( sal_uInt16 nFormatSize ); 485 void dumpObjRecFmlaRaw(); 486 void dumpObjRecFmla( const String& rName, sal_uInt16 nFmlaSize ); 487 void dumpObjRecPictFmla( sal_uInt16 nFmlaSize ); 488 489 typedef ::std::pair< sal_uInt8, ::rtl::OUString > ChFrExtPropInfo; 490 491 void dumpChFrExtProps(); 492 ChFrExtPropInfo dumpChFrExtPropHeader(); 493 494 private: 495 NameListRef mxColors; 496 NameListRef mxBorderStyles; 497 NameListRef mxFillPatterns; 498 NameListRef mxFontNames; 499 NameListRef mxFormats; 500 sal_uInt16 mnFormatIdx; 501 sal_uInt16 mnPTRowFields; 502 sal_uInt16 mnPTColFields; 503 sal_uInt16 mnPTRowColItemsIdx; 504 bool mbHasCodePage; 505 bool mbHasDff; 506 }; 507 508 // ============================================================================ 509 510 class PivotCacheStreamObject : public RecordStreamObject 511 { 512 public: 513 explicit PivotCacheStreamObject( 514 const ObjectBase& rParent, 515 const BinaryInputStreamRef& rxStrm, 516 ::oox::xls::BiffType eBiff, 517 const ::rtl::OUString& rSysFileName ); 518 519 protected: 520 virtual void implDumpRecordBody(); 521 }; 522 523 // ============================================================================ 524 // ============================================================================ 525 526 class RootStorageObject : public OleStorageObject 527 { 528 public: 529 explicit RootStorageObject( const DumperBase& rParent ); 530 531 protected: 532 virtual void implDumpStream( 533 const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxStrm, 534 const ::rtl::OUString& rStrgPath, 535 const ::rtl::OUString& rStrmName, 536 const ::rtl::OUString& rSysFileName ); 537 538 virtual void implDumpStorage( 539 const StorageRef& rxStrg, 540 const ::rtl::OUString& rStrgPath, 541 const ::rtl::OUString& rSysPath ); 542 543 virtual void implDumpBaseStream( 544 const BinaryInputStreamRef& rxStrm, 545 const ::rtl::OUString& rSysFileName ); 546 }; 547 548 // ============================================================================ 549 // ============================================================================ 550 551 class Dumper : public DumperBase 552 { 553 public: 554 explicit Dumper( const ::oox::core::FilterBase& rFilter ); 555 556 explicit Dumper( 557 const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext, 558 const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& rxInStrm, 559 const ::rtl::OUString& rSysFileName ); 560 561 protected: 562 virtual void implDump(); 563 }; 564 565 // ============================================================================ 566 // ============================================================================ 567 568 } // namespace biff 569 } // namespace dump 570 } // namespace oox 571 572 #endif 573 #endif 574