File indexing completed on 2024-12-08 04:30:57
0001 /* This file is part of the KDE project 0002 0003 Copyright (C) 2005 Dario Massarin <nekkar@libero.it> 0004 Copyright (C) 2009 Lukas Appelhans <l.appelhans@gmx.de> 0005 0006 This program is free software; you can redistribute it and/or 0007 modify it under the terms of the GNU General Public 0008 License as published by the Free Software Foundation; either 0009 version 2 of the License, or (at your option) any later version. 0010 */ 0011 0012 #ifndef JOB_H 0013 #define JOB_H 0014 0015 /** 0016 * @brief Job class 0017 * 0018 * We want to abstract this common interface in order to simplify the 0019 * Scheduler code. A Job can be either a Transfer or a search through the net. 0020 * It is basically something you execute in background and that the scheduler 0021 * can decide to start, stop or cancel. In this way we don't expose the complex 0022 * API of a Transfer (or a Search), to the scheduler. 0023 * By definition a job must always belong to a JobQueue (see jobqueue.h). 0024 **/ 0025 0026 #include "kget_export.h" 0027 #include <QObject> 0028 #include <QPixmap> 0029 0030 class QDomNode; 0031 0032 class Scheduler; 0033 class JobQueue; 0034 0035 class KGET_EXPORT Job : public QObject 0036 { 0037 Q_OBJECT 0038 public: 0039 /** 0040 * The status property describes the current job status 0041 */ 0042 enum Status { 0043 Running = 0, /// The job is being executed 0044 Stopped = 2, /// The job is stopped 0045 Aborted = 3, /// The job is stopped, but this also indicates that it 0046 /// stopped because an error occurred 0047 Finished = 4, /// The job exited from its Running state successfully 0048 FinishedKeepAlive = 5, /// The job exited from its Running state successfully 0049 /// but wants to be restarted by the scheduler 0050 Moving = 6 /// The associated files to that job (e.g. Download) are 0051 /// moved to a different location 0052 }; 0053 0054 /** 0055 * The policy property describes how the scheduler should manage this job. 0056 */ 0057 enum Policy { 0058 Start, /// The scheduler should start this job even if its queue 0059 /// isn't in a Running status 0060 Stop, /// The scheduler shouldn't never start this job, even if 0061 /// if its queue is in a Running status 0062 None /// The scheduler should start this job depending on its 0063 /// queue status 0064 }; 0065 /** 0066 * Describes different types of errors and how the scheduler should manage them. 0067 */ 0068 enum ErrorType { AutomaticRetry, ManualSolve, NotSolveable }; 0069 struct Error { 0070 int id; 0071 QString text; 0072 QString iconName; 0073 ErrorType type; 0074 }; 0075 Job(Scheduler *scheduler, JobQueue *parent); 0076 ~Job() override; 0077 0078 // Job commands 0079 virtual void start() = 0; 0080 virtual void stop() = 0; 0081 0082 JobQueue *jobQueue() 0083 { 0084 return m_jobQueue; 0085 } 0086 0087 // Job properties 0088 void setStatus(Status jobStatus); 0089 void setPolicy(Policy jobPolicy); 0090 void setError(const QString &text, const QString &iconName, ErrorType type = AutomaticRetry, int errorId = -1); 0091 0092 Status status() const 0093 { 0094 return m_status; 0095 } 0096 Status startStatus() const 0097 { 0098 return m_startStatus; 0099 } 0100 Policy policy() const 0101 { 0102 return m_policy; 0103 } 0104 Error error() const 0105 { 0106 return m_error; 0107 } 0108 0109 virtual int elapsedTime() const = 0; 0110 virtual int remainingTime() const = 0; 0111 virtual bool isStalled() const = 0; 0112 virtual bool isWorking() const = 0; 0113 0114 virtual void resolveError(int errorId); 0115 0116 protected: 0117 Scheduler *scheduler() const 0118 { 0119 return m_scheduler; 0120 } 0121 0122 void read(QDomNode *n); 0123 void write(QDomNode *n); 0124 0125 void setStartStatus(Status jobStatus); 0126 0127 /** 0128 * This one posts a job event to the scheduler 0129 */ 0130 void postJobEvent(Status); // do we need a JobEvent instead of JobStatus? 0131 0132 JobQueue *m_jobQueue; 0133 Scheduler *m_scheduler; 0134 0135 private: 0136 Status m_status; 0137 // our status when KGet is started 0138 Status m_startStatus; 0139 Policy m_policy; 0140 Error m_error; 0141 }; 0142 0143 #endif