/* 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); } }