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