OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimJob.h
Go to the documentation of this file.
1 //**************************************************************************************************
2 // OSSIM -- Open Source Software Image Map
3 //
4 // LICENSE: See top level LICENSE.txt file.
5 //
6 //**************************************************************************************************
7 // $Id$
8 #ifndef ossimJob_HEADER
9 #define ossimJob_HEADER
10 #include <ossim/base/ossimObject.h>
11 #include <ossim/base/ossimString.h>
12 #include <list>
13 #include <mutex>
14 #include <memory>
15 class ossimJob;
16 
69 {
70 public:
71  ossimJobCallback(std::shared_ptr<ossimJobCallback> nextCallback=0):m_nextCallback(nextCallback){}
72 
73  virtual void ready(std::shared_ptr<ossimJob> job) {if(m_nextCallback) m_nextCallback->ready(job); }
74  virtual void started(std::shared_ptr<ossimJob> job) {if(m_nextCallback) m_nextCallback->started(job); }
75  virtual void finished(std::shared_ptr<ossimJob> job) {if(m_nextCallback) m_nextCallback->finished(job);}
76  virtual void canceled(std::shared_ptr<ossimJob> job) {if(m_nextCallback) m_nextCallback->canceled(job);}
77 
78  virtual void nameChanged(const ossimString& name, std::shared_ptr<ossimJob> job)
79  {if(m_nextCallback) m_nextCallback->nameChanged(name, job);}
80 
81  virtual void descriptionChanged(const ossimString& description, std::shared_ptr<ossimJob> job)
82  {if(m_nextCallback) m_nextCallback->descriptionChanged(description, job);}
83 
84  virtual void idChanged(const ossimString& id, std::shared_ptr<ossimJob> job)
85  {if(m_nextCallback) m_nextCallback->idChanged(id, job);}
86 
87  virtual void percentCompleteChanged(double percentValue, std::shared_ptr<ossimJob> job)
88  {if(m_nextCallback) m_nextCallback->percentCompleteChanged(percentValue, job);}
89 
90  void setCallback(std::shared_ptr<ossimJobCallback> c){m_nextCallback = c;}
91  std::shared_ptr<ossimJobCallback> callback(){return m_nextCallback;}
92 
93 protected:
94  std::shared_ptr<ossimJobCallback> m_nextCallback;
95 };
96 
97 
149 class OSSIM_DLL ossimJob : public std::enable_shared_from_this<ossimJob>
150 {
151 public:
152  typedef std::list<std::shared_ptr<ossimJob> > List;
153 
158  enum State
159  {
160  ossimJob_NONE = 0,
161  ossimJob_READY = 1,
162  ossimJob_RUNNING = 2,
163  ossimJob_CANCEL = 4,
164  ossimJob_FINISHED = 8,
165  ossimJob_ALL = (ossimJob_READY|ossimJob_RUNNING|ossimJob_CANCEL|ossimJob_FINISHED)
166  };
167 
168  ossimJob() : m_state(ossimJob_READY), m_priority(0.0) {}
169 
177  virtual void start();
178 
185  std::shared_ptr<ossimJob> getSharedFromThis(){
186  return shared_from_this();
187  }
188 
195  std::shared_ptr<const ossimJob> getSharedFromThis()const{
196  return shared_from_this();
197  }
198 
205  void setPercentComplete(double value)
206  {
207  std::lock_guard<std::mutex> lock(m_jobMutex);
208  if(m_callback)
209  {
210  m_callback->percentCompleteChanged(value, getSharedFromThis());
211  }
212  }
213 
219  void setPriority(double value)
220  {
221  std::lock_guard<std::mutex> lock(m_jobMutex);
222  m_priority = value;
223  }
224 
225  /*
226  * @return the priotiy of the job
227  */
228  double priority()const
229  {
230  return m_priority;
231  }
232 
237  virtual void release(){}
238 
242  State state()const
243  {
244  std::lock_guard<std::mutex> lock(m_jobMutex);
245  return m_state;
246  }
247 
253  virtual void resetState(int value)
254  {
255  m_jobMutex.lock();
256  if(value != m_state)
257  {
258  m_state = ossimJob_NONE;
259  m_jobMutex.unlock();
260  setState(value);
261  }
262  else
263  {
264  m_jobMutex.unlock();
265  }
266 
267  }
268 
276  virtual void setState(int value, bool on=true);
277 
282  bool isCanceled()const
283  {
284  std::lock_guard<std::mutex> lock(m_jobMutex);
285  return (m_state & ossimJob_CANCEL);
286  }
287 
291  virtual void cancel()
292  {
293  // append the cancel flag to current state
294  setState(ossimJob_CANCEL);
295  }
296 
300  virtual void ready()
301  {
302  resetState(ossimJob_READY);
303  }
304 
308  virtual void running()
309  {
310  resetState(ossimJob_RUNNING);
311  }
312 
316  virtual void finished()
317  {
318  int newState = 0;
319  {
320  // maintain the cancel flag so we can indicate the job has now finished
321  std::lock_guard<std::mutex> lock(m_jobMutex);
322  newState = ((m_state & ossimJob_CANCEL) |
323  (ossimJob_FINISHED));
324  }
325  // now reset to the new state
326  resetState(newState);
327  }
328 
332  bool isReady()const
333  {
334  std::lock_guard<std::mutex> lock(m_jobMutex);
335  return m_state & ossimJob_READY;
336  }
337 
341  bool isStopped()const
342  {
343  std::lock_guard<std::mutex> lock(m_jobMutex);
344  return (m_state & ossimJob_FINISHED);
345  }
346 
350  bool isFinished()const
351  {
352  std::lock_guard<std::mutex> lock(m_jobMutex);
353  return (m_state & ossimJob_FINISHED);
354  }
355 
359  bool isRunning()const
360  {
361  std::lock_guard<std::mutex> lock(m_jobMutex);
362  return (m_state & ossimJob_RUNNING);
363  }
364 
368  void setCallback(std::shared_ptr<ossimJobCallback> callback)
369  {
370  std::lock_guard<std::mutex> lock(m_jobMutex);
371  m_callback = callback;
372  }
373 
379  void setName(const ossimString& value)
380  {
381  bool changed = false;
382  std::shared_ptr<ossimJobCallback> callback;
383  {
384  std::lock_guard<std::mutex> lock(m_jobMutex);
385  changed = value!=m_name;
386  m_name = value;
387  callback = m_callback;
388  }
389  if(changed&&callback)
390  {
391  callback->nameChanged(value, getSharedFromThis());
392  }
393  }
394 
398  const ossimString& name()const
399  {
400  std::lock_guard<std::mutex> lock(m_jobMutex);
401  return m_name;
402  }
403 
404  /*
405  * sets the ID
406  *
407  * @param value the id to set the job to
408  */
409  void setId(const ossimString& value)
410  {
411  bool changed = false;
412  std::shared_ptr<ossimJobCallback> callback;
413  {
414  std::lock_guard<std::mutex> lock(m_jobMutex);
415  changed = value!=m_id;
416  m_id = value;
417  callback = m_callback;
418  }
419  if(changed&&callback)
420  {
421  callback->idChanged(value, getSharedFromThis());
422  }
423  }
424 
425  /*
426  * @return id of the job
427  */
428  const ossimString& id()const
429  {
430  std::lock_guard<std::mutex> lock(m_jobMutex);
431  return m_id;
432  }
433 
434  /*
435  * @param value the description to set on the job
436  */
437  void setDescription(const ossimString& value)
438  {
439  bool changed = false;
440  std::shared_ptr<ossimJobCallback> callback;
441  {
442  std::lock_guard<std::mutex> lock(m_jobMutex);
443  changed = value!=m_description;
444  m_description = value;
445  callback = m_callback;
446  }
447  if(changed&&callback)
448  {
449  callback->descriptionChanged(value, getSharedFromThis());
450  }
451  }
452 
456  const ossimString& description()const
457  {
458  std::lock_guard<std::mutex> lock(m_jobMutex);
459  return m_description;
460  }
461 
465  std::shared_ptr<ossimJobCallback> callback() {return m_callback;}
466 
467 protected:
468  mutable std::mutex m_jobMutex;
473  double m_priority;
474  std::shared_ptr<ossimJobCallback> m_callback;
475 
480  virtual void run()=0;
481 };
482 
483 #endif
double m_priority
Definition: ossimJob.h:473
const ossimString & id() const
Definition: ossimJob.h:428
virtual void resetState(int value)
Will clear out the state and the call setState.
Definition: ossimJob.h:253
virtual void descriptionChanged(const ossimString &description, std::shared_ptr< ossimJob > job)
Definition: ossimJob.h:81
ossimString m_description
Definition: ossimJob.h:470
bool isFinished() const
Definition: ossimJob.h:350
void setCallback(std::shared_ptr< ossimJobCallback > c)
Definition: ossimJob.h:90
State state() const
Definition: ossimJob.h:242
virtual void cancel()
Sets the state if the object as cancelled.
Definition: ossimJob.h:291
double priority() const
Definition: ossimJob.h:228
State
This is a Bit vector.
Definition: ossimJob.h:158
virtual void ready()
Sets the state if the object as ready.
Definition: ossimJob.h:300
std::mutex m_jobMutex
Definition: ossimJob.h:468
virtual void nameChanged(const ossimString &name, std::shared_ptr< ossimJob > job)
Definition: ossimJob.h:78
bool isStopped() const
Definition: ossimJob.h:341
std::shared_ptr< ossimJobCallback > m_callback
Definition: ossimJob.h:474
void setDescription(const ossimString &value)
Definition: ossimJob.h:437
virtual void idChanged(const ossimString &id, std::shared_ptr< ossimJob > job)
Definition: ossimJob.h:84
void setCallback(std::shared_ptr< ossimJobCallback > callback)
Definition: ossimJob.h:368
virtual void release()
If derived interfaces implement a block this will allow one to release.
Definition: ossimJob.h:237
std::shared_ptr< ossimJobCallback > m_nextCallback
Definition: ossimJob.h:94
State m_state
Definition: ossimJob.h:472
ossimJob()
Definition: ossimJob.h:168
const ossimString & description() const
Definition: ossimJob.h:456
void setPriority(double value)
sets the priority of the job
Definition: ossimJob.h:219
virtual void finished()
Sets the state if the object as finished.
Definition: ossimJob.h:316
std::shared_ptr< ossimJobCallback > callback()
Definition: ossimJob.h:91
ossimString m_name
Definition: ossimJob.h:469
std::list< std::shared_ptr< ossimJob > > List
Definition: ossimJob.h:152
virtual void percentCompleteChanged(double percentValue, std::shared_ptr< ossimJob > job)
Definition: ossimJob.h:87
void setName(const ossimString &value)
Sets the name of a job.
Definition: ossimJob.h:379
virtual void started(std::shared_ptr< ossimJob > job)
Definition: ossimJob.h:74
bool isRunning() const
Definition: ossimJob.h:359
#define OSSIM_DLL
This is the job callback interface It allows one to attach and listen for different states of the job...
Definition: ossimJob.h:149
bool isReady() const
Definition: ossimJob.h:332
ossimString m_id
Definition: ossimJob.h:471
bool isCanceled() const
Definition: ossimJob.h:282
std::shared_ptr< const ossimJob > getSharedFromThis() const
This is a convenience method to get the shared representation of this pointer.
Definition: ossimJob.h:195
void setId(const ossimString &value)
Definition: ossimJob.h:409
virtual void ready(std::shared_ptr< ossimJob > job)
Definition: ossimJob.h:73
virtual void running()
Sets the state if the object as running.
Definition: ossimJob.h:308
std::shared_ptr< ossimJobCallback > callback()
Definition: ossimJob.h:465
virtual void canceled(std::shared_ptr< ossimJob > job)
Definition: ossimJob.h:76
std::shared_ptr< ossimJob > getSharedFromThis()
This is a convenience method to get the shared representation of this pointer.
Definition: ossimJob.h:185
const ossimString & name() const
Definition: ossimJob.h:398
virtual void finished(std::shared_ptr< ossimJob > job)
Definition: ossimJob.h:75
void setPercentComplete(double value)
When the pernet complete is set for the job it will call any callbacks and nofity percentCompleteChan...
Definition: ossimJob.h:205
This is the job callback interface It allows one to attach and listen for different states of the job...
Definition: ossimJob.h:68
ossimJobCallback(std::shared_ptr< ossimJobCallback > nextCallback=0)
Definition: ossimJob.h:71