1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove 25*b1cdbd2cSJim Jagielski #include "precompiled_svtools.hxx" 26*b1cdbd2cSJim Jagielski #include "svtaccessiblefactory.hxx" 27*b1cdbd2cSJim Jagielski #include <osl/module.h> 28*b1cdbd2cSJim Jagielski 29*b1cdbd2cSJim Jagielski // #define UNLOAD_ON_LAST_CLIENT_DYING 30*b1cdbd2cSJim Jagielski // this is not recommended currently. If enabled, the implementation will log 31*b1cdbd2cSJim Jagielski // the number of active clients, and unload the acc library when the last client 32*b1cdbd2cSJim Jagielski // goes away. 33*b1cdbd2cSJim Jagielski // Sounds like a good idea, unfortunately, there's no guarantee that all objects 34*b1cdbd2cSJim Jagielski // implemented in this library are already dead. 35*b1cdbd2cSJim Jagielski // Iow, just because an object implementing an XAccessible (implemented in this lib 36*b1cdbd2cSJim Jagielski // here) died, it's not said that everybody released all references to the 37*b1cdbd2cSJim Jagielski // XAccessibleContext used by this component, and implemented in the acc lib. 38*b1cdbd2cSJim Jagielski // So we cannot really unload the lib. 39*b1cdbd2cSJim Jagielski // 40*b1cdbd2cSJim Jagielski // Alternatively, if the lib would us own "usage counting", i.e. every component 41*b1cdbd2cSJim Jagielski // implemented therein would affect a static ref count, the acc lib could care 42*b1cdbd2cSJim Jagielski // for unloading itself. 43*b1cdbd2cSJim Jagielski 44*b1cdbd2cSJim Jagielski //........................................................................ 45*b1cdbd2cSJim Jagielski namespace svt 46*b1cdbd2cSJim Jagielski { 47*b1cdbd2cSJim Jagielski //........................................................................ 48*b1cdbd2cSJim Jagielski 49*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno; 50*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::awt; 51*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::accessibility; 52*b1cdbd2cSJim Jagielski 53*b1cdbd2cSJim Jagielski namespace 54*b1cdbd2cSJim Jagielski { 55*b1cdbd2cSJim Jagielski #ifdef UNLOAD_ON_LAST_CLIENT_DYING 56*b1cdbd2cSJim Jagielski static oslInterlockedCount s_nAccessibleFactoryAccesss = 0; 57*b1cdbd2cSJim Jagielski #endif // UNLOAD_ON_LAST_CLIENT_DYING 58*b1cdbd2cSJim Jagielski static oslModule s_hAccessibleImplementationModule = NULL; 59*b1cdbd2cSJim Jagielski static GetSvtAccessibilityComponentFactory s_pAccessibleFactoryFunc = NULL; 60*b1cdbd2cSJim Jagielski static ::rtl::Reference< IAccessibleFactory > s_pFactory; 61*b1cdbd2cSJim Jagielski 62*b1cdbd2cSJim Jagielski //==================================================================== 63*b1cdbd2cSJim Jagielski //= AccessibleDummyFactory 64*b1cdbd2cSJim Jagielski //==================================================================== 65*b1cdbd2cSJim Jagielski class AccessibleDummyFactory : public IAccessibleFactory 66*b1cdbd2cSJim Jagielski { 67*b1cdbd2cSJim Jagielski public: 68*b1cdbd2cSJim Jagielski AccessibleDummyFactory(); 69*b1cdbd2cSJim Jagielski 70*b1cdbd2cSJim Jagielski protected: 71*b1cdbd2cSJim Jagielski virtual ~AccessibleDummyFactory(); 72*b1cdbd2cSJim Jagielski 73*b1cdbd2cSJim Jagielski private: 74*b1cdbd2cSJim Jagielski AccessibleDummyFactory( const AccessibleDummyFactory& ); // never implemented 75*b1cdbd2cSJim Jagielski AccessibleDummyFactory& operator=( const AccessibleDummyFactory& ); // never implemented 76*b1cdbd2cSJim Jagielski 77*b1cdbd2cSJim Jagielski oslInterlockedCount m_refCount; 78*b1cdbd2cSJim Jagielski 79*b1cdbd2cSJim Jagielski public: 80*b1cdbd2cSJim Jagielski // IReference 81*b1cdbd2cSJim Jagielski virtual oslInterlockedCount SAL_CALL acquire(); 82*b1cdbd2cSJim Jagielski virtual oslInterlockedCount SAL_CALL release(); 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski // IAccessibleFactory 85*b1cdbd2cSJim Jagielski virtual IAccessibleTabListBox* createAccessibleTabListBox(const::com::sun::star::uno::Reference<::com::sun::star::accessibility::XAccessible> &,SvHeaderTabListBox &) const86*b1cdbd2cSJim Jagielski createAccessibleTabListBox( 87*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& /*rxParent*/, 88*b1cdbd2cSJim Jagielski SvHeaderTabListBox& /*rBox*/ 89*b1cdbd2cSJim Jagielski ) const 90*b1cdbd2cSJim Jagielski { 91*b1cdbd2cSJim Jagielski return NULL; 92*b1cdbd2cSJim Jagielski } 93*b1cdbd2cSJim Jagielski 94*b1cdbd2cSJim Jagielski virtual IAccessibleBrowseBox* createAccessibleBrowseBox(const::com::sun::star::uno::Reference<::com::sun::star::accessibility::XAccessible> &,IAccessibleTableProvider &) const95*b1cdbd2cSJim Jagielski createAccessibleBrowseBox( 96*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& /*_rxParent*/, 97*b1cdbd2cSJim Jagielski IAccessibleTableProvider& /*_rBrowseBox*/ 98*b1cdbd2cSJim Jagielski ) const 99*b1cdbd2cSJim Jagielski { 100*b1cdbd2cSJim Jagielski return NULL; 101*b1cdbd2cSJim Jagielski } 102*b1cdbd2cSJim Jagielski 103*b1cdbd2cSJim Jagielski virtual table::IAccessibleTableControl* createAccessibleTableControl(const::com::sun::star::uno::Reference<::com::sun::star::accessibility::XAccessible> &,table::IAccessibleTable &) const104*b1cdbd2cSJim Jagielski createAccessibleTableControl( 105*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& /*_rxParent*/, 106*b1cdbd2cSJim Jagielski table::IAccessibleTable& /*_rTable*/ 107*b1cdbd2cSJim Jagielski ) const 108*b1cdbd2cSJim Jagielski { 109*b1cdbd2cSJim Jagielski return NULL; 110*b1cdbd2cSJim Jagielski } 111*b1cdbd2cSJim Jagielski 112*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > createAccessibleIconChoiceCtrl(SvtIconChoiceCtrl &,const::com::sun::star::uno::Reference<::com::sun::star::accessibility::XAccessible> &) const113*b1cdbd2cSJim Jagielski createAccessibleIconChoiceCtrl( 114*b1cdbd2cSJim Jagielski SvtIconChoiceCtrl& /*_rIconCtrl*/, 115*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& /*_xParent*/ 116*b1cdbd2cSJim Jagielski ) const 117*b1cdbd2cSJim Jagielski { 118*b1cdbd2cSJim Jagielski return NULL; 119*b1cdbd2cSJim Jagielski } 120*b1cdbd2cSJim Jagielski 121*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > createAccessibleTabBar(TabBar &) const122*b1cdbd2cSJim Jagielski createAccessibleTabBar( 123*b1cdbd2cSJim Jagielski TabBar& /*_rTabBar*/ 124*b1cdbd2cSJim Jagielski ) const 125*b1cdbd2cSJim Jagielski { 126*b1cdbd2cSJim Jagielski return NULL; 127*b1cdbd2cSJim Jagielski } 128*b1cdbd2cSJim Jagielski 129*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > createAccessibleTextWindowContext(VCLXWindow *,TextEngine &,TextView &,bool) const130*b1cdbd2cSJim Jagielski createAccessibleTextWindowContext( 131*b1cdbd2cSJim Jagielski VCLXWindow* /*pVclXWindow*/, TextEngine& /*rEngine*/, TextView& /*rView*/, bool /*bCompoundControlChild*/ 132*b1cdbd2cSJim Jagielski ) const 133*b1cdbd2cSJim Jagielski { 134*b1cdbd2cSJim Jagielski return NULL; 135*b1cdbd2cSJim Jagielski } 136*b1cdbd2cSJim Jagielski 137*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > createAccessibleTreeListBox(SvTreeListBox &,const::com::sun::star::uno::Reference<::com::sun::star::accessibility::XAccessible> &) const138*b1cdbd2cSJim Jagielski createAccessibleTreeListBox( 139*b1cdbd2cSJim Jagielski SvTreeListBox& /*_rListBox*/, 140*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& /*_xParent*/ 141*b1cdbd2cSJim Jagielski ) const 142*b1cdbd2cSJim Jagielski { 143*b1cdbd2cSJim Jagielski return NULL; 144*b1cdbd2cSJim Jagielski } 145*b1cdbd2cSJim Jagielski 146*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > createAccessibleBrowseBoxHeaderBar(const::com::sun::star::uno::Reference<::com::sun::star::accessibility::XAccessible> &,IAccessibleTableProvider &,AccessibleBrowseBoxObjType) const147*b1cdbd2cSJim Jagielski createAccessibleBrowseBoxHeaderBar( 148*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& /*rxParent*/, 149*b1cdbd2cSJim Jagielski IAccessibleTableProvider& /*_rOwningTable*/, 150*b1cdbd2cSJim Jagielski AccessibleBrowseBoxObjType /*_eObjType*/ 151*b1cdbd2cSJim Jagielski ) const 152*b1cdbd2cSJim Jagielski { 153*b1cdbd2cSJim Jagielski return NULL; 154*b1cdbd2cSJim Jagielski } 155*b1cdbd2cSJim Jagielski 156*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > createAccessibleBrowseBoxTableCell(const::com::sun::star::uno::Reference<::com::sun::star::accessibility::XAccessible> &,IAccessibleTableProvider &,const::com::sun::star::uno::Reference<::com::sun::star::awt::XWindow> &,sal_Int32,sal_uInt16,sal_Int32) const157*b1cdbd2cSJim Jagielski createAccessibleBrowseBoxTableCell( 158*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& /*_rxParent*/, 159*b1cdbd2cSJim Jagielski IAccessibleTableProvider& /*_rBrowseBox*/, 160*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow >& /*_xFocusWindow*/, 161*b1cdbd2cSJim Jagielski sal_Int32 /*_nRowId*/, 162*b1cdbd2cSJim Jagielski sal_uInt16 /*_nColId*/, 163*b1cdbd2cSJim Jagielski sal_Int32 /*_nOffset*/ 164*b1cdbd2cSJim Jagielski ) const 165*b1cdbd2cSJim Jagielski { 166*b1cdbd2cSJim Jagielski return NULL; 167*b1cdbd2cSJim Jagielski } 168*b1cdbd2cSJim Jagielski 169*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > createAccessibleBrowseBoxHeaderCell(sal_Int32,const::com::sun::star::uno::Reference<::com::sun::star::accessibility::XAccessible> &,IAccessibleTableProvider &,const::com::sun::star::uno::Reference<::com::sun::star::awt::XWindow> &,AccessibleBrowseBoxObjType) const170*b1cdbd2cSJim Jagielski createAccessibleBrowseBoxHeaderCell( 171*b1cdbd2cSJim Jagielski sal_Int32 /*_nColumnRowId*/, 172*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& /*rxParent*/, 173*b1cdbd2cSJim Jagielski IAccessibleTableProvider& /*_rBrowseBox*/, 174*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow >& /*_xFocusWindow*/, 175*b1cdbd2cSJim Jagielski AccessibleBrowseBoxObjType /*_eObjType*/ 176*b1cdbd2cSJim Jagielski ) const 177*b1cdbd2cSJim Jagielski { 178*b1cdbd2cSJim Jagielski return NULL; 179*b1cdbd2cSJim Jagielski } 180*b1cdbd2cSJim Jagielski 181*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > createAccessibleCheckBoxCell(const::com::sun::star::uno::Reference<::com::sun::star::accessibility::XAccessible> &,IAccessibleTableProvider &,const::com::sun::star::uno::Reference<::com::sun::star::awt::XWindow> &,sal_Int32,sal_uInt16,const TriState &,sal_Bool,sal_Bool) const182*b1cdbd2cSJim Jagielski createAccessibleCheckBoxCell( 183*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& /*_rxParent*/, 184*b1cdbd2cSJim Jagielski IAccessibleTableProvider& /*_rBrowseBox*/, 185*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow >& /*_xFocusWindow*/, 186*b1cdbd2cSJim Jagielski sal_Int32 /*_nRowPos*/, 187*b1cdbd2cSJim Jagielski sal_uInt16 /*_nColPos*/, 188*b1cdbd2cSJim Jagielski const TriState& /*_eState*/, 189*b1cdbd2cSJim Jagielski sal_Bool /*_bEnabled*/, 190*b1cdbd2cSJim Jagielski sal_Bool /*_bIsTriState*/ 191*b1cdbd2cSJim Jagielski ) const 192*b1cdbd2cSJim Jagielski { 193*b1cdbd2cSJim Jagielski return NULL; 194*b1cdbd2cSJim Jagielski } 195*b1cdbd2cSJim Jagielski 196*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > createEditBrowseBoxTableCellAccess(const::com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessible> &,const::com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessible> &,const::com::sun::star::uno::Reference<::com::sun::star::awt::XWindow> &,IAccessibleTableProvider &,sal_Int32,sal_uInt16) const197*b1cdbd2cSJim Jagielski createEditBrowseBoxTableCellAccess( 198*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< com::sun::star::accessibility::XAccessible >& /*_rxParent*/, 199*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< com::sun::star::accessibility::XAccessible >& /*_rxControlAccessible*/, 200*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow >& /*_rxFocusWindow*/, 201*b1cdbd2cSJim Jagielski IAccessibleTableProvider& /*_rBrowseBox*/, 202*b1cdbd2cSJim Jagielski sal_Int32 /*_nRowPos*/, 203*b1cdbd2cSJim Jagielski sal_uInt16 /*_nColPos*/ 204*b1cdbd2cSJim Jagielski ) const 205*b1cdbd2cSJim Jagielski { 206*b1cdbd2cSJim Jagielski return NULL; 207*b1cdbd2cSJim Jagielski } 208*b1cdbd2cSJim Jagielski 209*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > createAccessibleToolPanelDeck(const::com::sun::star::uno::Reference<::com::sun::star::accessibility::XAccessible> &,::svt::ToolPanelDeck &)210*b1cdbd2cSJim Jagielski createAccessibleToolPanelDeck( 211*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& /*i_rAccessibleParent*/, 212*b1cdbd2cSJim Jagielski ::svt::ToolPanelDeck& /*i_rPanelDeck*/ 213*b1cdbd2cSJim Jagielski ) 214*b1cdbd2cSJim Jagielski { 215*b1cdbd2cSJim Jagielski return NULL; 216*b1cdbd2cSJim Jagielski } 217*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > createAccessibleToolPanelTabBar(const::com::sun::star::uno::Reference<::com::sun::star::accessibility::XAccessible> &,::svt::IToolPanelDeck &,::svt::PanelTabBar &)218*b1cdbd2cSJim Jagielski createAccessibleToolPanelTabBar( 219*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& /*i_rAccessibleParent*/, 220*b1cdbd2cSJim Jagielski ::svt::IToolPanelDeck& /*i_rPanelDeck*/, 221*b1cdbd2cSJim Jagielski ::svt::PanelTabBar& /*i_rTabBar*/ 222*b1cdbd2cSJim Jagielski ) 223*b1cdbd2cSJim Jagielski { 224*b1cdbd2cSJim Jagielski return NULL; 225*b1cdbd2cSJim Jagielski } 226*b1cdbd2cSJim Jagielski }; 227*b1cdbd2cSJim Jagielski 228*b1cdbd2cSJim Jagielski //---------------------------------------------------------------- AccessibleDummyFactory()229*b1cdbd2cSJim Jagielski AccessibleDummyFactory::AccessibleDummyFactory() 230*b1cdbd2cSJim Jagielski { 231*b1cdbd2cSJim Jagielski } 232*b1cdbd2cSJim Jagielski 233*b1cdbd2cSJim Jagielski //---------------------------------------------------------------- ~AccessibleDummyFactory()234*b1cdbd2cSJim Jagielski AccessibleDummyFactory::~AccessibleDummyFactory() 235*b1cdbd2cSJim Jagielski { 236*b1cdbd2cSJim Jagielski } 237*b1cdbd2cSJim Jagielski 238*b1cdbd2cSJim Jagielski //---------------------------------------------------------------- acquire()239*b1cdbd2cSJim Jagielski oslInterlockedCount SAL_CALL AccessibleDummyFactory::acquire() 240*b1cdbd2cSJim Jagielski { 241*b1cdbd2cSJim Jagielski return osl_incrementInterlockedCount( &m_refCount ); 242*b1cdbd2cSJim Jagielski } 243*b1cdbd2cSJim Jagielski 244*b1cdbd2cSJim Jagielski //---------------------------------------------------------------- release()245*b1cdbd2cSJim Jagielski oslInterlockedCount SAL_CALL AccessibleDummyFactory::release() 246*b1cdbd2cSJim Jagielski { 247*b1cdbd2cSJim Jagielski if ( 0 == osl_decrementInterlockedCount( &m_refCount ) ) 248*b1cdbd2cSJim Jagielski { 249*b1cdbd2cSJim Jagielski delete this; 250*b1cdbd2cSJim Jagielski return 0; 251*b1cdbd2cSJim Jagielski } 252*b1cdbd2cSJim Jagielski return m_refCount; 253*b1cdbd2cSJim Jagielski } 254*b1cdbd2cSJim Jagielski } 255*b1cdbd2cSJim Jagielski 256*b1cdbd2cSJim Jagielski //==================================================================== 257*b1cdbd2cSJim Jagielski //= AccessibleFactoryAccess 258*b1cdbd2cSJim Jagielski //==================================================================== 259*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- AccessibleFactoryAccess()260*b1cdbd2cSJim Jagielski AccessibleFactoryAccess::AccessibleFactoryAccess() 261*b1cdbd2cSJim Jagielski :m_bInitialized( false ) 262*b1cdbd2cSJim Jagielski { 263*b1cdbd2cSJim Jagielski } 264*b1cdbd2cSJim Jagielski 265*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- thisModule()266*b1cdbd2cSJim Jagielski extern "C" { static void SAL_CALL thisModule() {} } 267*b1cdbd2cSJim Jagielski ensureInitialized()268*b1cdbd2cSJim Jagielski void AccessibleFactoryAccess::ensureInitialized() 269*b1cdbd2cSJim Jagielski { 270*b1cdbd2cSJim Jagielski if ( m_bInitialized ) 271*b1cdbd2cSJim Jagielski return; 272*b1cdbd2cSJim Jagielski 273*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); 274*b1cdbd2cSJim Jagielski 275*b1cdbd2cSJim Jagielski #ifdef UNLOAD_ON_LAST_CLIENT_DYING 276*b1cdbd2cSJim Jagielski if ( 1 == osl_incrementInterlockedCount( &s_nAccessibleFactoryAccesss ) ) 277*b1cdbd2cSJim Jagielski { // the first client 278*b1cdbd2cSJim Jagielski #endif // UNLOAD_ON_LAST_CLIENT_DYING 279*b1cdbd2cSJim Jagielski // load the library implementing the factory 280*b1cdbd2cSJim Jagielski if ( !s_pFactory.get() ) 281*b1cdbd2cSJim Jagielski { 282*b1cdbd2cSJim Jagielski const ::rtl::OUString sModuleName = ::rtl::OUString::createFromAscii( 283*b1cdbd2cSJim Jagielski SVLIBRARY( "acc" ) 284*b1cdbd2cSJim Jagielski ); 285*b1cdbd2cSJim Jagielski s_hAccessibleImplementationModule = osl_loadModuleRelative( &thisModule, sModuleName.pData, 0 ); 286*b1cdbd2cSJim Jagielski if ( s_hAccessibleImplementationModule != NULL ) 287*b1cdbd2cSJim Jagielski { 288*b1cdbd2cSJim Jagielski const ::rtl::OUString sFactoryCreationFunc = 289*b1cdbd2cSJim Jagielski ::rtl::OUString::createFromAscii( "getSvtAccessibilityComponentFactory" ); 290*b1cdbd2cSJim Jagielski s_pAccessibleFactoryFunc = (GetSvtAccessibilityComponentFactory) 291*b1cdbd2cSJim Jagielski osl_getFunctionSymbol( s_hAccessibleImplementationModule, sFactoryCreationFunc.pData ); 292*b1cdbd2cSJim Jagielski 293*b1cdbd2cSJim Jagielski } 294*b1cdbd2cSJim Jagielski OSL_ENSURE( s_pAccessibleFactoryFunc, "ac_registerClient: could not load the library, or not retrieve the needed symbol!" ); 295*b1cdbd2cSJim Jagielski 296*b1cdbd2cSJim Jagielski // get a factory instance 297*b1cdbd2cSJim Jagielski if ( s_pAccessibleFactoryFunc ) 298*b1cdbd2cSJim Jagielski { 299*b1cdbd2cSJim Jagielski IAccessibleFactory* pFactory = static_cast< IAccessibleFactory* >( (*s_pAccessibleFactoryFunc)() ); 300*b1cdbd2cSJim Jagielski if ( pFactory ) 301*b1cdbd2cSJim Jagielski { 302*b1cdbd2cSJim Jagielski s_pFactory = pFactory; 303*b1cdbd2cSJim Jagielski pFactory->release(); 304*b1cdbd2cSJim Jagielski } 305*b1cdbd2cSJim Jagielski } 306*b1cdbd2cSJim Jagielski } 307*b1cdbd2cSJim Jagielski 308*b1cdbd2cSJim Jagielski if ( !s_pFactory.get() ) 309*b1cdbd2cSJim Jagielski // the attempt to load the lib, or to create the factory, failed 310*b1cdbd2cSJim Jagielski // -> fall back to a dummy factory 311*b1cdbd2cSJim Jagielski s_pFactory = new AccessibleDummyFactory; 312*b1cdbd2cSJim Jagielski #ifdef UNLOAD_ON_LAST_CLIENT_DYING 313*b1cdbd2cSJim Jagielski } 314*b1cdbd2cSJim Jagielski #endif 315*b1cdbd2cSJim Jagielski 316*b1cdbd2cSJim Jagielski m_bInitialized = true; 317*b1cdbd2cSJim Jagielski } 318*b1cdbd2cSJim Jagielski 319*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- ~AccessibleFactoryAccess()320*b1cdbd2cSJim Jagielski AccessibleFactoryAccess::~AccessibleFactoryAccess() 321*b1cdbd2cSJim Jagielski { 322*b1cdbd2cSJim Jagielski if ( m_bInitialized ) 323*b1cdbd2cSJim Jagielski { 324*b1cdbd2cSJim Jagielski ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); 325*b1cdbd2cSJim Jagielski 326*b1cdbd2cSJim Jagielski #ifdef UNLOAD_ON_LAST_CLIENT_DYING 327*b1cdbd2cSJim Jagielski if( 0 == osl_decrementInterlockedCount( &s_nAccessibleFactoryAccesss ) ) 328*b1cdbd2cSJim Jagielski { 329*b1cdbd2cSJim Jagielski s_pFactory = NULL; 330*b1cdbd2cSJim Jagielski s_pAccessibleFactoryFunc = NULL; 331*b1cdbd2cSJim Jagielski if ( s_hAccessibleImplementationModule ) 332*b1cdbd2cSJim Jagielski { 333*b1cdbd2cSJim Jagielski osl_unloadModule( s_hAccessibleImplementationModule ); 334*b1cdbd2cSJim Jagielski s_hAccessibleImplementationModule = NULL; 335*b1cdbd2cSJim Jagielski } 336*b1cdbd2cSJim Jagielski } 337*b1cdbd2cSJim Jagielski #endif // UNLOAD_ON_LAST_CLIENT_DYING 338*b1cdbd2cSJim Jagielski } 339*b1cdbd2cSJim Jagielski } 340*b1cdbd2cSJim Jagielski 341*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- getFactory()342*b1cdbd2cSJim Jagielski IAccessibleFactory& AccessibleFactoryAccess::getFactory() 343*b1cdbd2cSJim Jagielski { 344*b1cdbd2cSJim Jagielski ensureInitialized(); 345*b1cdbd2cSJim Jagielski DBG_ASSERT( s_pFactory.is(), "AccessibleFactoryAccess::getFactory: at least a dummy factory should have been created!" ); 346*b1cdbd2cSJim Jagielski return *s_pFactory; 347*b1cdbd2cSJim Jagielski } 348*b1cdbd2cSJim Jagielski 349*b1cdbd2cSJim Jagielski //........................................................................ 350*b1cdbd2cSJim Jagielski } // namespace svt 351*b1cdbd2cSJim Jagielski //........................................................................ 352