#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();
}



