-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathobsclient.cpp
75 lines (63 loc) · 2.24 KB
/
obsclient.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
#include "obsclient.h"
#include <QtNetwork>
#include <QObject>
#include <QNetworkReply>
#include "rpmpackage.h"
const QUrl OBSClient::PROXY_URL = QUrl("https://guoyunhe.me/opi/proxy/index.php");
const QString OBSClient::BINARY_SEARCH_PATH = "/search/published/binary/id";
/**
* @brief OBSClient::OBSClient
* @param instance OBSClient::OBS or OBSClient::PMBS
* @param apiRoot OBSClient::OBS_API_ROOT or OBSClient::PMBS_API_ROOT
* @param parent
*/
OBSClient::OBSClient(OBSInstance *obsInstance, QObject *parent) : QObject(parent)
{
this->obsInstance = obsInstance;
this->manager = new QNetworkAccessManager(this);
}
void OBSClient::search(QStringList keywords)
{
QUrl url = obsInstance->getApiRootUrl();
url.setPath(BINARY_SEARCH_PATH);
QUrlQuery query;
QString names = QString("'") + keywords.join(QString(",")) + QString("'");
QString xpath = QString("contains-ic(@name,%1) and path/project='%2'").arg(names).arg(obsInstance->getDistPrefix() + "openSUSE:Factory");
query.addQueryItem(QString("match"), QUrl::toPercentEncoding(xpath));
url.setQuery(query);
QUrl proxyUrl = getProxyUrl(url.toEncoded());
searchReply = manager->get(QNetworkRequest(proxyUrl));
connect(searchReply, &QNetworkReply::finished, this, &OBSClient::parseSearchResult);
}
void OBSClient::search(QString keywords)
{
search(keywords.split(" ", QString::SkipEmptyParts));
}
void OBSClient::parseSearchResult()
{
QVector<RPMPackage*> packages;
QString body = searchReply->readAll();
QXmlStreamReader xml(body);
xml.readNextStartElement();
if (xml.name() == "collection") {
while (xml.readNextStartElement()) {
if (xml.name() == "binary") {
RPMPackage *rpm = new RPMPackage(xml.attributes());
packages << rpm;
xml.readElementText();
} else {
xml.skipCurrentElement();
}
}
}
emit searchResultParsed(packages);
}
QUrl OBSClient::getProxyUrl(QString url)
{
QUrlQuery query;
query.addQueryItem(QString("obs_instance"), obsInstance->getName());
query.addQueryItem(QString("obs_api_link"), QUrl::toPercentEncoding(url));
QUrl proxyUrl(PROXY_URL);
proxyUrl.setQuery(query);
return proxyUrl;
}