xref: /haiku/headers/os/support/Job.h (revision 5ab2b1457b0262ca8f4b73778c3dc411fd451599)
1e711e6e4SAxel Dörfler /*
2e711e6e4SAxel Dörfler  * Copyright 2011-2015, Haiku, Inc.
3e711e6e4SAxel Dörfler  * Distributed under the terms of the MIT License.
4e711e6e4SAxel Dörfler  */
5e711e6e4SAxel Dörfler #ifndef _SUPPORT_JOB_H_
6e711e6e4SAxel Dörfler #define _SUPPORT_JOB_H_
7e711e6e4SAxel Dörfler 
8e711e6e4SAxel Dörfler 
9e711e6e4SAxel Dörfler #include <ObjectList.h>
10e711e6e4SAxel Dörfler #include <String.h>
11e711e6e4SAxel Dörfler 
12e711e6e4SAxel Dörfler 
13e711e6e4SAxel Dörfler namespace BSupportKit {
14e711e6e4SAxel Dörfler 
15e711e6e4SAxel Dörfler 
16e711e6e4SAxel Dörfler class BJob;
17e711e6e4SAxel Dörfler 
18e711e6e4SAxel Dörfler 
19e711e6e4SAxel Dörfler struct BJobStateListener {
20e711e6e4SAxel Dörfler 	virtual						~BJobStateListener();
21e711e6e4SAxel Dörfler 
22e711e6e4SAxel Dörfler 								// these default implementations do nothing
23e711e6e4SAxel Dörfler 	virtual	void				JobStarted(BJob* job);
24e711e6e4SAxel Dörfler 	virtual	void				JobProgress(BJob* job);
25e711e6e4SAxel Dörfler 	virtual	void				JobSucceeded(BJob* job);
26e711e6e4SAxel Dörfler 	virtual	void				JobFailed(BJob* job);
27e711e6e4SAxel Dörfler 	virtual	void				JobAborted(BJob* job);
28e711e6e4SAxel Dörfler };
29e711e6e4SAxel Dörfler 
30e711e6e4SAxel Dörfler 
31e711e6e4SAxel Dörfler enum BJobState {
32e711e6e4SAxel Dörfler 	B_JOB_STATE_WAITING_TO_RUN,
33e711e6e4SAxel Dörfler 	B_JOB_STATE_STARTED,
34e711e6e4SAxel Dörfler 	B_JOB_STATE_IN_PROGRESS,
35e711e6e4SAxel Dörfler 	B_JOB_STATE_SUCCEEDED,
36e711e6e4SAxel Dörfler 	B_JOB_STATE_FAILED,
37e711e6e4SAxel Dörfler 	B_JOB_STATE_ABORTED,
38e711e6e4SAxel Dörfler };
39e711e6e4SAxel Dörfler 
40e711e6e4SAxel Dörfler 
41e711e6e4SAxel Dörfler class BJob {
42e711e6e4SAxel Dörfler public:
43e711e6e4SAxel Dörfler 								BJob(const BString& title);
44e711e6e4SAxel Dörfler 	virtual						~BJob();
45e711e6e4SAxel Dörfler 
46e711e6e4SAxel Dörfler 			status_t			InitCheck() const;
47e711e6e4SAxel Dörfler 
48e711e6e4SAxel Dörfler 	virtual	status_t			Run();
49e711e6e4SAxel Dörfler 
50e711e6e4SAxel Dörfler 			const BString&		Title() const;
51e711e6e4SAxel Dörfler 			BJobState			State() const;
52e711e6e4SAxel Dörfler 			status_t			Result() const;
53e711e6e4SAxel Dörfler 			const BString&		ErrorString() const;
54e711e6e4SAxel Dörfler 
55e711e6e4SAxel Dörfler 			uint32				TicketNumber() const;
56e711e6e4SAxel Dörfler 
57e711e6e4SAxel Dörfler 			status_t			AddStateListener(BJobStateListener* listener);
58e711e6e4SAxel Dörfler 			status_t			RemoveStateListener(
59e711e6e4SAxel Dörfler 									BJobStateListener* listener);
60e711e6e4SAxel Dörfler 
61e711e6e4SAxel Dörfler 			bool				IsRunnable() const;
62e711e6e4SAxel Dörfler 			status_t			AddDependency(BJob* job);
63e711e6e4SAxel Dörfler 			status_t			RemoveDependency(BJob* job);
64e711e6e4SAxel Dörfler 			int32				CountDependencies() const;
65e711e6e4SAxel Dörfler 
66e711e6e4SAxel Dörfler 			BJob*				DependantJobAt(int32 index) const;
67e711e6e4SAxel Dörfler 
68e711e6e4SAxel Dörfler 			class Private;
69e711e6e4SAxel Dörfler 
70e711e6e4SAxel Dörfler protected:
71e711e6e4SAxel Dörfler 	virtual	status_t			Execute() = 0;
72e711e6e4SAxel Dörfler 	virtual	void				Cleanup(status_t jobResult);
73e711e6e4SAxel Dörfler 
74*5ab2b145SAxel Dörfler 			void				SetState(BJobState state);
75e711e6e4SAxel Dörfler 			void				SetErrorString(const BString&);
76e711e6e4SAxel Dörfler 
77e711e6e4SAxel Dörfler 			void				NotifyStateListeners();
78e711e6e4SAxel Dörfler 
79e711e6e4SAxel Dörfler private:
80e711e6e4SAxel Dörfler 	friend class Private;
81e711e6e4SAxel Dörfler 
82e711e6e4SAxel Dörfler 			void				_SetTicketNumber(uint32 ticketNumber);
83e711e6e4SAxel Dörfler 			void				_ClearTicketNumber();
84e711e6e4SAxel Dörfler 
85e711e6e4SAxel Dörfler private:
86e711e6e4SAxel Dörfler 			status_t			fInitStatus;
87e711e6e4SAxel Dörfler 			BString				fTitle;
88e711e6e4SAxel Dörfler 
89e711e6e4SAxel Dörfler 			BJobState			fState;
90e711e6e4SAxel Dörfler 			status_t			fResult;
91e711e6e4SAxel Dörfler 			BString				fErrorString;
92e711e6e4SAxel Dörfler 
93e711e6e4SAxel Dörfler 			uint32				fTicketNumber;
94e711e6e4SAxel Dörfler 
95e711e6e4SAxel Dörfler 	typedef	BObjectList<BJob>	JobList;
96e711e6e4SAxel Dörfler 			JobList				fDependencies;
97e711e6e4SAxel Dörfler 			JobList				fDependantJobs;
98e711e6e4SAxel Dörfler 
99e711e6e4SAxel Dörfler 	typedef	BObjectList<BJobStateListener>	StateListenerList;
100e711e6e4SAxel Dörfler 			StateListenerList	fStateListeners;
101e711e6e4SAxel Dörfler };
102e711e6e4SAxel Dörfler 
103e711e6e4SAxel Dörfler 
104e711e6e4SAxel Dörfler }	// namespace BSupportKit
105e711e6e4SAxel Dörfler 
106e711e6e4SAxel Dörfler 
107e711e6e4SAxel Dörfler #endif // _SUPPORT_JOB_H_
108