summaryrefslogtreecommitdiffstats
path: root/copyworker.cpp
diff options
context:
space:
mode:
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);
+ }
+}