bool Job::rollbackCopyBlocks(Report& report, CopyTarget& origTarget, CopySource& origSource) { if (!origSource.overlaps(origTarget)) { report.line() << i18nc("@info/plain", "Source and target for copying do not overlap: Rollback is not required."); return true; } try { CopySourceDevice& csd = dynamic_cast<CopySourceDevice&>(origSource); CopyTargetDevice& ctd = dynamic_cast<CopyTargetDevice&>(origTarget); // default: use values as if we were copying from front to back. qint64 undoSourceFirstSector = origTarget.firstSector(); qint64 undoSourceLastSector = origTarget.firstSector() + origTarget.sectorsWritten() - 1; qint64 undoTargetFirstSector = origSource.firstSector(); qint64 undoTargetLastSector = origSource.firstSector() + origTarget.sectorsWritten() - 1; if (origTarget.firstSector() > origSource.firstSector()) { // we were copying from back to front undoSourceFirstSector = origTarget.firstSector() + origSource.length() - origTarget.sectorsWritten(); undoSourceLastSector = origTarget.firstSector() + origSource.length() - 1; undoTargetFirstSector = origSource.lastSector() - origTarget.sectorsWritten() + 1; undoTargetLastSector = origSource.lastSector(); } report.line() << i18nc("@info/plain", "Rollback from: First sector: %1, last sector: %2.", undoSourceFirstSector, undoSourceLastSector); report.line() << i18nc("@info/plain", "Rollback to: First sector: %1, last sector: %2.", undoTargetFirstSector, undoTargetLastSector); CopySourceDevice undoSource(ctd.device(), undoSourceFirstSector, undoSourceLastSector); if (!undoSource.open()) { report.line() << i18nc("@info/plain", "Could not open device <filename>%1</filename> to rollback copying.", ctd.device().deviceNode()); return false; } CopyTargetDevice undoTarget(csd.device(), undoTargetFirstSector, undoTargetLastSector); if (!undoTarget.open()) { report.line() << i18nc("@info/plain", "Could not open device <filename>%1</filename> to rollback copying.", csd.device().deviceNode()); return false; } return copyBlocks(report, undoTarget, undoSource); } catch ( ... ) { report.line() << i18nc("@info/plain", "Rollback failed: Source or target are not devices."); } return false; }
bool MoveFileSystemJob::rollbackCopyBlocks( Report& report, CopyTargetDevice& origTarget, CopySourceDevice& origSource ) { if ( !origSource.overlaps( origTarget ) ) { report.line() << tr( "Source and target for copying do not overlap: Rollback is not required." ); return true; } // default: use values as if we were copying from front to back. qint64 undoSourceFirstSector = origTarget.firstSector(); qint64 undoSourceLastSector = origTarget.firstSector() + origTarget.sectorsWritten() - 1; qint64 undoTargetFirstSector = origSource.firstSector(); qint64 undoTargetLastSector = origSource.firstSector() + origTarget.sectorsWritten() - 1; if ( origTarget.firstSector() > origSource.firstSector() ) { // we were copying from back to front undoSourceFirstSector = origTarget.firstSector() + origSource.length() - origTarget.sectorsWritten(); undoSourceLastSector = origTarget.firstSector() + origSource.length() - 1; undoTargetFirstSector = origSource.lastSector() - origTarget.sectorsWritten() + 1; undoTargetLastSector = origSource.lastSector(); } CopySourceDevice undoSource( origTarget.device(), undoSourceFirstSector, undoSourceLastSector ); if ( !undoSource.open() ) { report.line() << tr( "Could not open device %1 to rollback copying." ) .arg( origTarget.device().deviceNode() ); return false; } CopyTargetDevice undoTarget( origSource.device(), undoTargetFirstSector, undoTargetLastSector ); if ( !undoTarget.open() ) { report.line() << tr( "Could not open device %1 to rollback copying." ) .arg( origSource.device().deviceNode() ); return false; } return copyBlocks( report, undoTarget, undoSource ); }