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 };