diff options
author | Arno <arno@disconnect.de> | 2016-08-19 17:51:10 +0200 |
---|---|---|
committer | Arno <arno@disconnect.de> | 2016-08-19 17:51:10 +0200 |
commit | 8ab990b7c6fb5348b09f451878a80e2c70695876 (patch) | |
tree | 8a90c848308c09e729d9256a6af921abfeb786b3 /torrentdisplay.cpp | |
parent | cead61f9598302a83fa72e99f82f7bfa2c0b19cb (diff) | |
download | ShemovCleaner-8ab990b7c6fb5348b09f451878a80e2c70695876.tar.gz ShemovCleaner-8ab990b7c6fb5348b09f451878a80e2c70695876.tar.bz2 ShemovCleaner-8ab990b7c6fb5348b09f451878a80e2c70695876.zip |
Added torrent support
The BEncode parser is loosely based on this:
https://github.com/jif/Bencode/blob/master/bencode.cpp
Not perfect, but enough to display all the essential data in the shiny
new TorrentDisplay dialog.
Diffstat (limited to 'torrentdisplay.cpp')
-rw-r--r-- | torrentdisplay.cpp | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/torrentdisplay.cpp b/torrentdisplay.cpp new file mode 100644 index 0000000..e56343c --- /dev/null +++ b/torrentdisplay.cpp @@ -0,0 +1,149 @@ +#include <QGridLayout> +#include <QHBoxLayout> +#include <QVBoxLayout> +#include <QGroupBox> +#include <QLineEdit> +#include <QStandardItemModel> +#include <QTreeView> +#include <QStandardItem> +#include <QPushButton> +#include <QLabel> +#include <QDateTime> + +#include "torrentdisplay.h" + +TorrentDisplay::TorrentDisplay(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f) { + //windows doesn't like it after setting up the GUI + setMinimumWidth(600); + + //general info + QGridLayout *torGenLayout = new QGridLayout; + QLabel *l1 = new QLabel(tr("Created")); + mCreated = new QLineEdit; + mCreated->setReadOnly(true); + QLabel *l2 = new QLabel(tr("Created by")); + mCreatedBy = new QLineEdit; + mCreatedBy->setReadOnly(true); + QLabel *l3 = new QLabel(tr("Encoding")); + mEncoding = new QLineEdit; + mEncoding->setReadOnly(true); + QLabel *l4 = new QLabel(tr("Piece length")); + mPieceLength = new QLineEdit; + mPieceLength->setReadOnly(true); + torGenLayout->addWidget(l1, 0, 0); + torGenLayout->addWidget(mCreated, 0, 1); + torGenLayout->addWidget(l2, 1, 0); + torGenLayout->addWidget(mCreatedBy, 1, 1); + torGenLayout->addWidget(l3, 2, 0); + torGenLayout->addWidget(mEncoding, 2, 1); + torGenLayout->addWidget(l4, 3, 0); + torGenLayout->addWidget(mPieceLength, 3, 1); + QGroupBox *torGenGroup = new QGroupBox(tr("General")); + torGenGroup->setLayout(torGenLayout); + + //files + mFileModel = new QStandardItemModel; + mFileView = new QTreeView; + mFileView->setSortingEnabled(true); + mFileView->setModel(mFileModel); + QHBoxLayout *fileLayout = new QHBoxLayout; + fileLayout->addWidget(mFileView); + QGroupBox *fileGroup = new QGroupBox(tr("Files")); + fileGroup->setLayout(fileLayout); + + //announce list + mAnnounceModel = new QStandardItemModel; + mAnnounceView = new QTreeView; + mAnnounceView->setSortingEnabled(true); + mAnnounceView->setModel(mAnnounceModel); + QHBoxLayout *announceLayout = new QHBoxLayout; + announceLayout->addWidget(mAnnounceView); + QGroupBox *announceGroup = new QGroupBox(tr("Announce")); + announceGroup->setLayout(announceLayout); + + //close button + QHBoxLayout *buttonLayout = new QHBoxLayout; + QPushButton *closeBtn = new QPushButton(tr("Close")); + buttonLayout->addStretch(); + buttonLayout->addWidget(closeBtn); + buttonLayout->addStretch(); + connect(closeBtn, SIGNAL(clicked()), this, SLOT(hide())); + + //dialog layout + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addWidget(torGenGroup); + mainLayout->addWidget(fileGroup); + mainLayout->addWidget(announceGroup); + mainLayout->addLayout(buttonLayout); + setLayout(mainLayout); + setWindowTitle(tr("Torrent Info")); +} + +void TorrentDisplay::setData(const QList<QVariant> data) { + if(data.isEmpty()){ + return; + } + mFileModel->clear(); + mFileModel->setHorizontalHeaderLabels(QStringList() << tr("Name") << tr("Length")); + mAnnounceModel->clear(); + mAnnounceModel->setHorizontalHeaderLabels(QStringList() << tr("Tracker")); + + foreach(QVariant cur, data){ + if(cur.canConvert<QVariantHash>()){ + QVariantHash h = cur.toHash(); + QHash<QString, QVariant>::const_iterator it = h.constBegin(); + while(it != h.constEnd()){ + if(it.key() == "info"){ + QVariantHash infoD = it.value().toHash(); + int piece_length = infoD.value("piece length").toInt(); + mPieceLength->setText(QString::number(piece_length)); + if(infoD.contains("name")){ + QString fn = infoD.value("name").toString(); + qint64 length = infoD.value("length").toLongLong(); + QStandardItem *i1 = new QStandardItem(fn); + QStandardItem *i2 = new QStandardItem(QString::number(length)); + i2->setData(length); + mFileModel->invisibleRootItem()->appendRow(QList<QStandardItem*>() << i1 << i2); + } + if(infoD.contains("files")){ + QVariantList fList = infoD.value("files").toList(); + foreach(QVariant fn, fList){ + QVariantHash curH = fn.toHash(); + QVariantList path = curH.value("path").toList(); + QStandardItem *i1 = new QStandardItem(path.last().toString()); + qint64 length = curH.value("length").toLongLong(); + QStandardItem *i2 = new QStandardItem(QString::number(length)); + i2->setData(length); + mFileModel->invisibleRootItem()->appendRow(QList<QStandardItem*>() << i1 << i2); + } + } + mFileView->resizeColumnToContents(0); + mFileView->resizeColumnToContents(1); + } + if(it.key() == "creation date"){ + qint64 secs = it.value().toLongLong(); + QDateTime when = QDateTime::fromTime_t(secs); + mCreated->setText(when.toString(Qt::RFC2822Date)); + } + if(it.key() == "encoding"){ + mEncoding->setText(it.value().toString()); + } + if(it.key() == "created by"){ + mCreatedBy->setText(it.value().toString()); + } + //this is a list of lists + if(it.key() == "announce-list"){ + QVariantList l1 = it.value().toList(); + foreach(QVariant l2, l1){ + QVariantList l3 = l2.toList(); + foreach(QVariant ann, l3){ + QStandardItem *i1 = new QStandardItem(ann.toString()); + mAnnounceModel->invisibleRootItem()->appendRow(QList<QStandardItem*>() << i1); + } + } + } + ++it; + } + } + } +} |