203 lines
4.7 KiB
C++
203 lines
4.7 KiB
C++
#include "vendordevicetreeitem.h"
|
|
|
|
#include <QFile>
|
|
#include <QPixmap>
|
|
#include <QDebug>
|
|
#include <iostream>
|
|
|
|
VendorDeviceTreeItem::VendorDeviceTreeItem(int id, VendorDeviceTreeItem *parent)
|
|
:deviceId(id),
|
|
settingsWidget(0),
|
|
parentItem(parent)
|
|
{
|
|
}
|
|
|
|
VendorDeviceTreeItem::~VendorDeviceTreeItem() {
|
|
qDeleteAll(childItems);
|
|
}
|
|
|
|
void VendorDeviceTreeItem::appendChild(VendorDeviceTreeItem *item) {
|
|
childItems.append(item);
|
|
}
|
|
|
|
VendorDeviceTreeItem *VendorDeviceTreeItem::child(int row) {
|
|
return childItems.value(row);
|
|
}
|
|
|
|
int VendorDeviceTreeItem::childCount() const {
|
|
return childItems.count();
|
|
}
|
|
int VendorDeviceTreeItem::columnCount() const {
|
|
return 1;
|
|
}
|
|
|
|
QVariant VendorDeviceTreeItem::data(int column) const {
|
|
if (column == 0) {
|
|
return deviceName;
|
|
}
|
|
|
|
return QVariant();
|
|
}
|
|
|
|
VendorDeviceTreeItem *VendorDeviceTreeItem::parent() {
|
|
return parentItem;
|
|
}
|
|
|
|
int VendorDeviceTreeItem::row() const {
|
|
if (parentItem) {
|
|
return parentItem->childItems.indexOf(const_cast<VendorDeviceTreeItem*>(this));
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
QPixmap VendorDeviceTreeItem::image() const {
|
|
QString filename;
|
|
if (deviceId == 0) {
|
|
filename = ":/images/vendors/" + img.toLower() + ".jpg";
|
|
} else {
|
|
filename = ":/images/devices/" + img + ".jpg";
|
|
}
|
|
QPixmap image = QPixmap(filename);
|
|
if (image.isNull()) {
|
|
image = QPixmap( 96, 96 );
|
|
image.fill( Qt::transparent );
|
|
}
|
|
return image;
|
|
}
|
|
|
|
int VendorDeviceTreeItem::widget() const {
|
|
return settingsWidget;
|
|
}
|
|
|
|
bool VendorDeviceTreeItem::isDevice() const {
|
|
return deviceId > 0;
|
|
}
|
|
|
|
int VendorDeviceTreeItem::deviceModel() const {
|
|
return deviceId;
|
|
}
|
|
|
|
const QString &VendorDeviceTreeItem::deviceProtocol() const {
|
|
return protocol;
|
|
}
|
|
|
|
VendorDeviceTreeItem * VendorDeviceTreeItem::findByDeviceId( int deviceId ) const {
|
|
foreach( VendorDeviceTreeItem *item, childItems ) {
|
|
if (item->deviceId == deviceId) {
|
|
return item;
|
|
}
|
|
VendorDeviceTreeItem *i = item->findByDeviceId( deviceId );
|
|
if (i) {
|
|
return i;
|
|
}
|
|
}
|
|
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, this);
|
|
item->deviceName = reader->attributes().value("name").toString();
|
|
item->img = reader->attributes().value("name").toString();
|
|
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 ) {
|
|
QXmlStreamAttributes attributes = reader->attributes();
|
|
VendorDeviceTreeItem *item = new VendorDeviceTreeItem(attributes.value("id").toString().toInt(), parent);
|
|
item->img = attributes.value("image").toString();
|
|
item->settingsWidget = attributes.value("widget").toString().toInt();
|
|
item->protocol = attributes.value("protocol").toString();
|
|
item->deviceName = reader->readElementText(); //This call must be the last one because it clears the attribute-list
|
|
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();
|
|
}
|
|
}
|
|
}
|