File indexing completed on 2024-04-21 16:33:15

0001 /*
0002     SPDX-FileCopyrightText: 2006 Csaba Karai <krusader@users.sourceforge.net>
0003     SPDX-FileCopyrightText: 2006-2022 Krusader Krew <https://krusader.org>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #ifndef SYNCHRONIZERTASK_H
0009 #define SYNCHRONIZERTASK_H
0010 
0011 // QtCore
0012 #include <QObject>
0013 
0014 #include <KIO/Job>
0015 
0016 class Synchronizer;
0017 class SynchronizerDirList;
0018 class SynchronizerFileItem;
0019 class QTimer;
0020 class QFile;
0021 
0022 #define ST_STATE_NEW 0
0023 #define ST_STATE_PENDING 1
0024 #define ST_STATE_STATUS 2
0025 #define ST_STATE_READY 3
0026 #define ST_STATE_ERROR 4
0027 
0028 class SynchronizerTask : public QObject
0029 {
0030     Q_OBJECT
0031 
0032 public:
0033     SynchronizerTask()
0034         : m_state(ST_STATE_NEW)
0035         , m_statusMessage(QString())
0036     {
0037     }
0038     ~SynchronizerTask() override = default;
0039 
0040     inline int start(QWidget *parentWidget)
0041     {
0042         this->parentWidget = parentWidget;
0043         start();
0044         return state();
0045     }
0046 
0047     inline int state()
0048     {
0049         return m_state;
0050     }
0051 
0052     void setStatusMessage(const QString &statMsg)
0053     {
0054         if (m_state == ST_STATE_PENDING || m_state == ST_STATE_STATUS)
0055             m_state = ST_STATE_STATUS;
0056         m_statusMessage = statMsg;
0057     }
0058 
0059     QString status()
0060     {
0061         if (m_state == ST_STATE_STATUS) {
0062             m_state = ST_STATE_PENDING;
0063             return m_statusMessage;
0064         }
0065         return QString();
0066     }
0067 
0068 protected:
0069     virtual void start()
0070     {
0071     }
0072     int m_state;
0073     QString m_statusMessage;
0074     QWidget *parentWidget;
0075 };
0076 
0077 class CompareTask : public SynchronizerTask
0078 {
0079     Q_OBJECT
0080 
0081 public:
0082     CompareTask(SynchronizerFileItem *parentIn,
0083                 const QString &leftURL,
0084                 const QString &rightURL,
0085                 const QString &leftDir,
0086                 const QString &rightDir,
0087                 bool ignoreHidden);
0088     CompareTask(SynchronizerFileItem *parentIn, const QString &urlIn, const QString &dirIn, bool isLeftIn, bool ignoreHidden);
0089     ~CompareTask() override;
0090 
0091     inline bool isDuplicate()
0092     {
0093         return m_duplicate;
0094     }
0095     inline bool isLeft()
0096     {
0097         return !m_duplicate && m_isLeft;
0098     }
0099     inline const QString &leftURL()
0100     {
0101         return m_url;
0102     }
0103     inline const QString &rightURL()
0104     {
0105         return m_otherUrl;
0106     }
0107     inline const QString &leftDir()
0108     {
0109         return m_dir;
0110     }
0111     inline const QString &rightDir()
0112     {
0113         return m_otherDir;
0114     }
0115     inline const QString &url()
0116     {
0117         return m_url;
0118     }
0119     inline const QString &dir()
0120     {
0121         return m_dir;
0122     }
0123     inline SynchronizerFileItem *parent()
0124     {
0125         return m_parent;
0126     }
0127     inline SynchronizerDirList *leftDirList()
0128     {
0129         return m_dirList;
0130     }
0131     inline SynchronizerDirList *rightDirList()
0132     {
0133         return m_otherDirList;
0134     }
0135     inline SynchronizerDirList *dirList()
0136     {
0137         return m_dirList;
0138     }
0139 
0140 protected slots:
0141     void start() override;
0142     void slotFinished(bool result);
0143     void slotOtherFinished(bool result);
0144 
0145 private:
0146     SynchronizerFileItem *m_parent;
0147     QString m_url;
0148     QString m_dir;
0149     QString m_otherUrl;
0150     QString m_otherDir;
0151     bool m_isLeft;
0152     bool m_duplicate;
0153     SynchronizerDirList *m_dirList;
0154     SynchronizerDirList *m_otherDirList;
0155     bool m_loadFinished;
0156     bool m_otherLoadFinished;
0157     bool ignoreHidden;
0158 };
0159 
0160 class CompareContentTask : public SynchronizerTask
0161 {
0162     Q_OBJECT
0163 
0164 public:
0165     CompareContentTask(Synchronizer *, SynchronizerFileItem *, const QUrl &, const QUrl &, KIO::filesize_t);
0166     ~CompareContentTask() override;
0167 
0168 public slots:
0169     void slotDataReceived(KIO::Job *job, const QByteArray &data);
0170     void slotFinished(KJob *job);
0171     void sendStatusMessage();
0172 
0173 protected:
0174     void start() override;
0175 
0176 protected slots:
0177     void localFileCompareCycle();
0178 
0179 private:
0180     void abortContentComparing();
0181 
0182     QUrl leftURL; // the currently processed URL (left)
0183     QUrl rightURL; // the currently processed URL (right)
0184     KIO::filesize_t size; // the size of the compared files
0185 
0186     bool errorPrinted; // flag indicates error
0187     KIO::TransferJob *leftReadJob; // compare left read job
0188     KIO::TransferJob *rightReadJob; // compare right read job
0189     QByteArray compareArray; // the array for comparing
0190     int owner; // the owner of the compare array
0191     SynchronizerFileItem *item; // the item for content compare
0192     QTimer *timer; // timer to show the process dialog at compare by content
0193 
0194     QFile *leftFile; // the left side local file
0195     QFile *rightFile; // the right side local file
0196 
0197     KIO::filesize_t received; // the received size
0198     Synchronizer *sync;
0199 };
0200 
0201 #endif /* __SYNCHRONIZER_TASK_H__ */