decklist transfer code

This commit is contained in:
Max-Wilhelm Bruker 2009-11-18 19:59:03 +01:00
parent c5bf72b1bf
commit d3114fafbf
9 changed files with 248 additions and 36 deletions

View file

@ -4,8 +4,8 @@
#include <QXmlStreamReader>
#include <QXmlStreamWriter>
#include <QVariant>
#include <QDebug>
#include "decklist.h"
#include "carddatabase.h"
AbstractDecklistNode::AbstractDecklistNode(InnerDecklistNode *_parent)
: parent(_parent), currentItem(0)
@ -185,7 +185,7 @@ bool DeckList::readElement(QXmlStreamReader *xml)
if (currentZone) {
if (currentZone->readElement(xml))
currentZone = 0;
return true;
return false;
}
if (xml->isEndElement()) {
@ -193,17 +193,17 @@ bool DeckList::readElement(QXmlStreamReader *xml)
name = currentElementText;
else if (xml->name() == "comments")
comments = currentElementText;
else
return false;
else if (xml->name() == "cockatrice_deck") {
qDebug() << "deck finished!";
return true;
}
currentElementText.clear();
} else if (xml->isStartElement() && (xml->name() == "zone"))
currentZone = new InnerDecklistNode(xml->attributes().value("name").toString(), root);
else if (xml->isCharacters() && !xml->isWhitespace())
currentElementText = xml->text().toString();
else
return false;
return true;
return false;
}
void DeckList::writeElement(QXmlStreamWriter *xml)
@ -219,25 +219,29 @@ void DeckList::writeElement(QXmlStreamWriter *xml)
xml->writeEndElement(); // cockatrice_deck
}
bool DeckList::loadFromFile_Native(QIODevice *device)
bool DeckList::loadFromXml(QXmlStreamReader *xml)
{
QXmlStreamReader xml(device);
while (!xml.atEnd()) {
xml.readNext();
if (xml.isStartElement()) {
if (xml.name() != "cockatrice_deck")
while (!xml->atEnd()) {
xml->readNext();
if (xml->isStartElement()) {
if (xml->name() != "cockatrice_deck")
return false;
while (!xml.atEnd()) {
xml.readNext();
if (!readElement(&xml))
if (xml.isEndElement() && (xml.name() == "cockatrice_deck"))
return true;
while (!xml->atEnd()) {
xml->readNext();
if (readElement(xml))
return true;
}
}
}
return false;
}
bool DeckList::loadFromFile_Native(QIODevice *device)
{
QXmlStreamReader xml(device);
return loadFromXml(&xml);
}
bool DeckList::saveToFile_Native(QIODevice *device)
{
QXmlStreamWriter xml(device);

View file

@ -103,6 +103,7 @@ public:
bool readElement(QXmlStreamReader *xml);
void writeElement(QXmlStreamWriter *xml);
bool loadFromXml(QXmlStreamReader *xml);
bool loadFromFile_Native(QIODevice *device);
bool saveToFile_Native(QIODevice *device);

View file

@ -3,6 +3,7 @@
#include <QDebug>
#include "protocol.h"
#include "protocol_items.h"
#include "decklist.h"
QHash<QString, ProtocolItem::NewItemFunction> ProtocolItem::itemNameHash;
@ -69,6 +70,7 @@ void ProtocolItem::initializeHash()
itemNameHash.insert("resp", ProtocolResponse::newItem);
ProtocolResponse::initializeHash();
itemNameHash.insert("respdeck_list", Response_DeckList::newItem);
itemNameHash.insert("respdeck_download", Response_DeckDownload::newItem);
itemNameHash.insert("generic_eventlist_games", Event_ListGames::newItem);
itemNameHash.insert("generic_eventlist_chat_channels", Event_ListChatChannels::newItem);
@ -99,6 +101,49 @@ void Command::processResponse(ProtocolResponse *response)
emit finished(response->getResponseCode());
}
Command_DeckUpload::Command_DeckUpload(int _cmdId, DeckList *_deck, const QString &_path)
: Command("deck_upload", _cmdId), deck(_deck), path(_path), readFinished(false)
{
setParameter("path", path);
}
Command_DeckUpload::~Command_DeckUpload()
{
delete deck;
}
void Command_DeckUpload::extractParameters()
{
Command::extractParameters();
path = parameters["path"];
}
bool Command_DeckUpload::readElement(QXmlStreamReader *xml)
{
if (readFinished)
return false;
if (!deck) {
if (xml->isStartElement() && (xml->name() == "cockatrice_deck")) {
deck = new DeckList;
return true;
}
return false;
}
if (deck->readElement(xml))
readFinished = true;
return true;
}
void Command_DeckUpload::writeElement(QXmlStreamWriter *xml)
{
if (deck)
deck->writeElement(xml);
}
QHash<QString, ResponseCode> ProtocolResponse::responseHash;
ProtocolResponse::ProtocolResponse(int _cmdId, ResponseCode _responseCode, const QString &_itemName)
@ -180,7 +225,7 @@ void Response_DeckList::Directory::writeElement(QXmlStreamWriter *xml)
}
Response_DeckList::Response_DeckList(int _cmdId, ResponseCode _responseCode, Directory *_root)
: ProtocolResponse(_cmdId, _responseCode, "deck_list"), root(_root)
: ProtocolResponse(_cmdId, _responseCode, "deck_list"), root(_root), readFinished(false)
{
}
@ -191,13 +236,20 @@ Response_DeckList::~Response_DeckList()
bool Response_DeckList::readElement(QXmlStreamReader *xml)
{
if (readFinished)
return false;
if (!root) {
if (xml->isStartElement() && (xml->name() == "directory"))
if (xml->isStartElement() && (xml->name() == "directory")) {
root = new Directory;
return true;
}
return false;
}
return !root->readElement(xml);
if (root->readElement(xml))
readFinished = true;
return true;
}
void Response_DeckList::writeElement(QXmlStreamWriter *xml)
@ -205,6 +257,56 @@ void Response_DeckList::writeElement(QXmlStreamWriter *xml)
root->writeElement(xml);
}
Response_DeckDownload::Response_DeckDownload(int _cmdId, ResponseCode _responseCode, DeckList *_deck)
: ProtocolResponse(_cmdId, _responseCode, "deck_download"), deck(_deck), readFinished(false)
{
}
Response_DeckDownload::~Response_DeckDownload()
{
delete deck;
}
bool Response_DeckDownload::readElement(QXmlStreamReader *xml)
{
if (readFinished)
return false;
if (!deck) {
if (xml->isStartElement() && (xml->name() == "cockatrice_deck")) {
deck = new DeckList;
return true;
}
return false;
}
if (deck->readElement(xml))
readFinished = true;
return true;
}
void Response_DeckDownload::writeElement(QXmlStreamWriter *xml)
{
if (deck)
deck->writeElement(xml);
}
Response_DeckUpload::Response_DeckUpload(int _cmdId, ResponseCode _responseCode, int _deckId)
: ProtocolResponse(_cmdId, _responseCode, "deck_upload"), deckId(_deckId)
{
setParameter("deck_id", deckId);
}
void Response_DeckUpload::extractParameters()
{
ProtocolResponse::extractParameters();
bool ok;
deckId = parameters["deck_id"].toInt(&ok);
if (!ok)
deckId = -1;
}
GenericEvent::GenericEvent(const QString &_eventName)
: ProtocolItem(_eventName)
{

View file

@ -14,13 +14,16 @@ class QXmlStreamWriter;
class QXmlStreamAttributes;
class ProtocolResponse;
class DeckList;
enum ItemId {
ItemId_Command_DeckUpload = ItemId_Other + 1,
ItemId_Event_ListChatChannels = ItemId_Other + 2,
ItemId_Event_ChatListPlayers = ItemId_Other + 3,
ItemId_Event_ListGames = ItemId_Other + 4,
ItemId_Response_DeckList = ItemId_Other + 5
ItemId_Response_DeckList = ItemId_Other + 5,
ItemId_Response_DeckDownload = ItemId_Other + 6,
ItemId_Response_DeckUpload = ItemId_Other + 7
};
class ProtocolItem : public QObject {
@ -123,10 +126,21 @@ public:
class Command_DeckUpload : public Command {
Q_OBJECT
private:
DeckList *deck;
QString path;
bool readFinished;
protected:
void extractParameters();
bool readElement(QXmlStreamReader *xml);
void writeElement(QXmlStreamWriter *xml);
public:
Command_DeckUpload(int _cmdId = -1) : Command("deck_upload", _cmdId) { }
Command_DeckUpload(int _cmdId = -1, DeckList *_deck = 0, const QString &_path = QString());
~Command_DeckUpload();
static ProtocolItem *newItem() { return new Command_DeckUpload; }
int getItemId() const { return ItemId_Command_DeckUpload; }
DeckList *getDeck() const { return deck; }
QString getPath() const { return path; }
};
// -----------------
@ -182,6 +196,7 @@ public:
};
private:
Directory *root;
bool readFinished;
protected:
bool readElement(QXmlStreamReader *xml);
void writeElement(QXmlStreamWriter *xml);
@ -193,6 +208,35 @@ public:
Directory *getRoot() const { return root; }
};
class Response_DeckDownload : public ProtocolResponse {
Q_OBJECT
private:
DeckList *deck;
bool readFinished;
protected:
bool readElement(QXmlStreamReader *xml);
void writeElement(QXmlStreamWriter *xml);
public:
Response_DeckDownload(int _cmdId = -1, ResponseCode _responseCode = RespOk, DeckList *_deck = 0);
~Response_DeckDownload();
int getItemId() const { return ItemId_Response_DeckDownload; }
static ProtocolItem *newItem() { return new Response_DeckDownload; }
DeckList *getDeck() const { return deck; }
};
class Response_DeckUpload : public ProtocolResponse {
Q_OBJECT
private:
int deckId;
protected:
void extractParameters();
public:
Response_DeckUpload(int _cmdId = -1, ResponseCode _responseCode = RespOk, int _deckId = -1);
int getItemId() const { return ItemId_Response_DeckUpload; }
static ProtocolItem *newItem() { return new Response_DeckUpload; }
int getDeckId() const { return deckId; }
};
// --------------
// --- EVENTS ---
// --------------

View file

@ -4,7 +4,7 @@
#include <QString>
#include <QColor>
enum ResponseCode { RespNothing, RespOk, RespInvalidCommand, RespNameNotFound, RespLoginNeeded, RespContextError, RespWrongPassword, RespSpectatorsNotAllowed };
enum ResponseCode { RespNothing, RespOk, RespInvalidCommand, RespInvalidData, RespNameNotFound, RespLoginNeeded, RespContextError, RespWrongPassword, RespSpectatorsNotAllowed };
class ServerChatChannelInfo {
private: