/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_framework.hxx" #include #include #include #include "services.h" #include #include #include #include #include #include #include using namespace com::sun::star::uno; using namespace com::sun::star::lang; using namespace com::sun::star::beans; using namespace com::sun::star::container; using namespace ::com::sun::star::frame; namespace framework { UIControllerFactory::UIControllerFactory( const Reference< XMultiServiceFactory >& xServiceManager, const rtl::OUString &rConfigurationNode ) : ThreadHelpBase() , m_bConfigRead( sal_False ) , m_xServiceManager( xServiceManager ) , m_pConfigAccess() { rtl::OUStringBuffer aBuffer; aBuffer.appendAscii( RTL_CONSTASCII_STRINGPARAM( "/org.openoffice.Office.UI.Controller/Registered/" ) ); aBuffer.append( rConfigurationNode ); m_pConfigAccess = new ConfigurationAccess_ControllerFactory( m_xServiceManager, aBuffer.makeStringAndClear() ); m_pConfigAccess->acquire(); } UIControllerFactory::~UIControllerFactory() { ResetableGuard aLock( m_aLock ); // reduce reference count m_pConfigAccess->release(); } // XMultiComponentFactory Reference< XInterface > SAL_CALL UIControllerFactory::createInstanceWithContext( const ::rtl::OUString& aServiceSpecifier, const Reference< XComponentContext >& ) throw (Exception, RuntimeException) { // SAFE ResetableGuard aLock( m_aLock ); if ( !m_bConfigRead ) { m_bConfigRead = sal_True; m_pConfigAccess->readConfigurationData(); } rtl::OUString aServiceName = m_pConfigAccess->getServiceFromCommandModule( aServiceSpecifier, rtl::OUString() ); if ( aServiceName.getLength() > 0 ) return m_xServiceManager->createInstance( aServiceName ); else return Reference< XInterface >(); // SAFE } Reference< XInterface > SAL_CALL UIControllerFactory::createInstanceWithArgumentsAndContext( const ::rtl::OUString& ServiceSpecifier, const Sequence< Any >& Arguments, const Reference< XComponentContext >& ) throw (Exception, RuntimeException) { const rtl::OUString aPropModuleName( RTL_CONSTASCII_USTRINGPARAM( "ModuleIdentifier" )); const rtl::OUString aPropValueName( RTL_CONSTASCII_USTRINGPARAM( "Value" )); rtl::OUString aPropName; PropertyValue aPropValue; // Retrieve the optional module name form the Arguments sequence. It is used as a part of // the hash map key to support different controller implementation for the same URL but different // module!! for ( int i = 0; i < Arguments.getLength(); i++ ) { if (( Arguments[i] >>= aPropValue ) && ( aPropValue.Name.equals( aPropModuleName ))) { aPropValue.Value >>= aPropName; break; } } Sequence< Any > aNewArgs( Arguments ); sal_Int32 nAppendIndex = aNewArgs.getLength(); bool bHasValue = m_pConfigAccess->hasValue(); aNewArgs.realloc( aNewArgs.getLength() + (bHasValue ? 2 : 1) ); // Append the command URL to the Arguments sequence so that one controller can be // used for more than one command URL. aPropValue.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CommandURL" )); aPropValue.Value <<= ServiceSpecifier; aNewArgs[nAppendIndex] <<= aPropValue; if ( bHasValue ) { // Append the optional value argument. It's an empty string if no additional info // is provided to the controller. rtl::OUString aValue = m_pConfigAccess->getValueFromCommandModule( ServiceSpecifier, aPropName ); aPropValue.Name = aPropValueName; aPropValue.Value <<= aValue; aNewArgs[nAppendIndex+1] <<= aPropValue; } { // SAFE ResetableGuard aLock( m_aLock ); if ( !m_bConfigRead ) { m_bConfigRead = sal_True; m_pConfigAccess->readConfigurationData(); } rtl::OUString aServiceName = m_pConfigAccess->getServiceFromCommandModule( ServiceSpecifier, aPropName ); Reference< XMultiServiceFactory > xServiceManager( m_xServiceManager ); aLock.unlock(); // SAFE if ( aServiceName.getLength() > 0 ) return xServiceManager->createInstanceWithArguments( aServiceName, aNewArgs ); else return Reference< XInterface >(); } } Sequence< ::rtl::OUString > SAL_CALL UIControllerFactory::getAvailableServiceNames() throw (RuntimeException) { return Sequence< ::rtl::OUString >(); } // XUIControllerRegistration sal_Bool SAL_CALL UIControllerFactory::hasController( const ::rtl::OUString& aCommandURL, const rtl::OUString& aModuleName ) throw (::com::sun::star::uno::RuntimeException) { ResetableGuard aLock( m_aLock ); if ( !m_bConfigRead ) { m_bConfigRead = sal_True; m_pConfigAccess->readConfigurationData(); } return ( m_pConfigAccess->getServiceFromCommandModule( aCommandURL, aModuleName ).getLength() > 0 ); } void SAL_CALL UIControllerFactory::registerController( const ::rtl::OUString& aCommandURL, const ::rtl::OUString& aModuleName, const ::rtl::OUString& aControllerImplementationName ) throw (RuntimeException) { // SAFE ResetableGuard aLock( m_aLock ); if ( !m_bConfigRead ) { m_bConfigRead = sal_True; m_pConfigAccess->readConfigurationData(); } m_pConfigAccess->addServiceToCommandModule( aCommandURL, aModuleName, aControllerImplementationName ); // SAFE } void SAL_CALL UIControllerFactory::deregisterController( const ::rtl::OUString& aCommandURL, const rtl::OUString& aModuleName ) throw (RuntimeException) { // SAFE ResetableGuard aLock( m_aLock ); if ( !m_bConfigRead ) { m_bConfigRead = sal_True; m_pConfigAccess->readConfigurationData(); } m_pConfigAccess->removeServiceFromCommandModule( aCommandURL, aModuleName ); // SAFE } DEFINE_XSERVICEINFO_ONEINSTANCESERVICE ( PopupMenuControllerFactory , ::cppu::OWeakObject , SERVICENAME_POPUPMENUCONTROLLERFACTORY , IMPLEMENTATIONNAME_POPUPMENUCONTROLLERFACTORY ) DEFINE_INIT_SERVICE ( PopupMenuControllerFactory, {} ) PopupMenuControllerFactory::PopupMenuControllerFactory( const Reference< XMultiServiceFactory >& xServiceManager ) : UIControllerFactory( xServiceManager, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PopupMenu" )) ) { } DEFINE_XSERVICEINFO_ONEINSTANCESERVICE ( ToolbarControllerFactory , ::cppu::OWeakObject , SERVICENAME_TOOLBARCONTROLLERFACTORY , IMPLEMENTATIONNAME_TOOLBARCONTROLLERFACTORY ) DEFINE_INIT_SERVICE ( ToolbarControllerFactory, {} ) ToolbarControllerFactory::ToolbarControllerFactory( const Reference< XMultiServiceFactory >& xServiceManager ) : UIControllerFactory( xServiceManager, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ToolBar" ))) { } DEFINE_XSERVICEINFO_ONEINSTANCESERVICE ( StatusbarControllerFactory , ::cppu::OWeakObject , SERVICENAME_STATUSBARCONTROLLERFACTORY , IMPLEMENTATIONNAME_STATUSBARCONTROLLERFACTORY ) DEFINE_INIT_SERVICE ( StatusbarControllerFactory, {} ) StatusbarControllerFactory::StatusbarControllerFactory( const Reference< XMultiServiceFactory >& xServiceManager ) : UIControllerFactory( xServiceManager, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StatusBar" )) ) { } } // namespace framework