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 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_dbaccess.hxx" 30 #include "HtmlReader.hxx" 31 #include <connectivity/dbconversion.hxx> 32 #include <connectivity/dbtools.hxx> 33 #include <tools/tenccvt.hxx> 34 #include <comphelper/extract.hxx> 35 #include "dbu_misc.hrc" 36 #include "dbustrings.hrc" 37 #include <sfx2/sfxhtml.hxx> 38 #include <tools/debug.hxx> 39 #include <tools/tenccvt.hxx> 40 #include "moduledbu.hxx" 41 #include <com/sun/star/sdbcx/XDataDescriptorFactory.hpp> 42 #include <com/sun/star/sdbcx/XColumnsSupplier.hpp> 43 #include <com/sun/star/sdbcx/XAppend.hpp> 44 #include <com/sun/star/sdbc/DataType.hpp> 45 #include <com/sun/star/sdbc/ColumnValue.hpp> 46 #include <com/sun/star/awt/FontDescriptor.hpp> 47 #include <com/sun/star/awt/FontWeight.hpp> 48 #include <com/sun/star/awt/FontStrikeout.hpp> 49 #include <com/sun/star/awt/FontSlant.hpp> 50 #include <com/sun/star/awt/FontUnderline.hpp> 51 #include <com/sun/star/util/NumberFormat.hpp> 52 #include <com/sun/star/util/XNumberFormatTypes.hpp> 53 #include <svtools/htmltokn.h> 54 #include <svtools/htmlkywd.hxx> 55 #include <tools/color.hxx> 56 #include "WCopyTable.hxx" 57 #include "WExtendPages.hxx" 58 #include "WNameMatch.hxx" 59 #include "WColumnSelect.hxx" 60 #include "QEnumTypes.hxx" 61 #include "WCPage.hxx" 62 #include <tools/inetmime.hxx> 63 #include <svl/inettype.hxx> 64 #include <rtl/tencinfo.h> 65 #include "UITools.hxx" 66 #include <vcl/svapp.hxx> 67 #include <rtl/logfile.hxx> 68 69 using namespace dbaui; 70 using namespace ::com::sun::star::uno; 71 using namespace ::com::sun::star::beans; 72 using namespace ::com::sun::star::container; 73 using namespace ::com::sun::star::sdbc; 74 using namespace ::com::sun::star::sdbcx; 75 using namespace ::com::sun::star::awt; 76 77 #define DBAUI_HTML_FONTSIZES 8 // wie Export, HTML-Options 78 #define HTML_META_NONE 0 79 #define HTML_META_AUTHOR 1 80 #define HTML_META_DESCRIPTION 2 81 #define HTML_META_KEYWORDS 3 82 #define HTML_META_REFRESH 4 83 #define HTML_META_CLASSIFICATION 5 84 #define HTML_META_CREATED 6 85 #define HTML_META_CHANGEDBY 7 86 #define HTML_META_CHANGED 8 87 #define HTML_META_GENERATOR 9 88 #define HTML_META_SDFOOTNOTE 10 89 #define HTML_META_SDENDNOTE 11 90 #define HTML_META_CONTENT_TYPE 12 91 92 // ========================================================================== 93 DBG_NAME(OHTMLReader) 94 // ========================================================================== 95 // OHTMLReader 96 // ========================================================================== 97 OHTMLReader::OHTMLReader(SvStream& rIn,const SharedConnection& _rxConnection, 98 const Reference< ::com::sun::star::util::XNumberFormatter >& _rxNumberF, 99 const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rM, 100 const TColumnVector* pList, 101 const OTypeInfoMap* _pInfoMap) 102 :HTMLParser(rIn) 103 ,ODatabaseExport( _rxConnection, _rxNumberF, _rM, pList, _pInfoMap, rIn ) 104 ,m_nTableCount(0) 105 ,m_nColumnWidth(87) 106 ,m_bMetaOptions(sal_False) 107 ,m_bSDNum(sal_False) 108 { 109 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OHTMLReader::OHTMLReader" ); 110 DBG_CTOR(OHTMLReader,NULL); 111 SetSrcEncoding( GetExtendedCompatibilityTextEncoding( RTL_TEXTENCODING_ISO_8859_1 ) ); 112 // If the file starts with a BOM, switch to UCS2. 113 SetSwitchToUCS2( sal_True ); 114 } 115 // --------------------------------------------------------------------------- 116 OHTMLReader::OHTMLReader(SvStream& rIn, 117 sal_Int32 nRows, 118 const TPositions &_rColumnPositions, 119 const Reference< ::com::sun::star::util::XNumberFormatter >& _rxNumberF, 120 const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rM, 121 const TColumnVector* pList, 122 const OTypeInfoMap* _pInfoMap, 123 sal_Bool _bAutoIncrementEnabled) 124 :HTMLParser(rIn) 125 ,ODatabaseExport( nRows, _rColumnPositions, _rxNumberF, _rM, pList, _pInfoMap, _bAutoIncrementEnabled, rIn ) 126 ,m_nTableCount(0) 127 ,m_nColumnWidth(87) 128 ,m_bMetaOptions(sal_False) 129 ,m_bSDNum(sal_False) 130 { 131 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OHTMLReader::OHTMLReader" ); 132 DBG_CTOR(OHTMLReader,NULL); 133 SetSrcEncoding( GetExtendedCompatibilityTextEncoding( RTL_TEXTENCODING_ISO_8859_1 ) ); 134 // If the file starts with a BOM, switch to UCS2. 135 SetSwitchToUCS2( sal_True ); 136 } 137 // --------------------------------------------------------------------------- 138 OHTMLReader::~OHTMLReader() 139 { 140 DBG_DTOR(OHTMLReader,NULL); 141 } 142 // --------------------------------------------------------------------------- 143 SvParserState OHTMLReader::CallParser() 144 { 145 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OHTMLReader::CallParser" ); 146 DBG_CHKTHIS(OHTMLReader,NULL); 147 rInput.Seek(STREAM_SEEK_TO_BEGIN); 148 rInput.ResetError(); 149 SvParserState eParseState = HTMLParser::CallParser(); 150 SetColumnTypes(m_pColumnList,m_pInfoMap); 151 return m_bFoundTable ? eParseState : SVPAR_ERROR; 152 } 153 // ----------------------------------------------------------------------------- 154 void OHTMLReader::NextToken( int nToken ) 155 { 156 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OHTMLReader::NextToken" ); 157 DBG_CHKTHIS(OHTMLReader,NULL); 158 if(m_bError || !m_nRows) // falls Fehler oder keine Rows mehr zur "Uberpr"ufung dann gleich zur"uck 159 return; 160 if ( nToken == HTML_META ) 161 setTextEncoding(); 162 163 if(m_xConnection.is()) // gibt an welcher CTOR gerufen wurde und damit, ob eine Tabelle erstellt werden soll 164 { 165 switch(nToken) 166 { 167 case HTML_TABLE_ON: 168 ++m_nTableCount; 169 { // es kann auch TD oder TH sein, wenn es vorher kein TABLE gab 170 const HTMLOptions* pHtmlOptions = GetOptions(); 171 sal_Int16 nArrLen = pHtmlOptions->Count(); 172 for ( sal_Int16 i = 0; i < nArrLen; i++ ) 173 { 174 const HTMLOption* pOption = (*pHtmlOptions)[i]; 175 switch( pOption->GetToken() ) 176 { 177 case HTML_O_WIDTH: 178 { // Prozent: von Dokumentbreite bzw. aeusserer Zelle 179 m_nColumnWidth = GetWidthPixel( pOption ); 180 } 181 break; 182 } 183 } 184 } 185 case HTML_THEAD_ON: 186 case HTML_TBODY_ON: 187 { 188 sal_uInt32 nTell = rInput.Tell(); // ver�ndert vielleicht die Position des Streams 189 if ( !m_xTable.is() ) 190 {// erste Zeile als Header verwenden 191 m_bError = !CreateTable(nToken); 192 if ( m_bAppendFirstLine ) 193 rInput.Seek(nTell); 194 } 195 } 196 break; 197 case HTML_TABLE_OFF: 198 if(!--m_nTableCount) 199 { 200 m_xTable = NULL; 201 } 202 break; 203 case HTML_TABLEROW_ON: 204 if ( m_pUpdateHelper.get() ) 205 { 206 try 207 { 208 m_pUpdateHelper->moveToInsertRow(); // sonst neue Zeile anh"angen 209 } 210 catch(SQLException& e) 211 // UpdateFehlerbehandlung 212 { 213 showErrorDialog(e); 214 } 215 } 216 else 217 m_bError = sal_True; 218 break; 219 case HTML_TEXTTOKEN: 220 case HTML_SINGLECHAR: 221 if ( m_bInTbl ) //&& !m_bSDNum ) // wichtig, da wir sonst auch die Namen der Fonts bekommen 222 m_sTextToken += aToken; 223 break; 224 case HTML_PARABREAK_OFF: 225 m_sCurrent += m_sTextToken; 226 break; 227 case HTML_PARABREAK_ON: 228 m_sTextToken.Erase(); 229 break; 230 case HTML_TABLEDATA_ON: 231 fetchOptions(); 232 break; 233 case HTML_TABLEDATA_OFF: 234 { 235 if ( m_sCurrent.Len() ) 236 m_sTextToken = m_sCurrent; 237 try 238 { 239 insertValueIntoColumn(); 240 } 241 catch(SQLException& e) 242 // UpdateFehlerbehandlung 243 { 244 showErrorDialog(e); 245 } 246 m_sCurrent.Erase(); 247 m_nColumnPos++; 248 eraseTokens(); 249 m_bSDNum = m_bInTbl = sal_False; 250 } 251 break; 252 case HTML_TABLEROW_OFF: 253 if ( !m_pUpdateHelper.get() ) 254 { 255 m_bError = sal_True; 256 break; 257 } 258 try 259 { 260 m_nRowCount++; 261 if (m_bIsAutoIncrement) // if bSetAutoIncrement then I have to set the autoincrement 262 m_pUpdateHelper->updateInt(1,m_nRowCount); 263 m_pUpdateHelper->insertRow(); 264 } 265 catch(SQLException& e) 266 ////////////////////////////////////////////////////////////////////// 267 // UpdateFehlerbehandlung 268 { 269 showErrorDialog(e); 270 } 271 m_nColumnPos = 0; 272 break; 273 } 274 } 275 else // Zweig nur f"ur Typpr"ufung g"ultig 276 { 277 switch(nToken) 278 { 279 case HTML_THEAD_ON: 280 case HTML_TBODY_ON: 281 // Der Spalten Kopf z"ahlt nicht mit 282 if(m_bHead) 283 { 284 do 285 {} 286 while(GetNextToken() != HTML_TABLEROW_OFF); 287 m_bHead = sal_False; 288 } 289 break; 290 case HTML_TABLEDATA_ON: 291 case HTML_TABLEHEADER_ON: 292 fetchOptions(); 293 break; 294 case HTML_TEXTTOKEN: 295 case HTML_SINGLECHAR: 296 if ( m_bInTbl ) // && !m_bSDNum ) // wichtig, da wir sonst auch die Namen der Fonts bekommen 297 m_sTextToken += aToken; 298 break; 299 case HTML_PARABREAK_OFF: 300 m_sCurrent += m_sTextToken; 301 break; 302 case HTML_PARABREAK_ON: 303 m_sTextToken.Erase(); 304 break; 305 case HTML_TABLEDATA_OFF: 306 if ( m_sCurrent.Len() ) 307 m_sTextToken = m_sCurrent; 308 adjustFormat(); 309 m_nColumnPos++; 310 m_bSDNum = m_bInTbl = sal_False; 311 m_sCurrent.Erase(); 312 break; 313 case HTML_TABLEROW_OFF: 314 if ( m_sCurrent.Len() ) 315 m_sTextToken = m_sCurrent; 316 adjustFormat(); 317 m_nColumnPos = 0; 318 m_nRows--; 319 m_sCurrent.Erase(); 320 break; 321 } 322 } 323 } 324 // ----------------------------------------------------------------------------- 325 void OHTMLReader::fetchOptions() 326 { 327 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OHTMLReader::fetchOptions" ); 328 m_bInTbl = sal_True; 329 const HTMLOptions* options = GetOptions(); 330 sal_Int16 nArrLen = options->Count(); 331 for ( sal_Int16 i = 0; i < nArrLen; i++ ) 332 { 333 const HTMLOption* pOption = (*options)[i]; 334 switch( pOption->GetToken() ) 335 { 336 case HTML_O_SDVAL: 337 { 338 m_sValToken = pOption->GetString(); 339 //m_sTextToken = pOption->GetString(); 340 m_bSDNum = sal_True; 341 } 342 break; 343 case HTML_O_SDNUM: 344 m_sNumToken = pOption->GetString(); 345 break; 346 } 347 } 348 } 349 //--------------------------------------------------------------------------------- 350 void OHTMLReader::TableDataOn(SvxCellHorJustify& eVal,int nToken) 351 { 352 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OHTMLReader::TableDataOn" ); 353 DBG_CHKTHIS(OHTMLReader,NULL); 354 sal_Bool bHorJustifyCenterTH = (nToken == HTML_TABLEHEADER_ON); 355 const HTMLOptions* pHtmlOptions = GetOptions(); 356 sal_Int16 nArrLen = pHtmlOptions->Count(); 357 for ( sal_Int16 i = 0; i < nArrLen; i++ ) 358 { 359 const HTMLOption* pOption = (*pHtmlOptions)[i]; 360 switch( pOption->GetToken() ) 361 { 362 case HTML_O_ALIGN: 363 { 364 bHorJustifyCenterTH = sal_False; 365 const String& rOptVal = pOption->GetString(); 366 if (rOptVal.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_AL_right )) 367 eVal = SVX_HOR_JUSTIFY_RIGHT; 368 else if (rOptVal.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_AL_center )) 369 eVal = SVX_HOR_JUSTIFY_CENTER; 370 else if (rOptVal.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_AL_left )) 371 eVal = SVX_HOR_JUSTIFY_LEFT; 372 else 373 eVal = SVX_HOR_JUSTIFY_STANDARD; 374 } 375 break; 376 case HTML_O_WIDTH: 377 m_nWidth = GetWidthPixel( pOption ); 378 break; 379 } 380 } 381 } 382 383 //--------------------------------------------------------------------------------- 384 void OHTMLReader::TableFontOn(FontDescriptor& _rFont,sal_Int32 &_rTextColor) 385 { 386 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OHTMLReader::TableFontOn" ); 387 DBG_CHKTHIS(OHTMLReader,NULL); 388 const HTMLOptions* pHtmlOptions = GetOptions(); 389 sal_Int16 nArrLen = pHtmlOptions->Count(); 390 for ( sal_Int16 i = 0; i < nArrLen; i++ ) 391 { 392 const HTMLOption* pOption = (*pHtmlOptions)[i]; 393 switch( pOption->GetToken() ) 394 { 395 case HTML_O_COLOR: 396 { 397 Color aColor; 398 pOption->GetColor( aColor ); 399 _rTextColor = aColor.GetRGBColor(); 400 } 401 break; 402 case HTML_O_FACE : 403 { 404 const String& rFace = pOption->GetString(); 405 String aFontName; 406 xub_StrLen nPos = 0; 407 while( nPos != STRING_NOTFOUND ) 408 { // Fontliste, VCL: Semikolon als Separator, HTML: Komma 409 String aFName = rFace.GetToken( 0, ',', nPos ); 410 aFName.EraseTrailingChars().EraseLeadingChars(); 411 if( aFontName.Len() ) 412 aFontName += ';'; 413 aFontName += aFName; 414 } 415 if ( aFontName.Len() ) 416 _rFont.Name = ::rtl::OUString(aFontName); 417 } 418 break; 419 case HTML_O_SIZE : 420 { 421 sal_Int16 nSize = (sal_Int16) pOption->GetNumber(); 422 if ( nSize == 0 ) 423 nSize = 1; 424 else if ( nSize < DBAUI_HTML_FONTSIZES ) 425 nSize = DBAUI_HTML_FONTSIZES; 426 427 _rFont.Height = nSize; 428 } 429 break; 430 } 431 } 432 } 433 // --------------------------------------------------------------------------- 434 sal_Int16 OHTMLReader::GetWidthPixel( const HTMLOption* pOption ) 435 { 436 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OHTMLReader::GetWidthPixel" ); 437 DBG_CHKTHIS(OHTMLReader,NULL); 438 const String& rOptVal = pOption->GetString(); 439 if ( rOptVal.Search('%') != STRING_NOTFOUND ) 440 { // Prozent 441 DBG_ASSERT( m_nColumnWidth, "WIDTH Option: m_nColumnWidth==0 und Width%" ); 442 return (sal_Int16)((pOption->GetNumber() * m_nColumnWidth) / 100); 443 } 444 else 445 { 446 if ( rOptVal.Search('*') != STRING_NOTFOUND ) 447 { // relativ zu was?!? 448 //2do: ColArray aller relativen Werte sammeln und dann MakeCol 449 return 0; 450 } 451 else 452 return (sal_Int16)pOption->GetNumber(); // Pixel 453 } 454 } 455 // --------------------------------------------------------------------------- 456 sal_Bool OHTMLReader::CreateTable(int nToken) 457 { 458 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OHTMLReader::CreateTable" ); 459 DBG_CHKTHIS(OHTMLReader,NULL); 460 String aTempName(ModuleRes(STR_TBL_TITLE)); 461 aTempName = aTempName.GetToken(0,' '); 462 aTempName = String(::dbtools::createUniqueName(m_xTables,::rtl::OUString(aTempName ))); 463 464 int nTmpToken2 = nToken; 465 sal_Bool bCaption = sal_False; 466 sal_Bool bTableHeader = sal_False; 467 String aColumnName; 468 SvxCellHorJustify eVal; 469 470 String aTableName; 471 FontDescriptor aFont = ::dbaui::CreateFontDescriptor(Application::GetSettings().GetStyleSettings().GetAppFont()); 472 sal_Int32 nTextColor = 0; 473 do 474 { 475 switch(nTmpToken2) 476 { 477 case HTML_TEXTTOKEN: 478 case HTML_SINGLECHAR: 479 if(bTableHeader) 480 aColumnName += aToken; 481 if(bCaption) 482 aTableName += aToken; 483 break; 484 case HTML_PARABREAK_OFF: 485 m_sCurrent += aColumnName; 486 break; 487 case HTML_PARABREAK_ON: 488 m_sTextToken.Erase(); 489 break; 490 case HTML_TABLEDATA_ON: 491 // m_bAppendFirstLine = true; 492 // run through 493 case HTML_TABLEHEADER_ON: 494 TableDataOn(eVal,nTmpToken2); 495 bTableHeader = sal_True; 496 break; 497 case HTML_TABLEDATA_OFF: 498 // m_bAppendFirstLine = true; 499 // run through 500 case HTML_TABLEHEADER_OFF: 501 { 502 aColumnName.EraseLeadingChars(); 503 aColumnName.EraseTrailingChars(); 504 if (!aColumnName.Len() || m_bAppendFirstLine ) 505 aColumnName = String(ModuleRes(STR_COLUMN_NAME)); 506 else if ( m_sCurrent.Len() ) 507 aColumnName = m_sCurrent; 508 509 aColumnName.EraseLeadingChars(); 510 aColumnName.EraseTrailingChars(); 511 CreateDefaultColumn(aColumnName); 512 aColumnName.Erase(); 513 m_sCurrent.Erase(); 514 515 eVal = SVX_HOR_JUSTIFY_STANDARD; 516 bTableHeader = sal_False; 517 } 518 break; 519 520 case HTML_TITLE_ON: 521 case HTML_CAPTION_ON: 522 bCaption = sal_True; 523 break; 524 case HTML_TITLE_OFF: 525 case HTML_CAPTION_OFF: 526 aTableName.EraseLeadingChars(); 527 aTableName.EraseTrailingChars(); 528 if(!aTableName.Len()) 529 aTableName = String(::dbtools::createUniqueName(m_xTables,::rtl::OUString(aTableName))); 530 else 531 aTableName = aTempName; 532 bCaption = sal_False; 533 break; 534 case HTML_FONT_ON: 535 TableFontOn(aFont,nTextColor); 536 break; 537 case HTML_BOLD_ON: 538 aFont.Weight = ::com::sun::star::awt::FontWeight::BOLD; 539 break; 540 case HTML_ITALIC_ON: 541 aFont.Slant = ::com::sun::star::awt::FontSlant_ITALIC; 542 break; 543 case HTML_UNDERLINE_ON: 544 aFont.Underline = ::com::sun::star::awt::FontUnderline::SINGLE; 545 break; 546 case HTML_STRIKE_ON: 547 aFont.Strikeout = ::com::sun::star::awt::FontStrikeout::SINGLE; 548 break; 549 } 550 } 551 while((nTmpToken2 = GetNextToken()) != HTML_TABLEROW_OFF); 552 553 if ( m_sCurrent.Len() ) 554 aColumnName = m_sCurrent; 555 aColumnName.EraseLeadingChars(); 556 aColumnName.EraseTrailingChars(); 557 if(aColumnName.Len()) 558 CreateDefaultColumn(aColumnName); 559 560 if ( m_vDestVector.empty() ) 561 return sal_False; 562 563 if(!aTableName.Len()) 564 aTableName = aTempName; 565 566 m_bInTbl = sal_False; 567 m_bFoundTable = sal_True; 568 569 if ( isCheckEnabled() ) 570 return sal_True; 571 572 return !executeWizard(aTableName,makeAny(nTextColor),aFont) && m_xTable.is(); 573 } 574 // ----------------------------------------------------------------------------- 575 void OHTMLReader::setTextEncoding() 576 { 577 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OHTMLReader::setTextEncoding" ); 578 DBG_CHKTHIS(OHTMLReader,NULL); 579 m_bMetaOptions = sal_True; 580 ParseMetaOptions(NULL, NULL); 581 } 582 583 // ----------------------------------------------------------------------------- 584 void OHTMLReader::release() 585 { 586 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OHTMLReader::release" ); 587 DBG_CHKTHIS(OHTMLReader,NULL); 588 ReleaseRef(); 589 } 590 // ----------------------------------------------------------------------------- 591 TypeSelectionPageFactory OHTMLReader::getTypeSelectionPageFactory() 592 { 593 RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "misc", "Ocke.Janssen@sun.com", "OHTMLReader::getTypeSelectionPageFactory" ); 594 DBG_CHKTHIS(OHTMLReader,NULL); 595 return &OWizHTMLExtend::Create; 596 } 597 // ----------------------------------------------------------------------------- 598 599