File indexing completed on 2024-12-08 07:19:11
0001 /* 0002 SPDX-FileCopyrightText: 2018 Volker Krause <vkrause@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "reply.h" 0008 #include "reply_p.h" 0009 #include "assetrepository_p.h" 0010 #include "datatypes/attributionutil_p.h" 0011 0012 #include <QDebug> 0013 #include <QUrl> 0014 0015 using namespace KPublicTransport; 0016 0017 void ReplyPrivate::emitFinishedIfDone(Reply *q) 0018 { 0019 if (pendingOps == 0 && (!needToWaitForAssets() || AssetRepository::instance()->isQueueEmpty())) { 0020 finalizeResult(); 0021 // delayed, as this is trigged from the backend settings results on us, which can be a multi-step process 0022 QMetaObject::invokeMethod(q, &Reply::finished, Qt::QueuedConnection); 0023 } 0024 } 0025 0026 void ReplyPrivate::emitUpdated(Reply *q) 0027 { 0028 shouldClearError = true; 0029 // delayed, as this is trigged from immediate cache lookup in Manager, when signals are not yet connected 0030 QMetaObject::invokeMethod(q, &Reply::updated, Qt::QueuedConnection); 0031 } 0032 0033 bool ReplyPrivate::needToWaitForAssets() const 0034 { 0035 return false; 0036 } 0037 0038 Reply::Reply(ReplyPrivate *dd, QObject *parent) 0039 : QObject(parent) 0040 , d_ptr(dd) 0041 { 0042 } 0043 0044 Reply::~Reply() = default; 0045 0046 Reply::Error Reply::error() const 0047 { 0048 if (d_ptr->shouldClearError) { 0049 return Reply::NoError; 0050 } 0051 return d_ptr->error; 0052 } 0053 0054 QString Reply::errorString() const 0055 { 0056 if (d_ptr->shouldClearError) { 0057 return {}; 0058 } 0059 return d_ptr->errorMsg; 0060 } 0061 0062 void Reply::addError(Reply::Error error, const QString &errorMsg) 0063 { 0064 d_ptr->error = error; 0065 d_ptr->errorMsg = errorMsg; 0066 d_ptr->pendingOps--; 0067 d_ptr->emitFinishedIfDone(this); 0068 } 0069 0070 void Reply::setPendingOps(int ops) 0071 { 0072 Q_ASSERT(d_ptr->pendingOps <= -1); 0073 Q_ASSERT(ops >= 0); 0074 d_ptr->pendingOps = ops; 0075 if (ops == 0) { 0076 QMetaObject::invokeMethod(this, &Reply::finished, Qt::QueuedConnection); 0077 } 0078 0079 if (d_ptr->needToWaitForAssets()) { 0080 connect(AssetRepository::instance(), &AssetRepository::downloadFinished, this, [this]() { d_ptr->emitFinishedIfDone(this); }); 0081 } 0082 } 0083 0084 const std::vector<Attribution>& Reply::attributions() const 0085 { 0086 return d_ptr->attributions; 0087 } 0088 0089 std::vector<Attribution>&& Reply::takeAttributions() 0090 { 0091 return std::move(d_ptr->attributions); 0092 } 0093 0094 void Reply::addAttributions(std::vector<Attribution>&& attributions) 0095 { 0096 AttributionUtil::merge(d_ptr->attributions, std::move(attributions)); 0097 } 0098 0099 void Reply::addAttribution(const Attribution &attr) 0100 { 0101 AttributionUtil::merge(d_ptr->attributions, attr); 0102 } 0103 0104 void Reply::addAttributions(const std::vector<Attribution> &attributions) 0105 { 0106 AttributionUtil::merge(d_ptr->attributions, attributions); 0107 }