You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.5 KiB
97 lines
2.5 KiB
#ifndef FM2_FILEOPERATIONJOB_H
|
|
#define FM2_FILEOPERATIONJOB_H
|
|
|
|
#include "../libfmqtglobals.h"
|
|
#include "job.h"
|
|
#include <string>
|
|
#include <mutex>
|
|
#include <cstdint>
|
|
#include "fileinfo.h"
|
|
#include "filepath.h"
|
|
|
|
namespace Fm {
|
|
|
|
class LIBFM_QT_API FileOperationJob : public Fm::Job {
|
|
Q_OBJECT
|
|
public:
|
|
enum FileExistsAction {
|
|
CANCEL = 0,
|
|
OVERWRITE = 1<<0,
|
|
RENAME = 1<<1,
|
|
SKIP = 1<<2,
|
|
SKIP_ERROR = 1<<3
|
|
};
|
|
|
|
explicit FileOperationJob();
|
|
|
|
// get total amount of work to do
|
|
bool totalAmount(std::uint64_t& fileSize, std::uint64_t& fileCount) const;
|
|
|
|
// get currently finished job amount
|
|
bool finishedAmount(std::uint64_t& finishedSize, std::uint64_t& finishedCount) const;
|
|
|
|
// get the current file
|
|
FilePath currentFile() const;
|
|
|
|
// get progress of the current file
|
|
bool currentFileProgress(FilePath& path, std::uint64_t& totalSize, std::uint64_t& finishedSize) const;
|
|
|
|
// is the job calculate progress based on file size or file counts
|
|
bool calcProgressUsingSize() const {
|
|
return calcProgressUsingSize_;
|
|
}
|
|
|
|
// get currently finished amount (0.0 to 1.0)
|
|
virtual double progress() const;
|
|
|
|
Q_SIGNALS:
|
|
|
|
void preparedToRun();
|
|
|
|
// void currentFile(const char* file);
|
|
|
|
// void progress(uint32_t percent);
|
|
|
|
// to correctly handle the signal, connect with Qt::BlockingQueuedConnection so it's a sync call.
|
|
void fileExists(const FileInfo& src, const FileInfo& dest, FileExistsAction& response, FilePath& newDest);
|
|
|
|
protected:
|
|
|
|
FileExistsAction askRename(const FileInfo& src, const FileInfo& dest, FilePath& newDest);
|
|
|
|
void setTotalAmount(std::uint64_t fileSize, std::uint64_t fileCount);
|
|
|
|
void setFinishedAmount(std::uint64_t finishedSize, std::uint64_t finishedCount);
|
|
|
|
void addFinishedAmount(std::uint64_t finishedSize, std::uint64_t finishedCount);
|
|
|
|
void setCurrentFile(const FilePath &path);
|
|
|
|
void setCurrentFileProgress(uint64_t totalSize, uint64_t finishedSize);
|
|
|
|
void setCalcProgressUsingSize(bool value) {
|
|
calcProgressUsingSize_ = value;
|
|
}
|
|
|
|
std::mutex& mutex() {
|
|
return mutex_;
|
|
}
|
|
|
|
private:
|
|
bool hasTotalAmount_;
|
|
bool calcProgressUsingSize_;
|
|
std::uint64_t totalSize_;
|
|
std::uint64_t totalCount_;
|
|
std::uint64_t finishedSize_;
|
|
std::uint64_t finishedCount_;
|
|
|
|
FilePath currentFile_;
|
|
std::uint64_t currentFileSize_;
|
|
std::uint64_t currentFileFinished_;
|
|
mutable std::mutex mutex_;
|
|
};
|
|
|
|
} // namespace Fm
|
|
|
|
#endif // FM2_FILEOPERATIONJOB_H
|