summaryrefslogtreecommitdiffstats
path: root/copyworker.cpp
diff options
context:
space:
mode:
authorArno <arno@disconnect.de>2016-03-04 15:20:14 +0100
committerArno <arno@disconnect.de>2016-03-04 15:20:14 +0100
commit793be3195e387179510b8f6fa61d9b4b79511d0d (patch)
tree7b253bad5410f17998c9e45050796d216cb8a28e /copyworker.cpp
parentfa17037f24ec8ced526effb8226f8c27da04cfbb (diff)
downloadSheMov-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.cpp86
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);
+ }
+}