xref: /trunk/main/framework/inc/jobs/job.hxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef __FRAMEWORK_JOBS_JOB_HXX_
29 #define __FRAMEWORK_JOBS_JOB_HXX_
30 
31 //_______________________________________
32 // my own includes
33 
34 #include <jobs/jobresult.hxx>
35 #include <jobs/jobdata.hxx>
36 #include <threadhelp/threadhelpbase.hxx>
37 #include <macros/debug.hxx>
38 #include <macros/xinterface.hxx>
39 #include <macros/xtypeprovider.hxx>
40 #include <stdtypes.h>
41 #include <general.h>
42 
43 //_______________________________________
44 // interface includes
45 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
46 #include <com/sun/star/lang/XTypeProvider.hpp>
47 #include <com/sun/star/frame/XFrame.hpp>
48 #include <com/sun/star/frame/XDesktop.hpp>
49 #include <com/sun/star/frame/XDispatchResultListener.hpp>
50 #include <com/sun/star/task/XJobListener.hpp>
51 #include <com/sun/star/util/XCloseListener.hpp>
52 #include <com/sun/star/frame/DispatchResultEvent.hpp>
53 
54 //_______________________________________
55 // other includes
56 #include <cppuhelper/weak.hxx>
57 #include <rtl/ustring.hxx>
58 
59 //_______________________________________
60 // namespace
61 
62 namespace framework{
63 
64 //_______________________________________
65 // public const
66 
67 //_______________________________________
68 // definitions
69 
70 /**
71     @short  it represent a job; execute it and control it's lifetime
72 
73     @descr  This implemetation can be used to wrapp jobs, execute it
74             synchronously or asynchronous, control it's lifetime
75             and differe between jobs with and without configuration.
76  */
77 class Job : public  css::lang::XTypeProvider
78           , public  css::task::XJobListener
79           , public  css::frame::XTerminateListener
80           , public  css::util::XCloseListener
81           , private ThreadHelpBase
82           , public  ::cppu::OWeakObject
83 {
84     //___________________________________
85     // structs
86 
87     private:
88 
89     /** different possible states for the internal wrapped job.
90         It can be started, stopped by a queryClosing() request or
91         disposed() by a notifyClosing() request ...
92      */
93     enum ERunState
94     {
95         E_NEW,
96         E_RUNNING,
97         E_STOPPED_OR_FINISHED,
98         E_DISPOSED
99     };
100 
101     //___________________________________
102     // member
103 
104     private:
105 
106         /**
107             hold all neccessary informations about this job.
108             It can be used for both modes: with and without configuration.
109          */
110         JobData m_aJobCfg;
111 
112         /**
113             We need it to create own services on demand.
114          */
115         css::uno::Reference< css::lang::XMultiServiceFactory > m_xSMGR;
116 
117         /**
118             Hold the (may asynchronous) job alive.
119          */
120         css::uno::Reference< css::uno::XInterface > m_xJob;
121 
122         /**
123             Used to wait for finishing of asynchronous started jobs.
124          */
125         ::osl::Condition m_aAsyncWait;
126 
127         /**
128             For some special cases we must know the environment, in which
129             this job runs. Means the frame inside which we may was triggered.
130             We use it too, to listen for closing events of this ressource.
131 
132             Please note: If m_xFrame is set - m_xModel should be NULL.
133             Only one environment can be supported realy.
134          */
135         css::uno::Reference< css::frame::XFrame > m_xFrame;
136 
137         /**
138             For some special cases we must know the environment, in which
139             this job runs. Means the document inside which we may was triggered.
140             We use it too, to listen for closing events of this ressource.
141 
142             Please note: If m_xModel is set - m_xFrame should be NULL.
143             Only one environment can be supported realy.
144          */
145         css::uno::Reference< css::frame::XModel > m_xModel;
146 
147         /**
148             We are registered at this instance to listen for office shutdown events.
149             It's neccessary supress it (if possible) or to react in the right way.
150          */
151         css::uno::Reference< css::frame::XDesktop > m_xDesktop;
152 
153         /**
154             A job can return a dispatch result event after finishing its work.
155             We have to transport it to any outside interested listener then.
156             (see m_xResultSourceFake for further informations too!)
157          */
158         css::uno::Reference< css::frame::XDispatchResultListener > m_xResultListener;
159 
160         /**
161             We can't set ourself as source of a dispatch result event ... nor our job.
162             Because the listener (set as m_xResultListener) expect the original instance,
163             where it was registered. This original instance is the user of this class.
164             It must be set explicitly and will be used to fake the source of the event!
165          */
166         css::uno::Reference< css::uno::XInterface > m_xResultSourceFake;
167 
168         /**
169             Holds the state, if we are listen for desktop/frame or model closing events or not.
170             The used references are not realy enough to detect a valid listener connection.
171             Thats why we use this additional information here too.
172          */
173         sal_Bool m_bListenOnDesktop;
174         sal_Bool m_bListenOnFrame;
175         sal_Bool m_bListenOnModel;
176 
177         /**
178             In case we got a close request from our desktop/frame/model (on which we listen) ... and
179             the ownership was delivered there ... we have to close ourself and this object
180             in case the internal wrapped and running job finish his work.
181          */
182         sal_Bool m_bPendingCloseFrame;
183         sal_Bool m_bPendingCloseModel;
184 
185         /**
186             indicates in which state the internal job currently exist.
187 
188             We can use this information to throw any suitable veto exception
189             to prevent the environment against dieing or supress superflous dispose()
190             calls at the job.
191          */
192         ERunState m_eRunState;
193 
194     //___________________________________
195     // native interface
196 
197     public:
198 
199                  Job( const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR  ,
200                       const css::uno::Reference< css::frame::XFrame >&              xFrame );
201                  Job( const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR  ,
202                       const css::uno::Reference< css::frame::XModel >&              xModel );
203         virtual ~Job(                                                                      );
204 
205         void     setDispatchResultFake( const css::uno::Reference< css::frame::XDispatchResultListener >& xListener    ,
206                                         const css::uno::Reference< css::uno::XInterface >&                xSourceFake  );
207         void     setJobData           ( const JobData&                                                    aData        );
208         void     execute              ( const css::uno::Sequence< css::beans::NamedValue >&               lDynamicArgs );
209         void     die                  (                                                                                );
210 
211     private:
212 
213         css::uno::Sequence< css::beans::NamedValue > impl_generateJobArgs  ( const css::uno::Sequence< css::beans::NamedValue >& lDynamicArgs );
214         void                                         impl_reactForJobResult( const css::uno::Any&                                aResult      );
215         void                                         impl_startListening   (                                                                  );
216         void                                         impl_stopListening    (                                                                  );
217 
218     //___________________________________
219     // uno interface
220 
221     public:
222 
223         FWK_DECLARE_XINTERFACE
224         FWK_DECLARE_XTYPEPROVIDER
225 
226         // XJobListener
227         virtual void SAL_CALL jobFinished( const css::uno::Reference< css::task::XAsyncJob >& xJob,
228                                            const css::uno::Any&                               aResult ) throw(css::uno::RuntimeException);
229 
230         // XTerminateListener
231         virtual void SAL_CALL queryTermination ( const css::lang::EventObject& aEvent ) throw(css::frame::TerminationVetoException,
232                                                                                               css::uno::RuntimeException          );
233         virtual void SAL_CALL notifyTermination( const css::lang::EventObject& aEvent ) throw(css::uno::RuntimeException          );
234 
235         // XCloseListener
236         virtual void SAL_CALL queryClosing ( const css::lang::EventObject& aEvent         ,
237                                                    sal_Bool                bGetsOwnership ) throw(css::util::CloseVetoException,
238                                                                                                   css::uno::RuntimeException   );
239         virtual void SAL_CALL notifyClosing( const css::lang::EventObject& aEvent         ) throw(css::uno::RuntimeException   );
240 
241         // XEventListener
242         virtual void SAL_CALL disposing( const css::lang::EventObject& aEvent ) throw(css::uno::RuntimeException);
243 };
244 
245 } // namespace framework
246 
247 #endif // __FRAMEWORK_JOBS_JOB_HXX_
248