From 207d10d3e2ab72170ceb0b7db62bcf2ba52ecffc Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Tue, 1 Dec 2009 10:43:46 +0100 Subject: [PATCH] XML fix --- cockatrice/src/client.cpp | 47 +++++++++++------------- cockatrice/src/tab_deck_storage.cpp | 6 +++ common/decklist.cpp | 4 +- common/decklist.h | 2 +- common/protocol.cpp | 5 ++- common/protocol.h | 5 +-- common/serializable_item.cpp | 36 ++++++++++-------- common/serializable_item.h | 19 +++++----- servatrice/src/serversocketinterface.cpp | 19 ++++------ 9 files changed, 73 insertions(+), 70 deletions(-) diff --git a/cockatrice/src/client.cpp b/cockatrice/src/client.cpp index 4738797e..b95077f9 100644 --- a/cockatrice/src/client.cpp +++ b/cockatrice/src/client.cpp @@ -58,33 +58,28 @@ void Client::readData() qDebug() << data; xmlReader->addData(data); - if (topLevelItem) - topLevelItem->read(xmlReader); - else { - while (!xmlReader->atEnd()) { - xmlReader->readNext(); - if (xmlReader->isStartElement() && (xmlReader->name().toString() == "cockatrice_server_stream")) { - int serverVersion = xmlReader->attributes().value("version").toString().toInt(); - if (serverVersion != ProtocolItem::protocolVersion) { - emit protocolVersionMismatch(ProtocolItem::protocolVersion, serverVersion); - disconnectFromServer(); - return; - } - xmlWriter->writeStartDocument(); - xmlWriter->writeStartElement("cockatrice_client_stream"); - xmlWriter->writeAttribute("version", QString::number(ProtocolItem::protocolVersion)); - - topLevelItem = new TopLevelProtocolItem; - connect(topLevelItem, SIGNAL(protocolItemReceived(ProtocolItem *)), this, SLOT(processProtocolItem(ProtocolItem *))); - - setStatus(StatusLoggingIn); - Command_Login *cmdLogin = new Command_Login(userName, password); - connect(cmdLogin, SIGNAL(finished(ResponseCode)), this, SLOT(loginResponse(ResponseCode))); - sendCommand(cmdLogin); - - if (topLevelItem) - topLevelItem->read(xmlReader); + while (!xmlReader->atEnd()) { + xmlReader->readNext(); + if (topLevelItem) + topLevelItem->readElement(xmlReader); + else if (xmlReader->isStartElement() && (xmlReader->name().toString() == "cockatrice_server_stream")) { + int serverVersion = xmlReader->attributes().value("version").toString().toInt(); + if (serverVersion != ProtocolItem::protocolVersion) { + emit protocolVersionMismatch(ProtocolItem::protocolVersion, serverVersion); + disconnectFromServer(); + return; } + xmlWriter->writeStartDocument(); + xmlWriter->writeStartElement("cockatrice_client_stream"); + xmlWriter->writeAttribute("version", QString::number(ProtocolItem::protocolVersion)); + + topLevelItem = new TopLevelProtocolItem; + connect(topLevelItem, SIGNAL(protocolItemReceived(ProtocolItem *)), this, SLOT(processProtocolItem(ProtocolItem *))); + + setStatus(StatusLoggingIn); + Command_Login *cmdLogin = new Command_Login(userName, password); + connect(cmdLogin, SIGNAL(finished(ResponseCode)), this, SLOT(loginResponse(ResponseCode))); + sendCommand(cmdLogin); } } if (status == StatusDisconnecting) diff --git a/cockatrice/src/tab_deck_storage.cpp b/cockatrice/src/tab_deck_storage.cpp index 4c6d4a23..56154ab0 100644 --- a/cockatrice/src/tab_deck_storage.cpp +++ b/cockatrice/src/tab_deck_storage.cpp @@ -102,6 +102,12 @@ void TabDeckStorage::actUpload() DeckList *deck = new DeckList; if (!deck->loadFromFile(filePath, DeckList::CockatriceFormat)) return; + if (deck->getName().isEmpty()) { + QString deckName = QInputDialog::getText(this, tr("Enter deck name"), tr("This decklist does not have a name.\nPlease enter a name:"), QLineEdit::Normal, tr("Unnamed deck")); + if (deckName.isEmpty()) + deckName = tr("Unnamed deck"); + deck->setName(deckName); + } QString targetPath; QTreeWidgetItem *curRight = serverDirView->currentItem(); diff --git a/common/decklist.cpp b/common/decklist.cpp index 4588084b..32167c32 100644 --- a/common/decklist.cpp +++ b/common/decklist.cpp @@ -5,6 +5,7 @@ #include #include #include "decklist.h" +#include AbstractDecklistNode::AbstractDecklistNode(InnerDecklistNode *_parent) : parent(_parent), currentItem(0) @@ -212,7 +213,7 @@ DeckList::~DeckList() delete root; } -void DeckList::readElement(QXmlStreamReader *xml) +bool DeckList::readElement(QXmlStreamReader *xml) { if (currentZone) { if (currentZone->readElement(xml)) @@ -228,6 +229,7 @@ void DeckList::readElement(QXmlStreamReader *xml) currentZone = new InnerDecklistNode(xml->attributes().value("name").toString(), root); else if (xml->isCharacters() && !xml->isWhitespace()) currentElementText = xml->text().toString(); + return SerializableItem::readElement(xml); } void DeckList::writeElement(QXmlStreamWriter *xml) diff --git a/common/decklist.h b/common/decklist.h index cd235241..31d3df94 100644 --- a/common/decklist.h +++ b/common/decklist.h @@ -107,7 +107,7 @@ public: QString getLastFileName() const { return lastFileName; } FileFormat getLastFileFormat() const { return lastFileFormat; } - void readElement(QXmlStreamReader *xml); + bool readElement(QXmlStreamReader *xml); void writeElement(QXmlStreamWriter *xml); void loadFromXml(QXmlStreamReader *xml); diff --git a/common/protocol.cpp b/common/protocol.cpp index 154777f7..edfa6e8f 100644 --- a/common/protocol.cpp +++ b/common/protocol.cpp @@ -53,7 +53,7 @@ TopLevelProtocolItem::TopLevelProtocolItem() bool TopLevelProtocolItem::readCurrentItem(QXmlStreamReader *xml) { if (currentItem) { - if (currentItem->read(xml)) { + if (currentItem->readElement(xml)) { emit protocolItemReceived(currentItem); currentItem = 0; } @@ -62,7 +62,7 @@ bool TopLevelProtocolItem::readCurrentItem(QXmlStreamReader *xml) return false; } -void TopLevelProtocolItem::readElement(QXmlStreamReader *xml) +bool TopLevelProtocolItem::readElement(QXmlStreamReader *xml) { if (!readCurrentItem(xml) && (xml->isStartElement())) { QString childName = xml->name().toString(); @@ -74,6 +74,7 @@ void TopLevelProtocolItem::readElement(QXmlStreamReader *xml) readCurrentItem(xml); } + return SerializableItem::readElement(xml); } void TopLevelProtocolItem::writeElement(QXmlStreamWriter * /*xml*/) diff --git a/common/protocol.h b/common/protocol.h index d2b3be87..fb488586 100644 --- a/common/protocol.h +++ b/common/protocol.h @@ -58,11 +58,10 @@ signals: private: ProtocolItem *currentItem; bool readCurrentItem(QXmlStreamReader *xml); -protected: - void readElement(QXmlStreamReader *xml); - void writeElement(QXmlStreamWriter *xml); public: TopLevelProtocolItem(); + bool readElement(QXmlStreamReader *xml); + void writeElement(QXmlStreamWriter *xml); }; // ---------------- diff --git a/common/serializable_item.cpp b/common/serializable_item.cpp index a3feb049..ce6c504c 100644 --- a/common/serializable_item.cpp +++ b/common/serializable_item.cpp @@ -17,14 +17,10 @@ void SerializableItem::registerSerializableItem(const QString &name, NewItemFunc itemNameHash.insert(name, func); } -bool SerializableItem::read(QXmlStreamReader *xml) +bool SerializableItem::readElement(QXmlStreamReader *xml) { - while (!xml->atEnd()) { - xml->readNext(); - readElement(xml); - if (xml->isEndElement() && (xml->name() == itemType)) - return true; - } + if (xml->isEndElement() && (xml->name() == itemType)) + return true; return false; } @@ -46,12 +42,14 @@ SerializableItem_Map::~SerializableItem_Map() delete itemList[i]; } -void SerializableItem_Map::readElement(QXmlStreamReader *xml) +bool SerializableItem_Map::readElement(QXmlStreamReader *xml) { if (currentItem) { - if (currentItem->read(xml)) + if (currentItem->readElement(xml)) currentItem = 0; - } else if (xml->isEndElement() && (xml->name() == itemType)) + } else if (firstItem) + firstItem = false; + else if (xml->isEndElement() && (xml->name() == itemType)) extractData(); else if (xml->isStartElement()) { QString childName = xml->name().toString(); @@ -63,9 +61,10 @@ void SerializableItem_Map::readElement(QXmlStreamReader *xml) if (!currentItem) currentItem = new SerializableItem_Invalid(childName); } - if (currentItem->read(xml)) + if (currentItem->readElement(xml)) currentItem = 0; } + return SerializableItem::readElement(xml); } void SerializableItem_Map::writeElement(QXmlStreamWriter *xml) @@ -77,10 +76,11 @@ void SerializableItem_Map::writeElement(QXmlStreamWriter *xml) itemList[i]->write(xml); } -void SerializableItem_String::readElement(QXmlStreamReader *xml) +bool SerializableItem_String::readElement(QXmlStreamReader *xml) { if (xml->isCharacters() && !xml->isWhitespace()) data = xml->text().toString(); + return SerializableItem::readElement(xml); } void SerializableItem_String::writeElement(QXmlStreamWriter *xml) @@ -88,7 +88,7 @@ void SerializableItem_String::writeElement(QXmlStreamWriter *xml) xml->writeCharacters(data); } -void SerializableItem_Int::readElement(QXmlStreamReader *xml) +bool SerializableItem_Int::readElement(QXmlStreamReader *xml) { if (xml->isCharacters() && !xml->isWhitespace()) { bool ok; @@ -96,6 +96,7 @@ void SerializableItem_Int::readElement(QXmlStreamReader *xml) if (!ok) data = -1; } + return SerializableItem::readElement(xml); } void SerializableItem_Int::writeElement(QXmlStreamWriter *xml) @@ -103,10 +104,11 @@ void SerializableItem_Int::writeElement(QXmlStreamWriter *xml) xml->writeCharacters(QString::number(data)); } -void SerializableItem_Bool::readElement(QXmlStreamReader *xml) +bool SerializableItem_Bool::readElement(QXmlStreamReader *xml) { if (xml->isCharacters() && !xml->isWhitespace()) data = xml->text().toString() == "1"; + return SerializableItem::readElement(xml); } void SerializableItem_Bool::writeElement(QXmlStreamWriter *xml) @@ -124,13 +126,14 @@ QColor SerializableItem_Color::colorFromInt(int colorValue) const return QColor(colorValue / 65536, (colorValue % 65536) / 256, colorValue % 256); } -void SerializableItem_Color::readElement(QXmlStreamReader *xml) +bool SerializableItem_Color::readElement(QXmlStreamReader *xml) { if (xml->isCharacters() && !xml->isWhitespace()) { bool ok; int colorValue = xml->text().toString().toInt(&ok); data = ok ? colorFromInt(colorValue) : Qt::black; } + return SerializableItem::readElement(xml); } void SerializableItem_Color::writeElement(QXmlStreamWriter *xml) @@ -138,13 +141,14 @@ void SerializableItem_Color::writeElement(QXmlStreamWriter *xml) xml->writeCharacters(QString::number(colorToInt(data))); } -void SerializableItem_DateTime::readElement(QXmlStreamReader *xml) +bool SerializableItem_DateTime::readElement(QXmlStreamReader *xml) { if (xml->isCharacters() && !xml->isWhitespace()) { bool ok; unsigned int dateTimeValue = xml->text().toString().toUInt(&ok); data = ok ? QDateTime::fromTime_t(dateTimeValue) : QDateTime(); } + return SerializableItem::readElement(xml); } void SerializableItem_DateTime::writeElement(QXmlStreamWriter *xml) diff --git a/common/serializable_item.h b/common/serializable_item.h index 5003bd81..31bb16db 100644 --- a/common/serializable_item.h +++ b/common/serializable_item.h @@ -18,23 +18,22 @@ protected: static QHash itemNameHash; QString itemType, itemSubType; + bool firstItem; public: SerializableItem(const QString &_itemType, const QString &_itemSubType = QString()) - : QObject(), itemType(_itemType), itemSubType(_itemSubType) { } + : QObject(), itemType(_itemType), itemSubType(_itemSubType), firstItem(true) { } static void registerSerializableItem(const QString &name, NewItemFunction func); static SerializableItem *getNewItem(const QString &name); const QString &getItemType() const { return itemType; } const QString &getItemSubType() const { return itemSubType; } - virtual void readElement(QXmlStreamReader *xml) = 0; + virtual bool readElement(QXmlStreamReader *xml); virtual void writeElement(QXmlStreamWriter *xml) = 0; - bool read(QXmlStreamReader *xml); void write(QXmlStreamWriter *xml); }; class SerializableItem_Invalid : public SerializableItem { public: SerializableItem_Invalid(const QString &_itemType) : SerializableItem(_itemType) { } - void readElement(QXmlStreamReader * /*xml*/) { } void writeElement(QXmlStreamWriter * /*xml*/) { } }; @@ -65,7 +64,7 @@ public: { } ~SerializableItem_Map(); - void readElement(QXmlStreamReader *xml); + bool readElement(QXmlStreamReader *xml); void writeElement(QXmlStreamWriter *xml); void appendItem(SerializableItem *item) { itemList.append(item); } }; @@ -74,7 +73,7 @@ class SerializableItem_String : public SerializableItem { private: QString data; protected: - void readElement(QXmlStreamReader *xml); + bool readElement(QXmlStreamReader *xml); void writeElement(QXmlStreamWriter *xml); public: SerializableItem_String(const QString &_itemType, const QString &_data) @@ -87,7 +86,7 @@ class SerializableItem_Int : public SerializableItem { private: int data; protected: - void readElement(QXmlStreamReader *xml); + bool readElement(QXmlStreamReader *xml); void writeElement(QXmlStreamWriter *xml); public: SerializableItem_Int(const QString &_itemType, int _data) @@ -100,7 +99,7 @@ class SerializableItem_Bool : public SerializableItem { private: bool data; protected: - void readElement(QXmlStreamReader *xml); + bool readElement(QXmlStreamReader *xml); void writeElement(QXmlStreamWriter *xml); public: SerializableItem_Bool(const QString &_itemType, bool _data) @@ -115,7 +114,7 @@ private: int colorToInt(const QColor &color) const; QColor colorFromInt(int colorValue) const; protected: - void readElement(QXmlStreamReader *xml); + bool readElement(QXmlStreamReader *xml); void writeElement(QXmlStreamWriter *xml); public: SerializableItem_Color(const QString &_itemType, const QColor &_data) @@ -128,7 +127,7 @@ class SerializableItem_DateTime : public SerializableItem { private: QDateTime data; protected: - void readElement(QXmlStreamReader *xml); + bool readElement(QXmlStreamReader *xml); void writeElement(QXmlStreamWriter *xml); public: SerializableItem_DateTime(const QString &_itemType, const QDateTime &_data) diff --git a/servatrice/src/serversocketinterface.cpp b/servatrice/src/serversocketinterface.cpp index 55a88268..b20146fc 100644 --- a/servatrice/src/serversocketinterface.cpp +++ b/servatrice/src/serversocketinterface.cpp @@ -73,18 +73,15 @@ void ServerSocketInterface::readClient() qDebug() << data; xmlReader->addData(data); - if (topLevelItem) - topLevelItem->read(xmlReader); - else - while (!xmlReader->atEnd()) { - xmlReader->readNext(); - if (xmlReader->isStartElement() && (xmlReader->name().toString() == "cockatrice_client_stream")) { - topLevelItem = new TopLevelProtocolItem; - connect(topLevelItem, SIGNAL(protocolItemReceived(ProtocolItem *)), this, SLOT(processProtocolItem(ProtocolItem *))); - - topLevelItem->read(xmlReader); - } + while (!xmlReader->atEnd()) { + xmlReader->readNext(); + if (topLevelItem) + topLevelItem->readElement(xmlReader); + else if (xmlReader->isStartElement() && (xmlReader->name().toString() == "cockatrice_client_stream")) { + topLevelItem = new TopLevelProtocolItem; + connect(topLevelItem, SIGNAL(protocolItemReceived(ProtocolItem *)), this, SLOT(processProtocolItem(ProtocolItem *))); } + } } void ServerSocketInterface::catchSocketError(QAbstractSocket::SocketError socketError)