File indexing completed on 2024-04-21 16:32:41
0001 /* 0002 SPDX-FileCopyrightText: 2009 Csaba Karai <krusader@users.sourceforge.net> 0003 SPDX-FileCopyrightText: 2009-2022 Krusader Krew <https://krusader.org> 0004 0005 SPDX-License-Identifier: GPL-2.0-or-later 0006 */ 0007 0008 #ifndef ABSTRACTTHREADEDJOB_H 0009 #define ABSTRACTTHREADEDJOB_H 0010 0011 // QtCore 0012 #include <QEvent> 0013 #include <QEventLoop> 0014 #include <QList> 0015 #include <QMimeDatabase> 0016 #include <QMutex> 0017 #include <QStack> 0018 #include <QThread> 0019 #include <QTime> 0020 #include <QUrl> 0021 #include <QVariant> 0022 #include <QWaitCondition> 0023 0024 #include <KIO/Job> 0025 0026 class AbstractJobThread; 0027 class QTemporaryDir; 0028 class UserEvent; 0029 class KrArcObserver; 0030 class QTemporaryFile; 0031 0032 class AbstractThreadedJob : public KIO::Job 0033 { 0034 friend class AbstractJobThread; 0035 0036 Q_OBJECT 0037 0038 protected: 0039 AbstractThreadedJob(); 0040 0041 void addEventResponse(QList<QVariant> *obj); 0042 QList<QVariant> *getEventResponse(UserEvent *event); 0043 void sendEvent(UserEvent *event); 0044 0045 virtual ~AbstractThreadedJob(); 0046 virtual bool event(QEvent *) override; 0047 virtual void startAbstractJobThread(AbstractJobThread *); 0048 virtual bool doSuspend() override 0049 { 0050 return false; 0051 } 0052 0053 protected slots: 0054 void slotDownloadResult(KJob *); 0055 void slotProcessedAmount(KJob *, KJob::Unit, qulonglong); 0056 void slotTotalAmount(KJob *, KJob::Unit, qulonglong); 0057 void slotSpeed(KJob *, unsigned long); 0058 void slotDescription(KJob *job, const QString &title, const QPair<QString, QString> &field1, const QPair<QString, QString> &field2); 0059 0060 public: 0061 QMutex _locker; 0062 QWaitCondition _waiter; 0063 QStack<QList<QVariant> *> _stack; 0064 QString _title; 0065 qulonglong _maxProgressValue; 0066 qulonglong _currentProgress; 0067 QTime _time; 0068 bool _exiting; 0069 0070 private: 0071 AbstractJobThread *_jobThread; 0072 }; 0073 0074 class AbstractJobThread : public QThread 0075 { 0076 friend class AbstractThreadedJob; 0077 friend class AbstractJobObserver; 0078 Q_OBJECT 0079 0080 public: 0081 AbstractJobThread(); 0082 virtual ~AbstractJobThread(); 0083 0084 void abort(); 0085 KrArcObserver *observer(); 0086 0087 protected slots: 0088 virtual void slotStart() = 0; 0089 0090 protected: 0091 virtual void run() override; 0092 void setJob(AbstractThreadedJob *job) 0093 { 0094 _job = job; 0095 } 0096 0097 QList<QUrl> remoteUrls(const QUrl &baseUrl, const QStringList &files); 0098 QUrl downloadIfRemote(const QUrl &baseUrl, const QStringList &files); 0099 void countLocalFiles(const QUrl &baseUrl, const QStringList &names, unsigned long &totalFiles); 0100 0101 void sendError(int errorCode, const QString &message); 0102 void sendInfo(const QString &message, 0103 const QString &a1 = QString(), 0104 const QString &a2 = QString(), 0105 const QString &a3 = QString(), 0106 const QString &a4 = QString()); 0107 void sendReset(const QString &message, 0108 const QString &a1 = QString(""), 0109 const QString &a2 = QString(""), 0110 const QString &a3 = QString(""), 0111 const QString &a4 = QString("")); 0112 void sendSuccess(); 0113 void sendMessage(const QString &message); 0114 void sendMaxProgressValue(qulonglong value); 0115 void sendAddProgress(qulonglong value, const QString &progress = QString()); 0116 0117 void setProgressTitle(const QString &title) 0118 { 0119 _progressTitle = title; 0120 } 0121 0122 QString tempFileIfRemote(const QUrl &kurl, const QString &type); 0123 QString tempDirIfRemote(const QUrl &kurl); 0124 bool uploadTempFiles(); 0125 0126 bool isExited() 0127 { 0128 return _exited; 0129 } 0130 void terminate(); 0131 0132 QString getPassword(const QString &path); 0133 bool getArchiveInformation(QString &, QString &, QString &, QString &, const QUrl &); 0134 0135 AbstractThreadedJob *_job; 0136 QEventLoop *_loop; 0137 0138 QTemporaryDir *_downloadTempDir; 0139 KrArcObserver *_observer; 0140 0141 QTemporaryFile *_tempFile; 0142 QString _tempFileName; 0143 QUrl _tempFileTarget; 0144 QTemporaryDir *_tempDir; 0145 QString _tempDirName; 0146 QUrl _tempDirTarget; 0147 0148 bool _exited; 0149 0150 QString _progressTitle; 0151 }; 0152 0153 enum PossibleCommands { 0154 CMD_ERROR = 1, 0155 CMD_INFO = 2, 0156 CMD_RESET = 3, 0157 CMD_DOWNLOAD_FILES = 4, 0158 CMD_UPLOAD_FILES = 5, 0159 CMD_SUCCESS = 6, 0160 CMD_MAXPROGRESSVALUE = 7, 0161 CMD_ADD_PROGRESS = 8, 0162 CMD_GET_PASSWORD = 9, 0163 CMD_MESSAGE = 10 0164 }; 0165 0166 class UserEvent : public QEvent 0167 { 0168 public: 0169 UserEvent(int command, const QList<QVariant> &args) 0170 : QEvent(QEvent::User) 0171 , _command(command) 0172 , _args(args) 0173 { 0174 } 0175 0176 inline int command() 0177 { 0178 return _command; 0179 } 0180 inline const QList<QVariant> &args() 0181 { 0182 return _args; 0183 } 0184 0185 protected: 0186 int _command; 0187 QList<QVariant> _args; 0188 }; 0189 0190 #endif // __ABSTRACTTHREADED_JOB_H__