File indexing completed on 2024-05-19 05:00:40
0001 /* 0002 * SPDX-FileCopyrightText: 2013-2014 Daniel Vrátil <dvratil@redhat.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 * 0006 */ 0007 0008 #ifndef KIO_GDRIVE_H 0009 #define KIO_GDRIVE_H 0010 0011 #include "pathcache.h" 0012 0013 #include <KGAPI/Account> 0014 #include <KGAPI/Types> 0015 #include <KIO/WorkerBase> 0016 0017 #include <memory> 0018 0019 class AbstractAccountManager; 0020 0021 class QTemporaryFile; 0022 0023 namespace KGAPI2 0024 { 0025 class Job; 0026 } 0027 0028 class KIOGDrive : public KIO::WorkerBase 0029 { 0030 public: 0031 enum Action { 0032 Success, 0033 Fail, 0034 Restart, 0035 }; 0036 0037 explicit KIOGDrive(const QByteArray &protocol, const QByteArray &pool_socket, const QByteArray &app_socket); 0038 ~KIOGDrive() override; 0039 0040 virtual KIO::WorkerResult openConnection() Q_DECL_OVERRIDE; 0041 virtual KIO::WorkerResult listDir(const QUrl &url) Q_DECL_OVERRIDE; 0042 virtual KIO::WorkerResult mkdir(const QUrl &url, int permissions) Q_DECL_OVERRIDE; 0043 0044 virtual KIO::WorkerResult stat(const QUrl &url) Q_DECL_OVERRIDE; 0045 virtual KIO::WorkerResult get(const QUrl &url) Q_DECL_OVERRIDE; 0046 virtual KIO::WorkerResult put(const QUrl &url, int permissions, KIO::JobFlags flags) Q_DECL_OVERRIDE; 0047 0048 virtual KIO::WorkerResult copy(const QUrl &src, const QUrl &dest, int permissions, KIO::JobFlags flags) Q_DECL_OVERRIDE; 0049 virtual KIO::WorkerResult rename(const QUrl &src, const QUrl &dest, KIO::JobFlags flags) Q_DECL_OVERRIDE; 0050 virtual KIO::WorkerResult del(const QUrl &url, bool isfile) Q_DECL_OVERRIDE; 0051 0052 virtual KIO::WorkerResult mimetype(const QUrl &url) Q_DECL_OVERRIDE; 0053 KIO::WorkerResult fileSystemFreeSpace(const QUrl &url) Q_DECL_OVERRIDE; 0054 0055 private: 0056 Q_DISABLE_COPY(KIOGDrive) 0057 0058 enum PathFlags { 0059 None = 0, 0060 PathIsFolder = 1, 0061 PathIsFile = 2, 0062 }; 0063 0064 enum class FetchEntryFlags { 0065 None = 0, 0066 CurrentDir = 1, 0067 }; 0068 0069 static KIO::UDSEntry newAccountUDSEntry(); 0070 static KIO::UDSEntry sharedWithMeUDSEntry(); 0071 static KIO::UDSEntry accountToUDSEntry(const QString &accountName); 0072 static KIO::UDSEntry sharedDriveToUDSEntry(const KGAPI2::Drive::DrivesPtr &sharedDrive); 0073 0074 [[nodiscard]] KIO::WorkerResult listAccounts(); 0075 [[nodiscard]] KIO::WorkerResult createAccount(); 0076 0077 [[nodiscard]] KIO::WorkerResult listSharedDrivesRoot(const QUrl &url); 0078 [[nodiscard]] KIO::WorkerResult createSharedDrive(const QUrl &url); 0079 [[nodiscard]] KIO::WorkerResult deleteSharedDrive(const QUrl &url); 0080 [[nodiscard]] KIO::WorkerResult statSharedDrive(const QUrl &url); 0081 [[nodiscard]] KIO::UDSEntry fetchSharedDrivesRootEntry(const QString &accountId, FetchEntryFlags flags = FetchEntryFlags::None); 0082 0083 [[nodiscard]] std::pair<KIO::WorkerResult, QString> resolveFileIdFromPath(const QString &path, PathFlags flags = None); 0084 QString resolveSharedDriveId(const QString &idOrName, const QString &accountId); 0085 0086 struct Result { 0087 Action action; 0088 int error = KJob::NoError; 0089 QString errorString; 0090 0091 static Result fail(int error, QString errorString) 0092 { 0093 return {Fail, error, errorString}; 0094 } 0095 0096 static Result success() 0097 { 0098 return {Success, KJob::NoError, QString()}; 0099 } 0100 0101 static Result restart() 0102 { 0103 return {Restart, KJob::NoError, QString()}; 0104 } 0105 }; 0106 0107 [[nodiscard]] Result handleError(const KGAPI2::Job &job, const QUrl &url); 0108 KIO::UDSEntry fileToUDSEntry(const KGAPI2::Drive::FilePtr &file, const QString &path) const; 0109 QUrl fileToUrl(const KGAPI2::Drive::FilePtr &file, const QString &path) const; 0110 0111 KGAPI2::AccountPtr getAccount(const QString &accountName); 0112 0113 [[nodiscard]] std::pair<KIO::WorkerResult, QString> rootFolderId(const QString &accountId); 0114 0115 [[nodiscard]] KIO::WorkerResult putUpdate(const QUrl &url); 0116 [[nodiscard]] KIO::WorkerResult putCreate(const QUrl &url); 0117 [[nodiscard]] KIO::WorkerResult readPutData(QTemporaryFile &tmpFile, KGAPI2::Drive::FilePtr &file); 0118 0119 /** 0120 * Executes a KGAPI2::Job in an event loop, retrying the job until success or failure. 0121 * If the Job fails a WorkerResult with an appropriate error message will be returned. 0122 * 0123 * @return Whether @p job succeeded. 0124 */ 0125 [[nodiscard]] KIO::WorkerResult runJob(KGAPI2::Job &job, const QUrl &url, const QString &accountId); 0126 0127 std::unique_ptr<AbstractAccountManager> m_accountManager; 0128 PathCache m_cache; 0129 0130 QMap<QString /* account */, QString /* rootId */> m_rootIds; 0131 }; 0132 0133 #endif // KIO_GDRIVE_H