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">
|
<vendor name="Waveman">
|
||||||
<device id="11" protocol="waveman" widget="1" image="17-356">17-356</device>
|
<device id="11" protocol="waveman" widget="1" image="17-356">17-356</device>
|
||||||
</vendor>
|
</vendor>
|
||||||
</settings>
|
</devices>
|
||||||
|
|
|
@ -5,11 +5,7 @@ VendorDeviceModel::VendorDeviceModel(QObject *parent)
|
||||||
:QAbstractItemModel(parent),
|
:QAbstractItemModel(parent),
|
||||||
rootItem(new VendorDeviceTreeItem(0, ""))
|
rootItem(new VendorDeviceTreeItem(0, ""))
|
||||||
{
|
{
|
||||||
rootItem->appendChild( new VendorDeviceTreeItem(0, "Ikea", rootItem) );
|
rootItem->parseXml( ":/data/devices.xml" );
|
||||||
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) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VendorDeviceModel::~VendorDeviceModel() {
|
VendorDeviceModel::~VendorDeviceModel() {
|
||||||
|
@ -45,7 +41,7 @@ Qt::ItemFlags VendorDeviceModel::flags(const QModelIndex &index) const {
|
||||||
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
|
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) {
|
if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
|
||||||
return tr("Name");
|
return tr("Name");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
#include "vendordevicetreeitem.h"
|
#include "vendordevicetreeitem.h"
|
||||||
|
|
||||||
|
#include <QFile>
|
||||||
|
#include <QXmlStreamReader>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
VendorDeviceTreeItem::VendorDeviceTreeItem(int id, const QString &displayString, VendorDeviceTreeItem *parent)
|
VendorDeviceTreeItem::VendorDeviceTreeItem(int id, const QString &displayString, VendorDeviceTreeItem *parent)
|
||||||
:deviceId(id),
|
:deviceId(id),
|
||||||
deviceName(displayString),
|
deviceName(displayString),
|
||||||
|
@ -31,7 +35,7 @@ QVariant VendorDeviceTreeItem::data(int column) const {
|
||||||
return deviceName;
|
return deviceName;
|
||||||
}
|
}
|
||||||
|
|
||||||
return "Da";
|
return QVariant();
|
||||||
}
|
}
|
||||||
|
|
||||||
VendorDeviceTreeItem *VendorDeviceTreeItem::parent() {
|
VendorDeviceTreeItem *VendorDeviceTreeItem::parent() {
|
||||||
|
@ -45,3 +49,103 @@ int VendorDeviceTreeItem::row() const {
|
||||||
|
|
||||||
return 0;
|
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>
|
#include <QVariant>
|
||||||
|
|
||||||
|
class QXmlStreamReader;
|
||||||
|
|
||||||
class VendorDeviceTreeItem
|
class VendorDeviceTreeItem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -18,7 +20,13 @@ public:
|
||||||
int row() const;
|
int row() const;
|
||||||
VendorDeviceTreeItem *parent();
|
VendorDeviceTreeItem *parent();
|
||||||
|
|
||||||
|
bool parseXml( const QString &filename );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void parseVendor( QXmlStreamReader *reader );
|
||||||
|
void parseDevice( QXmlStreamReader *reader, VendorDeviceTreeItem *parent );
|
||||||
|
void skipUnknownElement( QXmlStreamReader *reader );
|
||||||
|
|
||||||
QList<VendorDeviceTreeItem *> childItems;
|
QList<VendorDeviceTreeItem *> childItems;
|
||||||
|
|
||||||
int deviceId;
|
int deviceId;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue