30 #include <factory.hxx>
35 #include <com/sun/star/frame/XSessionManagerClient.hpp>
36 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
37 #include <com/sun/star/frame/XSessionManagerListener2.hpp>
53 public cppu::WeakComponentImplHelper < XSessionManagerClient >
57 css::uno::Reference< XSessionManagerListener >
m_xListener;
58 bool m_bInteractionRequested;
59 bool m_bInteractionDone;
62 explicit Listener(
const css::uno::Reference< XSessionManagerListener >& xListener )
63 : m_xListener( xListener ),
64 m_bInteractionRequested(
false ),
65 m_bInteractionDone(
false ),
71 std::unique_ptr< SalSession > m_xSession;
72 bool m_bInteractionRequested;
73 bool m_bInteractionGranted;
74 bool m_bInteractionDone;
77 static void SalSessionEventProc(
void* pData,
SalSessionEvent* pEvent );
79 virtual ~VCLSession()
override {}
81 virtual void SAL_CALL addSessionManagerListener(
const css::uno::Reference< XSessionManagerListener >& xListener )
override;
82 virtual void SAL_CALL removeSessionManagerListener(
const css::uno::Reference< XSessionManagerListener>& xListener )
override;
83 virtual void SAL_CALL queryInteraction(
const css::uno::Reference< XSessionManagerListener >& xListener )
override;
84 virtual void SAL_CALL interactionDone(
const css::uno::Reference< XSessionManagerListener >& xListener )
override;
85 virtual void SAL_CALL saveDone(
const css::uno::Reference< XSessionManagerListener >& xListener )
override;
86 virtual sal_Bool SAL_CALL cancelShutdown()
override;
88 void SAL_CALL disposing()
override;
90 void callSaveRequested(
bool bShutdown );
91 void callShutdownCancelled();
92 void callInteractionGranted(
bool bGranted );
101 VCLSession::VCLSession()
102 :
cppu::WeakComponentImplHelper< XSessionManagerClient >(
m_aMutex ),
103 m_xSession(
ImplGetSVData()->mpDefInst->CreateSalSession() ),
104 m_bInteractionRequested(
false ),
105 m_bInteractionGranted(
false ),
106 m_bInteractionDone(
false ),
109 SAL_INFO(
"vcl.se",
"VCLSession::VCLSession" );
112 m_xSession->SetCallback( SalSessionEventProc,
this );
115 void VCLSession::callSaveRequested(
bool bShutdown )
117 SAL_INFO(
"vcl.se",
"VCLSession::callSaveRequested" );
121 osl::MutexGuard aGuard( m_aMutex );
124 listener.m_bSaveDone = listener.m_bInteractionRequested = listener.m_bInteractionDone =
false;
131 m_bInteractionDone =
false;
134 m_bInteractionRequested = m_bInteractionGranted = !m_xSession;
137 SAL_WARN_IF( aListeners.empty(),
"vcl.se",
"saveRequested but no listeners !" );
139 SAL_INFO(
"vcl.se.debug",
" aListeners.empty() = " << (aListeners.empty() ?
"true" :
"false") <<
140 ", bShutdown = " << (bShutdown ?
"true" :
"false"));
141 if( aListeners.empty() )
144 m_xSession->saveDone();
150 for (
auto const & listener: aListeners)
151 listener.m_xListener->doSave( bShutdown,
false );
154 void VCLSession::callInteractionGranted(
bool bInteractionGranted )
156 SAL_INFO(
"vcl.se",
"VCLSession::callInteractionGranted" );
158 std::vector< Listener > aListeners;
160 osl::MutexGuard aGuard( m_aMutex );
162 for (
auto const & listener: m_aListeners)
163 if( listener.m_bInteractionRequested )
164 aListeners.push_back( listener );
166 m_bInteractionGranted = bInteractionGranted;
169 SAL_WARN_IF( aListeners.empty(),
"vcl.se",
"interactionGranted but no listeners !" );
171 SAL_INFO(
"vcl.se.debug",
" aListeners.empty() = " << (aListeners.empty() ?
"true" :
"false") <<
172 ", bInteractionGranted = " << (bInteractionGranted ?
"true" :
"false"));
173 if( aListeners.empty() )
176 m_xSession->interactionDone();
182 for (
auto const & listener: aListeners)
183 listener.m_xListener->approveInteraction( bInteractionGranted );
186 void VCLSession::callShutdownCancelled()
188 SAL_INFO(
"vcl.se",
"VCLSession::callShutdownCancelled");
190 std::vector< Listener > aListeners;
192 osl::MutexGuard aGuard( m_aMutex );
196 m_bInteractionRequested = m_bInteractionDone = m_bInteractionGranted =
false;
200 for (
auto const & listener: aListeners)
201 listener.m_xListener->shutdownCanceled();
204 void VCLSession::callQuit()
206 SAL_INFO(
"vcl.se",
"VCLSession::callQuit");
208 std::vector< Listener > aListeners;
210 osl::MutexGuard aGuard( m_aMutex );
214 m_bInteractionRequested = m_bInteractionDone = m_bInteractionGranted =
false;
218 for (
auto const & listener: aListeners)
220 css::uno::Reference< XSessionManagerListener2 > xListener2( listener.m_xListener, UNO_QUERY );
221 if( xListener2.is() )
222 xListener2->doQuit();
226 void VCLSession::SalSessionEventProc(
void* pData,
SalSessionEvent* pEvent )
228 SAL_INFO(
"vcl.se",
"VCLSession::SalSessionEventProc");
230 VCLSession * pThis =
static_cast< VCLSession *
>( pData );
235 SAL_INFO(
"vcl.se.debug",
" EventProcType = Interaction");
242 SAL_INFO(
"vcl.se.debug",
" EventProcType = SaveRequest");
248 SAL_INFO(
"vcl.se.debug",
" EventProcType = ShutdownCancel");
249 pThis->callShutdownCancelled();
252 SAL_INFO(
"vcl.se.debug",
" EventProcType = Quit");
258 void SAL_CALL VCLSession::addSessionManagerListener(
const css::uno::Reference<XSessionManagerListener>& xListener )
260 SAL_INFO(
"vcl.se",
"VCLSession::addSessionManagerListener" );
262 osl::MutexGuard aGuard( m_aMutex );
264 SAL_INFO(
"vcl.se.debug",
" m_aListeners.size() = " << m_aListeners.size() );
265 m_aListeners.emplace_back( xListener );
268 void SAL_CALL VCLSession::removeSessionManagerListener(
const css::uno::Reference<XSessionManagerListener>& xListener )
270 SAL_INFO(
"vcl.se",
"VCLSession::removeSessionManagerListener" );
272 osl::MutexGuard aGuard( m_aMutex );
274 SAL_INFO(
"vcl.se.debug",
" m_aListeners.size() = " << m_aListeners.size() );
276 m_aListeners.erase(std::remove_if(m_aListeners.begin(), m_aListeners.end(), [&](Listener& listener) {
return xListener == listener.m_xListener;}), m_aListeners.end());
279 void SAL_CALL VCLSession::queryInteraction(
const css::uno::Reference<XSessionManagerListener>& xListener )
281 SAL_INFO(
"vcl.se",
"VCLSession::queryInteraction");
283 SAL_INFO(
"vcl.se.debug",
" m_bInteractionGranted = " << (m_bInteractionGranted ?
"true" :
"false") <<
284 ", m_bInteractionRequested = "<< (m_bInteractionRequested ?
"true" :
"false"));
285 if( m_bInteractionGranted )
287 if( m_bInteractionDone )
288 xListener->approveInteraction(
false );
290 xListener->approveInteraction(
true );
294 osl::MutexGuard aGuard( m_aMutex );
295 if( ! m_bInteractionRequested )
297 m_xSession->queryInteraction();
298 m_bInteractionRequested =
true;
300 for (
auto & listener: m_aListeners)
302 if( listener.m_xListener == xListener )
304 SAL_INFO(
"vcl.se.debug",
" listener.m_xListener == xListener");
305 listener.m_bInteractionRequested =
true;
306 listener.m_bInteractionDone =
false;
311 void SAL_CALL VCLSession::interactionDone(
const css::uno::Reference< XSessionManagerListener >& xListener )
313 SAL_INFO(
"vcl.se",
"VCLSession::interactionDone");
315 osl::MutexGuard aGuard( m_aMutex );
316 int nRequested = 0, nDone = 0;
317 for (
auto & listener: m_aListeners)
319 if( listener.m_bInteractionRequested )
322 if( xListener == listener.m_xListener )
323 listener.m_bInteractionDone =
true;
325 if( listener.m_bInteractionDone )
329 SAL_INFO(
"vcl.se.debug",
" nDone = " << nDone <<
330 ", nRequested =" << nRequested);
331 if( nDone == nRequested && nDone > 0 )
333 m_bInteractionDone =
true;
335 m_xSession->interactionDone();
339 void SAL_CALL VCLSession::saveDone(
const css::uno::Reference< XSessionManagerListener >& xListener )
341 SAL_INFO(
"vcl.se",
"VCLSession::saveDone");
343 osl::MutexGuard aGuard( m_aMutex );
345 bool bSaveDone =
true;
346 for (
auto & listener: m_aListeners)
348 if( listener.m_xListener == xListener )
349 listener.m_bSaveDone =
true;
350 if( ! listener.m_bSaveDone )
354 SAL_INFO(
"vcl.se.debug",
" bSaveDone = " << (bSaveDone ?
"true" :
"false"));
356 if( bSaveDone && !m_bSaveDone )
360 m_xSession->saveDone();
364 sal_Bool SAL_CALL VCLSession::cancelShutdown()
366 SAL_INFO(
"vcl.se",
"VCLSession::cancelShutdown");
368 return m_xSession && m_xSession->cancelShutdown();
371 void VCLSession::disposing() {
372 SAL_INFO(
"vcl.se",
"VCLSession::disposing");
374 std::vector<Listener> vector;
376 osl::MutexGuard g(m_aMutex);
377 vector.swap(m_aListeners);
379 css::lang::EventObject src(static_cast<OWeakObject *>(
this));
380 for (
auto const & listener: vector) {
382 listener.m_xListener->disposing(src);
383 SAL_INFO(
"vcl.se.debug",
" call Listener disposing");
384 }
catch (css::uno::RuntimeException &) {
392 extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
394 css::uno::XComponentContext* , css::uno::Sequence<css::uno::Any>
const&)
396 return cppu::acquire(
new VCLSession);
std::vector< Reference< css::datatransfer::clipboard::XClipboardListener > > m_aListeners
A helper class that calls Application::ReleaseSolarMutex() in its constructor and restores the mutex ...
ImplSVData * ImplGetSVData()
#define TOOLS_WARN_EXCEPTION(area, stream)
SalSessionEventType m_eType
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * com_sun_star_frame_VCLSessionManagerClient_get_implementation(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)
#define SAL_WARN_IF(condition, area, stream)
#define SAL_INFO(area, stream)
bool m_bInteractionGranted
bool m_bDetectedRangeSegmentation false