diff options
Diffstat (limited to 'winaccessibility/source/service/msaaservice_impl.cxx')
-rw-r--r-- | winaccessibility/source/service/msaaservice_impl.cxx | 289 |
1 files changed, 289 insertions, 0 deletions
diff --git a/winaccessibility/source/service/msaaservice_impl.cxx b/winaccessibility/source/service/msaaservice_impl.cxx new file mode 100644 index 000000000000..3148c9713914 --- /dev/null +++ b/winaccessibility/source/service/msaaservice_impl.cxx @@ -0,0 +1,289 @@ +/************************************************************** + * + * 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 <cppuhelper/implbase3.hxx> +#include <cppuhelper/factory.hxx> +#include <cppuhelper/implementationentry.hxx> + +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/lang/XInitialization.hpp> +#include <com/sun/star/lang/IllegalArgumentException.hpp> +#include <com/sun/star/accessibility/XMSAAService.hpp> + +#include <com/sun/star/awt/XExtendedToolkit.hpp> +#include <vcl/svapp.hxx> + +using namespace ::rtl; // for OUString +using namespace ::com::sun::star; // for odk interfaces +using namespace ::com::sun::star::uno; // for basic types +using namespace ::com::sun::star::accessibility; + +using namespace ::com::sun::star::awt; + +typedef sal_Int32 HWND; + +#include "AccTopWindowListener.hxx" +#include "g_msacc.hxx" + +extern void FreeTopWindowListener(); +extern long GetMSComPtr(long hWnd, long lParam, long wParam); +extern void handleWindowOpened_impl( long pAcc); + + +namespace my_sc_impl +{ + +extern Sequence< OUString > SAL_CALL getSupportedServiceNames_MSAAServiceImpl(); +extern OUString SAL_CALL getImplementationName_MSAAServiceImpl(); +extern Reference< XInterface > SAL_CALL create_MSAAServiceImpl( + Reference< XComponentContext > const & xContext ) + SAL_THROW( () ); +/** + * Method that returns the service name. + * @param + * @return Name sequence. + */ +static Sequence< OUString > getSupportedServiceNames_MSAAServiceImpl() +{ + static Sequence < OUString > *pNames = 0; + if( ! pNames ) + { + // MutexGuard guard( Mutex::getGlobalMutex() ); + if( !pNames ) + { + static Sequence< OUString > seqNames(1); + seqNames.getArray()[0] = OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.accessibility.MSAAService")); + pNames = &seqNames; + } + } + return *pNames; +} + +/** + * Method that returns the service name. + * @param + * @return Name sequence. + */ +static OUString getImplementationName_MSAAServiceImpl() +{ + static OUString *pImplName = 0; + if( ! pImplName ) + { + // MutexGuard guard( Mutex::getGlobalMutex() ); + if( ! pImplName ) + { + static OUString implName( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.accessibility.my_sc_implementation.MSAAService") ); + pImplName = &implName; + } + } + return *pImplName; +} + +class MSAAServiceImpl : public ::cppu::WeakImplHelper3< + XMSAAService, lang::XServiceInfo, lang::XInitialization > +{ + OUString m_arg; +public: + // focus on three given interfaces, + // no need to implement XInterface, XTypeProvider, XWeak + MSAAServiceImpl (); + virtual ~MSAAServiceImpl( void ); + // XInitialization will be called upon createInstanceWithArguments[AndContext]() + virtual void SAL_CALL initialize( Sequence< Any > const & args ) + throw (Exception); + // XMSAAService + virtual sal_Int32 SAL_CALL getAccObjectPtr (long hWnd, long lParam, long wParam) + throw (RuntimeException); + virtual void SAL_CALL handleWindowOpened(sal_Int32) + throw (RuntimeException); + // XServiceInfo + virtual OUString SAL_CALL getImplementationName() + throw (RuntimeException); + virtual sal_Bool SAL_CALL supportsService( OUString const & serviceName ) + throw (RuntimeException); + virtual Sequence< OUString > SAL_CALL getSupportedServiceNames() + throw (RuntimeException); +}; + +/** + * Implemention of XInitialization. + * @param + * @return. + */ +void MSAAServiceImpl::initialize( Sequence< Any > const & args ) throw (Exception) +{ + if (1 != args.getLength()) + { + throw lang::IllegalArgumentException( + OUString( RTL_CONSTASCII_USTRINGPARAM("give a string instanciating this component!") ), + (::cppu::OWeakObject *)this, // resolve to XInterface reference + 0 ); // argument pos + } + if (! (args[ 0 ] >>= m_arg)) + { + throw lang::IllegalArgumentException( + OUString( RTL_CONSTASCII_USTRINGPARAM("no string given as argument!") ), + (::cppu::OWeakObject *)this, // resolve to XInterface reference + 0 ); // argument pos + } +} + +/** + * Implemention of getAccObjectPtr. + * @param + * @return Com interface. + */ +sal_Int32 MSAAServiceImpl::getAccObjectPtr ( long hWnd, long lParam, long wParam) throw (RuntimeException) +{ + return GetMSComPtr(hWnd, lParam, wParam); +} + +/** + * Implemention of handleWindowOpened,the method will be invoked when a top window + * opened and AT starts up. + * @param + * @return + */ +void MSAAServiceImpl::handleWindowOpened( sal_Int32 pAcc) +{ + handleWindowOpened_impl(pAcc); +} + +/** + * Implemention of XServiceInfo. + * @param + * @return Implementataion name. + */ +OUString MSAAServiceImpl::getImplementationName() throw (RuntimeException) +{ + // unique implementation name + return OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.accessibility.my_sc_impl.MSAAService") ); +} + +/** + * Implemention of XServiceInfo,return support service name. + * @param Service name. + * @return If the service name is supported. + */ +sal_Bool MSAAServiceImpl::supportsService( OUString const & serviceName ) throw (RuntimeException) +{ + // this object only supports one service, so the test is simple + return serviceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.accessibility.MSAAService") ); +} + +/** + * Implemention of XServiceInfo,return all service names. + * @param. + * @return service name sequence. + */ +Sequence< OUString > MSAAServiceImpl::getSupportedServiceNames() throw (RuntimeException) +{ + return getSupportedServiceNames_MSAAServiceImpl(); +} + +/** + * Static method that can create an entity of our MSAA Service + * @param xContext No use here. + * @return The object interface. + */ +Reference< XInterface > SAL_CALL create_MSAAServiceImpl( Reference< XComponentContext > const & /*xContext*/ ) SAL_THROW( () ) +{ + MSAAServiceImpl* xxx = new MSAAServiceImpl(); + //return static_cast< lang::XTypeProvider * >( xxx ); + Reference< XMSAAService > p( xxx ); + return p; +} + +/** + * Constructor. + * @param + * @return + */ +MSAAServiceImpl::MSAAServiceImpl() +{ + Reference< XExtendedToolkit > xToolkit = + Reference< XExtendedToolkit >(Application::GetVCLToolkit(), UNO_QUERY); + + if(xToolkit.is()) + { + AccTopWindowListener *accListener; + accListener = new AccTopWindowListener(); + g_pTop = accListener; + Reference< XTopWindowListener> x(accListener); + xToolkit->addTopWindowListener(x); + } +} + +/** + * Static method that can create an entity of our MSAA Service + * @param Destructor + * @return + */ +MSAAServiceImpl::~MSAAServiceImpl() +{ + + // As all folders and streams contain references to their parents, + // we must remove these references so that they will be deleted when + // the hash_map of the root folder is cleared, releasing all subfolders + // and substreams which in turn release theirs, etc. When xRootFolder is + // released when this destructor completes, the folder tree should be + // deleted fully (and automagically). + FreeTopWindowListener(); + + +} + +} + +/* shared lib exports implemented without helpers in service_impl1.cxx */ +namespace my_sc_impl +{ +static struct ::cppu::ImplementationEntry s_component_entries [] = + { + { + create_MSAAServiceImpl, getImplementationName_MSAAServiceImpl, + getSupportedServiceNames_MSAAServiceImpl, ::cppu::createSingleComponentFactory, + 0, 0 + }, + { + create_MSAAServiceImpl, getImplementationName_MSAAServiceImpl, + getSupportedServiceNames_MSAAServiceImpl, ::cppu::createSingleComponentFactory, + 0, 0 + }, + { 0, 0, 0, 0, 0, 0 } + }; +} + +extern "C" +{ + void SAL_CALL component_getImplementationEnvironment( + sal_Char const ** ppEnvTypeName, uno_Environment ** /*ppEnv*/ ) + { + *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; + } + void * SAL_CALL component_getFactory( + sal_Char const * implName, lang::XMultiServiceFactory * xMgr, + registry::XRegistryKey * xRegistry ) + { + return ::cppu::component_getFactoryHelper( + implName, xMgr, xRegistry, ::my_sc_impl::s_component_entries ); + } +} |