Compare commits

...

25 Commits

Author SHA1 Message Date
Christophe Dumez
aab28cda94 - Tagged 1.3.5 release 2009-07-24 08:36:27 +00:00
Christophe Dumez
4e1ae6e448 - Updated Changelog 2009-07-24 08:32:01 +00:00
Christophe Dumez
fb28a3821a Remember visual indexes of columns in transfer lists 2009-07-24 05:55:32 +00:00
Christophe Dumez
0af506f38a - Save properties window size, position, columns width and restore them
- Set a minimum default width for NAME column in properties
2009-07-24 03:38:44 +00:00
Christophe Dumez
5adca06912 - BUGFIX: Fixed possible overflow in progress calculation in arborescence.
h
2009-07-24 03:03:48 +00:00
Christophe Dumez
1ace2303fb Fixed a small typo in one of the last commits 2009-07-24 02:41:21 +00:00
Christophe Dumez
197d9af8ef - Updated version number to v1.3.5 2009-07-23 09:18:32 +00:00
Christophe Dumez
b582c5d338 - Fixed torrent creation tool 2009-07-23 09:14:05 +00:00
Christophe Dumez
bde7ebd60e - Updated TODO 2009-07-15 11:02:56 +00:00
Christophe Dumez
01a1088252 Made IP filter more robust 2009-07-14 07:10:05 +00:00
Christophe Dumez
9b86ea56ab - Updated v1.3.4 date in changelog 2009-07-12 09:14:56 +00:00
Christophe Dumez
a326307b0d - Display date as well as time in log window
- bump to v1.3.4
2009-07-12 09:13:11 +00:00
Christophe Dumez
2e888a1e68 Tuned lists properties to make sure they are displayed properly 2009-07-12 09:01:18 +00:00
Christophe Dumez
2b1755eb2a - BUGFIX: Remove last separator in top tool bar 2009-07-12 08:46:44 +00:00
Christophe Dumez
7f3832a73d Display a ratio of 0.0 if total_upload and total_download are both 0 2009-07-12 08:26:01 +00:00
Christophe Dumez
935de375b9 - BUGFIX: Torrents with an infinite ratio are no longer affected by ratio_limit set in program preferences (closes #364730) 2009-07-12 07:27:24 +00:00
Christophe Dumez
b88ea10937 - Fixed memory leak in search engine 2009-07-12 06:44:55 +00:00
Christophe Dumez
9b29302d42 - Cleanly fixed popup menus position in lists (no more workarounds) 2009-07-12 06:07:20 +00:00
Christophe Dumez
e67d3243e8 - Fixed percentages disapearing with default version of cleanlooks style 2009-07-12 03:39:24 +00:00
Christophe Dumez
977dba4be6 - Updated Changelog 2009-07-12 03:12:41 +00:00
Christophe Dumez
114d96195b - Suppressed QLayout: Attempting to add QLayout "" to properties "properties" warning message when opening a properties dialog (closes #380414) 2009-07-12 03:07:40 +00:00
Christophe Dumez
99786cdf17 - Fixing compiling with Qt 4.3 2009-06-21 15:04:17 +00:00
Christophe Dumez
0ad7781c8b - Fixed a bug in download_url() function in helpers.py 2009-06-19 06:54:54 +00:00
Christophe Dumez
dceba7e2e1 - Fixed ip filter parsing on 64bits (Fix by Eric Porter) 2009-05-03 15:39:49 +00:00
Christophe Dumez
3a6b5af494 - Fixed copyright in helpers.py 2009-04-07 06:48:30 +00:00
22 changed files with 404 additions and 317 deletions

View File

@@ -1,3 +1,25 @@
* Fri Jul 24 2009 - Christophe DUMEZ <chris@qbittorrent.org> - 1.3.5
- BUGFIX: Made IP filter parser more robust
- BUGFIX: Fixed torrent creation tool
- BUGFIX: Fixed possible overflow in progress calculation in arborescence.h
- BUGFIX: Save properties window size, position, columns width and restore them
- BUGFIX: Set a minimum default width for NAME column in properties
- BUGFIX: Remember visual indexes of columns in transfer lists
* Sun Jul 12 2009 - Christophe DUMEZ <chris@qbittorrent.org> - v1.3.4
- BUGFIX: Fixed IP filter file parsing on 64bits
- BUGFIX: Suppressed QLayout: Attempting to add QLayout "" to properties "properties" warning message when opening a properties dialog
- BUGFIX: Fixed a little bug in search engine plugins helper file
- BUGFIX: Fixed compilation problems with Qt 4.3
- BUGFIX: Percentages no longer disapear with default cleanlooks style
- BUGFIX: Cleanly fixed popup menus position in lists (no more workarounds)
- BUGFIX: Fixed memory leak in search engine
- BUGFIX: Torrents with an infinite ratio are no longer affected by ratio_limit set in program preferences
- BUGFIX: Display a ratio of 0.0 if total_upload and total_download are both 0
- BUGFIX: Remove last separator in top tool bar
- BUGFIX: Tuned lists properties to make sure display is correct
- COSMETIC: Display date as well as time in log window
* Sun Apr 5 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.3.3 * Sun Apr 5 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.3.3
- BUGFIX: Fixed Web UI torrent upload form - BUGFIX: Fixed Web UI torrent upload form
- BUGFIX: Fixed unicode support in search engine - BUGFIX: Fixed unicode support in search engine

19
TODO
View File

@@ -1,21 +1,2 @@
See https://blueprints.launchpad.net/qbittorrent/ See https://blueprints.launchpad.net/qbittorrent/
// translations done in v1.3.0
- Romanian
- Russian
- Hungarian
- German
- Chinese (traditional)
- Chinese (simplified)
- Italian
- Swedish
- Turkish
- French
- Slovak
- Czech
- Korean
- Portuguese
- Brazilian
- Greek
- Bulgarian
- Finnish

View File

@@ -48,6 +48,8 @@
#define F_RATIO 4 #define F_RATIO 4
#define F_HASH 5 #define F_HASH 5
#define MAX_RATIO 100.
class FinishedListDelegate: public QItemDelegate { class FinishedListDelegate: public QItemDelegate {
Q_OBJECT Q_OBJECT
@@ -72,7 +74,7 @@ class FinishedListDelegate: public QItemDelegate {
case F_RATIO:{ case F_RATIO:{
QItemDelegate::drawBackground(painter, opt, index); QItemDelegate::drawBackground(painter, opt, index);
double ratio = index.data().toDouble(); double ratio = index.data().toDouble();
if(ratio > 100.) if(ratio > MAX_RATIO)
QItemDelegate::drawDisplay(painter, opt, opt.rect, QString::fromUtf8("")); QItemDelegate::drawDisplay(painter, opt, opt.rect, QString::fromUtf8(""));
else else
QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(ratio, 'f', 1))); QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(ratio, 'f', 1)));

View File

@@ -53,6 +53,8 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par
finishedListModel->setHeaderData(F_LEECH, Qt::Horizontal, tr("Leechers", "i.e: full/partial sources")); finishedListModel->setHeaderData(F_LEECH, Qt::Horizontal, tr("Leechers", "i.e: full/partial sources"));
finishedListModel->setHeaderData(F_RATIO, Qt::Horizontal, tr("Ratio")); finishedListModel->setHeaderData(F_RATIO, Qt::Horizontal, tr("Ratio"));
finishedList->setModel(finishedListModel); finishedList->setModel(finishedListModel);
finishedList->setRootIsDecorated(false);
finishedList->setAllColumnsShowFocus(true);
loadHiddenColumns(); loadHiddenColumns();
// Hide hash column // Hide hash column
finishedList->hideColumn(F_HASH); finishedList->hideColumn(F_HASH);
@@ -174,6 +176,23 @@ bool FinishedTorrents::loadColWidthFinishedList(){
finishedList->header()->resizeSection(i, width_list.at(i).toInt()); finishedList->header()->resizeSection(i, width_list.at(i).toInt());
} }
loadLastSortedColumn(); loadLastSortedColumn();
QVariantList visualIndexes = settings.value(QString::fromUtf8("FinishedListVisualIndexes"), QVariantList()).toList();
if(visualIndexes.size() != finishedListModel->columnCount()-1) {
qDebug("Corrupted values for download list columns sizes");
return false;
}
bool change = false;
do {
change = false;
for(int i=0;i<visualIndexes.size(); ++i) {
int new_visual_index = visualIndexes.at(finishedList->header()->logicalIndex(i)).toInt();
if(i != new_visual_index) {
qDebug("Moving column from %d to %d", finishedList->header()->logicalIndex(i), new_visual_index);
finishedList->header()->moveSection(i, new_visual_index);
change = true;
}
}
}while(change);
qDebug("Finished list columns width loaded"); qDebug("Finished list columns width loaded");
return true; return true;
} }
@@ -221,6 +240,11 @@ void FinishedTorrents::saveColWidthFinishedList() const{
} }
} }
settings.setValue("FinishedListColsWidth", new_width_list.join(" ")); settings.setValue("FinishedListColsWidth", new_width_list.join(" "));
QVariantList visualIndexes;
for(int i=0; i<nbColumns; ++i) {
visualIndexes.append(finishedList->header()->visualIndex(i));
}
settings.setValue(QString::fromUtf8("FinishedListVisualIndexes"), visualIndexes);
qDebug("Finished list columns width saved"); qDebug("Finished list columns width saved");
} }
@@ -355,7 +379,7 @@ void FinishedTorrents::forceRecheck(){
} }
} }
void FinishedTorrents::displayFinishedListMenu(const QPoint& pos){ void FinishedTorrents::displayFinishedListMenu(const QPoint&){
QMenu myFinishedListMenu(this); QMenu myFinishedListMenu(this);
// Enable/disable pause/start action given the DL state // Enable/disable pause/start action given the DL state
QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes(); QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
@@ -399,8 +423,7 @@ void FinishedTorrents::displayFinishedListMenu(const QPoint& pos){
myFinishedListMenu.addAction(actionBuy_it); myFinishedListMenu.addAction(actionBuy_it);
// Call menu // Call menu
// XXX: why mapToGlobal() is not enough? myFinishedListMenu.exec(QCursor::pos());
myFinishedListMenu.exec(mapToGlobal(pos)+QPoint(10,58));
} }

View File

@@ -1,6 +1,6 @@
[Desktop Entry] [Desktop Entry]
Categories=Qt;Network;P2P Categories=Qt;Network;P2P
Comment=V1.3.3 Comment=V1.3.5
Exec=qbittorrent %f Exec=qbittorrent %f
GenericName=Bittorrent client GenericName=Bittorrent client
GenericName[bg]=Торент клиент GenericName[bg]=Торент клиент

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 76 KiB

View File

@@ -121,7 +121,6 @@
<addaction name="actionIncreasePriority" /> <addaction name="actionIncreasePriority" />
<addaction name="separator" /> <addaction name="separator" />
<addaction name="actionExit" /> <addaction name="actionExit" />
<addaction name="separator" />
</widget> </widget>
<widget class="QStatusBar" name="statusBar" /> <widget class="QStatusBar" name="statusBar" />
<action name="actionOpen" > <action name="actionOpen" >

View File

@@ -51,6 +51,8 @@ class torrent_file {
torrent_file(torrent_file *parent, QString path, bool dir, size_type size=0, int index=-1, float progress=0., int priority=1): parent(parent), is_dir(dir), size(size), progress(progress), priority(priority), index(index){ torrent_file(torrent_file *parent, QString path, bool dir, size_type size=0, int index=-1, float progress=0., int priority=1): parent(parent), is_dir(dir), size(size), progress(progress), priority(priority), index(index){
qDebug("created a file with index %d", index); qDebug("created a file with index %d", index);
rel_path = QDir::cleanPath(path); rel_path = QDir::cleanPath(path);
Q_ASSERT(progress >= 0.);
Q_ASSERT(progress <= 1.);
if(parent) { if(parent) {
parent->updateProgress(); parent->updateProgress();
parent->updatePriority(priority); parent->updatePriority(priority);
@@ -75,8 +77,8 @@ class torrent_file {
progress = 0.; progress = 0.;
return; return;
} }
float wanted = 0.; double wanted = 0.;
float done = 0.; double done = 0.;
foreach(const torrent_file *child, children) { foreach(const torrent_file *child, children) {
wanted += child->getSize(); wanted += child->getSize();
done += child->getSize()*child->getProgress(); done += child->getSize()*child->getProgress();
@@ -205,13 +207,13 @@ class arborescence {
} else { } else {
// XXX: Will crash if there is no file in torrent // XXX: Will crash if there is no file in torrent
qDebug("one file in the torrent, setting it as root with index 0"); qDebug("one file in the torrent, setting it as root with index 0");
root = new torrent_file(0, misc::toQString(t.name()), false, fi->size, 0, ((float)fp[0])/t.file_at(0).size, prioritiesTab[0]); root = new torrent_file(0, misc::toQString(t.name()), false, fi->size, 0, ((double)fp[0])/t.file_at(0).size, prioritiesTab[0]);
return; return;
} }
int i = 0; int i = 0;
while(fi != t.end_files()) { while(fi != t.end_files()) {
QString path = QDir::cleanPath(misc::toQString(fi->path.string())); QString path = QDir::cleanPath(misc::toQString(fi->path.string()));
addFile(path, fi->size, i, ((float)fp[i])/t.file_at(i).size, prioritiesTab[i]); addFile(path, fi->size, i, ((double)fp[i])/t.file_at(i).size, prioritiesTab[i]);
fi++; fi++;
++i; ++i;
} }

View File

@@ -29,7 +29,7 @@
*/ */
#include <QDir> #include <QDir>
#include <QTime> #include <QDateTime>
#include <QString> #include <QString>
#include <QTimer> #include <QTimer>
#include <QFileSystemWatcher> #include <QFileSystemWatcher>
@@ -52,9 +52,10 @@
#include <boost/filesystem/exception.hpp> #include <boost/filesystem/exception.hpp>
#define MAX_TRACKER_ERRORS 2 #define MAX_TRACKER_ERRORS 2
#define MAX_RATIO 100.
// Main constructor // Main constructor
bittorrent::bittorrent() : DHTEnabled(false), preAllocateAll(false), addInPause(false), maxConnecsPerTorrent(500), maxUploadsPerTorrent(4), max_ratio(-1), UPnPEnabled(false), NATPMPEnabled(false), LSDEnabled(false), queueingEnabled(false) { bittorrent::bittorrent() : DHTEnabled(false), preAllocateAll(false), addInPause(false), maxConnecsPerTorrent(500), maxUploadsPerTorrent(4), ratio_limit(-1), UPnPEnabled(false), NATPMPEnabled(false), LSDEnabled(false), queueingEnabled(false) {
// To avoid some exceptions // To avoid some exceptions
fs::path::default_name_check(fs::no_check); fs::path::default_name_check(fs::no_check);
// Creating bittorrent session // Creating bittorrent session
@@ -124,7 +125,7 @@ void bittorrent::preAllocateAllFiles(bool b) {
} }
void bittorrent::deleteBigRatios() { void bittorrent::deleteBigRatios() {
if(max_ratio == -1) return; if(ratio_limit == -1) return;
std::vector<torrent_handle> torrents = getTorrents(); std::vector<torrent_handle> torrents = getTorrents();
std::vector<torrent_handle>::iterator torrentIT; std::vector<torrent_handle>::iterator torrentIT;
for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) {
@@ -132,7 +133,8 @@ void bittorrent::deleteBigRatios() {
if(!h.is_valid()) continue; if(!h.is_valid()) continue;
if(h.is_seed()) { if(h.is_seed()) {
QString hash = h.hash(); QString hash = h.hash();
if(getRealRatio(hash) > max_ratio) { float ratio = getRealRatio(hash);
if(ratio <= MAX_RATIO && ratio > ratio_limit) {
QString fileName = h.name(); QString fileName = h.name();
addConsoleMessage(tr("%1 reached the maximum ratio you set.").arg(fileName)); addConsoleMessage(tr("%1 reached the maximum ratio you set.").arg(fileName));
deleteTorrent(hash); deleteTorrent(hash);
@@ -769,6 +771,8 @@ float bittorrent::getRealRatio(QString hash) const{
Q_ASSERT(h.all_time_download() >= 0); Q_ASSERT(h.all_time_download() >= 0);
Q_ASSERT(h.all_time_upload() >= 0); Q_ASSERT(h.all_time_upload() >= 0);
if(h.all_time_download() == 0) { if(h.all_time_download() == 0) {
if(h.all_time_upload() == 0)
return 0;
return 101; return 101;
} }
float ratio = (float)h.all_time_upload()/(float)h.all_time_download(); float ratio = (float)h.all_time_upload()/(float)h.all_time_download();
@@ -848,7 +852,7 @@ void bittorrent::addConsoleMessage(QString msg, QColor color) {
if(consoleMessages.size() > 100) { if(consoleMessages.size() > 100) {
consoleMessages.removeFirst(); consoleMessages.removeFirst();
} }
consoleMessages.append(QString::fromUtf8("<font color='grey'>")+ QTime::currentTime().toString(QString::fromUtf8("hh:mm:ss")) + QString::fromUtf8("</font> - <font color='") + color.name() +QString::fromUtf8("'><i>") + msg + QString::fromUtf8("</i></font>")); consoleMessages.append(QString::fromUtf8("<font color='grey'>")+ QDateTime::currentDateTime().toString(QString::fromUtf8("dd/MM/yyyy hh:mm:ss")) + QString::fromUtf8("</font> - <font color='") + color.name() +QString::fromUtf8("'><i>") + msg + QString::fromUtf8("</i></font>"));
} }
void bittorrent::addPeerBanMessage(QString ip, bool from_ipfilter) { void bittorrent::addPeerBanMessage(QString ip, bool from_ipfilter) {
@@ -856,9 +860,9 @@ void bittorrent::addPeerBanMessage(QString ip, bool from_ipfilter) {
peerBanMessages.removeFirst(); peerBanMessages.removeFirst();
} }
if(from_ipfilter) if(from_ipfilter)
peerBanMessages.append(QString::fromUtf8("<font color='grey'>")+ QTime::currentTime().toString(QString::fromUtf8("hh:mm:ss")) + QString::fromUtf8("</font> - ")+tr("<font color='red'>%1</font> <i>was blocked due to your IP filter</i>", "x.y.z.w was blocked").arg(ip)); peerBanMessages.append(QString::fromUtf8("<font color='grey'>")+ QDateTime::currentDateTime().toString(QString::fromUtf8("dd/MM/yyyy hh:mm:ss")) + QString::fromUtf8("</font> - ")+tr("<font color='red'>%1</font> <i>was blocked due to your IP filter</i>", "x.y.z.w was blocked").arg(ip));
else else
peerBanMessages.append(QString::fromUtf8("<font color='grey'>")+ QTime::currentTime().toString(QString::fromUtf8("hh:mm:ss")) + QString::fromUtf8("</font> - ")+tr("<font color='red'>%1</font> <i>was banned due to corrupt pieces</i>", "x.y.z.w was banned").arg(ip)); peerBanMessages.append(QString::fromUtf8("<font color='grey'>")+ QDateTime::currentDateTime().toString(QString::fromUtf8("dd/MM/yyyy hh:mm:ss")) + QString::fromUtf8("</font> - ")+tr("<font color='red'>%1</font> <i>was banned due to corrupt pieces</i>", "x.y.z.w was banned").arg(ip));
} }
bool bittorrent::isFilePreviewPossible(QString hash) const{ bool bittorrent::isFilePreviewPossible(QString hash) const{
@@ -981,19 +985,19 @@ void bittorrent::setGlobalRatio(float ratio) {
// be automatically deleted // be automatically deleted
void bittorrent::setDeleteRatio(float ratio) { void bittorrent::setDeleteRatio(float ratio) {
if(ratio != -1 && ratio < 1.) ratio = 1.; if(ratio != -1 && ratio < 1.) ratio = 1.;
if(max_ratio == -1 && ratio != -1) { if(ratio_limit == -1 && ratio != -1) {
Q_ASSERT(!BigRatioTimer); Q_ASSERT(!BigRatioTimer);
BigRatioTimer = new QTimer(this); BigRatioTimer = new QTimer(this);
connect(BigRatioTimer, SIGNAL(timeout()), this, SLOT(deleteBigRatios())); connect(BigRatioTimer, SIGNAL(timeout()), this, SLOT(deleteBigRatios()));
BigRatioTimer->start(5000); BigRatioTimer->start(5000);
} else { } else {
if(max_ratio != -1 && ratio == -1) { if(ratio_limit != -1 && ratio == -1) {
delete BigRatioTimer; delete BigRatioTimer;
} }
} }
if(max_ratio != ratio) { if(ratio_limit != ratio) {
max_ratio = ratio; ratio_limit = ratio;
qDebug("* Set deleteRatio to %.1f", max_ratio); qDebug("* Set deleteRatio to %.1f", ratio_limit);
deleteBigRatios(); deleteBigRatios();
} }
} }

View File

@@ -67,7 +67,7 @@ class bittorrent : public QObject {
bool addInPause; bool addInPause;
int maxConnecsPerTorrent; int maxConnecsPerTorrent;
int maxUploadsPerTorrent; int maxUploadsPerTorrent;
float max_ratio; float ratio_limit;
bool UPnPEnabled; bool UPnPEnabled;
bool NATPMPEnabled; bool NATPMPEnabled;
bool LSDEnabled; bool LSDEnabled;

View File

@@ -184,7 +184,6 @@ void createtorrent::on_createButton_clicked(){
void createtorrent::handleCreationFailure(QString msg) { void createtorrent::handleCreationFailure(QString msg) {
QMessageBox::information(0, tr("Torrent creation"), tr("Torrent creation was unsuccessful, reason: %1").arg(msg)); QMessageBox::information(0, tr("Torrent creation"), tr("Torrent creation was unsuccessful, reason: %1").arg(msg));
hide();
} }
void createtorrent::handleCreationSuccess(QString path, const char* branch_path) { void createtorrent::handleCreationSuccess(QString path, const char* branch_path) {
@@ -205,7 +204,7 @@ void createtorrent::handleCreationSuccess(QString path, const char* branch_path)
emit torrent_to_seed(path); emit torrent_to_seed(path);
} }
QMessageBox::information(0, tr("Torrent creation"), tr("Torrent was created successfully:")+" "+path); QMessageBox::information(0, tr("Torrent creation"), tr("Torrent was created successfully:")+" "+path);
hide(); close();
} }
void createtorrent::updateProgressBar(int progress) { void createtorrent::updateProgressBar(int progress) {
@@ -228,8 +227,12 @@ void torrentCreatorThread::create(QString _input_path, QString _save_path, QStri
start(); start();
} }
void sendProgressUpdateSignal(int i, int num, QDialog *parent){ void sendProgressUpdateSignal(int i, int num, torrentCreatorThread *parent){
((createtorrent*)parent)->updateProgressBar((int)(i*100./(float)num)); parent->sendProgressSignal((int)(i*100./(float)num));
}
void torrentCreatorThread::sendProgressSignal(int progress) {
emit updateProgress(progress);
} }
void torrentCreatorThread::run() { void torrentCreatorThread::run() {
@@ -254,15 +257,13 @@ void torrentCreatorThread::run() {
} }
if(abort) return; if(abort) return;
// calculate the hash for all pieces // calculate the hash for all pieces
set_piece_hashes(t, full_path.branch_path(), boost::bind<void>(&sendProgressUpdateSignal, _1, t.num_pieces(), parent)); set_piece_hashes(t, full_path.branch_path(), boost::bind<void>(&sendProgressUpdateSignal, _1, t.num_pieces(), this));
// Set qBittorrent as creator and add user comment to // Set qBittorrent as creator and add user comment to
// torrent_info structure // torrent_info structure
t.set_creator(creator_str); t.set_creator(creator_str);
t.set_comment((const char*)comment.toUtf8()); t.set_comment((const char*)comment.toUtf8());
// Is private ? // Is private ?
if(is_private){ t.set_priv(is_private);
t.set_priv(true);
}
if(abort) return; if(abort) return;
// create the torrent and print it to out // create the torrent and print it to out
ofstream out(complete(path((const char*)save_path.toUtf8())), std::ios_base::binary); ofstream out(complete(path((const char*)save_path.toUtf8())), std::ios_base::binary);

View File

@@ -57,6 +57,7 @@ class torrentCreatorThread : public QThread {
wait(); wait();
} }
void create(QString _input_path, QString _save_path, QStringList _trackers, QStringList _url_seeds, QString _comment, bool _is_private, int _piece_size); void create(QString _input_path, QString _save_path, QStringList _trackers, QStringList _url_seeds, QString _comment, bool _is_private, int _piece_size);
void sendProgressSignal(int progress);
protected: protected:
void run(); void run();
@@ -64,6 +65,8 @@ class torrentCreatorThread : public QThread {
signals: signals:
void creationFailure(QString msg); void creationFailure(QString msg);
void creationSuccess(QString path, const char* branch_path); void creationSuccess(QString path, const char* branch_path);
signals:
void updateProgress(int progress); void updateProgress(int progress);
}; };

View File

@@ -68,6 +68,8 @@ DownloadingTorrents::DownloadingTorrents(QObject *parent, bittorrent *BTSession)
DLListModel->setHeaderData(ETA, Qt::Horizontal, tr("ETA", "i.e: Estimated Time of Arrival / Time left")); DLListModel->setHeaderData(ETA, Qt::Horizontal, tr("ETA", "i.e: Estimated Time of Arrival / Time left"));
DLListModel->setHeaderData(PRIORITY, Qt::Horizontal, tr("Priority")); DLListModel->setHeaderData(PRIORITY, Qt::Horizontal, tr("Priority"));
downloadList->setModel(DLListModel); downloadList->setModel(DLListModel);
downloadList->setRootIsDecorated(false);
downloadList->setAllColumnsShowFocus(true);
DLDelegate = new DLListDelegate(downloadList); DLDelegate = new DLListDelegate(downloadList);
downloadList->setItemDelegate(DLDelegate); downloadList->setItemDelegate(DLDelegate);
// Hide priority column // Hide priority column
@@ -236,7 +238,7 @@ void DownloadingTorrents::forceRecheck() {
} }
} }
void DownloadingTorrents::displayDLListMenu(const QPoint& pos) { void DownloadingTorrents::displayDLListMenu(const QPoint&) {
QMenu myDLLlistMenu(this); QMenu myDLLlistMenu(this);
// Enable/disable pause/start action given the DL state // Enable/disable pause/start action given the DL state
QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes(); QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes();
@@ -285,8 +287,7 @@ void DownloadingTorrents::displayDLListMenu(const QPoint& pos) {
myDLLlistMenu.addSeparator(); myDLLlistMenu.addSeparator();
myDLLlistMenu.addAction(actionBuy_it); myDLLlistMenu.addAction(actionBuy_it);
// Call menu // Call menu
// XXX: why mapToGlobal() is not enough? myDLLlistMenu.exec(QCursor::pos());
myDLLlistMenu.exec(mapToGlobal(pos)+QPoint(10,35));
} }
@@ -578,6 +579,7 @@ void DownloadingTorrents::addTorrent(QString hash) {
DLListModel->setData(DLListModel->index(row, UPSPEED), QVariant((double)0.)); DLListModel->setData(DLListModel->index(row, UPSPEED), QVariant((double)0.));
DLListModel->setData(DLListModel->index(row, SEEDSLEECH), QVariant(QString::fromUtf8("0/0"))); DLListModel->setData(DLListModel->index(row, SEEDSLEECH), QVariant(QString::fromUtf8("0/0")));
DLListModel->setData(DLListModel->index(row, PROGRESS), QVariant((double)h.progress())); DLListModel->setData(DLListModel->index(row, PROGRESS), QVariant((double)h.progress()));
DLListModel->setData(DLListModel->index(row, RATIO), QVariant((double)0.));
DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1)); DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1));
if(BTSession->isQueueingEnabled()) if(BTSession->isQueueingEnabled())
DLListModel->setData(DLListModel->index(row, PRIORITY), QVariant((int)BTSession->getDlTorrentPriority(hash))); DLListModel->setData(DLListModel->index(row, PRIORITY), QVariant((int)BTSession->getDlTorrentPriority(hash)));
@@ -730,6 +732,11 @@ void DownloadingTorrents::saveColWidthDLList() const{
} }
} }
settings.setValue(QString::fromUtf8("DownloadListColsWidth"), new_width_list.join(QString::fromUtf8(" "))); settings.setValue(QString::fromUtf8("DownloadListColsWidth"), new_width_list.join(QString::fromUtf8(" ")));
QVariantList visualIndexes;
for(int i=0; i<nbColumns; ++i) {
visualIndexes.append(downloadList->header()->visualIndex(i));
}
settings.setValue(QString::fromUtf8("DownloadListVisualIndexes"), visualIndexes);
qDebug("Download list columns width saved"); qDebug("Download list columns width saved");
} }
@@ -750,6 +757,23 @@ bool DownloadingTorrents::loadColWidthDLList() {
for(unsigned int i=0; i<listSize; ++i) { for(unsigned int i=0; i<listSize; ++i) {
downloadList->header()->resizeSection(i, width_list.at(i).toInt()); downloadList->header()->resizeSection(i, width_list.at(i).toInt());
} }
QVariantList visualIndexes = settings.value(QString::fromUtf8("DownloadListVisualIndexes"), QVariantList()).toList();
if(visualIndexes.size() != DLListModel->columnCount()-1) {
qDebug("Corrupted values for download list columns sizes");
return false;
}
bool change = false;
do {
change = false;
for(int i=0;i<visualIndexes.size(); ++i) {
int new_visual_index = visualIndexes.at(downloadList->header()->logicalIndex(i)).toInt();
if(i != new_visual_index) {
qDebug("Moving column from %d to %d", downloadList->header()->logicalIndex(i), new_visual_index);
downloadList->header()->moveSection(i, new_visual_index);
change = true;
}
}
}while(change);
qDebug("Download list columns width loaded"); qDebug("Download list columns width loaded");
return true; return true;
} }

View File

@@ -191,9 +191,13 @@ class FilterParserThread : public QThread {
if(IPv4) { if(IPv4) {
//IPv4 addresses //IPv4 addresses
IP = strStartIP.split('.'); IP = strStartIP.split('.');
address_v4 start((IP.at(0).toInt() << 24) + (IP.at(1).toInt() << 16) + (IP.at(2).toInt() << 8) + IP.at(3).toInt()); if(IP.size() != 4)
throw exception();
address_v4 start((IP.at(0).toUInt() << 24) + (IP.at(1).toUInt() << 16) + (IP.at(2).toUInt() << 8) + IP.at(3).toUInt());
IP = strEndIP.split('.'); IP = strEndIP.split('.');
address_v4 last((IP.at(0).toInt() << 24) + (IP.at(1).toInt() << 16) + (IP.at(2).toInt() << 8) + IP.at(3).toInt()); if(IP.size() != 4)
throw exception();
address_v4 last((IP.at(0).toUInt() << 24) + (IP.at(1).toUInt() << 16) + (IP.at(2).toUInt() << 8) + IP.at(3).toUInt());
// Apply to bittorrent session // Apply to bittorrent session
filter.add_rule(start, last, ip_filter::blocked); filter.add_rule(start, last, ip_filter::blocked);
} else { } else {
@@ -250,9 +254,9 @@ class FilterParserThread : public QThread {
if(strStartIP.contains(is_ipv4) && strEndIP.contains(is_ipv4)) { if(strStartIP.contains(is_ipv4) && strEndIP.contains(is_ipv4)) {
// IPv4 // IPv4
IP = strStartIP.split('.'); IP = strStartIP.split('.');
address_v4 start((IP.at(0).toInt() << 24) + (IP.at(1).toInt() << 16) + (IP.at(2).toInt() << 8) + IP.at(3).toInt()); address_v4 start((IP.at(0).toUInt() << 24) + (IP.at(1).toUInt() << 16) + (IP.at(2).toUInt() << 8) + IP.at(3).toUInt());
IP = strEndIP.split('.'); IP = strEndIP.split('.');
address_v4 last((IP.at(0).toInt() << 24) + (IP.at(1).toInt() << 16) + (IP.at(2).toInt() << 8) + IP.at(3).toInt()); address_v4 last((IP.at(0).toUInt() << 24) + (IP.at(1).toUInt() << 16) + (IP.at(2).toUInt() << 8) + IP.at(3).toUInt());
// Apply to bittorrent session // Apply to bittorrent session
filter.add_rule(start, last, ip_filter::blocked); filter.add_rule(start, last, ip_filter::blocked);
} else { } else {

View File

@@ -103,8 +103,12 @@ void useStyle(QApplication *app, int style){
app->setStyle(new QWindowsXPStyle()); app->setStyle(new QWindowsXPStyle());
break; break;
#endif #endif
/*default: default:
app->setStyle(new QPlastiqueStyle());*/ if(app->style()->objectName() == "cleanlooks") {
// Force our own cleanlooks style
qDebug("Forcing our own cleanlooks style");
app->setStyle(new QGnomeLookStyle());
}
} }
} }

View File

@@ -1,3 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>properties</class> <class>properties</class>
<widget class="QDialog" name="properties"> <widget class="QDialog" name="properties">
@@ -294,7 +295,7 @@
<item> <item>
<widget class="QGroupBox" name="groupBox"> <widget class="QGroupBox" name="groupBox">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy vsizetype="Expanding" hsizetype="Expanding" > <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
@@ -534,7 +535,7 @@
<item> <item>
<widget class="QListWidget" name="trackersURLS"> <widget class="QListWidget" name="trackersURLS">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy vsizetype="Expanding" hsizetype="Expanding" > <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>

View File

@@ -136,9 +136,8 @@ properties::properties(QWidget *parent, bittorrent *BTSession, QTorrentHandle &h
updateInfosTimer->start(3000); updateInfosTimer->start(3000);
progressBar = new RealProgressBar(this); progressBar = new RealProgressBar(this);
progressBar->setForegroundColor(Qt::blue); progressBar->setForegroundColor(Qt::blue);
QVBoxLayout *vbox = new QVBoxLayout(this); progressBarVbox = new QVBoxLayout(RealProgressBox);
vbox->addWidget(progressBar); progressBarVbox->addWidget(progressBar);
RealProgressBox->setLayout(vbox);
progressBarUpdater = new RealProgressBarThread(progressBar, h); progressBarUpdater = new RealProgressBarThread(progressBar, h);
progressBarUpdater->start(); progressBarUpdater->start();
// progressBarUpdater->refresh(); // progressBarUpdater->refresh();
@@ -147,12 +146,14 @@ properties::properties(QWidget *parent, bittorrent *BTSession, QTorrentHandle &h
} }
properties::~properties(){ properties::~properties(){
writeSettings();
qDebug("Properties destroyed"); qDebug("Properties destroyed");
delete updateInfosTimer; delete updateInfosTimer;
delete PropDelegate; delete PropDelegate;
delete PropListModel; delete PropListModel;
delete progressBarUpdater; delete progressBarUpdater;
delete progressBar; delete progressBar;
delete progressBarVbox;
} }
void properties::addFilesToTree(const torrent_file *root, QStandardItem *parent) { void properties::addFilesToTree(const torrent_file *root, QStandardItem *parent) {
@@ -187,6 +188,11 @@ void properties::writeSettings() {
settings.beginGroup(QString::fromUtf8("PropWindow")); settings.beginGroup(QString::fromUtf8("PropWindow"));
settings.setValue(QString::fromUtf8("size"), size()); settings.setValue(QString::fromUtf8("size"), size());
settings.setValue(QString::fromUtf8("pos"), pos()); settings.setValue(QString::fromUtf8("pos"), pos());
QVariantList contentColsWidths;
for(int i=0; i<PropListModel->columnCount()-1; ++i) {
contentColsWidths.append(filesList->columnWidth(i));
}
settings.setValue(QString::fromUtf8("contentColsWidths"), contentColsWidths);
settings.endGroup(); settings.endGroup();
} }
@@ -194,6 +200,14 @@ void properties::loadSettings() {
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
resize(settings.value(QString::fromUtf8("PropWindow/size"), size()).toSize()); resize(settings.value(QString::fromUtf8("PropWindow/size"), size()).toSize());
move(settings.value(QString::fromUtf8("PropWindow/pos"), screenCenter()).toPoint()); move(settings.value(QString::fromUtf8("PropWindow/pos"), screenCenter()).toPoint());
QVariantList contentColsWidths = settings.value(QString::fromUtf8("PropWindow/contentColsWidths"), QVariantList()).toList();
if(contentColsWidths.empty()) {
filesList->header()->resizeSection(NAME, 200);
} else {
for(int i=0; i<contentColsWidths.size(); ++i) {
filesList->setColumnWidth(i, contentColsWidths.at(i).toInt());
}
}
} }
// Center window // Center window
@@ -362,7 +376,7 @@ void properties::getPriorities(QStandardItem *parent, int *priorities) {
} }
} }
void properties::displayFilesListMenu(const QPoint& pos){ void properties::displayFilesListMenu(const QPoint&){
if(h.get_torrent_info().num_files() == 1) return; if(h.get_torrent_info().num_files() == 1) return;
QMenu myFilesLlistMenu(this); QMenu myFilesLlistMenu(this);
QModelIndex index; QModelIndex index;
@@ -374,8 +388,7 @@ void properties::displayFilesListMenu(const QPoint& pos){
myFilesLlistMenu.addAction(actionHigh); myFilesLlistMenu.addAction(actionHigh);
myFilesLlistMenu.addAction(actionMaximum); myFilesLlistMenu.addAction(actionMaximum);
// Call menu // Call menu
// XXX: why mapToGlobal() is not enough? myFilesLlistMenu.exec(QCursor::pos());
myFilesLlistMenu.exec(mapToGlobal(pos)+QPoint(22,95));
} }
void properties::ignoreSelection(){ void properties::ignoreSelection(){

View File

@@ -59,6 +59,7 @@ class properties : public QDialog, private Ui::properties{
QStringList urlSeeds; QStringList urlSeeds;
RealProgressBar *progressBar; RealProgressBar *progressBar;
RealProgressBarThread *progressBarUpdater; RealProgressBarThread *progressBarUpdater;
QVBoxLayout *progressBarVbox;
protected slots: protected slots:
void on_okButton_clicked(); void on_okButton_clicked();

View File

@@ -177,6 +177,7 @@ void SearchEngine::on_search_button_clicked(){
// verify the max size of the history // verify the max size of the history
if(searchHistory.size() > SEARCHHISTORY_MAXSIZE) if(searchHistory.size() > SEARCHHISTORY_MAXSIZE)
searchHistory = searchHistory.mid(searchHistory.size()/2,searchHistory.size()/2); searchHistory = searchHistory.mid(searchHistory.size()/2,searchHistory.size()/2);
delete searchCompleter;
searchCompleter = new QCompleter(searchHistory, this); searchCompleter = new QCompleter(searchHistory, this);
searchCompleter->setCaseSensitivity(Qt::CaseInsensitive); searchCompleter->setCaseSensitivity(Qt::CaseInsensitive);
search_pattern->setCompleter(searchCompleter); search_pattern->setCompleter(searchCompleter);
@@ -269,7 +270,7 @@ void SearchEngine::downloadFinished(int exitcode, QProcess::ExitStatus) {
} }
} }
qDebug("Deleting downloadProcess"); qDebug("Deleting downloadProcess");
downloaders.removeOne(downloadProcess); downloaders.removeAll(downloadProcess);
delete downloadProcess; delete downloadProcess;
} }

View File

@@ -1,5 +1,3 @@
#VERSION: 1.0
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met: # modification, are permitted provided that the following conditions are met:
# #
@@ -24,6 +22,11 @@
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE. # POSSIBILITY OF SUCH DAMAGE.
#VERSION: 1.02
# Author:
# Christophe DUMEZ (chris@qbittorrent.org)
import re, htmlentitydefs import re, htmlentitydefs
import urllib2 import urllib2
import tempfile import tempfile
@@ -66,7 +69,7 @@ def download_file(url):
file = os.fdopen(file, "wb") file = os.fdopen(file, "wb")
# Download url # Download url
req = urllib2.Request(url) req = urllib2.Request(url)
response = urllib2.urlopen(url) response = urllib2.urlopen(req)
dat = response.read() dat = response.read()
# Write it to a file # Write it to a file
file.write(dat) file.write(dat)

View File

@@ -14,10 +14,10 @@ CONFIG += qt \
network network
# Update this VERSION for each release # Update this VERSION for each release
DEFINES += VERSION=\\\"v1.3.3\\\" DEFINES += VERSION=\\\"v1.3.5\\\"
DEFINES += VERSION_MAJOR=1 DEFINES += VERSION_MAJOR=1
DEFINES += VERSION_MINOR=3 DEFINES += VERSION_MINOR=3
DEFINES += VERSION_BUGFIX=3 DEFINES += VERSION_BUGFIX=5
!mac:QMAKE_LFLAGS += -Wl,--as-needed !mac:QMAKE_LFLAGS += -Wl,--as-needed
contains(DEBUG_MODE, 1) { contains(DEBUG_MODE, 1) {
CONFIG += debug CONFIG += debug

View File

@@ -290,7 +290,7 @@ class torrentAdditionDialog : public QDialog, private Ui_addTorrentDialog{
return true; return true;
} }
void displayFilesListMenu(const QPoint& pos){ void displayFilesListMenu(const QPoint&){
if(nbFiles == 1) return; if(nbFiles == 1) return;
QMenu myFilesLlistMenu(this); QMenu myFilesLlistMenu(this);
QModelIndex index; QModelIndex index;
@@ -302,8 +302,7 @@ class torrentAdditionDialog : public QDialog, private Ui_addTorrentDialog{
myFilesLlistMenu.addAction(actionHigh); myFilesLlistMenu.addAction(actionHigh);
myFilesLlistMenu.addAction(actionMaximum); myFilesLlistMenu.addAction(actionMaximum);
// Call menu // Call menu
// XXX: why mapToGlobal() is not enough? myFilesLlistMenu.exec(QCursor::pos());
myFilesLlistMenu.exec(mapToGlobal(pos)+QPoint(10,145));
} }
void ignoreSelection(){ void ignoreSelection(){