konaclient-qt/konatags.cpp

132 lines
4.0 KiB
C++
Executable File

#include "konatags.h"
#include <QDebug>
KonaTags::KonaTags(KonaClient *Kc, QString Name, int Limit, int Page, QString Order, int Id, int AfterId, QString NamePattern)
{
kc = Kc;
name = Name;
limit = Limit;
page = Page;
order = Order;
id = Id;
afterId = AfterId;
namePattern = NamePattern;
// Initialize temp file
int fileID = 0;
file = new QFile(kc->getTempDir() + SLASH + "tags_0");
while (file->exists()) {
fileID++;
file->setFileName(kc->getTempDir() + SLASH + "tags_" + 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()));
if (limit != -1) searchAgain();
else searchIsDone = true;
}
void KonaTags::searchAgain() {
searchIsDone = false;
statusCode = 0;
if (!file->open(QIODevice::ReadWrite)) {
qDebug() << "KonaTags: ERROR: Can't open temp file for search!";
emit searchFailed(this, ERROR_TAGS_TEMPFILE);
return;
}
QString optParams;
optParams += (id != -1 ? "&id=" + QString::number(id) : "");
optParams += (afterId != -1 ? "&after_id=" + QString::number(afterId) : "");
QUrl url("/tag/index.xml?name=" + name + "&page=" + QString::number(page) + "&limit=" + QString::number(limit) + "&order=" + order + "&name_pattern=" + namePattern + optParams);
http->get(url.toString(), file);
}
void KonaTags::requestFinished() {
if (statusCode == 200) {
file->flush();
file->reset();
QDomDocument doc ("search");
if (!doc.setContent(file)) {
qDebug() << "KonaSearch: 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() << "KonaTags: ERROR: Wrong root element!";
emit searchFailed(this, ERROR_TAGS_FORMAT);
return;
}
QDomElement el = root.firstChildElement("tag");
if (el.isNull()) {
qDebug() << "KonaTags: ERROR: Couldn't get first element!";
emit searchFailed(this, ERROR_TAGS_FORMAT);
return;
}
#define toBool(a) (a == "true" ? true : false)
int x = 0;
while (!el.isNull()) {
result.append(new KonaTag(el.attribute("id", "0").toInt(),
el.attribute("name"),
el.attribute("count").toInt(),
el.attribute("type").toInt(),
toBool(el.attribute("ambiguous"))));
x++;
el = root.elementsByTagName("tag").at(x).toElement();
}
qDebug() << "KonaTags: Search finished!";
searchIsDone = true;
emit searchFinished(this);
}
else {
qDebug() << "KonaTags: ERROR: " << "Received HTTP error code: " << statusCode;
emit searchFailed(this, ERROR_SEARCH_HTTP);
}
}
void KonaTags::responseHeaderReceived(QHttpResponseHeader resp) {
statusCode = resp.statusCode();
}
void KonaTags::newSearch(QString Name, int Limit, int Page, QString Order, int Id, int AfterId, QString NamePattern) {
// Reset
searchIsDone = false;
result.clear();
// Update search info to RAM
if (Name != "__KEEPOLD__") name = Name;
if (Limit != -1) limit = Limit;
if (Page != -1) page = Page;
if (Order != "__KEEPOLD__") order = Order;
if (Id != -1) id = Id;
if (AfterId != -1) afterId = AfterId;
if (NamePattern != "__KEEPOLD__") namePattern = NamePattern;
file->close();
file->remove();
searchAgain();
}