summaryrefslogtreecommitdiffstats
path: root/torrentdisplay.cpp
diff options
context:
space:
mode:
authorArno <arno@disconnect.de>2016-08-19 17:51:10 +0200
committerArno <arno@disconnect.de>2016-08-19 17:51:10 +0200
commit8ab990b7c6fb5348b09f451878a80e2c70695876 (patch)
tree8a90c848308c09e729d9256a6af921abfeb786b3 /torrentdisplay.cpp
parentcead61f9598302a83fa72e99f82f7bfa2c0b19cb (diff)
downloadShemovCleaner-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.cpp149
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;
+ }
+ }
+ }
+}