diff --git a/src/jobs/backupfilesystemjob.cpp b/src/jobs/backupfilesystemjob.cpp
index b1995f3..1999983 100644
--- a/src/jobs/backupfilesystemjob.cpp
+++ b/src/jobs/backupfilesystemjob.cpp
@@ -63,11 +63,8 @@ bool BackupFileSystemJob::run(Report& parent)
report->line() << xi18nc("@info:progress", "Could not open file system on source partition %1 for backup.", sourcePartition().deviceNode());
else if (!copyTarget.open())
report->line() << xi18nc("@info:progress", "Could not create backup file %1.", fileName());
- else {
- ExternalCommand copyCmd(copySource, copyTarget, QProcess::SeparateChannels);
- connect(©Cmd, &ExternalCommand::progress, this, [=] (int percent) { emit progress(percent); }, Qt::QueuedConnection);
- rval = copyCmd.startCopyBlocks(-1);
- }
+ else
+ rval = copyBlocks(*report, copyTarget, copySource);
}
jobFinished(*report, rval);
diff --git a/src/jobs/job.cpp b/src/jobs/job.cpp
index 192deb1..69a4532 100644
--- a/src/jobs/job.cpp
+++ b/src/jobs/job.cpp
@@ -24,6 +24,7 @@
#include "core/copysourcedevice.h"
#include "core/copytargetdevice.h"
+#include "util/externalcommand.h"
#include "util/report.h"
#include
@@ -38,70 +39,10 @@ Job::Job() :
bool Job::copyBlocks(Report& report, CopyTarget& target, CopySource& source)
{
- bool rval = true;
- const qint64 blockSize = 10 * 1024 * 1024; // number of bytes per block to copy
- const qint64 blocksToCopy = source.length() / blockSize;
-
- qint64 readOffset = source.firstByte();
- qint64 writeOffset = target.firstByte();
- qint32 copyDirection = 1;
-
- if (target.firstByte() > source.firstByte()) {
- readOffset = source.firstByte() + source.length() - blockSize;
- writeOffset = target.firstByte() + source.length() - blockSize;
- copyDirection = -1;
- }
-
- report.line() << xi18nc("@info:progress", "Copying %1 blocks (%2 bytes) from %3 to %4, direction: %5.", blocksToCopy, source.length(), readOffset, writeOffset, copyDirection == 1 ? i18nc("direction: left", "left") : i18nc("direction: right", "right"));
-
- qint64 blocksCopied = 0;
-
- QByteArray buffer;
- int percent = 0;
- QTime t;
- t.start();
- while (blocksCopied < blocksToCopy) {
- if (!(rval = source.readData(buffer, readOffset + blockSize * blocksCopied * copyDirection, blockSize)))
- break;
-
- if (!(rval = target.writeData(buffer, writeOffset + blockSize * blocksCopied * copyDirection)))
- break;
-
- if (++blocksCopied * 100 / blocksToCopy != percent) {
- percent = blocksCopied * 100 / blocksToCopy;
-
- if (percent % 5 == 0 && t.elapsed() > 1000) {
- const qint64 mibsPerSec = (blocksCopied * blockSize / 1024 / 1024) / (t.elapsed() / 1000);
- const qint64 estSecsLeft = (100 - percent) * t.elapsed() / percent / 1000;
- report.line() << xi18nc("@info:progress", "Copying %1 MiB/second, estimated time left: %2", mibsPerSec, QTime(0, 0).addSecs(estSecsLeft).toString());
- }
- emit progress(percent);
- }
- }
- const qint64 lastBlock = source.length() % blockSize;
-
- // copy the remainder
- if (rval && lastBlock > 0) {
- Q_ASSERT(lastBlock < blockSize);
-
- const qint64 lastBlockReadOffset = copyDirection > 0 ? readOffset + blockSize * blocksCopied : source.firstByte();
- const qint64 lastBlockWriteOffset = copyDirection > 0 ? writeOffset + blockSize * blocksCopied : target.firstByte();
-
- report.line() << xi18nc("@info:progress", "Copying remainder of block size %1 from %2 to %3.", lastBlock, lastBlockReadOffset, lastBlockWriteOffset);
-
- rval = source.readData(buffer, lastBlockReadOffset, lastBlock);
-
- if (rval)
- rval = target.writeData(buffer, lastBlockWriteOffset);
-
- if (rval)
- emit progress(100);
- }
-
-
- report.line() << xi18ncp("@info:progress argument 2 is a string such as 7 bytes (localized accordingly)", "Copying 1 block (%2) finished.", "Copying %1 blocks (%2) finished.", blocksCopied, i18np("1 byte", "%1 bytes", target.bytesWritten()));
-
- return rval;
+// FIXME: report
+ ExternalCommand copyCmd(source, target, QProcess::SeparateChannels);
+ connect(©Cmd, &ExternalCommand::progress, this, &Job::progress, Qt::QueuedConnection);
+ return copyCmd.startCopyBlocks(-1);
}
bool Job::rollbackCopyBlocks(Report& report, CopyTarget& origTarget, CopySource& origSource)