1 #ifndef FM2_COPYJOB_H
2 #define FM2_COPYJOB_H
3 
4 #include "../libfmqtglobals.h"
5 #include "fileoperationjob.h"
6 #include "gioptrs.h"
7 
8 namespace Fm {
9 
10 class LIBFM_QT_API FileTransferJob : public Fm::FileOperationJob {
11     Q_OBJECT
12 public:
13 
14     enum class Mode {
15         COPY,
16         MOVE,
17         LINK
18     };
19 
20     explicit FileTransferJob(FilePathList srcPaths, Mode mode = Mode::COPY);
21     explicit FileTransferJob(FilePathList srcPaths, FilePathList destPaths, Mode mode = Mode::COPY);
22     explicit FileTransferJob(FilePathList srcPaths, const FilePath &destDirPath, Mode mode = Mode::COPY);
23 
24     void setSrcPaths(FilePathList srcPaths);
25     void setDestPaths(FilePathList destPaths);
26     void setDestDirPath(const FilePath &destDirPath);
27 
28 protected:
29     void exec() override;
30 
31 private:
32     bool processPath(const FilePath& srcPath, const FilePath& destPath, const char *destFileName);
33     bool moveFile(const FilePath &srcPath, const GFileInfoPtr &srcInfo, const FilePath &destDirPath, const char *destFileName);
34     bool copyFile(const FilePath &srcPath, const GFileInfoPtr &srcInfo, const FilePath &destDirPath, const char *destFileName, bool skip = false);
35     bool linkFile(const FilePath &srcPath, const GFileInfoPtr &srcInfo, const FilePath &destDirPath, const char *destFileName);
36 
37     bool moveFileSameFs(const FilePath &srcPath, const GFileInfoPtr& srcInfo, FilePath &destPath);
38     bool copyRegularFile(const FilePath &srcPath, const GFileInfoPtr& srcInfo, FilePath &destPath);
39     bool copySpecialFile(const FilePath &srcPath, const GFileInfoPtr& srcInfo, FilePath& destPath);
40     bool copyDirContent(const FilePath &srcPath, GFileInfoPtr srcInfo, FilePath &destPath, bool skip = false);
41     bool makeDir(const FilePath &srcPath, GFileInfoPtr srcInfo, FilePath &destPath);
42     bool createSymlink(const FilePath &srcPath, const GFileInfoPtr& srcInfo, FilePath& destPath);
43     bool createShortcut(const FilePath &srcPath, const GFileInfoPtr& srcInfo, FilePath& destPath);
44 
45     bool handleError(GErrorPtr& err, const FilePath &srcPath, const GFileInfoPtr &srcInfo, FilePath &destPath, int& flags);
46 
47     static void gfileCopyProgressCallback(goffset current_num_bytes, goffset total_num_bytes, FileTransferJob* _this);
48 
49 private:
50     FilePathList srcPaths_;
51     FilePathList destPaths_;
52     Mode mode_;
53     bool hasDestDirPath_;
54 };
55 
56 
57 } // namespace Fm
58 
59 #endif // FM2_COPYJOB_H
60