diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2012-06-19 10:17:14 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2012-06-20 14:44:03 +0200 |
commit | 1cdb792368ed26d58828eead2848422e7dec4c7d (patch) | |
tree | a268bcfa0315ca6de5d55bd83f0023d6372194e3 | |
parent | b11de026cb8eb520dc410fd974581e780ecbef92 (diff) |
Make VCLSession into a OneInstanceFactory
...so no need to hold the one instance as ImplSVData::xSMClient. Nor as
VCLSession::pOneInstance, after changing SalSession::SetCallback to carry
VCLSession* as user data.
Change-Id: I3180d72035e3da7aa164a20309fbaeccecbb9b65
-rw-r--r-- | vcl/inc/salsession.hxx | 8 | ||||
-rw-r--r-- | vcl/inc/svdata.hxx | 12 | ||||
-rw-r--r-- | vcl/source/app/session.cxx | 28 | ||||
-rw-r--r-- | vcl/source/components/factory.cxx | 2 |
4 files changed, 17 insertions, 33 deletions
diff --git a/vcl/inc/salsession.hxx b/vcl/inc/salsession.hxx index c912565a920c..89e9239cf0b9 100644 --- a/vcl/inc/salsession.hxx +++ b/vcl/inc/salsession.hxx @@ -84,25 +84,27 @@ struct SalSessionQuitEvent : public SalSessionEvent {} }; -typedef void(*SessionProc)( SalSessionEvent *pEvent); +typedef void(*SessionProc)(void *pData, SalSessionEvent *pEvent); class VCL_PLUGIN_PUBLIC SalSession { SessionProc m_aProc; + void * m_pProcData; public: SalSession() : m_aProc( 0 ) {} virtual ~SalSession(); - void SetCallback( SessionProc aCallback ) + void SetCallback( SessionProc aCallback, void * pCallbackData ) { m_aProc = aCallback; + m_pProcData = pCallbackData; } void CallCallback( SalSessionEvent* pEvent ) { if( m_aProc ) - m_aProc( pEvent ); + m_aProc( m_pProcData, pEvent ); } // query the session manager for a user interaction slot diff --git a/vcl/inc/svdata.hxx b/vcl/inc/svdata.hxx index 8aa5f8732ec1..e96979a07900 100644 --- a/vcl/inc/svdata.hxx +++ b/vcl/inc/svdata.hxx @@ -53,16 +53,9 @@ #include <boost/unordered_map.hpp> -namespace com { -namespace sun { -namespace star { -namespace lang { +namespace com { namespace sun { namespace star { namespace lang { class XMultiServiceFactory; -} -namespace frame { - class XSessionManagerClient; -} -}}} +} } } } struct ImplTimerData; struct ImplFileImageCacheData; @@ -366,7 +359,6 @@ struct ImplSVData rtl::Reference< vcl::DisplayConnection > mxDisplayConnection; ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > mxAccessBridge; - com::sun::star::uno::Reference< com::sun::star::frame::XSessionManagerClient > xSMClient; ::vcl::SettingsConfigItem* mpSettingsConfigItem; std::list< vcl::DeleteOnDeinitBase* >* mpDeinitDeleteList; boost::unordered_map< int, rtl::OUString >* mpPaperNames; diff --git a/vcl/source/app/session.cxx b/vcl/source/app/session.cxx index 25a881079b15..47a39d87e2b9 100644 --- a/vcl/source/app/session.cxx +++ b/vcl/source/app/session.cxx @@ -84,8 +84,7 @@ class VCLSession : public cppu::WeakComponentImplHelper1 < XSessionManagerClient bool m_bInteractionDone; bool m_bSaveDone; - static void SalSessionEventProc( SalSessionEvent* pEvent ); - static VCLSession* pOneInstance; + static void SalSessionEventProc( void* pData, SalSessionEvent* pEvent ); void callSaveRequested( bool bShutdown, bool bCancelable ); void callShutdownCancelled(); @@ -103,8 +102,6 @@ public: virtual sal_Bool SAL_CALL cancelShutdown() throw( RuntimeException ); }; -VCLSession* VCLSession::pOneInstance = NULL; - VCLSession::VCLSession() : cppu::WeakComponentImplHelper1< XSessionManagerClient >( m_aMutex ), m_bInteractionRequested( false ), @@ -112,17 +109,13 @@ VCLSession::VCLSession() m_bInteractionDone( false ), m_bSaveDone( false ) { - DBG_ASSERT( pOneInstance == 0, "One instance of VCLSession only !" ); - pOneInstance = this; m_pSession = ImplGetSVData()->mpDefInst->CreateSalSession(); if( m_pSession ) - m_pSession->SetCallback( SalSessionEventProc ); + m_pSession->SetCallback( SalSessionEventProc, this ); } VCLSession::~VCLSession() { - DBG_ASSERT( pOneInstance == this, "Another instance of VCLSession in destructor !" ); - pOneInstance = NULL; delete m_pSession; } @@ -230,27 +223,28 @@ void VCLSession::callQuit() Application::AcquireSolarMutex( nAcquireCount ); } -void VCLSession::SalSessionEventProc( SalSessionEvent* pEvent ) +void VCLSession::SalSessionEventProc( void* pData, SalSessionEvent* pEvent ) { + VCLSession * pThis = static_cast< VCLSession * >( pData ); switch( pEvent->m_eType ) { case Interaction: { SalSessionInteractionEvent* pIEv = static_cast<SalSessionInteractionEvent*>(pEvent); - pOneInstance->callInteractionGranted( pIEv->m_bInteractionGranted ); + pThis->callInteractionGranted( pIEv->m_bInteractionGranted ); } break; case SaveRequest: { SalSessionSaveRequestEvent* pSEv = static_cast<SalSessionSaveRequestEvent*>(pEvent); - pOneInstance->callSaveRequested( pSEv->m_bShutdown, pSEv->m_bCancelable ); + pThis->callSaveRequested( pSEv->m_bShutdown, pSEv->m_bCancelable ); } break; case ShutdownCancel: - pOneInstance->callShutdownCancelled(); + pThis->callShutdownCancelled(); break; case Quit: - pOneInstance->callQuit(); + pThis->callQuit(); break; } } @@ -372,11 +366,7 @@ Sequence< rtl::OUString > SAL_CALL vcl_session_getSupportedServiceNames() css::uno::Reference< XInterface > SAL_CALL vcl_session_createInstance( const css::uno::Reference< XMultiServiceFactory > & /*xMultiServiceFactory*/ ) { - ImplSVData* pSVData = ImplGetSVData(); - if( ! pSVData->xSMClient.is() ) - pSVData->xSMClient = new VCLSession(); - - return css::uno::Reference< XInterface >(pSVData->xSMClient, UNO_QUERY ); + return static_cast< cppu::OWeakObject * >(new VCLSession); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/components/factory.cxx b/vcl/source/components/factory.cxx index b482431f24d7..2f0027d17868 100644 --- a/vcl/source/components/factory.cxx +++ b/vcl/source/components/factory.cxx @@ -95,7 +95,7 @@ extern "C" { Reference< ::com::sun::star::lang::XSingleServiceFactory > xFactory; if( vcl_session_getImplementationName().equalsAscii( pImplementationName ) ) { - xFactory = ::cppu::createSingleFactory( + xFactory = ::cppu::createOneInstanceFactory( xMgr, vcl_session_getImplementationName(), vcl_session_createInstance, vcl_session_getSupportedServiceNames() ); } |