File indexing completed on 2024-04-28 04:41:40

0001 /*
0002     SPDX-FileCopyrightText: 2018 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #ifndef KPUBLICTRANSPORT_REPLY_H
0008 #define KPUBLICTRANSPORT_REPLY_H
0009 
0010 #include "kpublictransport_export.h"
0011 
0012 #include <QObject>
0013 
0014 #include <memory>
0015 
0016 namespace KPublicTransport {
0017 
0018 class AbstractBackend;
0019 class Attribution;
0020 class Manager;
0021 class ReplyPrivate;
0022 
0023 /** Query response base class. */
0024 class KPUBLICTRANSPORT_EXPORT Reply : public QObject
0025 {
0026     Q_OBJECT
0027 public:
0028     ~Reply() override;
0029 
0030     /** Error types. */
0031     enum Error {
0032         NoError, ///< Nothing went wrong.
0033         NetworkError, ///< Error during network operations.
0034         NotFoundError, ///< The requested journey/departure/place could not be found.
0035         InvalidRequest, ///< Incomplete or otherwise invalid request.
0036         UnknownError ///< Anything else.
0037     };
0038 
0039     /** Error code. */
0040     Error error() const;
0041     /** Textual error message. */
0042     QString errorString() const;
0043 
0044     /** Returns the attributions for the provided data. */
0045     const std::vector<Attribution>& attributions() const;
0046     /** Returns the attributions for the provided data for moving them elsewhere. */
0047     std::vector<Attribution>&& takeAttributions();
0048 
0049 Q_SIGNALS:
0050     /** Emitted whenever the corresponding search has been completed. */
0051     void finished();
0052     /** Emitted whenever new results are available, even before the search has been completed.
0053      *  @note At this point no guarantees about the result apply, sorting/merging/etc might not have been applied yet
0054      *  and not all properties of the reply might be valid. Avoid the usage of this in general, unless you write
0055      *  dynamically updating models that need very quick results at the expensive of incompleteness.
0056      */
0057     void updated();
0058 
0059 protected:
0060     ///@cond internal
0061     Q_DECL_HIDDEN explicit Reply(ReplyPrivate *dd, QObject *parent);
0062     std::unique_ptr<ReplyPrivate> d_ptr;
0063 
0064     friend class AbstractBackend;
0065     /** Used for a backend to report it finished it's job with an error.
0066      *  Prefer to use the variants of this provided by the type-specific sub-classes
0067      *  which also add the corresponding negative cache entries if appropriate.
0068      */
0069     Q_DECL_HIDDEN void addError(Error error, const QString &errorMsg);
0070     Q_DECL_HIDDEN void addAttributions(std::vector<Attribution> &&attributions);
0071     Q_DECL_HIDDEN void addAttributions(const std::vector<Attribution> &attributions);
0072 
0073     friend class Manager;
0074     friend class ManagerPrivate;
0075     Q_DECL_HIDDEN void setPendingOps(int ops);
0076     Q_DECL_HIDDEN void addAttribution(const Attribution &attr);
0077     ///@endcond
0078 };
0079 
0080 }
0081 
0082 #endif // KPUBLICTRANSPORT_JOURNEYREPLY_H