xref: /aoo42x/main/vcl/source/app/session.cxx (revision cdf0e10c)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_vcl.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include <cppuhelper/compbase1.hxx>
32*cdf0e10cSrcweir 
33*cdf0e10cSrcweir #include <tools/debug.hxx>
34*cdf0e10cSrcweir 
35*cdf0e10cSrcweir #include <vcl/svapp.hxx>
36*cdf0e10cSrcweir 
37*cdf0e10cSrcweir #include <svdata.hxx>
38*cdf0e10cSrcweir #include <salinst.hxx>
39*cdf0e10cSrcweir #include <salsession.hxx>
40*cdf0e10cSrcweir 
41*cdf0e10cSrcweir #include <com/sun/star/frame/XSessionManagerClient.hpp>
42*cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp>
43*cdf0e10cSrcweir #include <com/sun/star/frame/XSessionManagerListener2.hpp>
44*cdf0e10cSrcweir 
45*cdf0e10cSrcweir #include <list>
46*cdf0e10cSrcweir 
47*cdf0e10cSrcweir namespace {
48*cdf0e10cSrcweir 
49*cdf0e10cSrcweir namespace css = com::sun::star;
50*cdf0e10cSrcweir 
51*cdf0e10cSrcweir }
52*cdf0e10cSrcweir 
53*cdf0e10cSrcweir using namespace com::sun::star::uno;
54*cdf0e10cSrcweir using namespace com::sun::star::lang;
55*cdf0e10cSrcweir using namespace com::sun::star::frame;
56*cdf0e10cSrcweir using namespace rtl;
57*cdf0e10cSrcweir 
58*cdf0e10cSrcweir SalSession::~SalSession()
59*cdf0e10cSrcweir {
60*cdf0e10cSrcweir }
61*cdf0e10cSrcweir 
62*cdf0e10cSrcweir class VCLSession : public cppu::WeakComponentImplHelper1 < XSessionManagerClient >
63*cdf0e10cSrcweir {
64*cdf0e10cSrcweir     struct Listener
65*cdf0e10cSrcweir     {
66*cdf0e10cSrcweir         css::uno::Reference< XSessionManagerListener >		m_xListener;
67*cdf0e10cSrcweir         bool										m_bInteractionRequested;
68*cdf0e10cSrcweir         bool										m_bInteractionDone;
69*cdf0e10cSrcweir         bool										m_bSaveDone;
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir         Listener( const css::uno::Reference< XSessionManagerListener >& xListener )
72*cdf0e10cSrcweir                 : m_xListener( xListener ),
73*cdf0e10cSrcweir                   m_bInteractionRequested( false ),
74*cdf0e10cSrcweir                   m_bInteractionDone( false ),
75*cdf0e10cSrcweir                   m_bSaveDone( false )
76*cdf0e10cSrcweir         {}
77*cdf0e10cSrcweir     };
78*cdf0e10cSrcweir 
79*cdf0e10cSrcweir     std::list< Listener >							m_aListeners;
80*cdf0e10cSrcweir     SalSession*										m_pSession;
81*cdf0e10cSrcweir     osl::Mutex										m_aMutex;
82*cdf0e10cSrcweir     bool											m_bInteractionRequested;
83*cdf0e10cSrcweir     bool											m_bInteractionGranted;
84*cdf0e10cSrcweir     bool											m_bInteractionDone;
85*cdf0e10cSrcweir     bool											m_bSaveDone;
86*cdf0e10cSrcweir 
87*cdf0e10cSrcweir     static void SalSessionEventProc( SalSessionEvent* pEvent );
88*cdf0e10cSrcweir     static VCLSession* pOneInstance;
89*cdf0e10cSrcweir 
90*cdf0e10cSrcweir     void callSaveRequested( bool bShutdown, bool bCancelable );
91*cdf0e10cSrcweir     void callShutdownCancelled();
92*cdf0e10cSrcweir     void callInteractionGranted( bool bGranted );
93*cdf0e10cSrcweir     void callQuit();
94*cdf0e10cSrcweir public:
95*cdf0e10cSrcweir     VCLSession();
96*cdf0e10cSrcweir     virtual ~VCLSession();
97*cdf0e10cSrcweir 
98*cdf0e10cSrcweir     virtual void SAL_CALL addSessionManagerListener( const css::uno::Reference< XSessionManagerListener >& xListener ) throw( RuntimeException );
99*cdf0e10cSrcweir     virtual void SAL_CALL removeSessionManagerListener( const css::uno::Reference< XSessionManagerListener>& xListener ) throw( RuntimeException );
100*cdf0e10cSrcweir     virtual void SAL_CALL queryInteraction( const css::uno::Reference< XSessionManagerListener >& xListener ) throw( RuntimeException );
101*cdf0e10cSrcweir     virtual void SAL_CALL interactionDone( const css::uno::Reference< XSessionManagerListener >& xListener ) throw( RuntimeException );
102*cdf0e10cSrcweir     virtual void SAL_CALL saveDone( const css::uno::Reference< XSessionManagerListener >& xListener ) throw( RuntimeException );
103*cdf0e10cSrcweir     virtual sal_Bool SAL_CALL cancelShutdown() throw( RuntimeException );
104*cdf0e10cSrcweir };
105*cdf0e10cSrcweir 
106*cdf0e10cSrcweir VCLSession* VCLSession::pOneInstance = NULL;
107*cdf0e10cSrcweir 
108*cdf0e10cSrcweir VCLSession::VCLSession()
109*cdf0e10cSrcweir         : cppu::WeakComponentImplHelper1< XSessionManagerClient >( m_aMutex ),
110*cdf0e10cSrcweir           m_bInteractionRequested( false ),
111*cdf0e10cSrcweir           m_bInteractionGranted( false ),
112*cdf0e10cSrcweir           m_bInteractionDone( false ),
113*cdf0e10cSrcweir           m_bSaveDone( false )
114*cdf0e10cSrcweir {
115*cdf0e10cSrcweir     DBG_ASSERT( pOneInstance == 0, "One instance  of VCLSession only !" );
116*cdf0e10cSrcweir     pOneInstance = this;
117*cdf0e10cSrcweir     m_pSession = ImplGetSVData()->mpDefInst->CreateSalSession();
118*cdf0e10cSrcweir     if( m_pSession )
119*cdf0e10cSrcweir         m_pSession->SetCallback( SalSessionEventProc );
120*cdf0e10cSrcweir }
121*cdf0e10cSrcweir 
122*cdf0e10cSrcweir VCLSession::~VCLSession()
123*cdf0e10cSrcweir {
124*cdf0e10cSrcweir     DBG_ASSERT( pOneInstance == this, "Another instance of VCLSession in destructor !" );
125*cdf0e10cSrcweir     pOneInstance = NULL;
126*cdf0e10cSrcweir     delete m_pSession;
127*cdf0e10cSrcweir }
128*cdf0e10cSrcweir 
129*cdf0e10cSrcweir void VCLSession::callSaveRequested( bool bShutdown, bool bCancelable )
130*cdf0e10cSrcweir {
131*cdf0e10cSrcweir     std::list< Listener > aListeners;
132*cdf0e10cSrcweir     {
133*cdf0e10cSrcweir         osl::MutexGuard aGuard( m_aMutex );
134*cdf0e10cSrcweir         // reset listener states
135*cdf0e10cSrcweir         for( std::list< Listener >::iterator it = m_aListeners.begin();
136*cdf0e10cSrcweir              it != m_aListeners.end(); ++it )
137*cdf0e10cSrcweir         {
138*cdf0e10cSrcweir             it->m_bSaveDone = it->m_bInteractionRequested = it->m_bInteractionDone = false;
139*cdf0e10cSrcweir         }
140*cdf0e10cSrcweir 
141*cdf0e10cSrcweir         // copy listener list since calling a listener may remove it.
142*cdf0e10cSrcweir         aListeners = m_aListeners;
143*cdf0e10cSrcweir         // set back interaction state
144*cdf0e10cSrcweir         m_bSaveDone = false;
145*cdf0e10cSrcweir         m_bInteractionDone = false;
146*cdf0e10cSrcweir         // without session we assume UI is always possible,
147*cdf0e10cSrcweir         // so it was reqeusted and granted
148*cdf0e10cSrcweir         m_bInteractionRequested = m_bInteractionGranted = m_pSession ? false : true;
149*cdf0e10cSrcweir 
150*cdf0e10cSrcweir         // answer the session manager even if no listeners available anymore
151*cdf0e10cSrcweir         DBG_ASSERT( ! aListeners.empty(), "saveRequested but no listeners !" );
152*cdf0e10cSrcweir         if( aListeners.empty() )
153*cdf0e10cSrcweir         {
154*cdf0e10cSrcweir             if( m_pSession )
155*cdf0e10cSrcweir                 m_pSession->saveDone();
156*cdf0e10cSrcweir             return;
157*cdf0e10cSrcweir         }
158*cdf0e10cSrcweir     }
159*cdf0e10cSrcweir 
160*cdf0e10cSrcweir     sal_uLong nAcquireCount = Application::ReleaseSolarMutex();
161*cdf0e10cSrcweir     for( std::list< Listener >::const_iterator it = aListeners.begin(); it != aListeners.end(); ++it )
162*cdf0e10cSrcweir         it->m_xListener->doSave( bShutdown, bCancelable );
163*cdf0e10cSrcweir     Application::AcquireSolarMutex( nAcquireCount );
164*cdf0e10cSrcweir }
165*cdf0e10cSrcweir 
166*cdf0e10cSrcweir void VCLSession::callInteractionGranted( bool bInteractionGranted )
167*cdf0e10cSrcweir {
168*cdf0e10cSrcweir     std::list< Listener > aListeners;
169*cdf0e10cSrcweir     {
170*cdf0e10cSrcweir         osl::MutexGuard aGuard( m_aMutex );
171*cdf0e10cSrcweir         // copy listener list since calling a listener may remove it.
172*cdf0e10cSrcweir         for( std::list< Listener >::const_iterator it = m_aListeners.begin(); it != m_aListeners.end(); ++it )
173*cdf0e10cSrcweir             if( it->m_bInteractionRequested )
174*cdf0e10cSrcweir                 aListeners.push_back( *it );
175*cdf0e10cSrcweir 
176*cdf0e10cSrcweir         m_bInteractionGranted = bInteractionGranted;
177*cdf0e10cSrcweir 
178*cdf0e10cSrcweir         // answer the session manager even if no listeners available anymore
179*cdf0e10cSrcweir         DBG_ASSERT( ! aListeners.empty(), "interactionGranted but no listeners !" );
180*cdf0e10cSrcweir         if( aListeners.empty() )
181*cdf0e10cSrcweir         {
182*cdf0e10cSrcweir             if( m_pSession )
183*cdf0e10cSrcweir                 m_pSession->interactionDone();
184*cdf0e10cSrcweir             return;
185*cdf0e10cSrcweir         }
186*cdf0e10cSrcweir     }
187*cdf0e10cSrcweir 
188*cdf0e10cSrcweir     sal_uLong nAcquireCount = Application::ReleaseSolarMutex();
189*cdf0e10cSrcweir     for( std::list< Listener >::const_iterator it = aListeners.begin(); it != aListeners.end(); ++it )
190*cdf0e10cSrcweir         it->m_xListener->approveInteraction( bInteractionGranted );
191*cdf0e10cSrcweir 
192*cdf0e10cSrcweir     Application::AcquireSolarMutex( nAcquireCount );
193*cdf0e10cSrcweir }
194*cdf0e10cSrcweir 
195*cdf0e10cSrcweir void VCLSession::callShutdownCancelled()
196*cdf0e10cSrcweir {
197*cdf0e10cSrcweir     std::list< Listener > aListeners;
198*cdf0e10cSrcweir     {
199*cdf0e10cSrcweir         osl::MutexGuard aGuard( m_aMutex );
200*cdf0e10cSrcweir         // copy listener list since calling a listener may remove it.
201*cdf0e10cSrcweir         aListeners = m_aListeners;
202*cdf0e10cSrcweir         // set back interaction state
203*cdf0e10cSrcweir         m_bInteractionRequested = m_bInteractionDone = m_bInteractionGranted = false;
204*cdf0e10cSrcweir     }
205*cdf0e10cSrcweir 
206*cdf0e10cSrcweir     sal_uLong nAcquireCount = Application::ReleaseSolarMutex();
207*cdf0e10cSrcweir     for( std::list< Listener >::const_iterator it = aListeners.begin(); it != aListeners.end(); ++it )
208*cdf0e10cSrcweir         it->m_xListener->shutdownCanceled();
209*cdf0e10cSrcweir     Application::AcquireSolarMutex( nAcquireCount );
210*cdf0e10cSrcweir }
211*cdf0e10cSrcweir 
212*cdf0e10cSrcweir void VCLSession::callQuit()
213*cdf0e10cSrcweir {
214*cdf0e10cSrcweir     std::list< Listener > aListeners;
215*cdf0e10cSrcweir     {
216*cdf0e10cSrcweir         osl::MutexGuard aGuard( m_aMutex );
217*cdf0e10cSrcweir         // copy listener list since calling a listener may remove it.
218*cdf0e10cSrcweir         aListeners = m_aListeners;
219*cdf0e10cSrcweir         // set back interaction state
220*cdf0e10cSrcweir         m_bInteractionRequested = m_bInteractionDone = m_bInteractionGranted = false;
221*cdf0e10cSrcweir     }
222*cdf0e10cSrcweir 
223*cdf0e10cSrcweir     sal_uLong nAcquireCount = Application::ReleaseSolarMutex();
224*cdf0e10cSrcweir     for( std::list< Listener >::const_iterator it = aListeners.begin(); it != aListeners.end(); ++it )
225*cdf0e10cSrcweir     {
226*cdf0e10cSrcweir         css::uno::Reference< XSessionManagerListener2 > xListener2( it->m_xListener, UNO_QUERY );
227*cdf0e10cSrcweir         if( xListener2.is() )
228*cdf0e10cSrcweir             xListener2->doQuit();
229*cdf0e10cSrcweir     }
230*cdf0e10cSrcweir     Application::AcquireSolarMutex( nAcquireCount );
231*cdf0e10cSrcweir }
232*cdf0e10cSrcweir 
233*cdf0e10cSrcweir void VCLSession::SalSessionEventProc( SalSessionEvent* pEvent )
234*cdf0e10cSrcweir {
235*cdf0e10cSrcweir     switch( pEvent->m_eType )
236*cdf0e10cSrcweir     {
237*cdf0e10cSrcweir         case Interaction:
238*cdf0e10cSrcweir         {
239*cdf0e10cSrcweir             SalSessionInteractionEvent* pIEv = static_cast<SalSessionInteractionEvent*>(pEvent);
240*cdf0e10cSrcweir             pOneInstance->callInteractionGranted( pIEv->m_bInteractionGranted );
241*cdf0e10cSrcweir         }
242*cdf0e10cSrcweir         break;
243*cdf0e10cSrcweir         case SaveRequest:
244*cdf0e10cSrcweir         {
245*cdf0e10cSrcweir             SalSessionSaveRequestEvent* pSEv = static_cast<SalSessionSaveRequestEvent*>(pEvent);
246*cdf0e10cSrcweir             pOneInstance->callSaveRequested( pSEv->m_bShutdown, pSEv->m_bCancelable );
247*cdf0e10cSrcweir         }
248*cdf0e10cSrcweir         break;
249*cdf0e10cSrcweir         case ShutdownCancel:
250*cdf0e10cSrcweir             pOneInstance->callShutdownCancelled();
251*cdf0e10cSrcweir             break;
252*cdf0e10cSrcweir         case Quit:
253*cdf0e10cSrcweir             pOneInstance->callQuit();
254*cdf0e10cSrcweir             break;
255*cdf0e10cSrcweir     }
256*cdf0e10cSrcweir }
257*cdf0e10cSrcweir 
258*cdf0e10cSrcweir void SAL_CALL VCLSession::addSessionManagerListener( const css::uno::Reference<XSessionManagerListener>& xListener ) throw( RuntimeException )
259*cdf0e10cSrcweir {
260*cdf0e10cSrcweir     osl::MutexGuard aGuard( m_aMutex );
261*cdf0e10cSrcweir 
262*cdf0e10cSrcweir     m_aListeners.push_back( Listener( xListener ) );
263*cdf0e10cSrcweir }
264*cdf0e10cSrcweir 
265*cdf0e10cSrcweir void SAL_CALL VCLSession::removeSessionManagerListener( const css::uno::Reference<XSessionManagerListener>& xListener ) throw( RuntimeException )
266*cdf0e10cSrcweir {
267*cdf0e10cSrcweir     osl::MutexGuard aGuard( m_aMutex );
268*cdf0e10cSrcweir 
269*cdf0e10cSrcweir     std::list< Listener >::iterator it = m_aListeners.begin();
270*cdf0e10cSrcweir     while( it != m_aListeners.end() )
271*cdf0e10cSrcweir     {
272*cdf0e10cSrcweir         if( it->m_xListener == xListener )
273*cdf0e10cSrcweir         {
274*cdf0e10cSrcweir             m_aListeners.erase( it );
275*cdf0e10cSrcweir             it = m_aListeners.begin();
276*cdf0e10cSrcweir         }
277*cdf0e10cSrcweir         else
278*cdf0e10cSrcweir             ++it;
279*cdf0e10cSrcweir     }
280*cdf0e10cSrcweir }
281*cdf0e10cSrcweir 
282*cdf0e10cSrcweir void SAL_CALL VCLSession::queryInteraction( const css::uno::Reference<XSessionManagerListener>& xListener ) throw( RuntimeException )
283*cdf0e10cSrcweir {
284*cdf0e10cSrcweir     if( m_bInteractionGranted )
285*cdf0e10cSrcweir     {
286*cdf0e10cSrcweir         if( m_bInteractionDone )
287*cdf0e10cSrcweir             xListener->approveInteraction( false );
288*cdf0e10cSrcweir         else
289*cdf0e10cSrcweir             xListener->approveInteraction( true );
290*cdf0e10cSrcweir         return;
291*cdf0e10cSrcweir     }
292*cdf0e10cSrcweir 
293*cdf0e10cSrcweir     osl::MutexGuard aGuard( m_aMutex );
294*cdf0e10cSrcweir     if( ! m_bInteractionRequested )
295*cdf0e10cSrcweir     {
296*cdf0e10cSrcweir         m_pSession->queryInteraction();
297*cdf0e10cSrcweir         m_bInteractionRequested = true;
298*cdf0e10cSrcweir     }
299*cdf0e10cSrcweir     for( std::list< Listener >::iterator it = m_aListeners.begin(); it != m_aListeners.end(); ++it )
300*cdf0e10cSrcweir     {
301*cdf0e10cSrcweir         if( it->m_xListener == xListener )
302*cdf0e10cSrcweir         {
303*cdf0e10cSrcweir             it->m_bInteractionRequested	= true;
304*cdf0e10cSrcweir             it->m_bInteractionDone		= false;
305*cdf0e10cSrcweir         }
306*cdf0e10cSrcweir     }
307*cdf0e10cSrcweir }
308*cdf0e10cSrcweir 
309*cdf0e10cSrcweir void SAL_CALL VCLSession::interactionDone( const css::uno::Reference< XSessionManagerListener >& xListener ) throw( RuntimeException )
310*cdf0e10cSrcweir {
311*cdf0e10cSrcweir     osl::MutexGuard aGuard( m_aMutex );
312*cdf0e10cSrcweir     int nRequested = 0, nDone = 0;
313*cdf0e10cSrcweir     for( std::list< Listener >::iterator it = m_aListeners.begin(); it != m_aListeners.end(); ++it )
314*cdf0e10cSrcweir     {
315*cdf0e10cSrcweir         if( it->m_bInteractionRequested )
316*cdf0e10cSrcweir         {
317*cdf0e10cSrcweir             nRequested++;
318*cdf0e10cSrcweir             if( xListener == it->m_xListener )
319*cdf0e10cSrcweir                 it->m_bInteractionDone = true;
320*cdf0e10cSrcweir         }
321*cdf0e10cSrcweir         if( it->m_bInteractionDone )
322*cdf0e10cSrcweir             nDone++;
323*cdf0e10cSrcweir     }
324*cdf0e10cSrcweir     if( nDone == nRequested && nDone > 0 )
325*cdf0e10cSrcweir     {
326*cdf0e10cSrcweir         m_bInteractionDone = true;
327*cdf0e10cSrcweir         if( m_pSession )
328*cdf0e10cSrcweir             m_pSession->interactionDone();
329*cdf0e10cSrcweir     }
330*cdf0e10cSrcweir }
331*cdf0e10cSrcweir 
332*cdf0e10cSrcweir void SAL_CALL VCLSession::saveDone( const css::uno::Reference< XSessionManagerListener >& xListener ) throw( RuntimeException )
333*cdf0e10cSrcweir {
334*cdf0e10cSrcweir     osl::MutexGuard aGuard( m_aMutex );
335*cdf0e10cSrcweir 
336*cdf0e10cSrcweir     bool bSaveDone = true;
337*cdf0e10cSrcweir     for( std::list< Listener >::iterator it = m_aListeners.begin();
338*cdf0e10cSrcweir          it != m_aListeners.end(); ++it )
339*cdf0e10cSrcweir     {
340*cdf0e10cSrcweir         if( it->m_xListener == xListener )
341*cdf0e10cSrcweir             it->m_bSaveDone = true;
342*cdf0e10cSrcweir         if( ! it->m_bSaveDone )
343*cdf0e10cSrcweir             bSaveDone = false;
344*cdf0e10cSrcweir     }
345*cdf0e10cSrcweir     if( bSaveDone )
346*cdf0e10cSrcweir     {
347*cdf0e10cSrcweir         m_bSaveDone = true;
348*cdf0e10cSrcweir         if( m_pSession )
349*cdf0e10cSrcweir             m_pSession->saveDone();
350*cdf0e10cSrcweir     }
351*cdf0e10cSrcweir }
352*cdf0e10cSrcweir 
353*cdf0e10cSrcweir sal_Bool SAL_CALL VCLSession::cancelShutdown() throw( RuntimeException )
354*cdf0e10cSrcweir {
355*cdf0e10cSrcweir     return m_pSession ? (sal_Bool)m_pSession->cancelShutdown() : sal_False;
356*cdf0e10cSrcweir }
357*cdf0e10cSrcweir 
358*cdf0e10cSrcweir // service implementation
359*cdf0e10cSrcweir 
360*cdf0e10cSrcweir OUString SAL_CALL vcl_session_getImplementationName()
361*cdf0e10cSrcweir {
362*cdf0e10cSrcweir 	static OUString aImplementationName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.VCLSessionManagerClient" ) );
363*cdf0e10cSrcweir 	return aImplementationName;
364*cdf0e10cSrcweir }
365*cdf0e10cSrcweir 
366*cdf0e10cSrcweir Sequence< rtl::OUString > SAL_CALL vcl_session_getSupportedServiceNames()
367*cdf0e10cSrcweir {
368*cdf0e10cSrcweir 	Sequence< OUString > aRet(1);
369*cdf0e10cSrcweir 	aRet[0] = OUString::createFromAscii("com.sun.star.frame.SessionManagerClient");
370*cdf0e10cSrcweir 	return aRet;
371*cdf0e10cSrcweir }
372*cdf0e10cSrcweir 
373*cdf0e10cSrcweir css::uno::Reference< XInterface > SAL_CALL vcl_session_createInstance( const css::uno::Reference< XMultiServiceFactory > & /*xMultiServiceFactory*/ )
374*cdf0e10cSrcweir {
375*cdf0e10cSrcweir     ImplSVData* pSVData = ImplGetSVData();
376*cdf0e10cSrcweir     if( ! pSVData->xSMClient.is() )
377*cdf0e10cSrcweir         pSVData->xSMClient = new VCLSession();
378*cdf0e10cSrcweir 
379*cdf0e10cSrcweir 	return css::uno::Reference< XInterface >(pSVData->xSMClient, UNO_QUERY );
380*cdf0e10cSrcweir }
381