aboutsummaryrefslogtreecommitdiff
path: root/src/client/QXmppFileSharingProvider.h
blob: 02e6252affb64369adb00c5c62cbaca27afacefc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// SPDX-FileCopyrightText: 2022 Jonah Brüchert <jbb@kaidan.im>
// SPDX-FileCopyrightText: 2022 Linus Jahn <lnj@kaidan.im>
//
// SPDX-License-Identifier: LGPL-2.1-or-later

#ifndef QXMPPFILESHARINGPROVIDER_H
#define QXMPPFILESHARINGPROVIDER_H

#include "QXmppError.h"
#include "QXmppGlobal.h"

#include <any>
#include <functional>
#include <memory>
#include <variant>

class QIODevice;
class QXmppFileMetadata;
class QXmppUpload;
class QXmppDownload;

///
/// \brief The interface of a provider for the QXmppFileSharingManager
///
/// To use it, implement all the pure virtual functions,
/// and add a using declaration for the type of source you want to handle.
/// ```
/// using SourceType = QXmppHttpFileSource;
/// ```
///
class QXMPP_EXPORT QXmppFileSharingProvider
{
public:
    /// Contains QXmpp::Success (successfully finished), QXmpp::Cancelled (manually cancelled) or
    /// QXmppError (an error occured while downloading).
    using DownloadResult = std::variant<QXmpp::Success, QXmpp::Cancelled, QXmppError>;

    /// Contains std::any (created file source), QXmpp::Cancelled (manually cancelled) or
    /// QXmppError (an error occured while uploading).
    using UploadResult = std::variant<std::any /* source */, QXmpp::Cancelled, QXmppError>;

    /// Used to control ongoing downloads
    class Download
    {
    public:
        virtual ~Download() = default;
        /// Cancels the download.
        virtual void cancel() = 0;
    };

    /// Used to control ongoing uploads
    class Upload
    {
    public:
        virtual ~Upload() = default;
        /// Cancels the upload.
        virtual void cancel() = 0;
    };

    /// \cond
    virtual ~QXmppFileSharingProvider() = default;
    /// \endcond

    ///
    /// \brief Handles the download of files for this provider
    /// \param source A type-erased source object. The provider will only ever have to handle
    ///        its own sources, so this can safely be casted to the defined source type.
    /// \param target QIODevice into which the received data should be written
    /// \param reportProgress Can be called to report received bytes and total bytes
    /// \param reportFinished Finalizes the download, no more progress must be reported after this
    ///
    virtual auto downloadFile(const std::any &source,
                              std::unique_ptr<QIODevice> target,
                              std::function<void(quint64, quint64)> reportProgress,
                              std::function<void(DownloadResult)> reportFinished) -> std::shared_ptr<Download> = 0;

    ///
    /// \brief Handles the upload of a file for this provider
    /// \param source A QIODevice from which data for uploading should be read.
    /// \param info Metadata of the file
    /// \param reportProgress Can be called to report sent bytes and total bytes
    /// \param reportFinished Finalizes the upload, no more progress must be reported after this
    ///
    virtual auto uploadFile(std::unique_ptr<QIODevice> source,
                            const QXmppFileMetadata &info,
                            std::function<void(quint64, quint64)> reportProgress,
                            std::function<void(UploadResult)> reportFinished) -> std::shared_ptr<Upload> = 0;
};

#endif  // QXMPPFILESHARINGPROVIDER_H