sdk-examples/trunk/cpp/components/StatusbarController/WordCountStatusbarController/ProtocolHandler.cxx (159 lines of code) (raw):

/************************************************************** * * 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. * *************************************************************/ #include "defines.hxx" #include "ProtocolHandler.hxx" #include "DispatchPool.hxx" #include <com/sun/star/lang/XMultiComponentFactory.hpp> #include <com/sun/star/lang/XServiceInfo.hpp> #include <com/sun/star/frame/XFrame.hpp> #include <com/sun/star/frame/XModuleManager.hpp> #include <com/sun/star/beans/XPropertySet.hpp> #include <cppuhelper/compbase4.hxx> #include <uno/current_context.hxx> using namespace framework::statusbar_controller_wordcount; using namespace com::sun::star; using namespace com::sun::star::frame; using namespace com::sun::star::beans; using namespace com::sun::star::lang; using namespace com::sun::star::uno; using namespace com::sun::star::util; using rtl::OUString; namespace { struct StaticSupportedServices : public rtl::StaticWithInit< Sequence< OUString >, StaticSupportedServices > { Sequence< OUString > operator( )( ) { Sequence< OUString > aServices( 2 ); aServices[0] = C2U( PROTOCOL_HANDLER_SERVICE_NAME ); aServices[1] = OUSTR_SERVICENAME_PROTOCOLHANDLER; return aServices; } }; } ProtocolHandler::ProtocolHandler( Reference< XComponentContext > const &rxContext ) : ProtocolHandler_Base( m_aMutex ), m_xContext( rxContext ), m_xFrame( ) { OSL_TRACE( "sbctlwc::ProtocolHandler::ProtocolHandler" ); } ProtocolHandler::~ProtocolHandler( ) { OSL_TRACE( "sbctlwc::ProtocolHandler::~ProtocolHandler" ); } void ProtocolHandler::ThrowIfDisposed( ) throw ( RuntimeException ) { if ( rBHelper.bInDispose || rBHelper.bDisposed ) throw DisposedException( ); } void SAL_CALL ProtocolHandler::disposing() { } void SAL_CALL ProtocolHandler::initialize( const Sequence< Any > &aArguments ) throw ( Exception, RuntimeException ) { OSL_TRACE( "sbctlwc::ProtocolHandler::initialize" ); Reference < XFrame > xFrame; if ( aArguments.getLength( ) ) { aArguments[0] >>= xFrame; osl::MutexGuard aGuard( m_aMutex ); m_xFrame = xFrame; try { Reference< XModuleManager > xModuleManager( m_xContext->getServiceManager()->createInstanceWithContext( OUSTR_SERVICENAME_MODULEMANAGER, m_xContext ), UNO_QUERY ); m_sModuleIdentifier = xModuleManager->identify( m_xFrame ); } catch ( ... ) {} } } Reference< XDispatch > SAL_CALL ProtocolHandler::queryDispatch( const URL &aURL, const OUString &sTargetFrameName, sal_Int32 ) throw ( RuntimeException ) { OSL_TRACE( "sbctlwc::ProtocolHandler::queryDispatch" ); Reference< XDispatch > xRet; OUString sModuleIdentifier; osl::ClearableMutexGuard aGuard( m_aMutex ); Reference< XFrame > xFrame = m_xFrame; Reference< XComponentContext > xContext = m_xContext; sModuleIdentifier = m_sModuleIdentifier; aGuard.clear( ); if ( !xFrame.is( ) ) return xRet; if ( aURL.Protocol.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( PROTOCOL_HANDLER_URL_PROTOCOL":" ) ) && sTargetFrameName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "_self" ) ) ) { return DispatchPool::GetDispatch( xContext, xFrame, aURL, sModuleIdentifier ); } return xRet; } Sequence< Reference< XDispatch > > SAL_CALL ProtocolHandler::queryDispatches( const Sequence< DispatchDescriptor > &seqDescripts ) throw ( RuntimeException ) { OSL_TRACE( "sbctlwc::ProtocolHandler::queryDispatches" ); ::sal_Int32 nCount = seqDescripts.getLength( ); Sequence< Reference< XDispatch > > lDispatcher( nCount ); for ( ::sal_Int32 i = 0; i < nCount; ++i ) { lDispatcher[i] = queryDispatch( seqDescripts[i].FeatureURL, seqDescripts[i].FrameName, seqDescripts[i].SearchFlags ); } return lDispatcher; } OUString SAL_CALL ProtocolHandler::getImplementationName( ) throw ( RuntimeException ) { return getImplementationName_static( ); } ::sal_Bool SAL_CALL ProtocolHandler::supportsService( OUString const &ServiceName ) throw ( RuntimeException ) { const Sequence< OUString > &aServices = StaticSupportedServices::get( ); for ( const OUString *pService = aServices.getConstArray( ), *pEnd = pService + aServices.getLength( ); pService != pEnd; pService++ ) { if ( pService->equals( ServiceName ) ) return sal_True; } return sal_False; } Sequence< OUString > SAL_CALL ProtocolHandler::getSupportedServiceNames( ) throw ( RuntimeException ) { return getSupportedServiceNames_static( ); } Reference< XInterface > ProtocolHandler::Create( const Reference< XComponentContext > &rxContext ) throw( Exception ) { return Reference< XInterface >( static_cast < ::cppu::OWeakObject * > ( new ProtocolHandler( rxContext ) ), UNO_QUERY ); } OUString ProtocolHandler::getImplementationName_static( ) { static OUString st_ImplName = C2U( PROTOCOL_HANDLER_IMPL_NAME ); return st_ImplName; } Sequence< OUString > ProtocolHandler::getSupportedServiceNames_static( ) { return StaticSupportedServices::get( ); }