From 793be3195e387179510b8f6fa61d9b4b79511d0d Mon Sep 17 00:00:00 2001 From: Arno Date: Fri, 4 Mar 2016 15:20:14 +0100 Subject: 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! --- copyworker.cpp | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 copyworker.cpp (limited to 'copyworker.cpp') 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 +#include +#include + +#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); + } +} -- cgit v1.2.3-70-g09d2