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