VendorDeviceModel now parses the xml with device information
This commit is contained in:
parent
a42788e13d
commit
4e490e1ccd
4 changed files with 116 additions and 8 deletions
|
@ -38,4 +38,4 @@
|
|||
<vendor name="Waveman">
|
||||
<device id="11" protocol="waveman" widget="1" image="17-356">17-356</device>
|
||||
</vendor>
|
||||
</settings>
|
||||
</devices>
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue