xref: /trunk/main/basic/source/uno/dlgcont.cxx (revision e1f63238)
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 
getInfoFileName() const75 const sal_Char* SAL_CALL SfxDialogLibraryContainer::getInfoFileName() const { return "dialog"; }
getOldInfoFileName() const76 const sal_Char* SAL_CALL SfxDialogLibraryContainer::getOldInfoFileName() const { return "dialogs"; }
getLibElementFileExtension() const77 const sal_Char* SAL_CALL SfxDialogLibraryContainer::getLibElementFileExtension() const { return "xdl"; }
getLibrariesDir() const78 const sal_Char* SAL_CALL SfxDialogLibraryContainer::getLibrariesDir() const { return "Dialogs"; }
79 
80 // Ctor for service
SfxDialogLibraryContainer(void)81 SfxDialogLibraryContainer::SfxDialogLibraryContainer( void )
82 {
83     // all initialisation has to be done
84     // by calling XInitialization::initialize
85 }
86 
SfxDialogLibraryContainer(const uno::Reference<embed::XStorage> & xStorage)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
implCreateLibrary(const::rtl::OUString & aName)93 SfxLibrary* SfxDialogLibraryContainer::implCreateLibrary( const ::rtl::OUString& aName )
94 {
95 	SfxLibrary* pRet = new SfxDialogLibrary( maModifiable, aName, mxMSF, mxSFI, this );
96 	return pRet;
97 }
98 
implCreateLibraryLink(const::rtl::OUString & aName,const OUString & aLibInfoFileURL,const OUString & StorageURL,sal_Bool ReadOnly)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 
createEmptyLibraryElement(void)108 Any SAL_CALL SfxDialogLibraryContainer::createEmptyLibraryElement( void )
109 {
110 	Reference< XInputStreamProvider > xISP;
111 	Any aRetAny;
112 	aRetAny <<= xISP;
113 	return aRetAny;
114 }
115 
isLibraryElementValid(Any aElement) const116 bool SAL_CALL SfxDialogLibraryContainer::isLibraryElementValid( Any aElement ) const
117 {
118     return SfxDialogLibrary::containsValidDialog( aElement );
119 }
120 
writeOasis2OOoLibraryElement(Reference<XInputStream> xInput,Reference<XOutputStream> xOutput)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 
writeLibraryElement(const Reference<XNameContainer> & xLib,const OUString & aElementName,const Reference<XOutputStream> & xOutput)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 
storeLibrariesToStorage(const uno::Reference<embed::XStorage> & xStorage)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 
importLibraryElement(const Reference<XNameContainer> &,const OUString &,const OUString & aFile,const uno::Reference<io::XInputStream> & xElementStream)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 
importFromOldStorage(const OUString &)340 void SAL_CALL SfxDialogLibraryContainer::importFromOldStorage( const OUString& )
341 {
342     // Nothing to do here, old dialogs cannot be imported
343 }
344 
createInstanceImpl(void)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 >
implCreateStringResource(SfxDialogLibrary * pDialogLibrary)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 
onNewRootStorage()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 
createRegistryInfo_SfxDialogLibraryContainer()487 void createRegistryInfo_SfxDialogLibraryContainer()
488 {
489     static OAutoRegistration< SfxDialogLibraryContainer > aAutoRegistration;
490 }
491 
getImplementationName()492 ::rtl::OUString SAL_CALL SfxDialogLibraryContainer::getImplementationName( ) throw (RuntimeException)
493 {
494     return getImplementationName_static();
495 }
496 
getSupportedServiceNames()497 Sequence< ::rtl::OUString > SAL_CALL SfxDialogLibraryContainer::getSupportedServiceNames( ) throw (RuntimeException)
498 {
499     return getSupportedServiceNames_static();
500 }
501 
getSupportedServiceNames_static()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 
getImplementationName_static()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 
Create(const Reference<XComponentContext> &)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
SfxDialogLibrary(ModifiableHelper & _rModifiable,const::rtl::OUString & aName,const Reference<XMultiServiceFactory> & xMSF,const Reference<XSimpleFileAccess> & xSFI,SfxDialogLibraryContainer * pParent)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 
SfxDialogLibrary(ModifiableHelper & _rModifiable,const::rtl::OUString & aName,const Reference<XMultiServiceFactory> & xMSF,const Reference<XSimpleFileAccess> & xSFI,const OUString & aLibInfoFileURL,const OUString & aStorageURL,sal_Bool ReadOnly,SfxDialogLibraryContainer * pParent)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
isModified(void)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 
storeResources(void)578 void SfxDialogLibrary::storeResources( void )
579 {
580 	if( m_xStringResourcePersistence.is() )
581 		m_xStringResourcePersistence->store();
582 }
583 
storeResourcesAsURL(const::rtl::OUString & URL,const::rtl::OUString & NewName)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 
storeResourcesToURL(const OUString & URL,const Reference<task::XInteractionHandler> & xHandler)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 
storeResourcesToStorage(const::com::sun::star::uno::Reference<::com::sun::star::embed::XStorage> & xStorage)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 >
getStringResource()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 
containsValidDialog(const::com::sun::star::uno::Any & aElement)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 
isLibraryElementValid(::com::sun::star::uno::Any aElement) const647 bool SAL_CALL SfxDialogLibrary::isLibraryElementValid( ::com::sun::star::uno::Any aElement ) const
648 {
649     return SfxDialogLibrary::containsValidDialog( aElement );
650 }
651 
652 }
653 //============================================================================
654 
655