diff options
author | Arno <arno@disconnect.de> | 2016-03-04 15:20:14 +0100 |
---|---|---|
committer | Arno <arno@disconnect.de> | 2016-03-04 15:20:14 +0100 |
commit | 793be3195e387179510b8f6fa61d9b4b79511d0d (patch) | |
tree | 7b253bad5410f17998c9e45050796d216cb8a28e /copyworker.cpp | |
parent | fa17037f24ec8ced526effb8226f8c27da04cfbb (diff) | |
download | SheMov-793be3195e387179510b8f6fa61d9b4b79511d0d.tar.gz SheMov-793be3195e387179510b8f6fa61d9b4b79511d0d.tar.bz2 SheMov-793be3195e387179510b8f6fa61d9b4b79511d0d.zip |
First version of CopyWorker
Preparation for archiving Movies to an USB disk:
Implement CopyWorker: a QThread for copying files in the background. It
compiles, nothing more, so expect bugs!
Diffstat (limited to 'copyworker.cpp')
-rw-r--r-- | copyworker.cpp | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/copyworker.cpp b/copyworker.cpp new file mode 100644 index 0000000..dbff451 --- /dev/null +++ b/copyworker.cpp @@ -0,0 +1,86 @@ +/* + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ + +#include <QFile> +#include <QFileInfo> +#include <QMutexLocker> + +#include "copyworker.h" + +CopyWorker::CopyWorker(QObject *parent) : QThread(parent), mMax(0) {} + +void CopyWorker::setDestination(const QString &destDir) { + QFileInfo destFi(destDir); + if(destFi.isDir()){ + mDest = destDir; + }else{ + QString e = QString(tr("%1 is not a directory!")).arg(destFi.absoluteFilePath()); + emit error(e); + } +} + +void CopyWorker::addSource(const QString &path){ + QMutexLocker l(&mSourceMx); + if(!mSources.contains(path)){ + QFileInfo fi(path); + if(fi.exists() && fi.isFile()){ + mSources.append(path); + qint64 size = fi.size(); + size = size / 1024 / 1024; + mMax += size; + } + } +} + +void CopyWorker::clear(){ + if(isRunning()){ + return; + } + QMutexLocker l(&mSourceMx); + mSources.clear(); + mMax = 0; +} + +void CopyWorker::run(){ + foreach(QString f, mSources){ + QFileInfo cur(f); + if(!cur.exists()){ + QString e = QString(tr("%1 has gone away from under us!")).arg(cur.fileName()); + emit error(e); + continue; + } + QString destFile = QString("%1/%2").arg(mDest).arg(cur.fileName()); + QFileInfo destFi(destFile); + if(destFi.exists()){ + QString e = QString(tr("%1 already exists!")).arg(destFi.absoluteFilePath()); + emit error(e); + continue; + } + QFile sourceQF(f); + QFile destQF(destFile); + bool openSource = sourceQF.open(QIODevice::ReadOnly); + bool openDest = destQF.open(QIODevice::WriteOnly); + if(!openSource || !openDest){ + QString e = QString(tr("Failed to open source or destination on %1!")).arg(cur.fileName()); + emit error(e); + continue; + } + char *buf = new char[32768]; + qint64 len = 0; + int total = 0; + while(!sourceQF.atEnd()){ + len = sourceQF.read(buf, 32768); + destQF.write(buf, len); + total +=len; + qint64 cur = total / 1024 / 1024; + emit bytesRead(cur); + } + delete buf; + QString s = QString(tr("Done copying %1")).arg(cur.fileName()); + emit success(s); + } +} |