1 /***************************************************************************** 2 * Copyright (C) 2006 Csaba Karai <krusader@users.sourceforge.net> * 3 * Copyright (C) 2006-2019 Krusader Krew [https://krusader.org] * 4 * * 5 * This file is part of Krusader [https://krusader.org]. * 6 * * 7 * Krusader is free software: you can redistribute it and/or modify * 8 * it under the terms of the GNU General Public License as published by * 9 * the Free Software Foundation, either version 2 of the License, or * 10 * (at your option) any later version. * 11 * * 12 * Krusader is distributed in the hope that it will be useful, * 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 15 * GNU General Public License for more details. * 16 * * 17 * You should have received a copy of the GNU General Public License * 18 * along with Krusader. If not, see [http://www.gnu.org/licenses/]. * 19 *****************************************************************************/ 20 21 #ifndef SYNCHRONIZERTASK_H 22 #define SYNCHRONIZERTASK_H 23 24 // QtCore 25 #include <QObject> 26 27 #include <KIO/Job> 28 29 class Synchronizer; 30 class SynchronizerDirList; 31 class SynchronizerFileItem; 32 class QTimer; 33 class QFile; 34 35 #define ST_STATE_NEW 0 36 #define ST_STATE_PENDING 1 37 #define ST_STATE_STATUS 2 38 #define ST_STATE_READY 3 39 #define ST_STATE_ERROR 4 40 41 class SynchronizerTask : public QObject 42 { 43 Q_OBJECT 44 45 public: SynchronizerTask()46 SynchronizerTask() : QObject(), m_state(ST_STATE_NEW), m_statusMessage(QString()) {} ~SynchronizerTask()47 virtual ~SynchronizerTask() {} 48 start(QWidget * parentWidget)49 inline int start(QWidget *parentWidget) { 50 this->parentWidget = parentWidget; start(); return state(); 51 } 52 state()53 inline int state() { 54 return m_state; 55 } 56 setStatusMessage(const QString & statMsg)57 void setStatusMessage(const QString & statMsg) { 58 if (m_state == ST_STATE_PENDING || m_state == ST_STATE_STATUS) 59 m_state = ST_STATE_STATUS; 60 m_statusMessage = statMsg; 61 } 62 status()63 QString status() { 64 if (m_state == ST_STATE_STATUS) { 65 m_state = ST_STATE_PENDING; 66 return m_statusMessage; 67 } 68 return QString(); 69 } 70 71 protected: start()72 virtual void start() {} 73 int m_state; 74 QString m_statusMessage; 75 QWidget *parentWidget; 76 }; 77 78 79 class CompareTask : public SynchronizerTask 80 { 81 Q_OBJECT 82 83 public: 84 CompareTask(SynchronizerFileItem *parentIn, const QString &leftURL, 85 const QString &rightURL, const QString &leftDir, 86 const QString &rightDir, bool ignoreHidden); 87 CompareTask(SynchronizerFileItem *parentIn, const QString &urlIn, 88 const QString &dirIn, bool isLeftIn, bool ignoreHidden); 89 virtual ~CompareTask(); 90 isDuplicate()91 inline bool isDuplicate() { 92 return m_duplicate; 93 } isLeft()94 inline bool isLeft() { 95 return !m_duplicate && m_isLeft; 96 } leftURL()97 inline const QString & leftURL() { 98 return m_url; 99 } rightURL()100 inline const QString & rightURL() { 101 return m_otherUrl; 102 } leftDir()103 inline const QString & leftDir() { 104 return m_dir; 105 } rightDir()106 inline const QString & rightDir() { 107 return m_otherDir; 108 } url()109 inline const QString & url() { 110 return m_url; 111 } dir()112 inline const QString & dir() { 113 return m_dir; 114 } parent()115 inline SynchronizerFileItem * parent() { 116 return m_parent; 117 } leftDirList()118 inline SynchronizerDirList * leftDirList() { 119 return m_dirList; 120 } rightDirList()121 inline SynchronizerDirList * rightDirList() { 122 return m_otherDirList; 123 } dirList()124 inline SynchronizerDirList * dirList() { 125 return m_dirList; 126 } 127 128 protected slots: 129 virtual void start() Q_DECL_OVERRIDE; 130 void slotFinished(bool result); 131 void slotOtherFinished(bool result); 132 133 private: 134 SynchronizerFileItem * m_parent; 135 QString m_url; 136 QString m_dir; 137 QString m_otherUrl; 138 QString m_otherDir; 139 bool m_isLeft; 140 bool m_duplicate; 141 SynchronizerDirList * m_dirList; 142 SynchronizerDirList * m_otherDirList; 143 bool m_loadFinished; 144 bool m_otherLoadFinished; 145 bool ignoreHidden; 146 }; 147 148 149 class CompareContentTask : public SynchronizerTask 150 { 151 Q_OBJECT 152 153 public: 154 CompareContentTask(Synchronizer *, SynchronizerFileItem *, const QUrl &, const QUrl &, KIO::filesize_t); 155 virtual ~CompareContentTask(); 156 157 public slots: 158 void slotDataReceived(KIO::Job *job, const QByteArray &data); 159 void slotFinished(KJob *job); 160 void sendStatusMessage(); 161 162 protected: 163 virtual void start() Q_DECL_OVERRIDE; 164 165 protected slots: 166 void localFileCompareCycle(); 167 168 private: 169 void abortContentComparing(); 170 171 QUrl leftURL; // the currently processed URL (left) 172 QUrl rightURL; // the currently processed URL (right) 173 KIO::filesize_t size; // the size of the compared files 174 175 bool errorPrinted; // flag indicates error 176 KIO::TransferJob *leftReadJob; // compare left read job 177 KIO::TransferJob *rightReadJob; // compare right read job 178 QByteArray compareArray; // the array for comparing 179 int owner; // the owner of the compare array 180 SynchronizerFileItem *item; // the item for content compare 181 QTimer *timer; // timer to show the process dialog at compare by content 182 183 QFile *leftFile; // the left side local file 184 QFile *rightFile; // the right side local file 185 186 KIO::filesize_t received; // the received size 187 Synchronizer *sync; 188 }; 189 190 #endif /* __SYNCHRONIZER_TASK_H__ */ 191