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 }