summaryrefslogtreecommitdiffstats
path: root/filecopier.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'filecopier.cpp')
-rw-r--r--filecopier.cpp61
1 files changed, 14 insertions, 47 deletions
diff --git a/filecopier.cpp b/filecopier.cpp
index 1588d6e..6256be1 100644
--- a/filecopier.cpp
+++ b/filecopier.cpp
@@ -1,6 +1,5 @@
#include <QMutexLocker>
#include <QFile>
-#include <QElapsedTimer>
#include "filecopier.h"
@@ -15,11 +14,8 @@ void FileCopier::addJob(const QString &source, const QString &dest){
}
void FileCopier::run(){
- int bufsize = 32 * 1024 * 1024;
- char *buf = new char[bufsize];
mCancel = false;
mCopied = 0;
- QElapsedTimer et;
while(!mJobs.isEmpty()){
mAddJobMutex.lock();
auto first = mJobs.constBegin();
@@ -27,58 +23,29 @@ void FileCopier::run(){
auto dest = first.value();
mJobs.remove(source);
mAddJobMutex.unlock();
+ QString msg = QString(tr("Copy: %1 (%2/%3)")).arg(source).arg(QString::number(mCopied + 1)).arg(QString::number(mTotal));
+ emit message(msg);
QFile sFile(source);
- QFile dFile(dest);
- bool openSource = sFile.open(QIODevice::ReadOnly);
- bool openDest = dFile.open(QIODevice::WriteOnly);
- if(!openSource || !openDest){
- emit success(false, source);
- goto cleanup;
+ if(sFile.copy(dest)){
+ ++mCopied;
+ QString msg = QString(tr("Copied file %1/%2").arg(QString::number(mCopied)).arg(QString::number(mTotal)));
+ emit message(msg);
+ }else{
+ QString msg = QString(tr("Failed to copy %1: %2").arg(source).arg(sFile.errorString()));
+ emit message(msg);
}
- emit newFile(source, dest, sFile.size());
- int read = 0;
- qint64 total = 0;
- qint64 elapsed = 0;
- qint64 bytesSinceEl = 0;
- et.start();
- while(!sFile.atEnd()){
- read = sFile.read(buf, bufsize);
- dFile.write(buf, read);
- total += read;
- bytesSinceEl += read;
- elapsed = et.elapsed();
- if(elapsed > 1000){
- mCancelMutex.lock();
- bool cancel = mCancel;
- mCancelMutex.unlock();
- if(cancel){
- dFile.close();
- QFile::remove(dest);
- emit success(false, source);
- goto cleanup;
- }
- mCountMutex.lock();
- emit bytesReadIntval(bytesSinceEl, elapsed, mTotal, mCopied);
- mCountMutex.unlock();
- elapsed = 0;
- bytesSinceEl = 0;
- et.restart();
- }
- emit bytesRead(total);
+ QMutexLocker l(&mCancelMutex);
+ if(mCancel){
+ break;
}
- emit success(true, source);
- ++mCopied;
- emit bytesReadIntval(bytesSinceEl, elapsed, mTotal, mCopied);
- et.restart();
}
-
- cleanup:
- delete buf;
+ mCancel = false;
mTotal = 0;
mJobs.clear();
}
void FileCopier::cancel(){
QMutexLocker l(&mCancelMutex);
+ emit message(tr("Canceling copy jobs. Please wait..."));
mCancel = true;
}