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