File indexing completed on 2024-05-05 10:16:02
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__ */