merge the formfield patch from ooo-build
[ooovba.git] / framework / source / services / sessionlistener.cxx
blob9bda14b891a6b1cdbb10192306b53ad6253edad1
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: sessionlistener.cxx,v $
10 * $Revision: 1.12 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_framework.hxx"
33 //_______________________________________________
34 // my own includes
36 #ifndef __FRAMEWORK_SERVICES_TYPEDETECTION_HXX_
37 #include <services/sessionlistener.hxx>
38 #endif
39 #include <threadhelp/readguard.hxx>
40 #include <threadhelp/resetableguard.hxx>
41 #include <protocols.h>
42 #include <services.h>
44 #include <osl/thread.h>
47 #include <vcl/svapp.hxx>
48 #include <tools/urlobj.hxx>
49 #include <tools/tempfile.hxx>
50 #include <unotools/tempfile.hxx>
51 #include <com/sun/star/lang/XSingleServiceFactory.hpp>
52 #include <com/sun/star/lang/XComponent.hpp>
53 #include <com/sun/star/container/XNameAccess.hpp>
54 #include <com/sun/star/container/XNameContainer.hpp>
55 #include <com/sun/star/beans/NamedValue.hpp>
56 #include <com/sun/star/beans/PropertyValue.hpp>
57 #include <com/sun/star/beans/PropertyState.hpp>
58 #include <com/sun/star/beans/XPropertySet.hpp>
59 #include <com/sun/star/frame/XFramesSupplier.hpp>
60 #include <com/sun/star/frame/XStorable.hpp>
61 #include <com/sun/star/frame/XComponentLoader.hpp>
62 #include <com/sun/star/frame/XDispatch.hpp>
63 #include <com/sun/star/util/XModifiable.hpp>
64 #include <com/sun/star/util/XChangesBatch.hpp>
65 #include <com/sun/star/util/XURLTransformer.hpp>
66 #include <com/sun/star/util/URL.hpp>
67 #include <osl/time.h>
68 #include <comphelper/processfactory.hxx>
69 #include <svtools/pathoptions.hxx>
70 #include <svtools/internaloptions.hxx>
71 #include <stdio.h>
72 //_______________________________________________
73 // interface includes
74 #include <com/sun/star/uno/Any.hxx>
76 #include <com/sun/star/uno/Sequence.hxx>
77 //_______________________________________________
78 // includes of other projects
80 //_______________________________________________
81 // namespace
83 using namespace com::sun::star::uno;
84 using namespace com::sun::star::util;
85 using namespace com::sun::star::frame;
86 using namespace com::sun::star::lang;
87 using namespace com::sun::star::beans;
88 using namespace com::sun::star::container;
90 using namespace rtl;
92 namespace framework{
94 //_______________________________________________
95 // non exported const
97 //_______________________________________________
98 // non exported definitions
100 //_______________________________________________
101 // declarations
103 //***********************************************
104 // XInterface, XTypeProvider, XServiceInfo
106 DEFINE_XINTERFACE_5(
107 SessionListener,
108 OWeakObject,
109 DIRECT_INTERFACE(css::lang::XTypeProvider),
110 DIRECT_INTERFACE(css::lang::XInitialization),
111 DIRECT_INTERFACE(css::frame::XSessionManagerListener),
112 DIRECT_INTERFACE(css::frame::XStatusListener),
113 DIRECT_INTERFACE(css::lang::XServiceInfo))
115 DEFINE_XTYPEPROVIDER_5(
116 SessionListener,
117 css::lang::XTypeProvider,
118 css::lang::XInitialization,
119 css::frame::XSessionManagerListener,
120 css::frame::XStatusListener,
121 css::lang::XServiceInfo)
123 DEFINE_XSERVICEINFO_ONEINSTANCESERVICE(
124 SessionListener,
125 cppu::OWeakObject,
126 SERVICENAME_SESSIONLISTENER,
127 IMPLEMENTATIONNAME_SESSIONLISTENER)
129 DEFINE_INIT_SERVICE(SessionListener,
131 /* Add special code for initialization here, if you have to use your own instance
132 during your ctor is still in progress! */
136 SessionListener::SessionListener(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR )
137 : ThreadHelpBase (&Application::GetSolarMutex())
138 , OWeakObject ( )
139 , m_xSMGR (xSMGR )
140 , m_bRestored( false )
144 SessionListener::~SessionListener()
146 if (m_rSessionManager.is())
148 css::uno::Reference< XSessionManagerListener> me(this);
149 m_rSessionManager->removeSessionManagerListener(me);
153 void SAL_CALL SessionListener::disposing(const com::sun::star::lang::EventObject&) throw (RuntimeException)
157 void SAL_CALL SessionListener::initialize(const Sequence< Any >& args)
158 throw (RuntimeException)
161 OUString aSMgr = OUString::createFromAscii("com.sun.star.frame.SessionManagerClient");
162 if (args.getLength() > 0)
164 NamedValue v;
165 for (int i = 0; i < args.getLength(); i++)
167 if (args[i] >>= v)
169 if (v.Name.equalsAscii("SessionManagerName"))
170 v.Value >>= aSMgr;
171 else if (v.Name.equalsAscii("SessionManager"))
172 v.Value >>= m_rSessionManager;
176 if (!m_rSessionManager.is())
177 m_rSessionManager = css::uno::Reference< XSessionManagerClient >
178 (m_xSMGR->createInstance(aSMgr), UNO_QUERY);
180 if (m_rSessionManager.is())
182 m_rSessionManager->addSessionManagerListener(this);
186 void SAL_CALL SessionListener::statusChanged(const FeatureStateEvent& event)
187 throw (css::uno::RuntimeException)
189 if (event.FeatureURL.Complete.equalsAscii("vnd.sun.star.autorecovery:/doSessionRestore"))
191 if (event.FeatureDescriptor.compareToAscii("update")==0)
192 m_bRestored = sal_True; // a document was restored
193 // if (event.FeatureDescriptor.compareToAscii("stop")==0)
196 else if (event.FeatureURL.Complete.equalsAscii("vnd.sun.star.autorecovery:/doSessionSave"))
198 if (event.FeatureDescriptor.compareToAscii("stop")==0)
200 if (m_rSessionManager.is())
201 m_rSessionManager->saveDone(this); // done with save
207 sal_Bool SAL_CALL SessionListener::doRestore()
208 throw (RuntimeException)
210 ResetableGuard aGuard(m_aLock);
211 m_bRestored = sal_False;
212 try {
213 css::uno::Reference< XDispatch > xDispatch(m_xSMGR->createInstance(SERVICENAME_AUTORECOVERY), UNO_QUERY_THROW);
215 URL aURL;
216 aURL.Complete = OUString::createFromAscii("vnd.sun.star.autorecovery:/doSessionRestore");
217 css::uno::Reference< XURLTransformer > xURLTransformer(m_xSMGR->createInstance(SERVICENAME_URLTRANSFORMER), UNO_QUERY_THROW);
218 xURLTransformer->parseStrict(aURL);
219 Sequence< PropertyValue > args;
220 xDispatch->addStatusListener(this, aURL);
221 xDispatch->dispatch(aURL, args);
222 m_bRestored = sal_True;
224 } catch (com::sun::star::uno::Exception& e) {
225 OString aMsg = OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8);
226 OSL_ENSURE(sal_False, aMsg.getStr());
229 return m_bRestored;
233 void SAL_CALL SessionListener::doSave( sal_Bool bShutdown, sal_Bool /*bCancelable*/ )
234 throw (RuntimeException)
236 if (bShutdown)
238 sal_Bool bDispatched = sal_False;
239 ResetableGuard aGuard(m_aLock);
240 try
242 // xd create SERVICENAME_AUTORECOVERY -> XDispatch
243 // xd->dispatch("vnd.sun.star.autorecovery:/doSessionSave, async=true
244 // on stop event m_rSessionManager->saveDone(this);
246 css::uno::Reference< XDispatch > xDispatch(m_xSMGR->createInstance(SERVICENAME_AUTORECOVERY), UNO_QUERY_THROW);
247 css::uno::Reference< XURLTransformer > xURLTransformer(m_xSMGR->createInstance(SERVICENAME_URLTRANSFORMER), UNO_QUERY_THROW);
248 URL aURL;
249 aURL.Complete = OUString::createFromAscii("vnd.sun.star.autorecovery:/doSessionSave");
250 xURLTransformer->parseStrict(aURL);
251 xDispatch->addStatusListener(this, aURL);
252 Sequence< PropertyValue > args(1);
253 args[0] = PropertyValue(OUString::createFromAscii("DispatchAsynchron"),-1,makeAny(sal_True),PropertyState_DIRECT_VALUE);
254 xDispatch->dispatch(aURL, args);
255 bDispatched = sal_True;
256 // on stop event set call m_rSessionManager->saveDone(this);
257 } catch (com::sun::star::uno::Exception& e) {
258 OString aMsg = OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8);
259 OSL_ENSURE(sal_False, aMsg.getStr());
260 // save failed, but tell manager to go on if we havent yet dispatched the request
261 if (m_rSessionManager.is() && !bDispatched)
262 m_rSessionManager->saveDone(this);
265 // we don't have anything to do so tell the session manager we're done
266 else if( m_rSessionManager.is() )
267 m_rSessionManager->saveDone( this );
272 void SAL_CALL SessionListener::approveInteraction( sal_Bool /*bInteractionGranted*/ )
273 throw (RuntimeException)
276 void SessionListener::shutdownCanceled()
277 throw (RuntimeException)