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_framework.hxx"
26 
27 //_________________________________________________________________________________________________________________
28 //	my own includes
29 //_________________________________________________________________________________________________________________
30 #include <uifactory/uielementfactorymanager.hxx>
31 #include <uifactory/windowcontentfactorymanager.hxx>
32 #include <threadhelp/resetableguard.hxx>
33 #include "services.h"
34 
35 //_________________________________________________________________________________________________________________
36 //	interface includes
37 //_________________________________________________________________________________________________________________
38 #include <com/sun/star/beans/PropertyValue.hpp>
39 #include <com/sun/star/beans/XPropertySet.hpp>
40 #include <com/sun/star/container/XNameAccess.hpp>
41 #include <com/sun/star/container/XNameContainer.hpp>
42 #include <com/sun/star/container/XContainer.hpp>
43 #include <com/sun/star/frame/XFrame.hpp>
44 
45 //_________________________________________________________________________________________________________________
46 //	includes of other projects
47 //_________________________________________________________________________________________________________________
48 #include <rtl/ustrbuf.hxx>
49 #include <cppuhelper/weak.hxx>
50 #include <tools/urlobj.hxx>
51 #include <vcl/svapp.hxx>
52 #include <rtl/logfile.hxx>
53 //_________________________________________________________________________________________________________________
54 //	Defines
55 //_________________________________________________________________________________________________________________
56 //
57 
58 using namespace com::sun::star::uno;
59 using namespace com::sun::star::lang;
60 using namespace com::sun::star::beans;
61 using namespace com::sun::star::frame;
62 using namespace com::sun::star::container;
63 using namespace ::com::sun::star::ui;
64 using namespace ::com::sun::star::frame;
65 
66 //_________________________________________________________________________________________________________________
67 //	Namespace
68 //_________________________________________________________________________________________________________________
69 //
70 
71 namespace framework
72 {
73 
74 // global function needed by both implementations
getHashKeyFromStrings(const rtl::OUString & aType,const rtl::OUString & aName,const rtl::OUString & aModuleName)75 rtl::OUString getHashKeyFromStrings( const rtl::OUString& aType, const rtl::OUString& aName, const rtl::OUString& aModuleName )
76 {
77     rtl::OUStringBuffer aKey( aType );
78     aKey.appendAscii( "^" );
79     aKey.append( aName );
80     aKey.appendAscii( "^" );
81     aKey.append( aModuleName );
82     return aKey.makeStringAndClear();
83 }
84 
85 
86 //*****************************************************************************************************************
87 //	Configuration access class for UIElementFactoryManager implementation
88 //*****************************************************************************************************************
89 
90 
ConfigurationAccess_FactoryManager(Reference<XMultiServiceFactory> & rServiceManager,const::rtl::OUString & _sRoot)91 ConfigurationAccess_FactoryManager::ConfigurationAccess_FactoryManager( Reference< XMultiServiceFactory >& rServiceManager,const ::rtl::OUString& _sRoot ) :
92     ThreadHelpBase(),
93     m_aPropType( RTL_CONSTASCII_USTRINGPARAM( "Type" )),
94     m_aPropName( RTL_CONSTASCII_USTRINGPARAM( "Name" )),
95     m_aPropModule( RTL_CONSTASCII_USTRINGPARAM( "Module" )),
96     m_aPropFactory( RTL_CONSTASCII_USTRINGPARAM( "FactoryImplementation" )),
97     m_sRoot(_sRoot),
98     m_xServiceManager( rServiceManager ),
99     m_bConfigAccessInitialized( sal_False ),
100     m_bConfigDirty(true)
101 {
102     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "UIElementFactoryManager::ConfigurationAccess_FactoryManager" );
103     m_xConfigProvider = Reference< XMultiServiceFactory >( rServiceManager->createInstance( SERVICENAME_CFGPROVIDER),UNO_QUERY );
104 }
105 
~ConfigurationAccess_FactoryManager()106 ConfigurationAccess_FactoryManager::~ConfigurationAccess_FactoryManager()
107 {
108     // SAFE
109     ResetableGuard aLock( m_aLock );
110 
111     Reference< XContainer > xContainer( m_xConfigAccess, UNO_QUERY );
112     if ( xContainer.is() )
113         xContainer->removeContainerListener( this );
114 }
115 
getFactorySpecifierFromTypeNameModule(const rtl::OUString & rType,const rtl::OUString & rName,const rtl::OUString & rModule) const116 rtl::OUString ConfigurationAccess_FactoryManager::getFactorySpecifierFromTypeNameModule( const rtl::OUString& rType, const rtl::OUString& rName, const rtl::OUString& rModule ) const
117 {
118     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "UIElementFactoryManager::getFactorySpecifierFromTypeNameModule" );
119     // SAFE
120     ResetableGuard aLock( m_aLock );
121 
122     FactoryManagerMap::const_iterator pIter =
123         m_aFactoryManagerMap.find( getHashKeyFromStrings( rType, rName, rModule ));
124     if ( pIter != m_aFactoryManagerMap.end() )
125         return pIter->second;
126     else
127     {
128         pIter = m_aFactoryManagerMap.find( getHashKeyFromStrings( rType, rName, rtl::OUString() ));
129         if ( pIter != m_aFactoryManagerMap.end() )
130             return pIter->second;
131         else
132         {
133             // Support factories which uses a defined prefix before the ui name.
134             sal_Int32 nIndex = rName.indexOf( '_' );
135             if ( nIndex > 0 )
136             {
137                 rtl::OUString aName = rName.copy( 0, nIndex+1 );
138                 pIter = m_aFactoryManagerMap.find( getHashKeyFromStrings( rType, aName, rtl::OUString() ));
139                 if ( pIter != m_aFactoryManagerMap.end() )
140                     return pIter->second;
141             }
142 
143             pIter = m_aFactoryManagerMap.find( getHashKeyFromStrings( rType, rtl::OUString(), rtl::OUString() ));
144             if ( pIter != m_aFactoryManagerMap.end() )
145                 return pIter->second;
146         }
147     }
148 
149     return rtl::OUString();
150 }
151 
addFactorySpecifierToTypeNameModule(const rtl::OUString & rType,const rtl::OUString & rName,const rtl::OUString & rModule,const rtl::OUString & rServiceSpecifier)152 void ConfigurationAccess_FactoryManager::addFactorySpecifierToTypeNameModule( const rtl::OUString& rType, const rtl::OUString& rName, const rtl::OUString& rModule, const rtl::OUString& rServiceSpecifier )
153 {
154     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "UIElementFactoryManager::addFactorySpecifierToTypeNameModule" );
155     // SAFE
156     ResetableGuard aLock( m_aLock );
157 
158     rtl::OUString aHashKey = getHashKeyFromStrings( rType, rName, rModule );
159 
160     FactoryManagerMap::const_iterator pIter = m_aFactoryManagerMap.find( aHashKey );
161 
162     if ( pIter != m_aFactoryManagerMap.end() )
163         throw ElementExistException();
164     else
165         m_aFactoryManagerMap.insert( FactoryManagerMap::value_type( aHashKey, rServiceSpecifier ));
166 }
167 
168 
removeFactorySpecifierFromTypeNameModule(const rtl::OUString & rType,const rtl::OUString & rName,const rtl::OUString & rModule)169 void ConfigurationAccess_FactoryManager::removeFactorySpecifierFromTypeNameModule( const rtl::OUString& rType, const rtl::OUString& rName, const rtl::OUString& rModule )
170 {
171     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "UIElementFactoryManager::removeFactorySpecifierFromTypeNameModule" );
172     // SAFE
173     ResetableGuard aLock( m_aLock );
174 
175     rtl::OUString aHashKey = getHashKeyFromStrings( rType, rName, rModule );
176 
177     FactoryManagerMap::const_iterator pIter = m_aFactoryManagerMap.find( aHashKey );
178 
179     if ( pIter == m_aFactoryManagerMap.end() )
180         throw NoSuchElementException();
181     else
182         m_aFactoryManagerMap.erase( aHashKey );
183 }
184 
getFactoriesDescription() const185 Sequence< Sequence< PropertyValue > > ConfigurationAccess_FactoryManager::getFactoriesDescription() const
186 {
187     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "UIElementFactoryManager::getFactoriesDescription" );
188     // SAFE
189     ResetableGuard aLock( m_aLock );
190 
191     Sequence< Sequence< PropertyValue > > aSeqSeq;
192 
193     sal_Int32 nIndex( 0 );
194     FactoryManagerMap::const_iterator pIter = m_aFactoryManagerMap.begin();
195     while ( pIter != m_aFactoryManagerMap.end() )
196     {
197         rtl::OUString aFactory = pIter->first;
198         if ( aFactory.getLength() > 0 )
199         {
200             sal_Int32                 nToken = 0;
201             Sequence< PropertyValue > aSeq( 1 );
202 
203             aSeqSeq.realloc( aSeqSeq.getLength() + 1 );
204             aSeq[0].Name  = m_aPropType;
205             aSeq[0].Value = makeAny( aFactory.getToken( 0, '^', nToken ));
206             if ( nToken > 0 )
207             {
208                 aSeq.realloc( 2 );
209                 aSeq[1].Name  = m_aPropName;
210                 aSeq[1].Value = makeAny( aFactory.getToken( 0, '^', nToken ));
211                 if ( nToken > 0 )
212                 {
213                     aSeq.realloc( 3 );
214                     aSeq[2].Name  = m_aPropModule;
215                     aSeq[2].Value = makeAny( aFactory.getToken( 0, '^', nToken ));
216                 }
217             }
218 
219             aSeqSeq[nIndex++] = aSeq;
220         }
221 
222         ++pIter;
223     }
224 
225     return aSeqSeq;
226 }
227 
228 // container.XContainerListener
elementInserted(const ContainerEvent & aEvent)229 void SAL_CALL ConfigurationAccess_FactoryManager::elementInserted( const ContainerEvent& aEvent ) throw(RuntimeException)
230 {
231     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "UIElementFactoryManager::elementInserted" );
232     rtl::OUString   aType;
233     rtl::OUString   aName;
234     rtl::OUString   aModule;
235     rtl::OUString   aService;
236 
237     // SAFE
238     ResetableGuard aLock( m_aLock );
239 
240     if ( impl_getElementProps( aEvent.Element, aType, aName, aModule, aService ))
241     {
242         // Create hash key from type, name and module as they are together a primary key to
243         // the UNO service that implements a user interface factory.
244         rtl::OUString aHashKey( getHashKeyFromStrings( aType, aName, aModule ));
245         m_aFactoryManagerMap.insert( FactoryManagerMap::value_type( aHashKey, aService ));
246     }
247 }
248 
elementRemoved(const ContainerEvent & aEvent)249 void SAL_CALL ConfigurationAccess_FactoryManager::elementRemoved ( const ContainerEvent& aEvent ) throw(RuntimeException)
250 {
251     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "UIElementFactoryManager::elementRemoved " );
252     rtl::OUString   aType;
253     rtl::OUString   aName;
254     rtl::OUString   aModule;
255     rtl::OUString   aService;
256 
257     // SAFE
258     ResetableGuard aLock( m_aLock );
259 
260     if ( impl_getElementProps( aEvent.Element, aType, aName, aModule, aService ))
261     {
262         // Create hash key from command and model as they are together a primary key to
263         // the UNO service that implements the popup menu controller.
264         rtl::OUString aHashKey( getHashKeyFromStrings( aType, aName, aModule ));
265         m_aFactoryManagerMap.erase( aHashKey );
266     }
267 }
268 
elementReplaced(const ContainerEvent & aEvent)269 void SAL_CALL ConfigurationAccess_FactoryManager::elementReplaced( const ContainerEvent& aEvent ) throw(RuntimeException)
270 {
271     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "UIElementFactoryManager::elementReplaced" );
272     rtl::OUString   aType;
273     rtl::OUString   aName;
274     rtl::OUString   aModule;
275     rtl::OUString   aService;
276 
277     // SAFE
278     ResetableGuard aLock( m_aLock );
279 
280     if ( impl_getElementProps( aEvent.Element, aType, aName, aModule, aService ))
281     {
282         // Create hash key from command and model as they are together a primary key to
283         // the UNO service that implements the popup menu controller.
284         rtl::OUString aHashKey( getHashKeyFromStrings( aType, aName, aModule ));
285         m_aFactoryManagerMap.erase( aHashKey );
286         m_aFactoryManagerMap.insert( FactoryManagerMap::value_type( aHashKey, aService ));
287     }
288 }
289 
290 // lang.XEventListener
disposing(const EventObject &)291 void SAL_CALL ConfigurationAccess_FactoryManager::disposing( const EventObject& ) throw(RuntimeException)
292 {
293     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "UIElementFactoryManager::disposing" );
294     // SAFE
295     // remove our reference to the config access
296     ResetableGuard aLock( m_aLock );
297     m_xConfigAccess.clear();
298 }
299 
readConfigurationData()300 void ConfigurationAccess_FactoryManager::readConfigurationData()
301 {
302     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "UIElementFactoryManager::readConfigurationData" );
303     // SAFE
304     ResetableGuard aLock( m_aLock );
305 
306     if ( !m_bConfigAccessInitialized )
307     {
308         Sequence< Any > aArgs( 1 );
309         PropertyValue   aPropValue;
310 
311         aPropValue.Name  = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "nodepath" ));
312         aPropValue.Value <<= m_sRoot;
313         aArgs[0] <<= aPropValue;
314 
315         try
316         {
317             m_xConfigAccess.set( m_xConfigProvider->createInstanceWithArguments(SERVICENAME_CFGREADACCESS,aArgs ), UNO_QUERY );
318         }
319         catch ( WrappedTargetException& )
320         {
321         }
322 
323         m_bConfigAccessInitialized = sal_True;
324     }
325 
326     if ( m_xConfigAccess.is() )
327     {
328         Sequence< rtl::OUString >   aUIElementFactories = m_xConfigAccess->getElementNames();
329 
330         rtl::OUString             aType;
331         rtl::OUString             aName;
332         rtl::OUString             aModule;
333         rtl::OUString             aService;
334         rtl::OUString             aHashKey;
335         Reference< XPropertySet > xPropertySet;
336         for ( sal_Int32 i = 0; i < aUIElementFactories.getLength(); i++ )
337         {
338             if ( impl_getElementProps( m_xConfigAccess->getByName( aUIElementFactories[i] ), aType, aName, aModule, aService ))
339             {
340                 // Create hash key from type, name and module as they are together a primary key to
341                 // the UNO service that implements the user interface element factory.
342                 aHashKey = getHashKeyFromStrings( aType, aName, aModule );
343                 m_aFactoryManagerMap.insert( FactoryManagerMap::value_type( aHashKey, aService ));
344             }
345         }
346 
347         Reference< XContainer > xContainer( m_xConfigAccess, UNO_QUERY );
348         aLock.unlock();
349         // UNSAFE
350         if ( xContainer.is() )
351             xContainer->addContainerListener( this );
352     }
353 }
354 
impl_getElementProps(const Any & aElement,rtl::OUString & rType,rtl::OUString & rName,rtl::OUString & rModule,rtl::OUString & rServiceSpecifier) const355 sal_Bool ConfigurationAccess_FactoryManager::impl_getElementProps( const Any& aElement, rtl::OUString& rType, rtl::OUString& rName, rtl::OUString& rModule, rtl::OUString& rServiceSpecifier ) const
356 {
357     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "UIElementFactoryManager::impl_getElementProps" );
358     Reference< XPropertySet > xPropertySet;
359     aElement >>= xPropertySet;
360 
361     if ( xPropertySet.is() )
362     {
363         try
364         {
365             xPropertySet->getPropertyValue( m_aPropType ) >>= rType;
366             xPropertySet->getPropertyValue( m_aPropName ) >>= rName;
367             xPropertySet->getPropertyValue( m_aPropModule ) >>= rModule;
368             xPropertySet->getPropertyValue( m_aPropFactory ) >>= rServiceSpecifier;
369         }
370         catch ( com::sun::star::beans::UnknownPropertyException& )
371         {
372             return sal_False;
373         }
374         catch ( com::sun::star::lang::WrappedTargetException& )
375         {
376             return sal_False;
377         }
378     }
379 
380     return sal_True;
381 }
382 
383 //*****************************************************************************************************************
384 //	XInterface, XTypeProvider, XServiceInfo
385 //*****************************************************************************************************************
DEFINE_XSERVICEINFO_ONEINSTANCESERVICE(UIElementFactoryManager,::cppu::OWeakObject,SERVICENAME_UIELEMENTFACTORYMANAGER,IMPLEMENTATIONNAME_UIELEMENTFACTORYMANAGER)386 DEFINE_XSERVICEINFO_ONEINSTANCESERVICE  (   UIElementFactoryManager				            ,
387                                             ::cppu::OWeakObject							    ,
388                                             SERVICENAME_UIELEMENTFACTORYMANAGER             ,
389 											IMPLEMENTATIONNAME_UIELEMENTFACTORYMANAGER
390 										)
391 
392 DEFINE_INIT_SERVICE                     (   UIElementFactoryManager, {} )
393 
394 UIElementFactoryManager::UIElementFactoryManager( const Reference< XMultiServiceFactory >& xServiceManager ) :
395     ThreadHelpBase( &Application::GetSolarMutex() ),
396     m_bConfigRead( sal_False ),
397     m_xServiceManager( xServiceManager )
398 {
399     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "UIElementFactoryManager::UIElementFactoryManager" );
400     m_pConfigAccess = new ConfigurationAccess_FactoryManager( m_xServiceManager,rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Office.UI.Factories/Registered/UIElementFactories" )) );
401     m_pConfigAccess->acquire();
402     m_xModuleManager = Reference< XModuleManager >( m_xServiceManager->createInstance( SERVICENAME_MODULEMANAGER ), UNO_QUERY );
403 }
404 
~UIElementFactoryManager()405 UIElementFactoryManager::~UIElementFactoryManager()
406 {
407     ResetableGuard aLock( m_aLock );
408 
409     // reduce reference count
410     m_pConfigAccess->release();
411 }
412 
413 // XUIElementFactory
createUIElement(const::rtl::OUString & ResourceURL,const Sequence<PropertyValue> & Args)414 Reference< XUIElement > SAL_CALL UIElementFactoryManager::createUIElement(
415     const ::rtl::OUString& ResourceURL,
416     const Sequence< PropertyValue >& Args )
417 throw ( ::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException )
418 {
419     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "UIElementFactoryManager::createUIElement" );
420     // SAFE
421     ResetableGuard aLock( m_aLock );
422 
423     if ( !m_bConfigRead )
424     {
425         m_bConfigRead = sal_True;
426         m_pConfigAccess->readConfigurationData();
427     }
428 
429     const rtl::OUString aPropFrame( RTL_CONSTASCII_USTRINGPARAM( "Frame" ));
430 
431     rtl::OUString   aModuleId;
432     PropertyValue   aPropValue;
433     Reference< XFrame > xFrame;
434 
435     // Retrieve the frame instance from the arguments to determine the module identifier. This must be provided
436     // to the search function. An empty module identifier is provided if the frame is missing or the module id cannot
437     // retrieve from it.
438     for ( int i = 0; i < Args.getLength(); i++ )
439     {
440         if ( Args[i].Name.equals( aPropFrame ))
441             Args[i].Value >>= xFrame;
442     }
443 
444     Reference< XModuleManager > xManager( m_xModuleManager );
445     aLock.unlock();
446 
447     // Determine the module identifier
448     try
449     {
450         if ( xFrame.is() && xManager.is() )
451             aModuleId = xManager->identify( Reference< XInterface >( xFrame, UNO_QUERY ) );
452 
453         Reference< XUIElementFactory > xUIElementFactory = getFactory( ResourceURL, aModuleId );
454         if ( xUIElementFactory.is() )
455             return xUIElementFactory->createUIElement( ResourceURL, Args );
456     }
457     catch ( UnknownModuleException& )
458     {
459     }
460 
461     throw NoSuchElementException();
462 }
463 
464 // XUIElementFactoryRegistration
getRegisteredFactories()465 Sequence< Sequence< PropertyValue > > SAL_CALL UIElementFactoryManager::getRegisteredFactories()
466 throw ( RuntimeException )
467 {
468     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "UIElementFactoryManager::getRegisteredFactories" );
469     // SAFE
470     ResetableGuard aLock( m_aLock );
471 
472     if ( !m_bConfigRead )
473     {
474         m_bConfigRead = sal_True;
475         m_pConfigAccess->readConfigurationData();
476     }
477 
478     return m_pConfigAccess->getFactoriesDescription();
479 }
480 
getFactory(const::rtl::OUString & aResourceURL,const::rtl::OUString & aModuleId)481 Reference< XUIElementFactory > SAL_CALL UIElementFactoryManager::getFactory( const ::rtl::OUString& aResourceURL, const ::rtl::OUString& aModuleId )
482 throw ( RuntimeException )
483 {
484     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "UIElementFactoryManager::getFactory" );
485     ResetableGuard aLock( m_aLock );
486 
487     if ( !m_bConfigRead )
488     {
489         m_bConfigRead = sal_True;
490         m_pConfigAccess->readConfigurationData();
491     }
492 
493     rtl::OUString aType;
494     rtl::OUString aName;
495 
496     WindowContentFactoryManager::RetrieveTypeNameFromResourceURL( aResourceURL, aType, aName );
497 
498     Reference< XMultiServiceFactory > xSManager( m_xServiceManager );
499 
500     rtl::OUString aServiceSpecifier = m_pConfigAccess->getFactorySpecifierFromTypeNameModule( aType, aName, aModuleId );
501 
502     aLock.unlock();
503     if ( aServiceSpecifier.getLength() )
504         return Reference< XUIElementFactory >( xSManager->createInstance( aServiceSpecifier ), UNO_QUERY );
505     else
506         return Reference< XUIElementFactory >();
507 }
508 
registerFactory(const::rtl::OUString & aType,const::rtl::OUString & aName,const::rtl::OUString & aModuleId,const::rtl::OUString & aFactoryImplementationName)509 void SAL_CALL UIElementFactoryManager::registerFactory( const ::rtl::OUString& aType, const ::rtl::OUString& aName, const ::rtl::OUString& aModuleId, const ::rtl::OUString& aFactoryImplementationName )
510 throw ( ElementExistException, RuntimeException )
511 {
512     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "UIElementFactoryManager::registerFactory" );
513     // SAFE
514     ResetableGuard aLock( m_aLock );
515 
516     if ( !m_bConfigRead )
517     {
518         m_bConfigRead = sal_True;
519         m_pConfigAccess->readConfigurationData();
520     }
521 
522     m_pConfigAccess->addFactorySpecifierToTypeNameModule( aType, aName, aModuleId, aFactoryImplementationName );
523     // SAFE
524 }
525 
deregisterFactory(const::rtl::OUString & aType,const::rtl::OUString & aName,const::rtl::OUString & aModuleId)526 void SAL_CALL UIElementFactoryManager::deregisterFactory( const ::rtl::OUString& aType, const ::rtl::OUString& aName, const ::rtl::OUString& aModuleId )
527 throw ( NoSuchElementException, RuntimeException )
528 {
529     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "framework", "Ocke.Janssen@sun.com", "UIElementFactoryManager::deregisterFactory" );
530     // SAFE
531     ResetableGuard aLock( m_aLock );
532 
533     if ( !m_bConfigRead )
534     {
535         m_bConfigRead = sal_True;
536         m_pConfigAccess->readConfigurationData();
537     }
538 
539     m_pConfigAccess->removeFactorySpecifierFromTypeNameModule( aType, aName, aModuleId );
540     // SAFE
541 }
542 
543 } // namespace framework
544