117 lines
3.4 KiB
C++
Executable File
117 lines
3.4 KiB
C++
Executable File
#include "konarelatedtags.h"
|
|
#include <QDebug>
|
|
|
|
KonaRelatedTags::KonaRelatedTags(KonaClient *Kc, QString Tags, QString Type)
|
|
{
|
|
kc = Kc;
|
|
tags = Tags;
|
|
type = Type;
|
|
|
|
|
|
// Initialize temp file
|
|
int fileID = 0;
|
|
file = new QFile(kc->getTempDir() + SLASH + "relTags_0");
|
|
|
|
while (file->exists()) {
|
|
fileID++;
|
|
file->setFileName(kc->getTempDir() + SLASH + "relTags_" + QString::number(fileID));
|
|
}
|
|
|
|
// Prepare HTTP
|
|
http = new QHttp(kc->getServer(), QHttp::ConnectionModeHttps);
|
|
connect(http, SIGNAL(responseHeaderReceived(QHttpResponseHeader)),
|
|
this, SLOT(responseHeaderReceived(QHttpResponseHeader)));
|
|
connect(http, SIGNAL(requestFinished(int,bool)),
|
|
this, SLOT(requestFinished()));
|
|
|
|
// Search
|
|
if (Tags == "") {
|
|
searchIsDone = true;
|
|
}
|
|
else {
|
|
searchAgain();
|
|
}
|
|
}
|
|
|
|
void KonaRelatedTags::newSearch(QString Tags, QString Type)
|
|
{
|
|
if (Tags != "__KEEPOLD__") tags = Tags;
|
|
if (Type != "__KEEPOLD__") type = Type;
|
|
|
|
searchAgain();
|
|
}
|
|
|
|
void KonaRelatedTags::searchAgain() {
|
|
result.clear();
|
|
searchIsDone = false;
|
|
|
|
statusCode = 0;
|
|
if (!file->open(QIODevice::ReadWrite)) {
|
|
qDebug() << "KonaRelatedTags: ERROR: Can't open temp file for search!";
|
|
emit searchFailed(this, ERROR_TAGS_TEMPFILE);
|
|
return;
|
|
}
|
|
|
|
QUrl url("/tag/related.xml?tags=" + tags + (type != "" ? "&type=" + type : ""));
|
|
qDebug() << url.toString();
|
|
http->get(url.toString(), file);
|
|
}
|
|
|
|
void KonaRelatedTags::requestFinished() {
|
|
if (statusCode == 200) {
|
|
file->flush();
|
|
file->reset();
|
|
|
|
QDomDocument doc ("search");
|
|
if (!doc.setContent(file)) {
|
|
qDebug() << "KonaRelatedTags: ERROR: Can't parse xml!";
|
|
emit searchFailed(this, ERROR_SEARCH_XML);
|
|
file->close();
|
|
file->remove();
|
|
return;
|
|
}
|
|
file->close();
|
|
file->remove(); // We don't need it anymore
|
|
|
|
QDomElement root = doc.documentElement();
|
|
if (root.tagName() != "tags") {
|
|
qDebug() << "KonaRelatedTags: ERROR: Wrong root element!";
|
|
emit searchFailed(this, ERROR_TAGS_FORMAT);
|
|
return;
|
|
}
|
|
|
|
QDomElement el = root.elementsByTagName("tag").at(1).toElement();
|
|
if (el.isNull()) {
|
|
qDebug() << "KonaRelatedTags: ERROR: Couldn't get first element!";
|
|
emit searchFailed(this, ERROR_TAGS_FORMAT);
|
|
return;
|
|
}
|
|
|
|
|
|
#define toBool(a) (a == "true" ? true : false)
|
|
|
|
int x = 1;
|
|
while (!el.isNull()) { //TODO: Filter doubles
|
|
result.append(new KonaTag(el.attribute("id", "0").toInt(),
|
|
el.attribute("name", ""),
|
|
el.attribute("count", "0").toInt(),
|
|
el.attribute("type", "unknown").toInt(),
|
|
toBool(el.attribute("ambiguous", "false"))));
|
|
x++;
|
|
el = root.elementsByTagName("tag").at(x).toElement();
|
|
}
|
|
|
|
qDebug() << "KonaRelatedTags: Search finished!";
|
|
searchIsDone = true;
|
|
emit searchFinished(this);
|
|
}
|
|
else {
|
|
qDebug() << "KonaRelatedTags: ERROR: " << "Received HTTP error code: " << statusCode;
|
|
emit searchFailed(this, ERROR_SEARCH_HTTP);
|
|
}
|
|
}
|
|
|
|
void KonaRelatedTags::responseHeaderReceived(QHttpResponseHeader resp) {
|
|
statusCode = resp.statusCode();
|
|
}
|