-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathqrzrucallbook.cpp
92 lines (78 loc) · 2.7 KB
/
qrzrucallbook.cpp
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
91
92
#include "qrzrucallbook.h"
#include <QEventLoop>
#include <QXmlStreamReader>
#include <QTimer>
QrzruCallbook::QrzruCallbook(QString username, QString password, QObject *parent)
: QObject{parent}
{
this->username = username;
this->password = password;
session_id = "";
session_time = QDateTime::fromString("01-01-1970 00:00:00", "MM-dd-yyyy hh:mm:ss");
}
void QrzruCallbook::GetApiSession() {
QByteArray data = Request(QString("https://api.qrz.ru/login?u=%1&p=%2&agent=MQL").arg(username, password));
session_id = getTagValue(data, "session_id");
session_time = QDateTime::currentDateTime();
}
QStringList QrzruCallbook::Get(QString call) {
QString ncall = call.left(call.indexOf('/'));
QStringList ret;
if (session_time.secsTo(QDateTime::currentDateTime()) > 3600) {
GetApiSession();
}
QByteArray data = Request(QString("https://api.qrz.ru/callsign?id=%1&callsign=%2").arg(session_id, ncall));
QString name = getTagValue(data, "name");
QString city = getTagValue(data, "city");
QString qthloc = getTagValue(data, "qthloc");
QString cnty = getTagValue(data, "state");
ret << name << city << qthloc << cnty;
return ret;
}
QByteArray QrzruCallbook::Request(QString url) {
QNetworkAccessManager manager;
QEventLoop eventLoop;
QTimer tot;
QByteArray data;
QObject::connect(&tot, &QTimer::timeout, &eventLoop, &QEventLoop::quit);
QObject::connect(&manager, &QNetworkAccessManager::finished,
&eventLoop, &QEventLoop::quit);
QNetworkRequest request((QUrl(url)));
request.setHeader(QNetworkRequest::UserAgentHeader, "MiniQSOLogger");
QNetworkReply* reply = manager.get(request);
tot.start(1000);
eventLoop.exec();
if (tot.isActive()) {
tot.stop();
if (reply->error() != QNetworkReply::NoError) {
switch (reply->error()) {
case QNetworkReply::ContentNotFoundError:
emit error404();
break;
default:
emit error();
}
} else {
data = reply->readAll();
reply->deleteLater();
}
}
return data;
}
QString QrzruCallbook::getTagValue(QByteArray data, QString tag) {
QString value = "";
QXmlStreamReader xml;
xml.addData(data);
while(!xml.atEnd() && !xml.hasError()) {
QXmlStreamReader::TokenType token = xml.readNext();
if (token == QXmlStreamReader::StartDocument) continue;
if (token == QXmlStreamReader::StartElement) {
if (xml.name() == tag) {
xml.readNext();
value = xml.text().toString();
}
}
}
xml.clear();
return value;
}