File indexing completed on 2025-03-16 05:24:30

0001 /*
0002     This file is part of the Kasten Framework, made within the KDE community.
0003 
0004     SPDX-FileCopyrightText: 2008-2009, 2014 Friedrich W. H. Kossebau <kossebau@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007 */
0008 
0009 #include "abstractfilesystemsyncfromremotejob_p.hpp"
0010 
0011 // library
0012 #include "abstractmodelfilesystemsynchronizer.hpp"
0013 // KF
0014 #include <KIO/FileCopyJob>
0015 #include <KJobWidgets>
0016 // Qt
0017 #include <QFileInfo>
0018 #include <QDateTime>
0019 #include <QUrl>
0020 #include <QTemporaryFile>
0021 
0022 namespace Kasten {
0023 
0024 void AbstractFileSystemSyncFromRemoteJobPrivate::syncFromRemote()
0025 {
0026     Q_Q(AbstractFileSystemSyncFromRemoteJob);
0027 
0028     const QUrl url = mSynchronizer->url();
0029 
0030     bool isWorkFileOk;
0031 
0032     if (url.isLocalFile()) {
0033         // file protocol. We do not need the network
0034         mWorkFilePath = url.toLocalFile();
0035         isWorkFileOk = true;
0036     } else {
0037         QTemporaryFile tmpFile;
0038         tmpFile.setAutoRemove(false);
0039         tmpFile.open();
0040 
0041         mWorkFilePath = tmpFile.fileName();
0042         mTempFilePath = mWorkFilePath;
0043 
0044         KIO::FileCopyJob* fileCopyJob =
0045             KIO::file_copy(url, QUrl::fromLocalFile(mWorkFilePath), -1, KIO::Overwrite);
0046         KJobWidgets::setWindow(fileCopyJob, /*mWidget*/ nullptr);
0047 
0048         isWorkFileOk = fileCopyJob->exec();
0049         if (!isWorkFileOk) {
0050             q->setErrorText(fileCopyJob->errorString());
0051         }
0052     }
0053 
0054     if (isWorkFileOk) {
0055         mFile = new QFile(mWorkFilePath);
0056         isWorkFileOk = mFile->open(QIODevice::ReadOnly);
0057         if (!isWorkFileOk) {
0058             q->setErrorText(mFile->errorString());
0059         }
0060     }
0061 
0062     if (isWorkFileOk) {
0063         q->startReadFromFile();
0064     } else {
0065         q->setError(KJob::KilledJobError);
0066         delete mFile;
0067         q->emitResult();
0068     }
0069 }
0070 
0071 void AbstractFileSystemSyncFromRemoteJobPrivate::completeRead(bool success)
0072 {
0073     Q_Q(AbstractFileSystemSyncFromRemoteJob);
0074 
0075     if (success) {
0076         const QUrl url = mSynchronizer->url();
0077         const bool isLocalFile = url.isLocalFile();
0078 
0079         QFileInfo fileInfo(mWorkFilePath);
0080         mSynchronizer->setFileDateTimeOnSync(fileInfo.lastModified());
0081         mSynchronizer->setRemoteState(isLocalFile ? RemoteInSync : RemoteUnknown);
0082     }
0083 
0084     delete mFile;
0085 
0086     if (!mTempFilePath.isEmpty()) {
0087         QFile::remove(mTempFilePath);
0088     }
0089 
0090     q->emitResult();
0091 }
0092 
0093 }