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