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__