From 9f36d521a4b4f5261e0e1b68ed10a1ea5d6de1f9 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Tue, 4 Sep 2007 04:18:51 +0000 Subject: [PATCH] - BUGFIX: Fixed deprecation warning with latest libtorrent svn - FEATURE: Redesigned torrent creation dialog - FEATURE: Allow to set piece size when creating a torrent - improved new options dialog a little --- TODO | 17 +- src/GUI.cpp | 7 +- src/GUI.h | 1 + src/bittorrent.cpp | 14 +- src/createtorrent.ui | 1102 +++++++++++++++++-------------------- src/createtorrent_imp.cpp | 121 ++-- src/createtorrent_imp.h | 6 +- src/optionsNG.ui | 7 + 8 files changed, 607 insertions(+), 668 deletions(-) diff --git a/TODO b/TODO index 6fb2a175e..7ef23cf22 100644 --- a/TODO +++ b/TODO @@ -42,7 +42,6 @@ - Allow to disable UPnP/NAT-PMP/LSD in options? - Allow to automatically delete torrents when they reach a given ratio (in options) : easy - Allow to limit the number of downloading torrents simultaneously (other are paused until a download finishes) -- Add "Mark all as read" feature for RSS - Allow to customize lists refreshing interval (in options) - Improve search plugin install (download drom url, choose in a list taken from plugins.qbittorrent.org) - Display the number of DHT node if possible @@ -54,10 +53,6 @@ - Fix all (or almost all) opened bugs in bug tracker - Add an option 'Automatically update search plugins' - Add an option 'Display current speed in title bar' -- Add an option 'append .!qBT to incomplete files' -- Add an option "preallocate all files" -- Add an option 'Put new downloads in ...' -- Add an option 'Put complete downloads in ...' - Improve systray tooltip - Use tooltips in options to explain - Keep documention up to date @@ -66,19 +61,12 @@ - valgrind --tool=memcheck --leak-check=full src/qbittorrent (Looks ok) - 128m 29m 16m S 4.8 2.9 0:02.28 qbittorrent * beta 7 + - Add "Mark all as read" feature for RSS - update doc for plugins (and add screenies) - Redesign options (fully) - * Add options like "num uploads" - - redesign torrent creation - * lineEdit for input - * Create and save button - * piece size choice - * Start seeding checkbox - Review torrent content selection * check the one in ktorrent - Translations update (IN PROGRESS) - - Wait for some bug fixes in libtorrent : - - Number of seeds non null for finished torrent (Ticket #122) LANGUAGES UPDATED: - French *BETA6* @@ -107,6 +95,8 @@ beta6->beta7 changelog: - FEATURE: Allow to drag'n drop plugin to list for install/update - FEATURE: Added some search plugins to http://plugins.qbittorrent.org - FEATURE: Added zip support in search plugins manager (can put .py & .png inside) +- FEATURE: Redesigned torrent creation dialog +- FEATURE: Allow to set piece size when creating a torrent - BUGFIX: In torrent content, it is now easier to filter all torrents using right click menu - BUGFIX: Updated man page / README / INSTALL - BUGFIX: Paused torrents could be displayed as connected for a sec after checking @@ -120,4 +110,5 @@ beta6->beta7 changelog: - BUGFIX: the function that set the rows color doesn't handle hidden columns anymore - BUGFIX: improved search engine plugin manager code and fixed bugs - BUGFIX: Dropped Qt4.2 support, becomes too difficult to maintain +- BUGFIX: Fixed deprecation warning with latest libtorrent svn - COSMETIC: Improved some icons diff --git a/src/GUI.cpp b/src/GUI.cpp index f55d24057..947740c22 100644 --- a/src/GUI.cpp +++ b/src/GUI.cpp @@ -511,7 +511,8 @@ void GUI::closeEvent(QCloseEvent *e) { // Display window to create a torrent void GUI::on_actionCreate_torrent_triggered() { - new createtorrent(this); + createtorrent *ct = new createtorrent(this); + connect(ct, SIGNAL(torrent_to_seed(QString)), this, SLOT(addTorrent(QString path))); } // Called when we minimize the program @@ -742,6 +743,10 @@ void GUI::processParams(const QStringList& params) { } } +void GUI::addTorrent(QString path) { + BTSession->addTorrent(path); +} + void GUI::processScannedFiles(const QStringList& params) { QString param; QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); diff --git a/src/GUI.h b/src/GUI.h index 1f6ea27e9..24548fe06 100644 --- a/src/GUI.h +++ b/src/GUI.h @@ -127,6 +127,7 @@ class GUI : public QMainWindow, private Ui::MainWindow{ void checkConnectionStatus(); void configureSession(bool deleteOptions); void processParams(const QStringList& params); + void addTorrent(QString path); void addUnauthenticatedTracker(QPair tracker); void processScannedFiles(const QStringList& params); void processDownloadedFiles(QString path, QString url); diff --git a/src/bittorrent.cpp b/src/bittorrent.cpp index 2674e2ebf..bbb3655c0 100644 --- a/src/bittorrent.cpp +++ b/src/bittorrent.cpp @@ -358,10 +358,10 @@ void bittorrent::addTorrent(QString path, bool fromScanDir, QString from_url) { // Decode torrent file entry e = bdecode(std::istream_iterator(in), std::istream_iterator()); // Getting torrent file informations - torrent_info t(e); - qDebug(" -> Hash: %s", misc::toString(t.info_hash()).c_str()); - qDebug(" -> Name: %s", t.name().c_str()); - QString hash = misc::toQString(t.info_hash()); + boost::intrusive_ptr t(new torrent_info(e)); + qDebug(" -> Hash: %s", misc::toString(t->info_hash()).c_str()); + qDebug(" -> Name: %s", t->name().c_str()); + QString hash = misc::toQString(t->info_hash()); if(file.startsWith(torrentBackup.path())) { QFileInfo fi(file); QString old_hash = fi.baseName(); @@ -378,7 +378,7 @@ void bittorrent::addTorrent(QString path, bool fromScanDir, QString from_url) { // return; } } - if(s->find_torrent(t.info_hash()).is_valid()) { + if(s->find_torrent(t->info_hash()).is_valid()) { qDebug("/!\\ Torrent is already in download list"); // Update info Bar if(!fromScanDir) { @@ -456,7 +456,7 @@ void bittorrent::addTorrent(QString path, bool fromScanDir, QString from_url) { } // Incremental download if(QFile::exists(misc::qBittorrentPath()+"BT_backup"+QDir::separator()+hash+".incremental")) { - qDebug("Incremental download enabled for %s", t.name().c_str()); + qDebug("Incremental download enabled for %s", t->name().c_str()); h.set_sequenced_download_threshold(1); } // Start torrent because it was added in paused state @@ -1086,7 +1086,7 @@ void bittorrent::reloadTorrent(const QTorrentHandle &h) { fs::path saveDir = h.save_path_boost(); QString fileName = h.name(); QString hash = h.hash(); - torrent_info t = h.get_torrent_info(); + boost::intrusive_ptr t(new torrent_info(h.get_torrent_info())); qDebug("Reloading torrent: %s", fileName.toUtf8().data()); entry resumeData; // Checking if torrentBackup Dir exists diff --git a/src/createtorrent.ui b/src/createtorrent.ui index a451e3efe..1e1cdf12f 100644 --- a/src/createtorrent.ui +++ b/src/createtorrent.ui @@ -5,604 +5,542 @@ 0 0 - 605 - 588 + 592 + 590 Torrent Creation Tool - - - - 9 - 9 - 587 - 27 - - - - - 0 - 27 - - - - - 16777215 - 27 - - - - - Sans Serif - 14 - 75 - false - true - false - false - - - - Torrent file creation - - - Qt::AlignCenter - - - - - - 9 - 42 - 597 - 438 - - - - - 0 - - - 6 - - - - - 0 - - - 6 - - - - - - 0 - 101 - - - - - 16777215 - 26 - - + + + + + + 0 + 27 + + + + + 16777215 + 27 + + + + + Sans Serif + 14 + 75 + false + true + false + false + + + + Torrent file creation + + + Qt::AlignCenter + + + + + + + File or folder to add to the torrent: + + + + + + + + + + + + Add a file + + + :/Icons/add_file.png + + + + + + + Add a folder + + + :/Icons/add_folder.png + + + + + + + + + + + + + + 0 + 102 + + + + + 16777215 + 70 + + + + Announce urls (trackers): + + + + + + + + + + + 0 + 101 + + + + Web seeds urls (optional): + + + + + + + + 0 + 102 + + + + + 16777215 + 102 + + + + Comment (optional): + + + txt_comment + + + + + + + + + + + 6 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QAbstractItemView::MultiSelection + + + + + + + 6 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Vertical + + + + 20 + 16 + + + + + + + + + 22 + 22 + + + + + 22 + 22 + + + + + + + :/Icons/skin/add.png + + + + + + + + 22 + 22 + + + + + 22 + 22 + + + + + + + :/Icons/skin/remove.png + + + + + + + Qt::Vertical + + + + 20 + 16 + + + + + + + + + + + + 6 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QAbstractItemView::MultiSelection + + + + + + + 6 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Vertical + + + + 20 + 16 + + + + + + + + + 22 + 22 + + + + + 22 + 22 + + + + + + + :/Icons/skin/add.png + + + + + + + + 22 + 22 + + + + + 22 + 22 + + + + + + + :/Icons/skin/remove.png + + + + + + + Qt::Vertical + + + + 20 + 16 + + + + + + + + + + + + + 421 + 102 + + + + false + + + + + + + + + + + + + Piece size: + + + + + + + 3 + + - Input file or directory: - - - - - - - - 0 - 102 - - - - - 16777215 - 70 - + 32 KiB + + - Announce urls (trackers): - - - - - - - - - - - 0 - 101 - + 64 KiB + + - Web seeds urls (optional): - - - - - - - - 0 - 102 - - - - - 16777215 - 102 - + 128 KiB + + - Comment (optional): + 256 KiB - - txt_comment - - - - - - - - - 0 - - - 6 - - - - - 0 - - - 6 - - - - - QAbstractItemView::MultiSelection - - - - - - - 0 - - - 6 - - - - - Qt::Vertical - - - - 20 - 16 - - - - - - - - - 22 - 22 - - - - - 22 - 22 - - - - - - - - - - - - 22 - 22 - - - - - 22 - 22 - - - - - - - - - - - - 22 - 22 - - - - - 22 - 22 - - - - - - - - - - - Qt::Vertical - - - - 20 - 16 - - - - - - - - - - - - 0 - - - 6 - - - - - QAbstractItemView::MultiSelection - - - - - - - 0 - - - 6 - - - - - Qt::Vertical - - - - 20 - 16 - - - - - - - - - 22 - 22 - - - - - 22 - 22 - - - - - - - - - - - - 22 - 22 - - - - - 22 - 22 - - - - - - - - - - - Qt::Vertical - - - - 20 - 16 - - - - - - - - - - - - 0 - - - 6 - - - - - QAbstractItemView::MultiSelection - - - - - - - 0 - - - 6 - - - - - Qt::Vertical - - - - 20 - 16 - - - - - - - - - 22 - 22 - - - - - 22 - 22 - - - - - - - - - - - - 22 - 22 - - - - - 22 - 22 - - - - - - - - - - - Qt::Vertical - - - - 20 - 16 - - - - - - - - - - - - - 421 - 102 - - - - - 421 - 102 - - - - false - - - - - - - - - - - 9 - 482 - 587 - 22 - - - - Private (won't be distributed on trackerless network / DHT if enabled) - - - - - - 9 - 510 - 587 - 30 - - - - - 0 - - - 6 - - - - - - 16777215 - 26 - - - - Destination torrent file: - - - txt_destination - - - - - - - 0 - - - 6 - - - - - - + + - ... + 512 KiB - - - - - - - - - - 9 - 546 - 587 - 33 - - - - - 0 - - - 6 - - - - - Qt::Horizontal - - - - 131 - 31 - - - - - - - - Create - - - - - - - Cancel - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - + + + + 1 MiB + + + + + 2 MiB + + + + + 4 MiB + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Private (won't be distributed on DHT network if enabled) + + + + + + + Start seeding after creation + + + + + + + 6 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + 131 + 31 + + + + + + + + Create and save... + + + + + + + Cancel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + - + + + cancelButton diff --git a/src/createtorrent_imp.cpp b/src/createtorrent_imp.cpp index 979f95644..4e9c185fd 100644 --- a/src/createtorrent_imp.cpp +++ b/src/createtorrent_imp.cpp @@ -42,55 +42,23 @@ using namespace boost::filesystem; createtorrent::createtorrent(QWidget *parent): QDialog(parent){ setupUi(this); - addTracker_button->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/add.png"))); - removeTracker_button->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/remove.png"))); - addURLSeed_button->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/add.png"))); - removeURLSeed_button->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/remove.png"))); - removeFolder_button->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/remove.png"))); - addFolder_button->setIcon(QIcon(QString::fromUtf8(":/Icons/add_folder.png"))); - addFile_button->setIcon(QIcon(QString::fromUtf8(":/Icons/add_file.png"))); setAttribute(Qt::WA_DeleteOnClose); show(); } -void createtorrent::on_browse_destination_clicked(){ - QString destination = QFileDialog::getSaveFileName(this, tr("Select destination torrent file"), QDir::homePath(), tr("Torrent Files")+QString::fromUtf8(" (*.torrent)")); - if(!destination.isEmpty()){ - if(!destination.endsWith(QString::fromUtf8(".torrent"))) - destination += QString::fromUtf8(".torrent"); - txt_destination->setText(destination); - } -} - void createtorrent::on_addFolder_button_clicked(){ QString dir = QFileDialog::getExistingDirectory(this, tr("Select a folder to add to the torrent"), QDir::homePath(), QFileDialog::ShowDirsOnly); - if(!dir.isEmpty()) { - input_list->addItem(dir); - addFolder_button->setEnabled(false); - addFile_button->setEnabled(false); - } + if(!dir.isEmpty()) + textInputPath->setText(dir); } void createtorrent::on_addFile_button_clicked(){ QString file = QFileDialog::getOpenFileName(this, tr("Select a file to add to the torrent"), QDir::homePath(), QString(), 0, QFileDialog::ShowDirsOnly); - if(!file.isEmpty()) { - input_list->addItem(file); - addFolder_button->setEnabled(false); - addFile_button->setEnabled(false); - } + if(!file.isEmpty()) + textInputPath->setText(file); } -void createtorrent::on_removeFolder_button_clicked(){ - QModelIndexList selectedIndexes = input_list->selectionModel()->selectedIndexes(); - if(!selectedIndexes.size()) return; - Q_ASSERT(selectedIndexes.size() == 1); - QListWidgetItem *item = input_list->takeItem(selectedIndexes.first().row()); - delete item; - addFolder_button->setEnabled(true); - addFile_button->setEnabled(true); -} - -void createtorrent::on_removeTracker_button_clicked(){ +void createtorrent::on_removeTracker_button_clicked() { QModelIndexList selectedIndexes = trackers_list->selectionModel()->selectedIndexes(); for(int i=selectedIndexes.size()-1; i>=0; --i){ QListWidgetItem *item = trackers_list->takeItem(selectedIndexes.at(i).row()); @@ -98,7 +66,28 @@ void createtorrent::on_removeTracker_button_clicked(){ } } -void createtorrent::on_addTracker_button_clicked(){ +int createtorrent::getPieceSize() const { + switch(comboPieceSize->currentIndex()) { + case 0: + return 32*1024; + case 1: + return 64*1024; + case 2: + return 128*1024; + case 3: + return 256*1024; + case 4: + return 512*1024; + case 5: + return 1024*1024; + case 6: + return 2048*1024; + default: + return 256*1024; + } +} + +void createtorrent::on_addTracker_button_clicked() { bool ok; QString URL = QInputDialog::getText(this, tr("Please type an announce URL"), tr("Announce URL:", "Tracker URL"), QLineEdit::Normal, @@ -151,61 +140,67 @@ QStringList createtorrent::allItems(QListWidget *list){ // Main function that create a .torrent file void createtorrent::on_createButton_clicked(){ - QString destination = txt_destination->text(); - if(destination.isEmpty()){ - QMessageBox::critical(0, tr("No destination path set"), tr("Please type a destination path first")); + QString input = textInputPath->text().trimmed(); + if(input.isEmpty() == 0){ + QMessageBox::critical(0, tr("No input path set"), tr("Please type an input path first")); return; } - QStringList input = allItems(input_list); - if(input.size() == 0){ - QMessageBox::critical(0, tr("No input path set"), tr("Please type an input path first")); + QStringList trackers = allItems(trackers_list); + if(!trackers.size()){ + QMessageBox::critical(0, tr("No tracker path set"), tr("Please set at least one tracker")); + return; + } + QString destination = QFileDialog::getSaveFileName(this, tr("Select destination torrent file"), QDir::homePath(), tr("Torrent Files")+QString::fromUtf8(" (*.torrent)")); + if(!destination.isEmpty()) { + if(!destination.endsWith(QString::fromUtf8(".torrent"))) + destination += QString::fromUtf8(".torrent"); + } else { return; } char const* creator_str = "qBittorrent "VERSION; try { - torrent_info t; + boost::intrusive_ptr t(new torrent_info); ofstream out(complete(path((const char*)destination.toUtf8())), std::ios_base::binary); path full_path; // Adding files to the torrent - QString input_path; - foreach(input_path, input){ - full_path = complete(path(input_path.toUtf8().data())); - add_files(t, full_path.branch_path(), full_path.leaf()); - } - int piece_size = 256 * 1024; - t.set_piece_size(piece_size); + full_path = complete(path(input.toUtf8().data())); + add_files(*t, full_path.branch_path(), full_path.leaf()); + // Set piece size + int piece_size = getPieceSize(); + t->set_piece_size(piece_size); // Add url seeds QStringList urlSeeds = allItems(URLSeeds_list); QString seed; foreach(seed, urlSeeds){ - t.add_url_seed(seed.toUtf8().data()); + t->add_url_seed(seed.toUtf8().data()); } - QStringList trackers = allItems(trackers_list); for(int i=0; iadd_tracker(trackers.at(i).toUtf8().data()); } // calculate the hash for all pieces file_pool fp; boost::scoped_ptr st(default_storage_constructor(t, full_path.branch_path(), fp)); - int num = t.num_pieces(); + int num = t->num_pieces(); std::vector buf(piece_size); for (int i = 0; i < num; ++i) { - st->read(&buf[0], i, 0, t.piece_size(i)); - hasher h(&buf[0], t.piece_size(i)); - t.set_hash(i, h.final()); + st->read(&buf[0], i, 0, t->piece_size(i)); + hasher h(&buf[0], t->piece_size(i)); + t->set_hash(i, h.final()); } // Set qBittorrent as creator and add user comment to // torrent_info structure - t.set_creator(creator_str); - t.set_comment((const char*)txt_comment->toPlainText().toUtf8()); + t->set_creator(creator_str); + t->set_comment((const char*)txt_comment->toPlainText().toUtf8()); // Is private ? if(check_private->isChecked()){ - t.set_priv(true); + t->set_priv(true); } // create the torrent and print it to out - entry e = t.create_torrent(); + entry e = t->create_torrent(); libtorrent::bencode(std::ostream_iterator(out), e); + if(checkStartSeeding->isChecked()) + emit torrent_to_seed(destination); } catch (std::exception& e){ std::cerr << e.what() << "\n"; diff --git a/src/createtorrent_imp.h b/src/createtorrent_imp.h index d29a2f1b7..d8ff04157 100644 --- a/src/createtorrent_imp.h +++ b/src/createtorrent_imp.h @@ -30,13 +30,15 @@ class createtorrent : public QDialog, private Ui::createTorrentDialog{ public: createtorrent(QWidget *parent = 0); QStringList allItems(QListWidget *list); + int getPieceSize() const; + + signals: + void torrent_to_seed(QString path); protected slots: - void on_browse_destination_clicked(); void on_createButton_clicked(); void on_addFile_button_clicked(); void on_addFolder_button_clicked(); - void on_removeFolder_button_clicked(); void on_addTracker_button_clicked(); void on_removeTracker_button_clicked(); void on_addURLSeed_button_clicked(); diff --git a/src/optionsNG.ui b/src/optionsNG.ui index ce93cd9fe..132ca1f76 100644 --- a/src/optionsNG.ui +++ b/src/optionsNG.ui @@ -204,6 +204,13 @@ + + + + Display current speed in title bar + + +