xref: /AOO41X/main/winaccessibility/source/service/msaaservice_impl.cxx (revision ffad8df045fe8db79e3e50f731c1fa6ab6501c83)
1*3a700b0aSSteve Yin /**************************************************************
25fdc4257SSteve Yin  *
3*3a700b0aSSteve Yin  * Licensed to the Apache Software Foundation (ASF) under one
4*3a700b0aSSteve Yin  * or more contributor license agreements.  See the NOTICE file
5*3a700b0aSSteve Yin  * distributed with this work for additional information
6*3a700b0aSSteve Yin  * regarding copyright ownership.  The ASF licenses this file
7*3a700b0aSSteve Yin  * to you under the Apache License, Version 2.0 (the
8*3a700b0aSSteve Yin  * "License"); you may not use this file except in compliance
9*3a700b0aSSteve Yin  * with the License.  You may obtain a copy of the License at
105fdc4257SSteve Yin  *
11*3a700b0aSSteve Yin  *   http://www.apache.org/licenses/LICENSE-2.0
125fdc4257SSteve Yin  *
13*3a700b0aSSteve Yin  * Unless required by applicable law or agreed to in writing,
14*3a700b0aSSteve Yin  * software distributed under the License is distributed on an
15*3a700b0aSSteve Yin  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*3a700b0aSSteve Yin  * KIND, either express or implied.  See the License for the
17*3a700b0aSSteve Yin  * specific language governing permissions and limitations
18*3a700b0aSSteve Yin  * under the License.
195fdc4257SSteve Yin  *
20*3a700b0aSSteve Yin  *************************************************************/
215fdc4257SSteve Yin 
225fdc4257SSteve Yin #include <cppuhelper/implbase3.hxx>
235fdc4257SSteve Yin #include <cppuhelper/factory.hxx>
245fdc4257SSteve Yin #include <cppuhelper/implementationentry.hxx>
255fdc4257SSteve Yin 
265fdc4257SSteve Yin #include <com/sun/star/lang/XServiceInfo.hpp>
275fdc4257SSteve Yin #include <com/sun/star/lang/XInitialization.hpp>
285fdc4257SSteve Yin #include <com/sun/star/lang/IllegalArgumentException.hpp>
295fdc4257SSteve Yin #include <com/sun/star/accessibility/XMSAAService.hpp>
305fdc4257SSteve Yin 
315fdc4257SSteve Yin #include <com/sun/star/awt/XExtendedToolkit.hpp>
325fdc4257SSteve Yin #include <vcl/svapp.hxx>
335fdc4257SSteve Yin 
345fdc4257SSteve Yin using namespace ::rtl; // for OUString
355fdc4257SSteve Yin using namespace ::com::sun::star; // for odk interfaces
365fdc4257SSteve Yin using namespace ::com::sun::star::uno; // for basic types
375fdc4257SSteve Yin using namespace ::com::sun::star::accessibility;
385fdc4257SSteve Yin 
395fdc4257SSteve Yin using namespace ::com::sun::star::awt;
405fdc4257SSteve Yin 
415fdc4257SSteve Yin typedef sal_Int32 HWND;
425fdc4257SSteve Yin 
435fdc4257SSteve Yin #include "AccTopWindowListener.hxx"
445fdc4257SSteve Yin #include "g_msacc.hxx"
455fdc4257SSteve Yin 
465fdc4257SSteve Yin extern void FreeTopWindowListener();
475fdc4257SSteve Yin extern long GetMSComPtr(long hWnd, long lParam, long wParam);
485fdc4257SSteve Yin extern void handleWindowOpened_impl( long pAcc);
495fdc4257SSteve Yin 
505fdc4257SSteve Yin 
515fdc4257SSteve Yin namespace my_sc_impl
525fdc4257SSteve Yin {
535fdc4257SSteve Yin 
545fdc4257SSteve Yin extern Sequence< OUString > SAL_CALL  getSupportedServiceNames_MSAAServiceImpl();
555fdc4257SSteve Yin extern OUString SAL_CALL getImplementationName_MSAAServiceImpl();
565fdc4257SSteve Yin extern Reference< XInterface > SAL_CALL create_MSAAServiceImpl(
575fdc4257SSteve Yin         Reference< XComponentContext > const & xContext )
585fdc4257SSteve Yin     SAL_THROW( () );
595fdc4257SSteve Yin /**
605fdc4257SSteve Yin    * Method that returns the service name.
615fdc4257SSteve Yin    * @param
625fdc4257SSteve Yin    * @return Name sequence.
635fdc4257SSteve Yin    */
getSupportedServiceNames_MSAAServiceImpl()645fdc4257SSteve Yin static Sequence< OUString > getSupportedServiceNames_MSAAServiceImpl()
655fdc4257SSteve Yin {
665fdc4257SSteve Yin     static Sequence < OUString > *pNames = 0;
675fdc4257SSteve Yin     if( ! pNames )
685fdc4257SSteve Yin     {
695fdc4257SSteve Yin         //		MutexGuard guard( Mutex::getGlobalMutex() );
705fdc4257SSteve Yin         if( !pNames )
715fdc4257SSteve Yin         {
725fdc4257SSteve Yin             static Sequence< OUString > seqNames(1);
735fdc4257SSteve Yin             seqNames.getArray()[0] = OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.accessibility.MSAAService"));
745fdc4257SSteve Yin             pNames = &seqNames;
755fdc4257SSteve Yin         }
765fdc4257SSteve Yin     }
775fdc4257SSteve Yin     return *pNames;
785fdc4257SSteve Yin }
795fdc4257SSteve Yin 
805fdc4257SSteve Yin /**
815fdc4257SSteve Yin    * Method that returns the service name.
825fdc4257SSteve Yin    * @param
835fdc4257SSteve Yin    * @return Name sequence.
845fdc4257SSteve Yin    */
getImplementationName_MSAAServiceImpl()855fdc4257SSteve Yin static OUString getImplementationName_MSAAServiceImpl()
865fdc4257SSteve Yin {
875fdc4257SSteve Yin     static OUString *pImplName = 0;
885fdc4257SSteve Yin     if( ! pImplName )
895fdc4257SSteve Yin     {
905fdc4257SSteve Yin         //		MutexGuard guard( Mutex::getGlobalMutex() );
915fdc4257SSteve Yin         if( ! pImplName )
925fdc4257SSteve Yin         {
935fdc4257SSteve Yin             static OUString implName( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.accessibility.my_sc_implementation.MSAAService") );
945fdc4257SSteve Yin             pImplName = &implName;
955fdc4257SSteve Yin         }
965fdc4257SSteve Yin     }
975fdc4257SSteve Yin     return *pImplName;
985fdc4257SSteve Yin }
995fdc4257SSteve Yin 
1005fdc4257SSteve Yin class MSAAServiceImpl : public ::cppu::WeakImplHelper3<
1015fdc4257SSteve Yin             XMSAAService, lang::XServiceInfo, lang::XInitialization >
1025fdc4257SSteve Yin {
1035fdc4257SSteve Yin     OUString m_arg;
1045fdc4257SSteve Yin public:
1055fdc4257SSteve Yin     // focus on three given interfaces,
1065fdc4257SSteve Yin     // no need to implement XInterface, XTypeProvider, XWeak
1075fdc4257SSteve Yin     MSAAServiceImpl ();
1085fdc4257SSteve Yin     virtual ~MSAAServiceImpl( void );
1095fdc4257SSteve Yin     // XInitialization will be called upon createInstanceWithArguments[AndContext]()
1105fdc4257SSteve Yin     virtual void SAL_CALL initialize( Sequence< Any > const & args )
1115fdc4257SSteve Yin     throw (Exception);
1125fdc4257SSteve Yin     // XMSAAService
1135fdc4257SSteve Yin     virtual sal_Int32 SAL_CALL getAccObjectPtr (long hWnd, long lParam, long wParam)
1145fdc4257SSteve Yin     throw (RuntimeException);
1155fdc4257SSteve Yin     virtual void SAL_CALL handleWindowOpened(sal_Int32)
1165fdc4257SSteve Yin     throw (RuntimeException);
1175fdc4257SSteve Yin     // XServiceInfo
1185fdc4257SSteve Yin     virtual OUString SAL_CALL getImplementationName()
1195fdc4257SSteve Yin     throw (RuntimeException);
1205fdc4257SSteve Yin     virtual sal_Bool SAL_CALL supportsService( OUString const & serviceName )
1215fdc4257SSteve Yin     throw (RuntimeException);
1225fdc4257SSteve Yin     virtual Sequence< OUString > SAL_CALL getSupportedServiceNames()
1235fdc4257SSteve Yin     throw (RuntimeException);
1245fdc4257SSteve Yin };
1255fdc4257SSteve Yin 
1265fdc4257SSteve Yin /**
1275fdc4257SSteve Yin    * Implemention of XInitialization.
1285fdc4257SSteve Yin    * @param
1295fdc4257SSteve Yin    * @return.
1305fdc4257SSteve Yin    */
initialize(Sequence<Any> const & args)1315fdc4257SSteve Yin void MSAAServiceImpl::initialize( Sequence< Any > const & args ) throw (Exception)
1325fdc4257SSteve Yin {
1335fdc4257SSteve Yin     if (1 != args.getLength())
1345fdc4257SSteve Yin     {
1355fdc4257SSteve Yin         throw lang::IllegalArgumentException(
1365fdc4257SSteve Yin             OUString( RTL_CONSTASCII_USTRINGPARAM("give a string instanciating this component!") ),
1375fdc4257SSteve Yin             (::cppu::OWeakObject *)this, // resolve to XInterface reference
1385fdc4257SSteve Yin             0 ); // argument pos
1395fdc4257SSteve Yin     }
1405fdc4257SSteve Yin     if (! (args[ 0 ] >>= m_arg))
1415fdc4257SSteve Yin     {
1425fdc4257SSteve Yin         throw lang::IllegalArgumentException(
1435fdc4257SSteve Yin             OUString( RTL_CONSTASCII_USTRINGPARAM("no string given as argument!") ),
1445fdc4257SSteve Yin             (::cppu::OWeakObject *)this, // resolve to XInterface reference
1455fdc4257SSteve Yin             0 ); // argument pos
1465fdc4257SSteve Yin     }
1475fdc4257SSteve Yin }
1485fdc4257SSteve Yin 
1495fdc4257SSteve Yin /**
1505fdc4257SSteve Yin    * Implemention of getAccObjectPtr.
1515fdc4257SSteve Yin    * @param
1525fdc4257SSteve Yin    * @return Com interface.
1535fdc4257SSteve Yin    */
getAccObjectPtr(long hWnd,long lParam,long wParam)1545fdc4257SSteve Yin sal_Int32 MSAAServiceImpl::getAccObjectPtr ( long hWnd, long lParam, long wParam) throw (RuntimeException)
1555fdc4257SSteve Yin {
1565fdc4257SSteve Yin     return GetMSComPtr(hWnd, lParam, wParam);
1575fdc4257SSteve Yin }
1585fdc4257SSteve Yin 
1595fdc4257SSteve Yin /**
1605fdc4257SSteve Yin    * Implemention of handleWindowOpened,the method will be invoked when a top window
1615fdc4257SSteve Yin    * opened and AT starts up.
1625fdc4257SSteve Yin    * @param
1635fdc4257SSteve Yin    * @return
1645fdc4257SSteve Yin    */
handleWindowOpened(sal_Int32 pAcc)1655fdc4257SSteve Yin void MSAAServiceImpl::handleWindowOpened( sal_Int32 pAcc)
1665fdc4257SSteve Yin {
1675fdc4257SSteve Yin     handleWindowOpened_impl(pAcc);
1685fdc4257SSteve Yin }
1695fdc4257SSteve Yin 
1705fdc4257SSteve Yin /**
1715fdc4257SSteve Yin    * Implemention of XServiceInfo.
1725fdc4257SSteve Yin    * @param
1735fdc4257SSteve Yin    * @return Implementataion name.
1745fdc4257SSteve Yin    */
getImplementationName()1755fdc4257SSteve Yin OUString MSAAServiceImpl::getImplementationName() throw (RuntimeException)
1765fdc4257SSteve Yin {
1775fdc4257SSteve Yin     // unique implementation name
1785fdc4257SSteve Yin     return OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.accessibility.my_sc_impl.MSAAService") );
1795fdc4257SSteve Yin }
1805fdc4257SSteve Yin 
1815fdc4257SSteve Yin /**
1825fdc4257SSteve Yin    * Implemention of XServiceInfo,return support service name.
1835fdc4257SSteve Yin    * @param Service name.
1845fdc4257SSteve Yin    * @return If the service name is supported.
1855fdc4257SSteve Yin    */
supportsService(OUString const & serviceName)1865fdc4257SSteve Yin sal_Bool MSAAServiceImpl::supportsService( OUString const & serviceName ) throw (RuntimeException)
1875fdc4257SSteve Yin {
1885fdc4257SSteve Yin     // this object only supports one service, so the test is simple
1895fdc4257SSteve Yin     return serviceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("com.sun.star.accessibility.MSAAService") );
1905fdc4257SSteve Yin }
1915fdc4257SSteve Yin 
1925fdc4257SSteve Yin /**
1935fdc4257SSteve Yin    * Implemention of XServiceInfo,return all service names.
1945fdc4257SSteve Yin    * @param.
1955fdc4257SSteve Yin    * @return service name sequence.
1965fdc4257SSteve Yin    */
getSupportedServiceNames()1975fdc4257SSteve Yin Sequence< OUString > MSAAServiceImpl::getSupportedServiceNames() throw (RuntimeException)
1985fdc4257SSteve Yin {
1995fdc4257SSteve Yin     return getSupportedServiceNames_MSAAServiceImpl();
2005fdc4257SSteve Yin }
2015fdc4257SSteve Yin 
2025fdc4257SSteve Yin /**
2035fdc4257SSteve Yin    * Static method that can create an entity of our MSAA Service
2045fdc4257SSteve Yin    * @param xContext No use here.
2055fdc4257SSteve Yin    * @return The object interface.
2065fdc4257SSteve Yin    */
create_MSAAServiceImpl(Reference<XComponentContext> const &)2075fdc4257SSteve Yin Reference< XInterface > SAL_CALL create_MSAAServiceImpl( Reference< XComponentContext > const & /*xContext*/ ) SAL_THROW( () )
2085fdc4257SSteve Yin {
2095fdc4257SSteve Yin     MSAAServiceImpl* xxx = new MSAAServiceImpl();
2105fdc4257SSteve Yin     //return static_cast< lang::XTypeProvider * >(  xxx );
2115fdc4257SSteve Yin     Reference< XMSAAService > p( xxx );
2125fdc4257SSteve Yin     return p;
2135fdc4257SSteve Yin }
2145fdc4257SSteve Yin 
2155fdc4257SSteve Yin /**
2165fdc4257SSteve Yin    * Constructor.
2175fdc4257SSteve Yin    * @param
2185fdc4257SSteve Yin    * @return
2195fdc4257SSteve Yin    */
MSAAServiceImpl()2205fdc4257SSteve Yin MSAAServiceImpl::MSAAServiceImpl()
2215fdc4257SSteve Yin {
2225fdc4257SSteve Yin     Reference< XExtendedToolkit > xToolkit =
2235fdc4257SSteve Yin         Reference< XExtendedToolkit >(Application::GetVCLToolkit(), UNO_QUERY);
2245fdc4257SSteve Yin 
2255fdc4257SSteve Yin     if(xToolkit.is())
2265fdc4257SSteve Yin     {
2275fdc4257SSteve Yin         AccTopWindowListener *accListener;
2285fdc4257SSteve Yin         accListener = new AccTopWindowListener();
2295fdc4257SSteve Yin         g_pTop = accListener;
2305fdc4257SSteve Yin         Reference< XTopWindowListener> x(accListener);
2315fdc4257SSteve Yin         xToolkit->addTopWindowListener(x);
2325fdc4257SSteve Yin     }
2335fdc4257SSteve Yin }
2345fdc4257SSteve Yin 
2355fdc4257SSteve Yin /**
2365fdc4257SSteve Yin    * Static method that can create an entity of our MSAA Service
2375fdc4257SSteve Yin    * @param Destructor
2385fdc4257SSteve Yin    * @return
2395fdc4257SSteve Yin    */
~MSAAServiceImpl()2405fdc4257SSteve Yin MSAAServiceImpl::~MSAAServiceImpl()
2415fdc4257SSteve Yin {
2425fdc4257SSteve Yin 
2435fdc4257SSteve Yin     // As all folders and streams contain references to their parents,
2445fdc4257SSteve Yin     // we must remove these references so that they will be deleted when
2455fdc4257SSteve Yin     // the hash_map of the root folder is cleared, releasing all subfolders
2465fdc4257SSteve Yin     // and substreams which in turn release theirs, etc. When xRootFolder is
2475fdc4257SSteve Yin     // released when this destructor completes, the folder tree should be
2485fdc4257SSteve Yin     // deleted fully (and automagically).
2495fdc4257SSteve Yin     FreeTopWindowListener();
2505fdc4257SSteve Yin 
2515fdc4257SSteve Yin 
2525fdc4257SSteve Yin }
2535fdc4257SSteve Yin 
2545fdc4257SSteve Yin }
2555fdc4257SSteve Yin 
2565fdc4257SSteve Yin /* shared lib exports implemented without helpers in service_impl1.cxx */
2575fdc4257SSteve Yin namespace my_sc_impl
2585fdc4257SSteve Yin {
2595fdc4257SSteve Yin static struct ::cppu::ImplementationEntry s_component_entries [] =
2605fdc4257SSteve Yin     {
2615fdc4257SSteve Yin         {
2625fdc4257SSteve Yin             create_MSAAServiceImpl, getImplementationName_MSAAServiceImpl,
2635fdc4257SSteve Yin             getSupportedServiceNames_MSAAServiceImpl, ::cppu::createSingleComponentFactory,
2645fdc4257SSteve Yin             0, 0
2655fdc4257SSteve Yin         },
2665fdc4257SSteve Yin         {
2675fdc4257SSteve Yin             create_MSAAServiceImpl, getImplementationName_MSAAServiceImpl,
2685fdc4257SSteve Yin             getSupportedServiceNames_MSAAServiceImpl, ::cppu::createSingleComponentFactory,
2695fdc4257SSteve Yin             0, 0
2705fdc4257SSteve Yin         },
2715fdc4257SSteve Yin         { 0, 0, 0, 0, 0, 0 }
2725fdc4257SSteve Yin     };
2735fdc4257SSteve Yin }
2745fdc4257SSteve Yin 
2755fdc4257SSteve Yin extern "C"
2765fdc4257SSteve Yin {
component_getImplementationEnvironment(sal_Char const ** ppEnvTypeName,uno_Environment **)2775fdc4257SSteve Yin     void SAL_CALL component_getImplementationEnvironment(
2785fdc4257SSteve Yin         sal_Char const ** ppEnvTypeName, uno_Environment ** /*ppEnv*/ )
2795fdc4257SSteve Yin     {
2805fdc4257SSteve Yin         *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
2815fdc4257SSteve Yin     }
component_getFactory(sal_Char const * implName,lang::XMultiServiceFactory * xMgr,registry::XRegistryKey * xRegistry)2825fdc4257SSteve Yin     void * SAL_CALL component_getFactory(
2835fdc4257SSteve Yin         sal_Char const * implName, lang::XMultiServiceFactory * xMgr,
2845fdc4257SSteve Yin         registry::XRegistryKey * xRegistry )
2855fdc4257SSteve Yin     {
2865fdc4257SSteve Yin         return ::cppu::component_getFactoryHelper(
2875fdc4257SSteve Yin                    implName, xMgr, xRegistry, ::my_sc_impl::s_component_entries );
2885fdc4257SSteve Yin     }
2895fdc4257SSteve Yin }
290