36#include <com/sun/star/frame/XSessionManagerClient.hpp>
37#include <com/sun/star/lang/XMultiServiceFactory.hpp>
38#include <com/sun/star/frame/XSessionManagerListener2.hpp>
54 public cppu::WeakComponentImplHelper < XSessionManagerClient >
58 css::uno::Reference< XSessionManagerListener >
m_xListener;
59 bool m_bInteractionRequested;
60 bool m_bInteractionDone;
63 explicit Listener( css::uno::Reference< XSessionManagerListener > xListener )
65 m_bInteractionRequested( false ),
66 m_bInteractionDone( false ),
72 std::unique_ptr< SalSession > m_xSession;
73 bool m_bInteractionRequested;
74 bool m_bInteractionGranted;
75 bool m_bInteractionDone;
78 static void SalSessionEventProc(
void* pData,
SalSessionEvent* pEvent );
80 virtual ~VCLSession()
override {}
82 virtual void SAL_CALL addSessionManagerListener(
const css::uno::Reference< XSessionManagerListener >& xListener )
override;
83 virtual void SAL_CALL removeSessionManagerListener(
const css::uno::Reference< XSessionManagerListener>& xListener )
override;
84 virtual void SAL_CALL queryInteraction(
const css::uno::Reference< XSessionManagerListener >& xListener )
override;
85 virtual void SAL_CALL interactionDone(
const css::uno::Reference< XSessionManagerListener >& xListener )
override;
86 virtual void SAL_CALL saveDone(
const css::uno::Reference< XSessionManagerListener >& xListener )
override;
87 virtual sal_Bool SAL_CALL cancelShutdown()
override;
89 void SAL_CALL disposing()
override;
91 void callSaveRequested(
bool bShutdown );
92 void callShutdownCancelled();
93 void callInteractionGranted(
bool bGranted );
102VCLSession::VCLSession()
103 :
cppu::WeakComponentImplHelper< XSessionManagerClient >(
m_aMutex ),
104 m_xSession(
ImplGetSVData()->mpDefInst->CreateSalSession() ),
105 m_bInteractionRequested( false ),
106 m_bInteractionGranted( false ),
107 m_bInteractionDone( false ),
110 SAL_INFO(
"vcl.se",
"VCLSession::VCLSession" );
113 m_xSession->SetCallback( SalSessionEventProc,
this );
116void VCLSession::callSaveRequested(
bool bShutdown )
118 SAL_INFO(
"vcl.se",
"VCLSession::callSaveRequested" );
122 osl::MutexGuard aGuard( m_aMutex );
125 listener.m_bSaveDone = listener.m_bInteractionRequested = listener.m_bInteractionDone =
false;
132 m_bInteractionDone =
false;
135 m_bInteractionRequested = m_bInteractionGranted = !m_xSession;
140 SAL_INFO(
"vcl.se.debug",
" aListeners.empty() = " << (
aListeners.empty() ?
"true" :
"false") <<
141 ", bShutdown = " << (bShutdown ?
"true" :
"false"));
145 m_xSession->saveDone();
151 for (
auto const & listener: aListeners)
152 listener.m_xListener->doSave( bShutdown,
false );
155void VCLSession::callInteractionGranted(
bool bInteractionGranted )
157 SAL_INFO(
"vcl.se",
"VCLSession::callInteractionGranted" );
161 osl::MutexGuard aGuard( m_aMutex );
164 if( listener.m_bInteractionRequested )
167 m_bInteractionGranted = bInteractionGranted;
172 SAL_INFO(
"vcl.se.debug",
" aListeners.empty() = " << (
aListeners.empty() ?
"true" :
"false") <<
173 ", bInteractionGranted = " << (bInteractionGranted ?
"true" :
"false"));
177 m_xSession->interactionDone();
183 for (
auto const & listener: aListeners)
184 listener.m_xListener->approveInteraction( bInteractionGranted );
187void VCLSession::callShutdownCancelled()
189 SAL_INFO(
"vcl.se",
"VCLSession::callShutdownCancelled");
193 osl::MutexGuard aGuard( m_aMutex );
197 m_bInteractionRequested = m_bInteractionDone = m_bInteractionGranted =
false;
201 for (
auto const & listener: aListeners)
202 listener.m_xListener->shutdownCanceled();
205void VCLSession::callQuit()
207 SAL_INFO(
"vcl.se",
"VCLSession::callQuit");
211 osl::MutexGuard aGuard( m_aMutex );
215 m_bInteractionRequested = m_bInteractionDone = m_bInteractionGranted =
false;
219 for (
auto const & listener: aListeners)
221 css::uno::Reference< XSessionManagerListener2 > xListener2( listener.m_xListener, UNO_QUERY );
222 if( xListener2.is() )
223 xListener2->doQuit();
227void VCLSession::SalSessionEventProc(
void* pData,
SalSessionEvent* pEvent )
229 SAL_INFO(
"vcl.se",
"VCLSession::SalSessionEventProc");
231 VCLSession * pThis =
static_cast< VCLSession *
>(
pData );
236 SAL_INFO(
"vcl.se.debug",
" EventProcType = Interaction");
243 SAL_INFO(
"vcl.se.debug",
" EventProcType = SaveRequest");
249 SAL_INFO(
"vcl.se.debug",
" EventProcType = ShutdownCancel");
250 pThis->callShutdownCancelled();
253 SAL_INFO(
"vcl.se.debug",
" EventProcType = Quit");
259void SAL_CALL VCLSession::addSessionManagerListener(
const css::uno::Reference<XSessionManagerListener>& xListener )
261 SAL_INFO(
"vcl.se",
"VCLSession::addSessionManagerListener" );
263 osl::MutexGuard aGuard( m_aMutex );
269void SAL_CALL VCLSession::removeSessionManagerListener(
const css::uno::Reference<XSessionManagerListener>& xListener )
271 SAL_INFO(
"vcl.se",
"VCLSession::removeSessionManagerListener" );
273 osl::MutexGuard aGuard( m_aMutex );
280void SAL_CALL VCLSession::queryInteraction(
const css::uno::Reference<XSessionManagerListener>& xListener )
282 SAL_INFO(
"vcl.se",
"VCLSession::queryInteraction");
284 SAL_INFO(
"vcl.se.debug",
" m_bInteractionGranted = " << (m_bInteractionGranted ?
"true" :
"false") <<
285 ", m_bInteractionRequested = "<< (m_bInteractionRequested ?
"true" :
"false"));
286 if( m_bInteractionGranted )
288 if( m_bInteractionDone )
289 xListener->approveInteraction(
false );
291 xListener->approveInteraction(
true );
295 osl::MutexGuard aGuard( m_aMutex );
296 if( ! m_bInteractionRequested )
298 m_xSession->queryInteraction();
299 m_bInteractionRequested =
true;
303 if( listener.m_xListener == xListener )
305 SAL_INFO(
"vcl.se.debug",
" listener.m_xListener == xListener");
306 listener.m_bInteractionRequested =
true;
307 listener.m_bInteractionDone =
false;
312void SAL_CALL VCLSession::interactionDone(
const css::uno::Reference< XSessionManagerListener >& xListener )
314 SAL_INFO(
"vcl.se",
"VCLSession::interactionDone");
316 osl::MutexGuard aGuard( m_aMutex );
317 int nRequested = 0, nDone = 0;
320 if( listener.m_bInteractionRequested )
323 if( xListener == listener.m_xListener )
324 listener.m_bInteractionDone =
true;
326 if( listener.m_bInteractionDone )
330 SAL_INFO(
"vcl.se.debug",
" nDone = " << nDone <<
331 ", nRequested =" << nRequested);
332 if( nDone == nRequested && nDone > 0 )
334 m_bInteractionDone =
true;
336 m_xSession->interactionDone();
340void SAL_CALL VCLSession::saveDone(
const css::uno::Reference< XSessionManagerListener >& xListener )
342 SAL_INFO(
"vcl.se",
"VCLSession::saveDone");
344 osl::MutexGuard aGuard( m_aMutex );
346 bool bSaveDone =
true;
349 if( listener.m_xListener == xListener )
350 listener.m_bSaveDone =
true;
351 if( ! listener.m_bSaveDone )
355 SAL_INFO(
"vcl.se.debug",
" bSaveDone = " << (bSaveDone ?
"true" :
"false"));
357 if( bSaveDone && !m_bSaveDone )
361 m_xSession->saveDone();
365sal_Bool SAL_CALL VCLSession::cancelShutdown()
367 SAL_INFO(
"vcl.se",
"VCLSession::cancelShutdown");
369 return m_xSession && m_xSession->cancelShutdown();
372void VCLSession::disposing() {
373 SAL_INFO(
"vcl.se",
"VCLSession::disposing");
375 std::vector<Listener> vector;
377 osl::MutexGuard g(m_aMutex);
380 css::lang::EventObject src(
static_cast<OWeakObject *
>(
this));
381 for (
auto const & listener: vector) {
383 listener.m_xListener->disposing(src);
384 SAL_INFO(
"vcl.se.debug",
" call Listener disposing");
385 }
catch (css::uno::RuntimeException &) {
393extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
395 css::uno::XComponentContext* , css::uno::Sequence<css::uno::Any>
const&)
397 return cppu::acquire(
new VCLSession);
A helper class that calls Application::ReleaseSolarMutex() in its constructor and restores the mutex ...
#define TOOLS_WARN_EXCEPTION(area, stream)
std::vector< Reference< css::datatransfer::clipboard::XClipboardListener > > m_aListeners
#define SAL_WARN_IF(condition, area, stream)
#define SAL_INFO(area, stream)
std::unique_ptr< sal_Int32[]> pData
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * com_sun_star_frame_VCLSessionManagerClient_get_implementation(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)
SalSessionEventType m_eType
bool m_bInteractionGranted
ImplSVData * ImplGetSVData()