From ae6803f9f20ab6982063db01bc7acb574ec65981 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Tue, 13 Oct 2009 01:06:48 +0200 Subject: [PATCH] rewrote oracle importer --- cockatrice/src/carddatabase.h | 1 + cockatrice/translations/cockatrice_de.ts | 50 +-- cockatrice/translations/cockatrice_en.ts | 50 +-- oracle/oracle.pro | 6 +- oracle/sets.xml | 547 ++++++++++------------- oracle/src/main.cpp | 8 +- oracle/src/oracleimporter.cpp | 225 ++++++---- oracle/src/oracleimporter.h | 14 +- oracle/src/window_main.cpp | 60 +++ oracle/src/window_main.h | 26 ++ 10 files changed, 535 insertions(+), 452 deletions(-) create mode 100644 oracle/src/window_main.cpp create mode 100644 oracle/src/window_main.h diff --git a/cockatrice/src/carddatabase.h b/cockatrice/src/carddatabase.h index 0407fa83..11e0f1bf 100644 --- a/cockatrice/src/carddatabase.h +++ b/cockatrice/src/carddatabase.h @@ -72,6 +72,7 @@ public: QString getCardType() const { return cardtype; } QString getPowTough() const { return powtough; } QString getText() const { return text; } + void setText(const QString &_text) { text = _text; } QStringList getColors() const { return colors; } QString getPicURL() const { return picURL; } QString getMainCardType() const; diff --git a/cockatrice/translations/cockatrice_de.ts b/cockatrice/translations/cockatrice_de.ts index 66457c68..d3e64eb5 100644 --- a/cockatrice/translations/cockatrice_de.ts +++ b/cockatrice/translations/cockatrice_de.ts @@ -2008,32 +2008,32 @@ &Suchen nach: - + Deck &name: Deck &Name: - + &Comments: &Kommentare: - + Deck editor [*] Deck-Editor [*] - + &New deck &Neues Deck - + &Load deck... Deck &laden... - + &Save deck Deck &speichern @@ -2042,97 +2042,97 @@ Deck &speichern unter... - + Save deck &as... Deck s&peichern unter... - + &Print deck... Deck &drucken... - + &Close S&chließen - + Ctrl+Q Ctrl+Q - + &Edit sets... &Editionen bearbeiten... - + &Deck &Deck - + &Sets &Editionen - + Add card to &maindeck Karte zu&m Hauptdeck hinzufügen - + Ctrl+M Ctrl+M - + Add card to &sideboard Karte zum &Sideboard hinzufügen - + Ctrl+N Ctrl+N - + &Remove row Zeile entfe&rnen - + Del Entf - + &Increment number Anzahl er&höhen - + + + - + &Decrement number Anzahl v&erringern - + - - - + Are you sure? Bist du sicher? - + The decklist has been modified. Do you want to save the changes? Die Deckliste wurde verändert. diff --git a/cockatrice/translations/cockatrice_en.ts b/cockatrice/translations/cockatrice_en.ts index 5f7807f2..024c30a0 100644 --- a/cockatrice/translations/cockatrice_en.ts +++ b/cockatrice/translations/cockatrice_en.ts @@ -1498,127 +1498,127 @@ - + Deck &name: - + &Comments: - + Deck editor [*] - + &New deck - + &Load deck... - + &Save deck - + Save deck &as... - + &Print deck... - + &Close - + Ctrl+Q - + &Edit sets... - + &Deck - + &Sets - + Add card to &maindeck - + Ctrl+M - + Add card to &sideboard - + Ctrl+N - + &Remove row - + Del - + &Increment number - + + - + &Decrement number - + - - + Are you sure? - + The decklist has been modified. Do you want to save the changes? diff --git a/oracle/oracle.pro b/oracle/oracle.pro index 9c9c201e..69425921 100644 --- a/oracle/oracle.pro +++ b/oracle/oracle.pro @@ -4,7 +4,7 @@ DEPENDPATH += . src INCLUDEPATH += . src ../cockatrice/src MOC_DIR = build OBJECTS_DIR = build -QT += network svg +QT += network svg xml -HEADERS += src/oracleimporter.h ../cockatrice/src/carddatabase.h -SOURCES += src/main.cpp src/oracleimporter.cpp ../cockatrice/src/carddatabase.cpp +HEADERS += src/oracleimporter.h src/window_main.h ../cockatrice/src/carddatabase.h +SOURCES += src/main.cpp src/oracleimporter.cpp src/window_main.cpp ../cockatrice/src/carddatabase.cpp diff --git a/oracle/sets.xml b/oracle/sets.xml index eef70a04..e83a0065 100644 --- a/oracle/sets.xml +++ b/oracle/sets.xml @@ -1,354 +1,293 @@ http://www.wizards.com/global/images/magic/general/%1.jpg + http://gatherer.wizards.com/Pages/Search/Default.aspx?output=spoiler&method=text&set=["!longname!"] - 5E - Fifth Edition - http://www.crystalkeep.com/magic/rules/oracle/oracle-5th.txt - - - ST2K - Starter 2000 - http://www.crystalkeep.com/magic/rules/oracle/oracle-st2.txt - - - US - Urza's Saga - http://www.crystalkeep.com/magic/rules/oracle/oracle-us.txt - - - MR - Mirrodin - http://www.crystalkeep.com/magic/rules/oracle/oracle-mr.txt - - - NE - Nemesis - http://www.crystalkeep.com/magic/rules/oracle/oracle-ne.txt - - - VI - Visions - http://www.crystalkeep.com/magic/rules/oracle/oracle-vi.txt - - - FD - Fifth Dawn - http://www.crystalkeep.com/magic/rules/oracle/oracle-fd.txt - - - FE - Fallen Empires - http://www.crystalkeep.com/magic/rules/oracle/oracle-fe.txt - - - EX - Exodus - http://www.crystalkeep.com/magic/rules/oracle/oracle-ex.txt - - - 6E - Sixth Edition - http://www.crystalkeep.com/magic/rules/oracle/oracle-6th.txt - - - PLC - Planar Chaos - http://www.crystalkeep.com/magic/rules/oracle/oracle-pc.txt - - - 10E - Tenth Edition - http://www.crystalkeep.com/magic/rules/oracle/oracle-10.txt - - - CFX - Conflux - http://www.crystalkeep.com/magic/rules/oracle/oracle-cf.txt - - - P2 - Portal: Second Age - http://www.crystalkeep.com/magic/rules/oracle/oracle-pt2.txt - - - P3 - Portal: Three Kingdoms - http://www.crystalkeep.com/magic/rules/oracle/oracle-pt3.txt - - - OD - Odyssey - http://www.crystalkeep.com/magic/rules/oracle/oracle-od.txt - - - UNH - Unhinged - http://www.crystalkeep.com/magic/rules/oracle/oracle-uh.txt - - - BOK - Betrayers of Kamigawa - http://www.crystalkeep.com/magic/rules/oracle/oracle-bk.txt - - - LRW - Lorwyn - http://www.crystalkeep.com/magic/rules/oracle/oracle-lo.txt - - - WL - Weatherlight - http://www.crystalkeep.com/magic/rules/oracle/oracle-wl.txt - - - ON - Onslaught - http://www.crystalkeep.com/magic/rules/oracle/oracle-on.txt - - - 7E - Seventh Edition - http://www.crystalkeep.com/magic/rules/oracle/oracle-7th.txt - - - GP - Guildpact - http://www.crystalkeep.com/magic/rules/oracle/oracle-gp.txt - - - CHK - Champions of Kamigawa - http://www.crystalkeep.com/magic/rules/oracle/oracle-ck.txt - - - 8E - Eighth Edition - http://www.crystalkeep.com/magic/rules/oracle/oracle-8th.txt - - - HL - Homelands - http://www.crystalkeep.com/magic/rules/oracle/oracle-hl.txt - - - PR - Promo cards - promo.txt - - - PS - Planeshift - http://www.crystalkeep.com/magic/rules/oracle/oracle-ps.txt - - - PT - Portal - http://www.crystalkeep.com/magic/rules/oracle/oracle-pt.txt - - - IA - Ice Age - http://www.crystalkeep.com/magic/rules/oracle/oracle-ia.txt - - - SOK - Saviors of Kamigawa - http://www.crystalkeep.com/magic/rules/oracle/oracle-sk.txt - - - DIS - Dissension - http://www.crystalkeep.com/magic/rules/oracle/oracle-di.txt - - - PY - Prophecy - http://www.crystalkeep.com/magic/rules/oracle/oracle-py.txt - - - 9E - Ninth Edition - http://www.crystalkeep.com/magic/rules/oracle/oracle-9th.txt - - - B - Limited Edition - http://www.crystalkeep.com/magic/rules/oracle/oracle-lu.txt - - - IN - Invasion - http://www.crystalkeep.com/magic/rules/oracle/oracle-in.txt + ARB + Alara Reborn AL Alliances - http://www.crystalkeep.com/magic/rules/oracle/oracle-al.txt - - - AN - Arabian Nights - http://www.crystalkeep.com/magic/rules/oracle/oracle-an.txt - - - ARB - Alara Reborn - http://www.crystalkeep.com/magic/rules/oracle/oracle-ar.txt - - - AP - Apocalypse - http://www.crystalkeep.com/magic/rules/oracle/oracle-ap.txt AQ Antiquities - http://www.crystalkeep.com/magic/rules/oracle/oracle-aq.txt - SHM - Shadowmoor - http://www.crystalkeep.com/magic/rules/oracle/oracle-sm.txt + AP + Apocalypse - R - Revised Edition - http://www.crystalkeep.com/magic/rules/oracle/oracle-rv.txt + AN + Arabian Nights - U - Unlimited Edition - http://www.crystalkeep.com/magic/rules/oracle/oracle-lu.txt + BOK + Betrayers of Kamigawa - SC - Scourge - http://www.crystalkeep.com/magic/rules/oracle/oracle-sc.txt - - - SH - Stronghold - http://www.crystalkeep.com/magic/rules/oracle/oracle-sh.txt - - - JU - Judgment - http://www.crystalkeep.com/magic/rules/oracle/oracle-ju.txt + CHK + Champions of Kamigawa CH Chronicles - http://www.crystalkeep.com/magic/rules/oracle/oracle-ch.txt - MOR - Morningtide - http://www.crystalkeep.com/magic/rules/oracle/oracle-mt.txt - - - ST - Starter - http://www.crystalkeep.com/magic/rules/oracle/oracle-st.txt - - - TE - Tempest - http://www.crystalkeep.com/magic/rules/oracle/oracle-te.txt - - - ALA - Shards of Alara - http://www.crystalkeep.com/magic/rules/oracle/oracle-sa.txt - - - LE - Legions - http://www.crystalkeep.com/magic/rules/oracle/oracle-le.txt - - - FUT - Future Sight - http://www.crystalkeep.com/magic/rules/oracle/oracle-fs.txt + 6E + Classic Sixth Edition CS Coldsnap - http://www.crystalkeep.com/magic/rules/oracle/oracle-cs.txt - LG - Legends - http://www.crystalkeep.com/magic/rules/oracle/oracle-lg.txt - - - M10 - Magic 2010 - http://www.crystalkeep.com/magic/rules/oracle/oracle-m10.txt - - - RAV - Ravnica - http://www.crystalkeep.com/magic/rules/oracle/oracle-ra.txt - - - TO - Torment - http://www.crystalkeep.com/magic/rules/oracle/oracle-to.txt - - - EVE - Eventide - http://www.crystalkeep.com/magic/rules/oracle/oracle-et.txt - - - DK - The Dark - http://www.crystalkeep.com/magic/rules/oracle/oracle-dk.txt - - - 4E - Fourth Edition - http://www.crystalkeep.com/magic/rules/oracle/oracle-4th.txt - - - UD - Urza's Destiny - http://www.crystalkeep.com/magic/rules/oracle/oracle-ud.txt - - - TSP - Time Spiral - http://www.crystalkeep.com/magic/rules/oracle/oracle-ts.txt - - - UG - Unglued - http://www.crystalkeep.com/magic/rules/oracle/oracle-ug.txt + CFX + Conflux DS Darksteel - http://www.crystalkeep.com/magic/rules/oracle/oracle-ds.txt - UL - Urza's Legacy - http://www.crystalkeep.com/magic/rules/oracle/oracle-ul.txt + DIS + Dissension - MI - Mirage - http://www.crystalkeep.com/magic/rules/oracle/oracle-mi.txt + 8E + Eighth Edition + + + EVE + Eventide + + + EX + Exodus + + + FE + Fallen Empires + + + FD + Fifth Dawn + + + 5E + Fifth Edition + + + 4E + Fourth Edition + + + FUT + Future Sight + + + GP + Guildpact + + + HL + Homelands + + + IA + Ice Age + + + IN + Invasion + + + JU + Judgment + + + LG + Legends + + + LE + Legions + + + A + Limited Edition Alpha + + + B + Limited Edition Beta + + + LRW + Lorwyn + + + M10 + Magic 2010 MM Mercadian Masques - http://www.crystalkeep.com/magic/rules/oracle/oracle-mm.txt + + + MI + Mirage + + + MR + Mirrodin + + + MOR + Morningtide + + + NE + Nemesis + + + 9E + Ninth Edition + + + OD + Odyssey + + + ON + Onslaught + + + PLC + Planar Chaos + + + PS + Planeshift + + + PT + Portal + + + P2 + Portal Second Age + + + P3 + Portal Three Kingdoms + + + PR + Promo set for Gatherer + + + PY + Prophecy + + + RAV + Ravnica: City of Guilds + + + R + Revised Edition + + + SOK + Saviors of Kamigawa + + + SC + Scourge + + + 7E + Seventh Edition + + + SHM + Shadowmoor + + + ALA + Shards of Alara + + + ST + Starter 1999 + + + ST2K + Starter 2000 + + + SH + Stronghold + + + TE + Tempest + + + 10E + Tenth Edition + + + DK + The Dark + + + TSP + Time Spiral + + + TSB + Time Spiral "Timeshifted" + + + TO + Torment + + + UG + Unglued + + + UNH + Unhinged + + + U + Unlimited Edition + + + UD + Urza's Destiny + + + UL + Urza's Legacy + + + US + Urza's Saga + + + VI + Visions + + + WL + Weatherlight ZEN Zendikar - http://www.crystalkeep.com/magic/rules/oracle/oracle-ze.txt diff --git a/oracle/src/main.cpp b/oracle/src/main.cpp index 0c33bc83..cd572940 100644 --- a/oracle/src/main.cpp +++ b/oracle/src/main.cpp @@ -1,12 +1,16 @@ #include +#include #include "oracleimporter.h" +#include "window_main.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); - OracleImporter importer("../oracle"); - importer.downloadNextFile(); + QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); + + WindowMain wnd; + wnd.show(); return app.exec(); } diff --git a/oracle/src/oracleimporter.cpp b/oracle/src/oracleimporter.cpp index 9d70ec71..6104c89d 100644 --- a/oracle/src/oracleimporter.cpp +++ b/oracle/src/oracleimporter.cpp @@ -2,9 +2,10 @@ #include #include #include +#include -OracleImporter::OracleImporter(const QString &_dataDir) - : dataDir(_dataDir), setIndex(-1) +OracleImporter::OracleImporter(const QString &_dataDir, QObject *parent) + : CardDatabase(parent), dataDir(_dataDir), setIndex(-1) { QFile setsFile(dataDir + "/sets.xml"); setsFile.open(QIODevice::ReadOnly | QIODevice::Text); @@ -24,101 +25,142 @@ OracleImporter::OracleImporter(const QString &_dataDir) edition = xml.readElementText(); else if (xml.name() == "longname") editionLong = xml.readElementText(); - else if(xml.name() == "url") + else if (xml.name() == "url") editionURL = xml.readElementText(); } setsToDownload << SetToDownload(edition, editionLong, editionURL); + edition = editionLong = editionURL = QString(); } else if (xml.name() == "picture_url") pictureUrl = xml.readElementText(); + else if (xml.name() == "set_url") + setUrl = xml.readElementText(); } buffer = new QBuffer(this); http = new QHttp(this); connect(http, SIGNAL(requestFinished(int, bool)), this, SLOT(httpRequestFinished(int, bool))); connect(http, SIGNAL(responseHeaderReceived(const QHttpResponseHeader &)), this, SLOT(readResponseHeader(const QHttpResponseHeader &))); + connect(http, SIGNAL(dataReadProgress(int, int)), this, SIGNAL(dataReadProgress(int, int))); } -void OracleImporter::importOracleFile(CardSet *set) +CardInfo *OracleImporter::addCard(QString cardName, const QString &cardCost, const QString &cardType, const QString &cardPT, const QStringList &cardText) +{ + QString fullCardText = cardText.join("\n"); + bool splitCard = false; + if (cardName.contains('(')) { + cardName.remove(QRegExp(" \\(.*\\)")); + splitCard = true; + } + + CardInfo *card; + if (cardHash.contains(cardName)) { + card = cardHash.value(cardName); + if (splitCard && !card->getText().contains(fullCardText)) + card->setText(card->getText() + "\n---\n" + fullCardText); + } else { + // Workaround for card name weirdness + if (cardName.contains("XX")) + cardName.remove("XX"); + + bool mArtifact = false; + if (cardType.endsWith("Artifact")) + for (int i = 0; i < cardText.size(); ++i) + if (cardText[i].contains("{T}") && cardText[i].contains("to your mana pool")) + mArtifact = true; + + QStringList colors; + QStringList allColors = QStringList() << "W" << "U" << "B" << "R" << "G"; + for (int i = 0; i < allColors.size(); i++) + if (cardCost.contains(allColors[i])) + colors << allColors[i]; + + if (cardText.contains(cardName + " is white.")) + colors << "W"; + if (cardText.contains(cardName + " is blue.")) + colors << "U"; + if (cardText.contains(cardName + " is black.")) + colors << "B"; + if (cardText.contains(cardName + " is red.")) + colors << "R"; + if (cardText.contains(cardName + " is green.")) + colors << "G"; + + card = new CardInfo(this, cardName, cardCost, cardType, cardPT, fullCardText, colors); + card->setPicURL(getURLFromName(normalizeName(cardName))); + int tableRow = 1; + QString mainCardType = card->getMainCardType(); + if ((mainCardType == "Land") || mArtifact) + tableRow = 0; + else if ((mainCardType == "Sorcery") || (mainCardType == "Instant")) + tableRow = 2; + else if (mainCardType == "Creature") + tableRow = 3; + card->setTableRow(tableRow); + + cardHash.insert(cardName, card); + } + return card; +} + +int OracleImporter::importTextSpoiler(CardSet *set, const QByteArray &data) { int cards = 0; - buffer->seek(0); - QTextStream in(buffer); - while (!in.atEnd()) { - QString cardname = in.readLine(); - if (cardname.isEmpty()) - continue; - if (cardname.contains("XX")){ - cardname.remove("XX"); + QString bufferContents(data); + + // Workaround for ampersand bug in text spoilers + int index = -1; + while ((index = bufferContents.indexOf('&', index + 1)) != -1) { + int semicolonIndex = bufferContents.indexOf(';', index); + if (semicolonIndex > 5) { + bufferContents.insert(index + 1, "amp;"); + index += 4; } - - QString manacost = in.readLine(); - QString cardtype, powtough; - QStringList text; - if ((manacost.contains("Land")) || (manacost.contains("Sorcery")) || (manacost.contains("Instant")) || (manacost.contains("Artifact"))) { - cardtype = manacost; - manacost.clear(); - } else { - cardtype = in.readLine(); - powtough = in.readLine(); - // Dirty hack. - // Cards to test: Any creature, any basic land, Ancestral Vision, Fire // Ice. - if (!powtough.contains("/") || powtough.size() > 5) { - text << powtough; - powtough = QString(); - } - } - QString line = in.readLine(); - QString firstTextLine = line; - bool manaArtifact = false; - while (!line.isEmpty()) { - text << line; - line = in.readLine(); - } - // Table row override - if (cardtype.endsWith("Artifact")) - for (int i = 0; i < text.size(); ++i) - if (text[i].contains("{T}") && text[i].contains("to your mana pool")) - manaArtifact = true; - CardInfo *card; - if (cardHash.contains(cardname)) - card = cardHash.value(cardname); - else { - QStringList colors; - QStringList allColors = QStringList() << "W" << "U" << "B" << "R" << "G"; - for (int i = 0; i < allColors.size(); i++) - if (manacost.contains(allColors[i])) - colors << allColors[i]; - - QString wholeText = text.join(";"); - if (text.contains(cardname + " is white.")) - colors << "W"; - if (text.contains(cardname + " is blue.")) - colors << "U"; - if (text.contains(cardname + " is black.")) - colors << "B"; - if (text.contains(cardname + " is red.")) - colors << "R"; - if (text.contains(cardname + " is green.")) - colors << "G"; - - card = new CardInfo(this, cardname, manacost, cardtype, powtough, text.join("\n"), colors); - card->setPicURL(getURLFromName(normalizeName(cardname))); - int tableRow = 1; - QString mainCardType = card->getMainCardType(); - if ((mainCardType == "Land") || manaArtifact) - tableRow = 0; - else if ((mainCardType == "Sorcery") || (mainCardType == "Instant")) - tableRow = 2; - else if (mainCardType == "Creature") - tableRow = 3; - card->setTableRow(tableRow); - - cardHash.insert(cardname, card); - } - card->addToSet(set); - cards++; } - qDebug(QString("%1: %2 cards imported").arg(set->getLongName()).arg(cards).toLatin1()); + + QDomDocument doc; + QString errorMsg; + int errorLine, errorColumn; + if (!doc.setContent(bufferContents, &errorMsg, &errorLine, &errorColumn)) + qDebug(QString("error: %1, line=%2, column=%3").arg(errorMsg).arg(errorLine).arg(errorColumn).toLatin1()); + + QDomNodeList divs = doc.elementsByTagName("div"); + for (int i = 0; i < divs.size(); ++i) { + QDomElement div = divs.at(i).toElement(); + QDomNode divClass = div.attributes().namedItem("class"); + if (divClass.nodeValue() == "textspoiler") { + QString cardName, cardCost, cardType, cardPT, cardText; + + QDomNodeList trs = div.elementsByTagName("tr"); + for (int j = 0; j < trs.size(); ++j) { + QDomElement tr = trs.at(j).toElement(); + QDomNodeList tds = tr.elementsByTagName("td"); + if (tds.size() != 2) { + CardInfo *card = addCard(cardName, cardCost, cardType, cardPT, cardText.split("\n")); + if (!set->contains(card)) { + card->addToSet(set); + cards++; + } + cardName = cardCost = cardType = cardPT = cardText = QString(); + } else { + QString v1 = tds.at(0).toElement().text().simplified(); + QString v2 = tds.at(1).toElement().text().replace(trUtf8("—"), "-"); + + if (v1 == "Name:") + cardName = v2.simplified(); + else if (v1 == "Cost:") + cardCost = v2.simplified(); + else if (v1 == "Type:") + cardType = v2.simplified(); + else if (v1 == "Pow/Tgh:") + cardPT = v2.simplified(); + else if (v1 == "Rules Text:") + cardText = v2.trimmed(); + } + } + break; + } + } + return cards; } QString OracleImporter::normalizeName(QString cardname) @@ -146,18 +188,22 @@ QString OracleImporter::getURLFromName(QString normalizedName) void OracleImporter::downloadNextFile() { if (setIndex == -1) { - progressDialog = new QProgressDialog(tr("Downloading oracle files..."), QString(), 0, setsToDownload.size()); setIndex = 0; + emit setIndexChanged(0, 0, setsToDownload[0].getLongName()); } QString urlString = setsToDownload[setIndex].getUrl(); + if (urlString.isEmpty()) + urlString = setUrl; + urlString = urlString.replace("!longname!", setsToDownload[setIndex].getLongName()); if (urlString.startsWith("http://")) { QUrl url(urlString); http->setHost(url.host(), QHttp::ConnectionModeHttp, url.port() == -1 ? 0 : url.port()); + QString path = QUrl::toPercentEncoding(urlString.mid(url.host().size() + 7).replace(' ', '+'), "?!$&'()*+,;=:@/"); buffer->close(); buffer->setData(QByteArray()); buffer->open(QIODevice::ReadWrite | QIODevice::Text); - reqId = http->get(QUrl::toPercentEncoding(url.path(), "!$&'()*+,;=:@/"), buffer); + reqId = http->get(path, buffer); } else { QFile file(dataDir + "/" + urlString); file.open(QIODevice::ReadOnly | QIODevice::Text); @@ -182,16 +228,20 @@ void OracleImporter::httpRequestFinished(int requestId, bool error) CardSet *set = new CardSet(setsToDownload[setIndex].getShortName(), setsToDownload[setIndex].getLongName()); if (!setHash.contains(set->getShortName())) setHash.insert(set->getShortName(), set); - importOracleFile(set); - progressDialog->setValue(++setIndex); + + buffer->seek(0); + buffer->close(); + int cards = importTextSpoiler(set, buffer->data()); + ++setIndex; if (setIndex == setsToDownload.size()) { setIndex = -1; saveToFile(dataDir + "/cards.xml"); - QMessageBox::information(0, tr("Import finished"), tr("Total: %1 cards imported").arg(cardHash.size())); - qApp->quit(); - } else + emit setIndexChanged(cards, setIndex, QString()); + } else { downloadNextFile(); + emit setIndexChanged(cards, setIndex, setsToDownload[setIndex].getLongName()); + } } void OracleImporter::readResponseHeader(const QHttpResponseHeader &responseHeader) @@ -205,7 +255,6 @@ void OracleImporter::readResponseHeader(const QHttpResponseHeader &responseHeade break; default: QMessageBox::information(0, tr("HTTP"), tr("Download failed: %1.").arg(responseHeader.reasonPhrase())); - progressDialog->hide(); http->abort(); deleteLater(); } diff --git a/oracle/src/oracleimporter.h b/oracle/src/oracleimporter.h index 314a223f..6c219467 100644 --- a/oracle/src/oracleimporter.h +++ b/oracle/src/oracleimporter.h @@ -4,7 +4,6 @@ #include #include -class QProgressDialog; class QBuffer; class SetToDownload { @@ -22,22 +21,27 @@ class OracleImporter : public CardDatabase { Q_OBJECT private: QList setsToDownload; - QString pictureUrl; + QString pictureUrl, setUrl; QString dataDir; int setIndex; int reqId; QBuffer *buffer; QHttp *http; - QProgressDialog *progressDialog; QString normalizeName(QString); QString getURLFromName(QString); + + CardInfo *addCard(QString cardName, const QString &cardCost, const QString &cardType, const QString &cardPT, const QStringList &cardText); private slots: void httpRequestFinished(int requestId, bool error); void readResponseHeader(const QHttpResponseHeader &responseHeader); +signals: + void setIndexChanged(int cardsImported, int setIndex, const QString &nextSetName); + void dataReadProgress(int bytesRead, int totalBytes); public: - OracleImporter(const QString &_dataDir); - void importOracleFile(CardSet *set); + OracleImporter(const QString &_dataDir, QObject *parent = 0); + int importTextSpoiler(CardSet *set, const QByteArray &data); void downloadNextFile(); + int getSetsCount() const { return setsToDownload.size(); } }; #endif diff --git a/oracle/src/window_main.cpp b/oracle/src/window_main.cpp new file mode 100644 index 00000000..ddd0ac4a --- /dev/null +++ b/oracle/src/window_main.cpp @@ -0,0 +1,60 @@ +#include +#include "window_main.h" +#include "oracleimporter.h" + +WindowMain::WindowMain(QWidget *parent) + : QMainWindow(parent) +{ + importer = new OracleImporter("../oracle", this); + + totalLabel = new QLabel(tr("Total progress:")); + totalProgressBar = new QProgressBar; + nextSetLabel1 = new QLabel(tr("Current file:")); + nextSetLabel2 = new QLabel; + fileLabel = new QLabel(tr("Progress:")); + fileProgressBar = new QProgressBar; + + messageLog = new QTextEdit; + messageLog->setReadOnly(true); + + QGridLayout *grid = new QGridLayout; + grid->addWidget(totalLabel, 0, 0); + grid->addWidget(totalProgressBar, 0, 1); + grid->addWidget(nextSetLabel1, 1, 0); + grid->addWidget(nextSetLabel2, 1, 1); + grid->addWidget(fileLabel, 2, 0); + grid->addWidget(fileProgressBar, 2, 1); + grid->addWidget(messageLog, 3, 0, 1, 2); + + QWidget *centralWidget = new QWidget; + centralWidget->setLayout(grid); + setCentralWidget(centralWidget); + + connect(importer, SIGNAL(setIndexChanged(int, int, const QString &)), this, SLOT(updateTotalProgress(int, int, const QString &))); + connect(importer, SIGNAL(dataReadProgress(int, int)), this, SLOT(updateFileProgress(int, int))); + totalProgressBar->setMaximum(importer->getSetsCount()); + + setWindowTitle(tr("Oracle importer")); + setFixedSize(300, 300); + + importer->downloadNextFile(); +} + +void WindowMain::updateTotalProgress(int cardsImported, int setIndex, const QString &nextSetName) +{ + if (setIndex != 0) + messageLog->append(QString("%1: %2 cards imported").arg(nextSetLabel2->text()).arg(cardsImported)); + totalProgressBar->setValue(setIndex); + if (nextSetName.isEmpty()) { + QMessageBox::information(this, tr("Oracle importer"), tr("Import finished: %1 cards.").arg(importer->getCardList().size())); + qApp->quit(); + } else { + nextSetLabel2->setText(nextSetName); + } +} + +void WindowMain::updateFileProgress(int bytesRead, int totalBytes) +{ + fileProgressBar->setMaximum(totalBytes); + fileProgressBar->setValue(bytesRead); +} diff --git a/oracle/src/window_main.h b/oracle/src/window_main.h new file mode 100644 index 00000000..19c83a7a --- /dev/null +++ b/oracle/src/window_main.h @@ -0,0 +1,26 @@ +#ifndef WINDOW_MAIN_H +#define WINDOW_MAIN_H + +#include + +class OracleImporter; +class QLabel; +class QProgressBar; +class QTextEdit; + +class WindowMain : public QMainWindow { + Q_OBJECT +private: + OracleImporter *importer; + + QLabel *totalLabel, *fileLabel, *nextSetLabel1, *nextSetLabel2; + QProgressBar *totalProgressBar, *fileProgressBar; + QTextEdit *messageLog; +private slots: + void updateTotalProgress(int cardsImported, int setIndex, const QString &nextSetName); + void updateFileProgress(int bytesRead, int totalBytes); +public: + WindowMain(QWidget *parent = 0); +}; + +#endif