diff options
Diffstat (limited to 'filecopier.cpp')
-rw-r--r-- | filecopier.cpp | 61 |
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; } |