HaikuDepot: notify work status from main window
[haiku.git] / src / kits / support / Job.cpp
blobc2ecb723ac692f83b451c10a104d803c17af9e23
1 /*
2 * Copyright 2011-2015, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
5 * Authors:
6 * Oliver Tappe <zooey@hirschkaefer.de>
7 * Rene Gollent <rene@gollent.com>
8 */
11 #include <Job.h>
13 #include <Errors.h>
16 namespace BSupportKit {
19 BJobStateListener::~BJobStateListener()
24 void
25 BJobStateListener::JobStarted(BJob* job)
30 void
31 BJobStateListener::JobProgress(BJob* job)
36 void
37 BJobStateListener::JobSucceeded(BJob* job)
42 void
43 BJobStateListener::JobFailed(BJob* job)
48 void
49 BJobStateListener::JobAborted(BJob* job)
54 // #pragma mark -
57 BJob::BJob(const BString& title)
59 fTitle(title),
60 fState(B_JOB_STATE_WAITING_TO_RUN),
61 fTicketNumber(0xFFFFFFFFUL)
63 if (fTitle.Length() == 0)
64 fInitStatus = B_BAD_VALUE;
65 else
66 fInitStatus = B_OK;
70 BJob::~BJob()
75 status_t
76 BJob::InitCheck() const
78 return fInitStatus;
82 const BString&
83 BJob::Title() const
85 return fTitle;
89 BJobState
90 BJob::State() const
92 return fState;
96 status_t
97 BJob::Result() const
99 return fResult;
103 const BString&
104 BJob::ErrorString() const
106 return fErrorString;
110 uint32
111 BJob::TicketNumber() const
113 return fTicketNumber;
117 void
118 BJob::_SetTicketNumber(uint32 ticketNumber)
120 fTicketNumber = ticketNumber;
124 void
125 BJob::_ClearTicketNumber()
127 fTicketNumber = 0xFFFFFFFFUL;
131 void
132 BJob::SetErrorString(const BString& error)
134 fErrorString = error;
138 status_t
139 BJob::Run()
141 if (fState != B_JOB_STATE_WAITING_TO_RUN)
142 return B_NOT_ALLOWED;
144 fState = B_JOB_STATE_STARTED;
145 NotifyStateListeners();
147 fState = B_JOB_STATE_IN_PROGRESS;
148 fResult = Execute();
149 Cleanup(fResult);
151 fState = fResult == B_OK
152 ? B_JOB_STATE_SUCCEEDED
153 : fResult == B_CANCELED
154 ? B_JOB_STATE_ABORTED
155 : B_JOB_STATE_FAILED;
156 NotifyStateListeners();
158 return fResult;
162 void
163 BJob::Cleanup(status_t /*jobResult*/)
168 status_t
169 BJob::AddStateListener(BJobStateListener* listener)
171 return fStateListeners.AddItem(listener) ? B_OK : B_ERROR;
175 status_t
176 BJob::RemoveStateListener(BJobStateListener* listener)
178 return fStateListeners.RemoveItem(listener) ? B_OK : B_ERROR;
182 status_t
183 BJob::AddDependency(BJob* job)
185 if (fDependencies.HasItem(job))
186 return B_ERROR;
188 if (fDependencies.AddItem(job) && job->fDependantJobs.AddItem(this))
189 return B_OK;
191 return B_ERROR;
195 status_t
196 BJob::RemoveDependency(BJob* job)
198 if (!fDependencies.HasItem(job))
199 return B_ERROR;
201 if (fDependencies.RemoveItem(job) && job->fDependantJobs.RemoveItem(this))
202 return B_OK;
204 return B_ERROR;
208 bool
209 BJob::IsRunnable() const
211 return fDependencies.IsEmpty();
215 int32
216 BJob::CountDependencies() const
218 return fDependencies.CountItems();
222 BJob*
223 BJob::DependantJobAt(int32 index) const
225 return fDependantJobs.ItemAt(index);
229 void
230 BJob::SetState(BJobState state)
232 fState = state;
236 void
237 BJob::NotifyStateListeners()
239 int32 count = fStateListeners.CountItems();
240 for (int i = 0; i < count; ++i) {
241 BJobStateListener* listener = fStateListeners.ItemAt(i);
242 if (listener == NULL)
243 continue;
244 switch (fState) {
245 case B_JOB_STATE_STARTED:
246 listener->JobStarted(this);
247 break;
248 case B_JOB_STATE_IN_PROGRESS:
249 listener->JobProgress(this);
250 break;
251 case B_JOB_STATE_SUCCEEDED:
252 listener->JobSucceeded(this);
253 break;
254 case B_JOB_STATE_FAILED:
255 listener->JobFailed(this);
256 break;
257 case B_JOB_STATE_ABORTED:
258 listener->JobAborted(this);
259 break;
260 default:
261 break;
267 } // namespace BPackageKit