File indexing completed on 2024-04-21 04:57:27
0001 /* 0002 * SPDX-FileCopyrightText: 2022 Kai Uwe Broulik <kde@broulik.de> 0003 * SPDX-License-Identifier: GPL-2.0-or-later 0004 */ 0005 0006 #pragma once 0007 0008 #include <KIO/Global> 0009 #include <KIO/WorkerBase> 0010 0011 #include <QMap> 0012 #include <QMutex> 0013 #include <QScopedPointer> 0014 #include <QString> 0015 0016 #include <libimobiledevice/libimobiledevice.h> 0017 0018 #include <memory> 0019 0020 #include "afcclient.h" 0021 0022 using namespace KIO; 0023 0024 class AfcDevice; 0025 class AfcFile; 0026 class AfcUrl; 0027 0028 using Result = KIO::WorkerResult; 0029 0030 class AfcWorker : public KIO::WorkerBase 0031 { 0032 public: 0033 explicit AfcWorker(const QByteArray &poolSocket, const QByteArray &appSocket); 0034 ~AfcWorker() override; 0035 0036 void onDeviceEvent(const idevice_event_t *event); 0037 0038 Q_REQUIRED_RESULT Result init(); 0039 0040 Q_REQUIRED_RESULT Result listDir(const QUrl &url) override; 0041 0042 Q_REQUIRED_RESULT Result stat(const QUrl &url) override; 0043 0044 Q_REQUIRED_RESULT Result get(const QUrl &url) override; 0045 Q_REQUIRED_RESULT Result put(const QUrl &url, int permissions, KIO::JobFlags flags) override; 0046 0047 Q_REQUIRED_RESULT Result open(const QUrl &url, QIODevice::OpenMode mode) override; 0048 Q_REQUIRED_RESULT Result read(KIO::filesize_t bytesRequested) override; 0049 Q_REQUIRED_RESULT Result seek(KIO::filesize_t offset) override; 0050 Q_REQUIRED_RESULT Result truncate(KIO::filesize_t length) override; 0051 Q_REQUIRED_RESULT Result write(const QByteArray &data) override; 0052 Q_REQUIRED_RESULT Result close() override; 0053 0054 Q_REQUIRED_RESULT Result copy(const QUrl &src, const QUrl &dest, int permissions, JobFlags flags) override; 0055 Q_REQUIRED_RESULT Result del(const QUrl &url, bool isFile) override; 0056 Q_REQUIRED_RESULT Result rename(const QUrl &url, const QUrl &dest, KIO::JobFlags flags) override; 0057 Q_REQUIRED_RESULT Result symlink(const QString &target, const QUrl &dest, KIO::JobFlags flags) override; 0058 Q_REQUIRED_RESULT Result mkdir(const QUrl &url, int permissions) override; 0059 Q_REQUIRED_RESULT Result setModificationTime(const QUrl &url, const QDateTime &mtime) override; 0060 0061 Q_REQUIRED_RESULT Result fileSystemFreeSpace(const QUrl &url) override; 0062 0063 private: 0064 void updateDeviceList(); 0065 bool addDevice(const QString &id); 0066 void removeDevice(const QString &id); 0067 0068 Q_REQUIRED_RESULT Result clientForUrl(const AfcUrl &afcUrl, AfcClient::Ptr &client) const; 0069 QString deviceIdForFriendlyUrl(const AfcUrl &afcUrl) const; 0070 0071 QUrl resolveSolidUrl(const QUrl &url) const; 0072 bool redirectIfSolidUrl(const QUrl &url); 0073 0074 UDSEntry overviewEntry(const QString &fileName = QString()) const; 0075 UDSEntry deviceEntry(const AfcDevice *device, const QString &fileName = QString(), bool asLink = false) const; 0076 UDSEntry appsOverviewEntry(const AfcDevice *device, const QString &fileName = QString()) const; 0077 0078 void guessMimeType(AfcFile &file, const QString &path); 0079 0080 QMutex m_mutex; 0081 0082 QMap<QString /*udid*/, AfcDevice *> m_devices; 0083 QMap<QString /*pretty name*/, QString /*udid*/> m_friendlyNames; 0084 0085 std::unique_ptr<AfcFile> m_openFile; 0086 };