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