#include <QApplication>
#include <QString>
#include <QtXml>
#include <QTreeWidget>
#include <QMessageBox>
class DomParser
{
public:
DomParser(QIODevice *device, QTreeWidget *tree);
private:
void parseTrack(const QDomElement &element,
QTreeWidgetItem *parent);
QTreeWidget *treeWidget;
};
DomParser::DomParser(QIODevice *device, QTreeWidget *tree)
{
treeWidget = tree;
QString errorStr;
int errorLine;
int errorColumn;
QDomDocument doc;
if (!doc.setContent(device, true, &errorStr, &errorLine,
&errorColumn)) {
QMessageBox::warning(0, QObject::tr("DOM Parser"),
QObject::tr("Parse error at line %1, "
"column %2:\n%3")
.arg(errorLine)
.arg(errorColumn)
.arg(errorStr));
return;
}
QDomElement root = doc.documentElement();
if (root.tagName() != "lsdvd")
return;
QTreeWidgetItem *item = new QTreeWidgetItem(tree);
QDomNode node = root.firstChild();
while (!node.isNull()) {
if (node.toElement().tagName() == "device")
item->setText(0, node.toElement().text());
else if (node.toElement().tagName() == "title")
item->setText(1, node.toElement().text());
else if (node.toElement().tagName() == "vmg_id")
item->setText(2, node.toElement().text());
else if (node.toElement().tagName() == "provider_id")
item->setText(3, node.toElement().text());
else if (node.toElement().tagName() == "longest_track")
item->setText(4, node.toElement().text());
else if (node.toElement().tagName() == "track")
parseTrack(node.toElement(), item);
node = node.nextSibling();
}
}
void DomParser::parseTrack(const QDomElement &element, QTreeWidgetItem *parent)
{
QTreeWidgetItem *item;
if (parent) {
item = new QTreeWidgetItem(parent);
} else {
item = new QTreeWidgetItem(treeWidget);
}
QDomNode node = element.firstChild();
while (!node.isNull()) {
if (node.toElement().tagName() == "ix")
item->setText(0, "Title " + node.toElement().text());
else if (node.toElement().tagName() == "length")
item->setText(1, node.toElement().text());
else if (node.toElement().tagName() == "vts_id")
item->setText(2, node.toElement().text());
else if (node.toElement().tagName() == "vts")
item->setText(3, node.toElement().text());
else if (node.toElement().tagName() == "ttn")
item->setText(4, node.toElement().text());
else if (node.toElement().tagName() == "fps")
item->setText(5, node.toElement().text());
else if (node.toElement().tagName() == "format")
item->setText(6, node.toElement().text());
else if (node.toElement().tagName() == "aspect")
item->setText(7, node.toElement().text());
else if (node.toElement().tagName() == "width")
item->setText(8, node.toElement().text());
else if (node.toElement().tagName() == "height")
item->setText(9, node.toElement().text());
else if (node.toElement().tagName() == "df")
item->setText(10, node.toElement().text());
else if (node.toElement().tagName() == "angles")
item->setText(11, node.toElement().text());
else if (node.toElement().tagName() == "audio") {
QTreeWidgetItem *subItem = new QTreeWidgetItem(item);
QDomNode subNode = node.toElement().firstChild();
while (!subNode.isNull()) {
if (subNode.toElement().tagName() == "ix")
subItem->setText(0, "Audio " + subNode.toElement().text());
if (subNode.toElement().tagName() == "langcode")
subItem->setText(1, subNode.toElement().text());
if (subNode.toElement().tagName() == "language")
subItem->setText(2, subNode.toElement().text());
if (subNode.toElement().tagName() == "format")
subItem->setText(3, subNode.toElement().text());
if (subNode.toElement().tagName() == "frequency")
subItem->setText(4, subNode.toElement().text());
if (subNode.toElement().tagName() == "quantization")
subItem->setText(5, subNode.toElement().text());
if (subNode.toElement().tagName() == "channels")
subItem->setText(6, subNode.toElement().text());
if (subNode.toElement().tagName() == "ap_mode")
subItem->setText(7, subNode.toElement().text());
if (subNode.toElement().tagName() == "content")
subItem->setText(8, subNode.toElement().text());
if (subNode.toElement().tagName() == "streamid")
subItem->setText(9, subNode.toElement().text());
subNode = subNode.nextSibling();
}
} else if (node.toElement().tagName() == "chapter") {
QTreeWidgetItem *subItem = new QTreeWidgetItem(item);
QDomNode subNode = node.toElement().firstChild();
while (!subNode.isNull()) {
if (subNode.toElement().tagName() == "ix")
subItem->setText(0, "Chapter " + subNode.toElement().text());
if (subNode.toElement().tagName() == "length")
subItem->setText(1, subNode.toElement().text());
if (subNode.toElement().tagName() == "startcell")
subItem->setText(2, subNode.toElement().text());
subNode = subNode.nextSibling();
}
} else if (node.toElement().tagName() == "cell") {
QTreeWidgetItem *subItem = new QTreeWidgetItem(item);
QDomNode subNode = node.toElement().firstChild();
while (!subNode.isNull()) {
if (subNode.toElement().tagName() == "ix")
subItem->setText(0, "Cell " + subNode.toElement().text());
if (subNode.toElement().tagName() == "length")
subItem->setText(1, subNode.toElement().text());
subNode = subNode.nextSibling();
}
} else if (node.toElement().tagName() == "subp") {
QTreeWidgetItem *subItem = new QTreeWidgetItem(item);
QDomNode subNode = node.toElement().firstChild();
while (!subNode.isNull()) {
if (subNode.toElement().tagName() == "ix")
subItem->setText(0, "Subtitle " + subNode.toElement().text());
if (subNode.toElement().tagName() == "langcode")
subItem->setText(1, subNode.toElement().text());
if (subNode.toElement().tagName() == "langugage")
subItem->setText(2, subNode.toElement().text());
if (subNode.toElement().tagName() == "content")
subItem->setText(3, subNode.toElement().text());
if (subNode.toElement().tagName() == "streamid")
subItem->setText(4, subNode.toElement().text());
subNode = subNode.nextSibling();
}
} else if (node.toElement().tagName() == "palette") {
QTreeWidgetItem *subItem = new QTreeWidgetItem(item);
QDomNode subNode = node.toElement().firstChild();
QString color = "Palette";
while (!subNode.isNull()) {
if (subNode.toElement().tagName() == "color")
color += " " + subNode.toElement().text();
subNode = subNode.nextSibling();
}
subItem->setText(0, color);
//subItem->setText(0, "Pal: " + node.toElement().text());
}
node = node.nextSibling();
}
}
void parseFile(const QString &fileName)
{
QStringList labels;
labels << QObject::tr("Track") << QObject::tr("Length")
<< QObject::tr("VTS_ID") << QObject::tr("VTS")
<< QObject::tr("TTN") << QObject::tr("FPS") << QObject::tr("Format")
<< QObject::tr("Aspect") << QObject::tr("Width") << QObject::tr("Height") << QObject::tr("DF") << QObject::tr("Angles");
QTreeWidget *treeWidget = new QTreeWidget;
treeWidget->setHeaderLabels(labels);
treeWidget->setWindowTitle(QObject::tr("DVD Info Parser"));
treeWidget->show();
QFile file(fileName);
DomParser(&file, treeWidget);
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
parseFile(argv[1]);
return app.exec();
}