VendorDeviceModel now parses the xml with device information

This commit is contained in:
Micke Prag 2008-12-18 22:37:54 +00:00
parent a42788e13d
commit 4e490e1ccd
4 changed files with 116 additions and 8 deletions

View file

@ -38,4 +38,4 @@
<vendor name="Waveman">
<device id="11" protocol="waveman" widget="1" image="17-356">17-356</device>
</vendor>
</settings>
</devices>

View file

@ -5,11 +5,7 @@ VendorDeviceModel::VendorDeviceModel(QObject *parent)
:QAbstractItemModel(parent),
rootItem(new VendorDeviceTreeItem(0, ""))
{
rootItem->appendChild( new VendorDeviceTreeItem(0, "Ikea", rootItem) );
rootItem->appendChild( new VendorDeviceTreeItem(0, "Nexa", rootItem) );
rootItem->appendChild( new VendorDeviceTreeItem(0, "Proove", rootItem) );
rootItem->appendChild( new VendorDeviceTreeItem(0, "Sartano", rootItem) );
rootItem->appendChild( new VendorDeviceTreeItem(0, "Waveman", rootItem) );
rootItem->parseXml( ":/data/devices.xml" );
}
VendorDeviceModel::~VendorDeviceModel() {
@ -45,7 +41,7 @@ Qt::ItemFlags VendorDeviceModel::flags(const QModelIndex &index) const {
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}
QVariant VendorDeviceModel::headerData(int section, Qt::Orientation orientation, int role) const {
QVariant VendorDeviceModel::headerData(int , Qt::Orientation orientation, int role) const {
if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
return tr("Name");
}

View file

@ -1,5 +1,9 @@
#include "vendordevicetreeitem.h"
#include <QFile>
#include <QXmlStreamReader>
#include <iostream>
VendorDeviceTreeItem::VendorDeviceTreeItem(int id, const QString &displayString, VendorDeviceTreeItem *parent)
:deviceId(id),
deviceName(displayString),
@ -31,7 +35,7 @@ QVariant VendorDeviceTreeItem::data(int column) const {
return deviceName;
}
return "Da";
return QVariant();
}
VendorDeviceTreeItem *VendorDeviceTreeItem::parent() {
@ -45,3 +49,103 @@ int VendorDeviceTreeItem::row() const {
return 0;
}
bool VendorDeviceTreeItem::parseXml( const QString &filename ) {
QFile file(filename);
if (!file.open(QFile::ReadOnly | QFile::Text)) {
std::cerr << "Error: Cannot read file " << qPrintable(filename)
<< ": " << qPrintable(file.errorString())
<< std::endl;
return false;
}
QXmlStreamReader reader;
reader.setDevice(&file);
reader.readNext();
while (!reader.atEnd()) {
if (reader.isStartElement()) {
if (reader.name() == "devices") { //First element
reader.readNext();
} else if (reader.name() == "vendor") {
parseVendor( &reader );
} else {
reader.raiseError( QObject::tr("Not a Telldus device-file"));
}
} else {
reader.readNext();
}
}
file.close();
if (reader.hasError()) {
std::cerr << "Error: Failed to parse file "
<< qPrintable(filename) << ": "
<< qPrintable(reader.errorString()) << std::endl;
return false;
} else if (file.error() != QFile::NoError) {
std::cerr << "Error: Cannot read file " << qPrintable(filename)
<< ": " << qPrintable(file.errorString())
<< std::endl;
return false;
}
return true;
}
void VendorDeviceTreeItem::parseVendor( QXmlStreamReader *reader ) {
VendorDeviceTreeItem *item = new VendorDeviceTreeItem(0, reader->attributes().value("name").toString(), this);
appendChild(item);
reader->readNext();
while(!reader->atEnd()) {
if (reader->isEndElement()) {
reader->readNext();
break;
}
if (reader->isStartElement()) {
if (reader->name() == "device") {
parseDevice( reader, item );
} else {
skipUnknownElement( reader );
}
} else {
reader->readNext();
}
}
}
void VendorDeviceTreeItem::parseDevice( QXmlStreamReader *reader, VendorDeviceTreeItem *parent ) {
VendorDeviceTreeItem *item = new VendorDeviceTreeItem(reader->attributes().value("id").toString().toInt(), reader->readElementText(), parent);
parent->appendChild(item);
while(!reader->atEnd()) {
if (reader->isEndElement()) {
reader->readNext();
break;
}
if (reader->isStartElement()) {
skipUnknownElement( reader );
} else {
reader->readNext();
}
}
}
void VendorDeviceTreeItem::skipUnknownElement( QXmlStreamReader *reader ) {
reader->readNext();
while (!reader->atEnd()) {
if (reader->isEndElement()) {
reader->readNext();
break;
}
if (reader->isStartElement()) {
skipUnknownElement( reader );
} else {
reader->readNext();
}
}
}

View file

@ -3,6 +3,8 @@
#include <QVariant>
class QXmlStreamReader;
class VendorDeviceTreeItem
{
public:
@ -18,7 +20,13 @@ public:
int row() const;
VendorDeviceTreeItem *parent();
bool parseXml( const QString &filename );
private:
void parseVendor( QXmlStreamReader *reader );
void parseDevice( QXmlStreamReader *reader, VendorDeviceTreeItem *parent );
void skipUnknownElement( QXmlStreamReader *reader );
QList<VendorDeviceTreeItem *> childItems;
int deviceId;