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_basic.hxx" 26 #include <com/sun/star/container/XNameContainer.hpp> 27 #include <com/sun/star/xml/sax/XParser.hpp> 28 #include <com/sun/star/xml/sax/InputSource.hpp> 29 #include <com/sun/star/io/XOutputStream.hpp> 30 #include <com/sun/star/io/XInputStream.hpp> 31 #include <com/sun/star/embed/ElementModes.hpp> 32 #include <com/sun/star/ucb/XSimpleFileAccess.hpp> 33 #include <com/sun/star/beans/XPropertySet.hpp> 34 #include <com/sun/star/io/XActiveDataSource.hpp> 35 #include <com/sun/star/xml/sax/XDocumentHandler.hpp> 36 #include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp> 37 #include "com/sun/star/resource/XStringResourceWithStorage.hpp" 38 #include "com/sun/star/resource/XStringResourceWithLocation.hpp" 39 #include "dlgcont.hxx" 40 #include "sbmodule.hxx" 41 #include <comphelper/processfactory.hxx> 42 #include <unotools/streamwrap.hxx> 43 #include <osl/mutex.hxx> 44 45 #include <vcl/svapp.hxx> 46 #include <vcl/settings.hxx> 47 #include <unotools/pathoptions.hxx> 48 #include <xmlscript/xmldlg_imexp.hxx> 49 #include <cppuhelper/factory.hxx> 50 #include <svtools/sfxecode.hxx> 51 #include <svtools/ehdl.hxx> 52 53 54 namespace basic 55 { 56 57 using namespace com::sun::star::document; 58 using namespace com::sun::star::container; 59 using namespace com::sun::star::io; 60 using namespace com::sun::star::uno; 61 using namespace com::sun::star::ucb; 62 using namespace com::sun::star::lang; 63 using namespace com::sun::star::script; 64 using namespace com::sun::star::xml::sax; 65 using namespace com::sun::star; 66 using namespace cppu; 67 using namespace rtl; 68 using namespace osl; 69 70 using com::sun::star::uno::Reference; 71 72 //============================================================================ 73 // Implementation class SfxDialogLibraryContainer 74 75 const sal_Char* SAL_CALL SfxDialogLibraryContainer::getInfoFileName() const { return "dialog"; } 76 const sal_Char* SAL_CALL SfxDialogLibraryContainer::getOldInfoFileName() const { return "dialogs"; } 77 const sal_Char* SAL_CALL SfxDialogLibraryContainer::getLibElementFileExtension() const { return "xdl"; } 78 const sal_Char* SAL_CALL SfxDialogLibraryContainer::getLibrariesDir() const { return "Dialogs"; } 79 80 // Ctor for service 81 SfxDialogLibraryContainer::SfxDialogLibraryContainer( void ) 82 { 83 // all initialisation has to be done 84 // by calling XInitialization::initialize 85 } 86 87 SfxDialogLibraryContainer::SfxDialogLibraryContainer( const uno::Reference< embed::XStorage >& xStorage ) 88 { 89 init( OUString(), xStorage ); 90 } 91 92 // Methods to get library instances of the correct type 93 SfxLibrary* SfxDialogLibraryContainer::implCreateLibrary( const ::rtl::OUString& aName ) 94 { 95 SfxLibrary* pRet = new SfxDialogLibrary( maModifiable, aName, mxMSF, mxSFI, this ); 96 return pRet; 97 } 98 99 SfxLibrary* SfxDialogLibraryContainer::implCreateLibraryLink 100 ( const ::rtl::OUString& aName, const OUString& aLibInfoFileURL, 101 const OUString& StorageURL, sal_Bool ReadOnly ) 102 { 103 SfxLibrary* pRet = new SfxDialogLibrary 104 ( maModifiable, aName, mxMSF, mxSFI, aLibInfoFileURL, StorageURL, ReadOnly, this ); 105 return pRet; 106 } 107 108 Any SAL_CALL SfxDialogLibraryContainer::createEmptyLibraryElement( void ) 109 { 110 Reference< XInputStreamProvider > xISP; 111 Any aRetAny; 112 aRetAny <<= xISP; 113 return aRetAny; 114 } 115 116 bool SAL_CALL SfxDialogLibraryContainer::isLibraryElementValid( Any aElement ) const 117 { 118 return SfxDialogLibrary::containsValidDialog( aElement ); 119 } 120 121 bool writeOasis2OOoLibraryElement( 122 Reference< XInputStream > xInput, Reference< XOutputStream > xOutput ) 123 { 124 Reference< XMultiServiceFactory > xMSF( 125 comphelper::getProcessServiceFactory() ); 126 127 Reference< XComponentContext > xContext; 128 Reference< beans::XPropertySet > xProps( xMSF, UNO_QUERY ); 129 OSL_ASSERT( xProps.is() ); 130 OSL_VERIFY( xProps->getPropertyValue( 131 OUString::createFromAscii(("DefaultContext")) ) >>= xContext ); 132 133 Reference< lang::XMultiComponentFactory > xSMgr( 134 xContext->getServiceManager() ); 135 136 if (! xSMgr.is()) 137 { 138 return sal_False; 139 } 140 141 Reference< xml::sax::XParser > xParser( 142 xSMgr->createInstanceWithContext( 143 OUString( RTL_CONSTASCII_USTRINGPARAM( 144 "com.sun.star.xml.sax.Parser" ) ), 145 xContext ), 146 UNO_QUERY ); 147 148 Reference< xml::sax::XExtendedDocumentHandler > xWriter( 149 xSMgr->createInstanceWithContext( 150 OUString( RTL_CONSTASCII_USTRINGPARAM( 151 "com.sun.star.xml.sax.Writer" ) ), 152 xContext ), 153 UNO_QUERY ); 154 155 Reference< io::XActiveDataSource > xSource( xWriter, UNO_QUERY ); 156 xSource->setOutputStream( xOutput ); 157 158 if ( !xParser.is() || !xWriter.is() ) 159 { 160 return sal_False; 161 } 162 163 Sequence<Any> aArgs( 1 ); 164 aArgs[0] <<= xWriter; 165 166 Reference< xml::sax::XDocumentHandler > xHandler( 167 xSMgr->createInstanceWithArgumentsAndContext( 168 OUString( RTL_CONSTASCII_USTRINGPARAM( 169 "com.sun.star.comp.Oasis2OOoTransformer" ) ), 170 aArgs, xContext ), 171 UNO_QUERY ); 172 173 xParser->setDocumentHandler( xHandler ); 174 175 xml::sax::InputSource source; 176 source.aInputStream = xInput; 177 source.sSystemId = OUString::createFromAscii( "virtual file" ); 178 179 xParser->parseStream( source ); 180 181 return sal_True; 182 } 183 184 void SAL_CALL SfxDialogLibraryContainer::writeLibraryElement 185 ( 186 const Reference < XNameContainer >& xLib, 187 const OUString& aElementName, 188 const Reference< XOutputStream >& xOutput 189 ) 190 throw(Exception) 191 { 192 Any aElement = xLib->getByName( aElementName ); 193 Reference< XInputStreamProvider > xISP; 194 aElement >>= xISP; 195 if( !xISP.is() ) 196 return; 197 198 Reference< XInputStream > xInput( xISP->createInputStream() ); 199 200 bool bComplete = sal_False; 201 if ( mbOasis2OOoFormat ) 202 { 203 bComplete = writeOasis2OOoLibraryElement( xInput, xOutput ); 204 } 205 206 if ( bComplete == sal_False ) 207 { 208 Sequence< sal_Int8 > bytes; 209 sal_Int32 nRead = xInput->readBytes( bytes, xInput->available() ); 210 for (;;) 211 { 212 if( nRead ) 213 xOutput->writeBytes( bytes ); 214 215 nRead = xInput->readBytes( bytes, 1024 ); 216 if (! nRead) 217 break; 218 } 219 } 220 xInput->closeInput(); 221 } 222 223 void SfxDialogLibraryContainer::storeLibrariesToStorage( const uno::Reference< embed::XStorage >& xStorage ) throw ( RuntimeException ) 224 { 225 LibraryContainerMethodGuard aGuard( *this ); 226 mbOasis2OOoFormat = sal_False; 227 228 if ( mxStorage.is() && xStorage.is() ) 229 { 230 try 231 { 232 long nSource = SotStorage::GetVersion( mxStorage ); 233 long nTarget = SotStorage::GetVersion( xStorage ); 234 235 if ( nSource == SOFFICE_FILEFORMAT_CURRENT && 236 nTarget != SOFFICE_FILEFORMAT_CURRENT ) 237 { 238 mbOasis2OOoFormat = sal_True; 239 } 240 } 241 catch ( Exception& ) 242 { 243 // if we cannot get the version then the 244 // Oasis2OOoTransformer will not be used 245 OSL_ASSERT(sal_False); 246 } 247 } 248 249 SfxLibraryContainer::storeLibrariesToStorage( xStorage ); 250 251 mbOasis2OOoFormat = sal_False; 252 } 253 254 255 Any SAL_CALL SfxDialogLibraryContainer::importLibraryElement 256 ( const Reference < XNameContainer >& /*xLib*/, 257 const OUString& /*aElementName */, const OUString& aFile, 258 const uno::Reference< io::XInputStream >& xElementStream ) 259 { 260 Any aRetAny; 261 262 // TODO: Member because later it will be a component 263 //Reference< XMultiServiceFactory > xMSF( comphelper::getProcessServiceFactory() ); 264 //if( !xMSF.is() ) 265 //{ 266 // OSL_ENSURE( 0, "### couln't get ProcessServiceFactory\n" ); 267 // return aRetAny; 268 //} 269 270 Reference< XParser > xParser( mxMSF->createInstance( 271 OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.xml.sax.Parser") ) ), UNO_QUERY ); 272 if( !xParser.is() ) 273 { 274 OSL_ENSURE( 0, "### couln't create sax parser component\n" ); 275 return aRetAny; 276 } 277 278 Reference< XNameContainer > xDialogModel( mxMSF->createInstance 279 ( OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlDialogModel" ) ) ), UNO_QUERY ); 280 if( !xDialogModel.is() ) 281 { 282 OSL_ENSURE( 0, "### couln't create com.sun.star.awt.UnoControlDialogModel component\n" ); 283 return aRetAny; 284 } 285 286 // Read from storage? 287 sal_Bool bStorage = xElementStream.is(); 288 Reference< XInputStream > xInput; 289 290 if( bStorage ) 291 { 292 xInput = xElementStream; 293 } 294 else 295 { 296 try 297 { 298 xInput = mxSFI->openFileRead( aFile ); 299 } 300 catch( Exception& ) 301 //catch( Exception& e ) 302 { 303 // TODO: 304 //throw WrappedTargetException( e ); 305 } 306 } 307 if( !xInput.is() ) 308 return aRetAny; 309 310 Reference< XComponentContext > xContext; 311 Reference< beans::XPropertySet > xProps( mxMSF, UNO_QUERY ); 312 OSL_ASSERT( xProps.is() ); 313 OSL_VERIFY( xProps->getPropertyValue( OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultContext")) ) >>= xContext ); 314 315 InputSource source; 316 source.aInputStream = xInput; 317 source.sSystemId = aFile; 318 319 try { 320 // start parsing 321 xParser->setDocumentHandler( ::xmlscript::importDialogModel( xDialogModel, xContext ) ); 322 xParser->parseStream( source ); 323 } 324 catch( Exception& ) 325 { 326 OSL_ENSURE( 0, "Parsing error\n" ); 327 SfxErrorContext aEc( ERRCTX_SFX_LOADBASIC, aFile ); 328 sal_uIntPtr nErrorCode = ERRCODE_IO_GENERAL; 329 ErrorHandler::HandleError( nErrorCode ); 330 return aRetAny; 331 } 332 333 // Create InputStream, TODO: Implement own InputStreamProvider 334 // to avoid creating the DialogModel here! 335 Reference< XInputStreamProvider > xISP = ::xmlscript::exportDialogModel( xDialogModel, xContext ); 336 aRetAny <<= xISP; 337 return aRetAny; 338 } 339 340 void SAL_CALL SfxDialogLibraryContainer::importFromOldStorage( const OUString& ) 341 { 342 // Nothing to do here, old dialogs cannot be imported 343 } 344 345 SfxLibraryContainer* SfxDialogLibraryContainer::createInstanceImpl( void ) 346 { 347 return new SfxDialogLibraryContainer(); 348 } 349 350 351 static OUString aResourceFileNameBase = OUString::createFromAscii( "DialogStrings" ); 352 static OUString aResourceFileCommentBase = OUString::createFromAscii( "# Strings for Dialog Library " ); 353 354 // Resource handling 355 Reference< ::com::sun::star::resource::XStringResourcePersistence > 356 SfxDialogLibraryContainer::implCreateStringResource( SfxDialogLibrary* pDialogLibrary ) 357 { 358 Reference< resource::XStringResourcePersistence > xRet; 359 OUString aLibName = pDialogLibrary->getName(); 360 bool bReadOnly = pDialogLibrary->mbReadOnly; 361 362 // get ui locale 363 ::com::sun ::star::lang::Locale aLocale = Application::GetSettings().GetUILocale(); 364 365 OUString aComment = aResourceFileCommentBase; 366 aComment += aLibName; 367 368 sal_Bool bStorage = mxStorage.is(); 369 if( bStorage ) 370 { 371 Sequence<Any> aArgs( 5 ); 372 aArgs[1] <<= bReadOnly; 373 aArgs[2] <<= aLocale; 374 aArgs[3] <<= aResourceFileNameBase; 375 aArgs[4] <<= aComment; 376 377 // TODO: Ctor 378 xRet = Reference< resource::XStringResourcePersistence >( mxMSF->createInstance 379 ( OUString::createFromAscii( "com.sun.star.resource.StringResourceWithStorage" ) ), UNO_QUERY ); 380 381 uno::Reference< embed::XStorage > xLibrariesStor; 382 uno::Reference< embed::XStorage > xLibraryStor; 383 try { 384 xLibrariesStor = mxStorage->openStorageElement( maLibrariesDir, embed::ElementModes::READ ); 385 // TODO: Should be READWRITE with new storage concept using store() instead of storeTo() 386 if ( !xLibrariesStor.is() ) 387 throw uno::RuntimeException(); 388 389 xLibraryStor = xLibrariesStor->openStorageElement( aLibName, embed::ElementModes::READ ); 390 // TODO: Should be READWRITE with new storage concept using store() instead of storeTo() 391 if ( !xLibraryStor.is() ) 392 throw uno::RuntimeException(); 393 394 aArgs[0] <<= xLibraryStor; 395 } 396 catch( uno::Exception& ) 397 { 398 // TODO: Error handling? 399 return xRet; 400 } 401 402 // TODO: Ctor 403 if( xRet.is() ) 404 { 405 Reference< XInitialization > xInit( xRet, UNO_QUERY ); 406 if( xInit.is() ) 407 xInit->initialize( aArgs ); 408 } 409 } 410 else 411 { 412 Sequence<Any> aArgs( 6 ); 413 414 OUString aLocation = createAppLibraryFolder( pDialogLibrary, aLibName ); 415 aArgs[0] <<= aLocation; 416 aArgs[1] <<= bReadOnly; 417 aArgs[2] <<= aLocale; 418 aArgs[3] <<= aResourceFileNameBase; 419 aArgs[4] <<= aComment; 420 421 // TODO: Real handler? 422 Reference< task::XInteractionHandler > xDummyHandler; 423 aArgs[5] <<= xDummyHandler; 424 425 // TODO: Ctor 426 xRet = Reference< resource::XStringResourcePersistence >( mxMSF->createInstance 427 ( OUString::createFromAscii( "com.sun.star.resource.StringResourceWithLocation" ) ), UNO_QUERY ); 428 429 // TODO: Ctor 430 if( xRet.is() ) 431 { 432 Reference< XInitialization > xInit( xRet, UNO_QUERY ); 433 if( xInit.is() ) 434 xInit->initialize( aArgs ); 435 } 436 } 437 438 return xRet; 439 } 440 441 void SfxDialogLibraryContainer::onNewRootStorage() 442 { 443 // the library container is not modified, go through the libraries and check whether they are modified 444 Sequence< OUString > aNames = maNameContainer.getElementNames(); 445 const OUString* pNames = aNames.getConstArray(); 446 sal_Int32 nNameCount = aNames.getLength(); 447 448 for( sal_Int32 i = 0 ; i < nNameCount ; i++ ) 449 { 450 OUString aName = pNames[ i ]; 451 SfxDialogLibrary* pDialogLibrary = static_cast<SfxDialogLibrary*>( getImplLib( aName ) ); 452 453 Reference< resource::XStringResourcePersistence > xStringResourcePersistence = 454 pDialogLibrary->getStringResourcePersistence(); 455 456 if( xStringResourcePersistence.is() ) 457 { 458 Reference< embed::XStorage > xLibrariesStor; 459 Reference< embed::XStorage > xLibraryStor; 460 try { 461 xLibrariesStor = mxStorage->openStorageElement( maLibrariesDir, embed::ElementModes::READWRITE ); 462 if ( !xLibrariesStor.is() ) 463 throw uno::RuntimeException(); 464 465 OUString aLibName = pDialogLibrary->getName(); 466 xLibraryStor = xLibrariesStor->openStorageElement( aLibName, embed::ElementModes::READWRITE ); 467 if ( !xLibraryStor.is() ) 468 throw uno::RuntimeException(); 469 470 Reference< resource::XStringResourceWithStorage > 471 xStringResourceWithStorage( xStringResourcePersistence, UNO_QUERY ); 472 if( xStringResourceWithStorage.is() ) 473 xStringResourceWithStorage->setStorage( xLibraryStor ); 474 } 475 catch( uno::Exception& ) 476 { 477 // TODO: Error handling? 478 } 479 } 480 } 481 } 482 483 484 //============================================================================ 485 // Service 486 487 void createRegistryInfo_SfxDialogLibraryContainer() 488 { 489 static OAutoRegistration< SfxDialogLibraryContainer > aAutoRegistration; 490 } 491 492 ::rtl::OUString SAL_CALL SfxDialogLibraryContainer::getImplementationName( ) throw (RuntimeException) 493 { 494 return getImplementationName_static(); 495 } 496 497 Sequence< ::rtl::OUString > SAL_CALL SfxDialogLibraryContainer::getSupportedServiceNames( ) throw (RuntimeException) 498 { 499 return getSupportedServiceNames_static(); 500 } 501 502 Sequence< OUString > SfxDialogLibraryContainer::getSupportedServiceNames_static() 503 { 504 Sequence< OUString > aServiceNames( 2 ); 505 aServiceNames[0] = OUString::createFromAscii( "com.sun.star.script.DocumentDialogLibraryContainer" ); 506 // plus, for compatibility: 507 aServiceNames[1] = OUString::createFromAscii( "com.sun.star.script.DialogLibraryContainer" ); 508 return aServiceNames; 509 } 510 511 OUString SfxDialogLibraryContainer::getImplementationName_static() 512 { 513 static OUString aImplName; 514 static sal_Bool bNeedsInit = sal_True; 515 516 MutexGuard aGuard( Mutex::getGlobalMutex() ); 517 if( bNeedsInit ) 518 { 519 aImplName = OUString::createFromAscii( "com.sun.star.comp.sfx2.DialogLibraryContainer" ); 520 bNeedsInit = sal_False; 521 } 522 return aImplName; 523 } 524 525 Reference< XInterface > SAL_CALL SfxDialogLibraryContainer::Create( const Reference< XComponentContext >& ) throw( Exception ) 526 { 527 Reference< XInterface > xRet = 528 static_cast< XInterface* >( static_cast< OWeakObject* >(new SfxDialogLibraryContainer()) ); 529 return xRet; 530 } 531 532 533 //============================================================================ 534 // Implementation class SfxDialogLibrary 535 536 // Ctor 537 SfxDialogLibrary::SfxDialogLibrary( ModifiableHelper& _rModifiable, 538 const ::rtl::OUString& aName, 539 const Reference< XMultiServiceFactory >& xMSF, 540 const Reference< XSimpleFileAccess >& xSFI, 541 SfxDialogLibraryContainer* pParent ) 542 : SfxLibrary( _rModifiable, getCppuType( (const Reference< XInputStreamProvider > *)0 ), xMSF, xSFI ) 543 , m_pParent( pParent ) 544 , m_aName( aName ) 545 { 546 } 547 548 SfxDialogLibrary::SfxDialogLibrary( ModifiableHelper& _rModifiable, 549 const ::rtl::OUString& aName, 550 const Reference< XMultiServiceFactory >& xMSF, 551 const Reference< XSimpleFileAccess >& xSFI, 552 const OUString& aLibInfoFileURL, 553 const OUString& aStorageURL, 554 sal_Bool ReadOnly, 555 SfxDialogLibraryContainer* pParent ) 556 : SfxLibrary( _rModifiable, getCppuType( (const Reference< XInputStreamProvider > *)0 ), 557 xMSF, xSFI, aLibInfoFileURL, aStorageURL, ReadOnly) 558 , m_pParent( pParent ) 559 , m_aName( aName ) 560 { 561 } 562 563 IMPLEMENT_FORWARD_XINTERFACE2( SfxDialogLibrary, SfxLibrary, SfxDialogLibrary_BASE ); 564 IMPLEMENT_FORWARD_XTYPEPROVIDER2( SfxDialogLibrary, SfxLibrary, SfxDialogLibrary_BASE ); 565 566 // Provide modify state including resources 567 sal_Bool SfxDialogLibrary::isModified( void ) 568 { 569 sal_Bool bRet = implIsModified(); 570 571 if( !bRet && m_xStringResourcePersistence.is() ) 572 bRet = m_xStringResourcePersistence->isModified(); 573 // else: Resources not accessed so far -> not modified 574 575 return bRet; 576 } 577 578 void SfxDialogLibrary::storeResources( void ) 579 { 580 if( m_xStringResourcePersistence.is() ) 581 m_xStringResourcePersistence->store(); 582 } 583 584 void SfxDialogLibrary::storeResourcesAsURL 585 ( const ::rtl::OUString& URL, const ::rtl::OUString& NewName ) 586 { 587 OUString aComment = aResourceFileCommentBase; 588 m_aName = NewName; 589 aComment += m_aName; 590 591 if( m_xStringResourcePersistence.is() ) 592 { 593 m_xStringResourcePersistence->setComment( aComment ); 594 595 Reference< resource::XStringResourceWithLocation > 596 xStringResourceWithLocation( m_xStringResourcePersistence, UNO_QUERY ); 597 if( xStringResourceWithLocation.is() ) 598 xStringResourceWithLocation->storeAsURL( URL ); 599 } 600 } 601 602 void SfxDialogLibrary::storeResourcesToURL( const OUString& URL, 603 const Reference< task::XInteractionHandler >& xHandler ) 604 { 605 OUString aComment = aResourceFileCommentBase; 606 aComment += m_aName; 607 608 if( m_xStringResourcePersistence.is() ) 609 { 610 m_xStringResourcePersistence->storeToURL 611 ( URL, aResourceFileNameBase, aComment, xHandler ); 612 } 613 } 614 615 void SfxDialogLibrary::storeResourcesToStorage( const ::com::sun::star::uno::Reference 616 < ::com::sun::star::embed::XStorage >& xStorage ) 617 { 618 OUString aComment = aResourceFileCommentBase; 619 aComment += m_aName; 620 621 if( m_xStringResourcePersistence.is() ) 622 { 623 m_xStringResourcePersistence->storeToStorage 624 ( xStorage, aResourceFileNameBase, aComment ); 625 } 626 } 627 628 629 // XStringResourceSupplier 630 Reference< resource::XStringResourceResolver > 631 SAL_CALL SfxDialogLibrary::getStringResource( ) throw (RuntimeException) 632 { 633 if( !m_xStringResourcePersistence.is() ) 634 m_xStringResourcePersistence = m_pParent->implCreateStringResource( this ); 635 636 Reference< resource::XStringResourceResolver > xRet( m_xStringResourcePersistence, UNO_QUERY ); 637 return xRet; 638 } 639 640 bool SfxDialogLibrary::containsValidDialog( const ::com::sun::star::uno::Any& aElement ) 641 { 642 Reference< XInputStreamProvider > xISP; 643 aElement >>= xISP; 644 return xISP.is(); 645 } 646 647 bool SAL_CALL SfxDialogLibrary::isLibraryElementValid( ::com::sun::star::uno::Any aElement ) const 648 { 649 return SfxDialogLibrary::containsValidDialog( aElement ); 650 } 651 652 } 653 //============================================================================ 654 655