Git commit 42562a41af3849bbc029cfa87efc39e356157a05 by Elvis Angelaccio. Committed on 13/09/2022 at 22:23. Pushed by elvisangelaccio into branch 'master'.
Port to WorkerBase WorkerBase requires KIO 5.96. It seems that this version of KF5 brings in the QT_NO_CAST_FROM_ASCII macro, so this commit also fixes a bunch of compilation errors with QStrings. M +2 -2 CMakeLists.txt M +4 -4 README.md M +1 -1 autotests/s3urltest.cpp M +1 -0 doc/CMakeLists.txt M +1 -1 doc/index.docbook M +28 -28 src/kio_s3.cpp M +16 -16 src/kio_s3.h M +8 -7 src/s3backend.cpp M +3 -3 src/s3backend.h https://invent.kde.org/network/kio-s3/commit/42562a41af3849bbc029cfa87efc39e356157a05 diff --git a/CMakeLists.txt b/CMakeLists.txt index d9baaec..0f7804e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ set(KIO_S3_VERSION 0.9.70) project(kio-s3 VERSION ${KIO_S3_VERSION}) set(QT_MIN_VERSION 5.15.0) -set(KF5_MIN_VERSION 5.71.0) +set(KF5_MIN_VERSION 5.96.0) find_package(ECM ${KF5_MIN_VERSION} REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) @@ -35,7 +35,7 @@ find_package(AWSSDK REQUIRED COMPONENTS set_package_properties(AWSSDK PROPERTIES DESCRIPTION "the AWS SDK for C++" URL "https://github.com/aws/aws-sdk-cpp" TYPE REQUIRED - PURPOSE "Needed to build the S3 kioslave") + PURPOSE "Needed to build the S3 KIO worker") find_package(Qt5Test QUIET) set_package_properties(Qt5Test PROPERTIES diff --git a/README.md b/README.md index 951e7f8..f9afff8 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ KIO S3 ====== -A kio slave for Amazon Simple Storage Service (Amazon S3): https://aws.amazon.com/s3/ +A KIO worker for Amazon Simple Storage Service (Amazon S3): https://aws.amazon.com/s3/ S3 is an object store. It has buckets and objects. Buckets contain objects, and objects are made of data (usually a file) and metadata (information about the data). @@ -14,8 +14,8 @@ Buckets contain objects, and objects are made of data (usually a file) and metad BUILDING ======== -The Amazon AWS SDK for C++ is required to build this slave: https://github.com/aws/aws-sdk-cpp -The slave requires the `core` and `s3` SDK components. +The Amazon AWS SDK for C++ is required to build this project: https://github.com/aws/aws-sdk-cpp +In particular the `core` and `s3` SDK components are required. USAGE ===== @@ -23,7 +23,7 @@ USAGE 1. Configure AWS credentials and region: https://docs.aws.amazon.com/credref/latest/refdocs/overview.html 2. Run `dolphin s3://`. -The slave supports S3 URIs with the following format: +The worker supports S3 URIs with the following format: s3://mybucket/mykey diff --git a/autotests/s3urltest.cpp b/autotests/s3urltest.cpp index 6fd3efe..d12eb98 100644 --- a/autotests/s3urltest.cpp +++ b/autotests/s3urltest.cpp @@ -28,7 +28,7 @@ void S3UrlTest::testS3Url_data() QTest::addColumn<QString>("expectedPrefix"); QTest::newRow("root url") - << QUrl("s3:") + << QUrl(QStringLiteral("s3:")) << false << false << QString() diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index 2850108..6750182 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -1,6 +1,7 @@ # SPDX-License-Identifier: BSD-3-Clause # SPDX-FileCopyrightText: 2020 Elvis Angelaccio <elvis.angelac...@kde.org> +# TODO: what's the KF6 equivalent for kioslave5? kdoctools_create_handbook(index.docbook INSTALL_DESTINATION ${KDE_INSTALL_DOCBUNDLEDIR}/en SUBDIR kioslave5/s3) diff --git a/doc/index.docbook b/doc/index.docbook index ede580d..6bc3003 100644 --- a/doc/index.docbook +++ b/doc/index.docbook @@ -30,7 +30,7 @@ <para>KIO S3 allows you to list Amazon S3 buckets and objects, to upload files and folders to a bucket and to delete objects from a bucket. You can also copy folders or objects within S3, as well as move or rename objects.</para> -<para>You can use the s3 kioslave like this:</para> +<para>You can use the s3 KIO worker like this:</para> <para><userinput>s3://</userinput> or <userinput>s3://<replaceable>mybucket/mykey</replaceable></userinput>.</para> <para>The first URL shows all your S3 buckets.</para> diff --git a/src/kio_s3.cpp b/src/kio_s3.cpp index bc832e0..1f10bb1 100644 --- a/src/kio_s3.cpp +++ b/src/kio_s3.cpp @@ -11,7 +11,7 @@ class KIOPluginForMetaData : public QObject { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.kde.kio.slave.s3" FILE "s3.json") + Q_PLUGIN_METADATA(IID "org.kde.kio.worker.s3" FILE "s3.json") }; extern "C" @@ -25,77 +25,77 @@ int Q_DECL_EXPORT kdemain(int argc, char **argv) exit(-1); } - S3Slave slave(argv[1], argv[2], argv[3]); + S3Worker worker(argv[1], argv[2], argv[3]); qCDebug(S3) << "Starting kio_s3..."; - slave.dispatchLoop(); + worker.dispatchLoop(); return 0; } -S3Slave::S3Slave(const QByteArray &protocol, const QByteArray &pool_socket, const QByteArray &app_socket) - : SlaveBase("s3", pool_socket, app_socket) +S3Worker::S3Worker(const QByteArray &protocol, const QByteArray &pool_socket, const QByteArray &app_socket) + : WorkerBase("s3", pool_socket, app_socket) { Q_UNUSED(protocol) qCDebug(S3) << "kio_s3 ready."; } -S3Slave::~S3Slave() +S3Worker::~S3Worker() { qCDebug(S3) << "kio_s3 ended."; } -void S3Slave::listDir(const QUrl &url) +KIO::WorkerResult S3Worker::listDir(const QUrl &url) { - finalize(d->listDir(url)); + return finalize(d->listDir(url)); } -void S3Slave::stat(const QUrl &url) +KIO::WorkerResult S3Worker::stat(const QUrl &url) { - finalize(d->stat(url)); + return finalize(d->stat(url)); } -void S3Slave::mimetype(const QUrl &url) +KIO::WorkerResult S3Worker::mimetype(const QUrl &url) { - finalize(d->mimetype(url)); + return finalize(d->mimetype(url)); } -void S3Slave::get(const QUrl &url) +KIO::WorkerResult S3Worker::get(const QUrl &url) { - finalize(d->get(url)); + return finalize(d->get(url)); } -void S3Slave::put(const QUrl &url, int permissions, KIO::JobFlags flags) +KIO::WorkerResult S3Worker::put(const QUrl &url, int permissions, KIO::JobFlags flags) { - finalize(d->put(url, permissions, flags)); + return finalize(d->put(url, permissions, flags)); } -void S3Slave::copy(const QUrl &src, const QUrl &dest, int permissions, KIO::JobFlags flags) +KIO::WorkerResult S3Worker::copy(const QUrl &src, const QUrl &dest, int permissions, KIO::JobFlags flags) { - finalize(d->copy(src, dest, permissions, flags)); + return finalize(d->copy(src, dest, permissions, flags)); } -void S3Slave::mkdir(const QUrl &url, int permissions) +KIO::WorkerResult S3Worker::mkdir(const QUrl &url, int permissions) { - finalize(d->mkdir(url, permissions)); + return finalize(d->mkdir(url, permissions)); } -void S3Slave::del(const QUrl &url, bool isfile) +KIO::WorkerResult S3Worker::del(const QUrl &url, bool isfile) { - finalize(d->del(url, isfile)); + return finalize(d->del(url, isfile)); } -void S3Slave::rename(const QUrl &src, const QUrl &dest, KIO::JobFlags flags) +KIO::WorkerResult S3Worker::rename(const QUrl &src, const QUrl &dest, KIO::JobFlags flags) { - finalize(d->rename(src, dest, flags)); + return finalize(d->rename(src, dest, flags)); } -void S3Slave::finalize(const S3Backend::Result &result) +KIO::WorkerResult S3Worker::finalize(const S3Backend::Result &result) { if (result.exitCode > 0) { - error(result.exitCode, result.errorMessage); - } else { - finished(); + return KIO::WorkerResult::fail(result.exitCode, result.errorMessage); } + + return KIO::WorkerResult::pass(); } #include "kio_s3.moc" diff --git a/src/kio_s3.h b/src/kio_s3.h index 3d867ff..da58d31 100644 --- a/src/kio_s3.h +++ b/src/kio_s3.h @@ -8,33 +8,33 @@ #include "s3backend.h" -#include <KIO/SlaveBase> +#include <KIO/WorkerBase> #include <QUrl> -class S3Slave : public KIO::SlaveBase +class S3Worker : public KIO::WorkerBase { public: - S3Slave(const QByteArray &protocol, + S3Worker(const QByteArray &protocol, const QByteArray &pool_socket, const QByteArray &app_socket); - ~S3Slave() override; - - void listDir(const QUrl &url) override; - void stat(const QUrl &url) override; - void mimetype(const QUrl &url) override; - void get(const QUrl &url) override; - void put(const QUrl &url, int permissions, KIO::JobFlags flags) override; - void copy(const QUrl &src, const QUrl &dest, int permissions, KIO::JobFlags flags) override; - void mkdir(const QUrl &url, int permissions) override; - void del(const QUrl &url, bool isfile) override; - void rename(const QUrl &src, const QUrl &dest, KIO::JobFlags flags) override; + ~S3Worker() override; + + KIO::WorkerResult listDir(const QUrl &url) override; + KIO::WorkerResult stat(const QUrl &url) override; + KIO::WorkerResult mimetype(const QUrl &url) override; + KIO::WorkerResult get(const QUrl &url) override; + KIO::WorkerResult put(const QUrl &url, int permissions, KIO::JobFlags flags) override; + KIO::WorkerResult copy(const QUrl &src, const QUrl &dest, int permissions, KIO::JobFlags flags) override; + KIO::WorkerResult mkdir(const QUrl &url, int permissions) override; + KIO::WorkerResult del(const QUrl &url, bool isfile) override; + KIO::WorkerResult rename(const QUrl &src, const QUrl &dest, KIO::JobFlags flags) override; private: - Q_DISABLE_COPY(S3Slave) + Q_DISABLE_COPY(S3Worker) - void finalize(const S3Backend::Result &result); + KIO::WorkerResult finalize(const S3Backend::Result &result); QScopedPointer<S3Backend> d { new S3Backend(this) }; }; diff --git a/src/s3backend.cpp b/src/s3backend.cpp index 5d8722b..dce29db 100644 --- a/src/s3backend.cpp +++ b/src/s3backend.cpp @@ -28,14 +28,14 @@ static S3Backend::Result finished() { static S3Backend::Result invalidUrlError() { static const S3Backend::Result s_invalidUrlError = { - KIO::ERR_SLAVE_DEFINED, - xi18nc("@info", "Invalid S3 URI, bucket name is missing from the host.<nl/>A valid S3 URI must be written in the form: <link>%1</link>", "s3://bucket/key") + KIO::ERR_WORKER_DEFINED, + xi18nc("@info", "Invalid S3 URI, bucket name is missing from the host.<nl/>A valid S3 URI must be written in the form: <link>s3://bucket/key</link>") }; return s_invalidUrlError; } -S3Backend::S3Backend(S3Slave *q) +S3Backend::S3Backend(S3Worker *q) : q(q) { Aws::SDKOptions options; @@ -308,7 +308,7 @@ S3Backend::Result S3Backend::copy(const QUrl &src, const QUrl &dest, int permiss auto copyObjectOutcome = client.CopyObject(request); if (!copyObjectOutcome.IsSuccess()) { qCDebug(S3) << "Could not copy" << src << "to" << dest << "- " << copyObjectOutcome.GetError().GetMessage().c_str(); - return {KIO::ERR_SLAVE_DEFINED, xi18nc("@info", "Could not copy <link>%1</link> to <link>%2</link>", src.toDisplayString(), dest.toDisplayString())}; + return {KIO::ERR_WORKER_DEFINED, xi18nc("@info", "Could not copy <link>%1</link> to <link>%2</link>", src.toDisplayString(), dest.toDisplayString())}; } return finished(); @@ -420,10 +420,11 @@ void S3Backend::listBucket(const QString &bucketName) const auto objects = listObjectsOutcome.GetResult().GetContents(); for (const auto &object : objects) { KIO::UDSEntry entry; + const auto objectKey = QString::fromUtf8(object.GetKey().c_str()); entry.reserve(6); - entry.fastInsert(KIO::UDSEntry::UDS_NAME, object.GetKey().c_str()); - entry.fastInsert(KIO::UDSEntry::UDS_DISPLAY_NAME, object.GetKey().c_str()); - entry.fastInsert(KIO::UDSEntry::UDS_URL, QStringLiteral("s3://%1/%2").arg(bucketName, object.GetKey().c_str())); + entry.fastInsert(KIO::UDSEntry::UDS_NAME, objectKey); + entry.fastInsert(KIO::UDSEntry::UDS_DISPLAY_NAME, objectKey); + entry.fastInsert(KIO::UDSEntry::UDS_URL, QStringLiteral("s3://%1/%2").arg(bucketName, objectKey)); entry.fastInsert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFREG); entry.fastInsert(KIO::UDSEntry::UDS_SIZE, object.GetSize()); entry.fastInsert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH ); diff --git a/src/s3backend.h b/src/s3backend.h index a23a335..00ed5bd 100644 --- a/src/s3backend.h +++ b/src/s3backend.h @@ -14,7 +14,7 @@ #include <aws/s3/S3Client.h> -class S3Slave; +class S3Worker; class S3Backend { @@ -27,7 +27,7 @@ struct Result { QString errorMessage; }; - S3Backend(S3Slave *q); + S3Backend(S3Worker *q); Q_REQUIRED_RESULT Result listDir(const QUrl &url); Q_REQUIRED_RESULT Result stat(const QUrl &url); @@ -55,7 +55,7 @@ private: QString contentType(const S3Url &s3url); QByteArray m_configProfileName; // This must be passed to the S3Client objects to get the proper region from ~/.aws/config - S3Slave *q = nullptr; + S3Worker *q = nullptr; }; #endif // S3BACKEND_H