aboutsummaryrefslogtreecommitdiff
path: root/src/qt
diff options
context:
space:
mode:
authorxiphon <xiphon@protonmail.com>2020-03-08 15:30:34 +0000
committerxiphon <xiphon@protonmail.com>2020-03-09 11:05:49 +0000
commit55b548f31cc87d36193a578b00d5a55e35e421f1 (patch)
tree889f2d4c32ece0840da60e9a015d70a8de6a4dd4 /src/qt
parentcee56a7d239f44cc7e0b5ca6c397b9893200e5f8 (diff)
downloadmonzero-gui-55b548f31cc87d36193a578b00d5a55e35e421f1.tar.gz
monzero-gui-55b548f31cc87d36193a578b00d5a55e35e421f1.tar.xz
monzero-gui-55b548f31cc87d36193a578b00d5a55e35e421f1.zip
qt: drop Qt Network and Qt OpenSSL deps, use epee library instead
Diffstat (limited to 'src/qt')
-rw-r--r--src/qt/prices.cpp126
-rw-r--r--src/qt/prices.h25
2 files changed, 75 insertions, 76 deletions
diff --git a/src/qt/prices.cpp b/src/qt/prices.cpp
index 2f212f4b..6c09553a 100644
--- a/src/qt/prices.cpp
+++ b/src/qt/prices.cpp
@@ -26,85 +26,85 @@
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#include <QDebug>
#include <QtCore>
-#include <QNetworkAccessManager>
+
+// TODO: wallet_merged - epee library triggers the warnings
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#pragma GCC diagnostic ignored "-Wreorder"
+#include <net/http_client.h>
+#pragma GCC diagnostic pop
#include "utils.h"
#include "prices.h"
-
-Prices::Prices(QNetworkAccessManager *networkAccessManager, QObject *parent)
- : QObject(parent) {
- this->m_networkAccessManager = networkAccessManager;
+Prices::Prices(QObject *parent)
+ : QObject(parent)
+ , m_scheduler(this)
+{
}
-void Prices::getJSON(const QString url) {
+void Prices::getJSON(const QString url) const
+{
qDebug() << QString("Fetching: %1").arg(url);
- QNetworkRequest request;
- request.setUrl(QUrl(url));
- request.setRawHeader("User-Agent", randomUserAgent().toUtf8());
- request.setRawHeader("Content-Type", "application/json");
-
- m_reply = this->m_networkAccessManager->get(request);
-
- connect(m_reply, SIGNAL(finished()), this, SLOT(gotJSON()));
-}
-void Prices::gotJSON() {
- // Check connectivity
- if (!m_reply || m_reply->error() != QNetworkReply::NoError){
- this->gotError("Problem with reply from server. Check connectivity.");
- m_reply->deleteLater();
- return;
- }
+ m_scheduler.run([this, url] {
+ epee::net_utils::http::http_simple_client http_client;
- // Check json header
- QList<QByteArray> headerList = m_reply->rawHeaderList();
- QByteArray headerJson = m_reply->rawHeader("Content-Type");
- if(headerJson.length() <= 15){
- this->gotError("Bad Content-Type");
- m_reply->deleteLater();
- return;
- }
+ const QUrl urlParsed(url);
+ http_client.set_server(urlParsed.host().toStdString(), urlParsed.scheme() == "https" ? "443" : "80", {});
- QString headerJsonStr = QTextCodec::codecForMib(106)->toUnicode(headerJson);
- int _contentType = headerList.indexOf("Content-Type");
- if (_contentType < 0 || !headerJsonStr.startsWith("application/json")){
- this->gotError("Bad Content-Type");
- m_reply->deleteLater();
- return;
- }
+ const QString uri = (urlParsed.hasQuery() ? urlParsed.path() + "?" + urlParsed.query() : urlParsed.path());
+ const epee::net_utils::http::http_response_info* pri = NULL;
+ constexpr std::chrono::milliseconds timeout = std::chrono::seconds(15);
- // Check valid json document
- QByteArray data = m_reply->readAll();
- QJsonDocument doc = QJsonDocument::fromJson(data);
- QString jsonString = doc.toJson(QJsonDocument::Indented);
- if (jsonString.isEmpty()){
- this->gotError("Bad JSON");
- m_reply->deleteLater();
- return;
- }
+ const bool result = http_client.invoke(
+ uri.toStdString(),
+ "GET",
+ {},
+ timeout,
+ std::addressof(pri),
+ {
+ {"Content-Type", "application/json; charset=utf-8"},
+ {"User-Agent", randomUserAgent().toStdString()}
+ });
- // Insert source url for later reference
- QUrl url = m_reply->url();
- QJsonObject docobj = doc.object();
- docobj["_url"] = url.toString();
- doc.setObject(docobj);
-
- qDebug() << QString("Fetched: %1").arg(url.toString());
-
- // Emit signal
- QVariantMap vMap = doc.object().toVariantMap();
- emit priceJsonReceived(vMap);
-
- m_reply->deleteLater();
-}
+ if (!result)
+ {
+ this->gotError("unknown error");
+ }
+ else if (!pri)
+ {
+ this->gotError("internal error (null response ptr)");
+ }
+ else if (pri->m_response_code != 200)
+ {
+ this->gotError(QString("response code: %1").arg(pri->m_response_code));
+ }
+ else
+ {
+ QJsonDocument doc = QJsonDocument::fromJson({&pri->m_body[0], static_cast<int>(pri->m_body.size())});
+ if (doc.isEmpty())
+ {
+ this->gotError("bad JSON");
+ }
+ else
+ {
+ // Insert source url for later reference
+ QJsonObject docobj = doc.object();
+ docobj["_url"] = url;
+ doc.setObject(docobj);
-void Prices::gotError() {
- this->gotError("Unknown error");
+ QVariantMap vMap = doc.object().toVariantMap();
+ emit priceJsonReceived(vMap);
+ }
+ }
+ });
}
-void Prices::gotError(const QString &message) {
+void Prices::gotError(const QString &message) const
+{
qCritical() << "[Fiat API] Error:" << message;
emit priceJsonError(message);
}
diff --git a/src/qt/prices.h b/src/qt/prices.h
index 334fd9dc..4168aedc 100644
--- a/src/qt/prices.h
+++ b/src/qt/prices.h
@@ -3,28 +3,27 @@
#include <QCoreApplication>
#include <QtNetwork>
-#include <QNetworkAccessManager>
-#include <QNetworkReply>
-#include <QDebug>
+
+#include "FutureScheduler.h"
class Prices : public QObject
{
Q_OBJECT
public:
- Prices(QNetworkAccessManager *networkAccessManager, QObject *parent = nullptr);
+ Prices(QObject *parent = nullptr);
+
+public:
+ Q_INVOKABLE void getJSON(const QString url) const;
+
+private:
+ void gotError(const QString &message) const;
-public slots:
- Q_INVOKABLE void getJSON(const QString url);
- void gotJSON();
- void gotError();
- void gotError(const QString &message);
signals:
- void priceJsonReceived(QVariantMap document);
- void priceJsonError(QString message);
+ void priceJsonReceived(QVariantMap document) const;
+ void priceJsonError(QString message) const;
private:
- mutable QPointer<QNetworkReply> m_reply;
- QNetworkAccessManager *m_networkAccessManager;
+ mutable FutureScheduler m_scheduler;
};
#endif // PRICES_H