Compare commits

..

28 Commits

Author SHA1 Message Date
Christophe Dumez
0e8f62b675 Tagged v2.5.4 release 2011-01-06 09:52:04 +00:00
Christophe Dumez
c571ae900c Bump to v2.5.4 2011-01-06 09:24:16 +00:00
Christophe Dumez
b9f6bbf09b BUGFIX: Avoid possible crash on exit when the IP filter is enabled (closes #695945) 2011-01-03 21:34:16 +00:00
Christophe Dumez
916e01f9f8 BUGFIX: Fix issues when search engines results contain a '|' 2011-01-03 19:11:12 +00:00
Christophe Dumez
7bd5b0d3b5 Print the default web UI password on stdout when runing nox 2011-01-02 17:42:11 +00:00
Christophe Dumez
44574498ad Fix configure script 2011-01-02 17:30:54 +00:00
Christophe Dumez
ec3d45fc99 Prioritize first and last pieces when sequential download is enabled 2011-01-02 14:02:27 +00:00
Christophe Dumez
7908de917a Added WPATH DEFINE 2011-01-01 23:30:09 +00:00
Christophe Dumez
0e53a6ab8b Fix compilation in release mode 2011-01-01 22:30:17 +00:00
Christophe Dumez
ba2f8af012 Some encoding fixes 2011-01-01 20:26:47 +00:00
Christophe Dumez
a8bc3f6d4d BUGFIX: Added --enable-debug parameter to the configure script 2011-01-01 17:21:02 +00:00
Christophe Dumez
0211f42df9 Fix Changelog date 2011-01-01 11:55:00 +00:00
Christophe Dumez
0180f46dc9 Updated Changelog 2011-01-01 09:05:08 +00:00
Christophe Dumez
6e4d15e72d Bump to v2.5.3 2010-12-31 12:36:27 +00:00
Christophe Dumez
3e1e992fa8 Improved splash screen code 2010-12-31 12:33:15 +00:00
Christophe Dumez
6051aa57cf BUGFIX: Fix ampersand display in search tabs (closes #695715) 2010-12-30 17:07:39 +00:00
Christophe Dumez
55b0cac61b BUGFIX: Remove empty folders on torrent soft deletion (closes #695174) 2010-12-29 20:31:45 +00:00
Christophe Dumez
28409b83c3 Fix scan dirs saving 2010-12-27 19:28:41 +00:00
Christophe Dumez
eed0b6ca12 Restore Update Url 2010-12-26 12:30:08 +00:00
Christophe Dumez
4b0fae88bc Updated plugin update URL 2010-12-26 09:57:15 +00:00
Christophe Dumez
6ff3de7686 Make compatible with nova2 plugins (new API) 2010-12-26 09:08:28 +00:00
Christophe Dumez
f08d792e67 Improvement to last commit 2010-12-25 09:24:33 +00:00
Christophe Dumez
e2edf62834 BUGFIX: Make sure the number of torrents is properly set on startup (closes #694135) 2010-12-25 09:17:26 +00:00
Christophe Dumez
eb4c449620 Some OS2 changes by Silvan Scherrer 2010-12-24 09:15:16 +00:00
Christophe Dumez
c06386126b BUGFIX: Fix priority up/down for multiple torrents at the same time (closes #692184) 2010-12-19 13:46:13 +00:00
Christophe Dumez
8c854b8a0e Fix compilation error in release mode 2010-12-19 10:19:52 +00:00
Christophe Dumez
749c3a429a Update release date 2010-12-19 08:57:52 +00:00
Christophe Dumez
a6edea2222 Bump to v2.5.2 2010-12-19 08:57:28 +00:00
33 changed files with 407 additions and 126 deletions

View File

@@ -1,3 +1,19 @@
* Thu Jan 6 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.5.4
- BUGFIX: Added --enable-debug parameter to the configure script
- BUGFIX: Prioritize first and last pieces when sequential download is enabled
- BUGFIX: Some encoding fixes (Windows)
- BUGFIX: Display default password on stdout when using nox
- BUGFIX: Fix issues when search engines results contain a '|'
- BUGFIX: Avoid possible crash on exit when the IP filter is enabled (closes #695945)
* Sat Jan 1 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.5.3
- BUGFIX: Fix priority up/down for multiple torrents at the same time (closes #692184)
- BUGFIX: Make sure the number of torrents is properly set on startup (closes #694135)
- BUGFIX: Fix scan directories saving (closes #694768)
- BUGFIX: Remove empty folders on torrent soft deletion (closes #695174)
- BUGFIX: Make sure the main window has focus on startup
- BUGFIX: Fix ampersand display in search tabs (closes #695715)
* Sun Dec 19 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.5.2 * Sun Dec 19 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.5.2
- BUGFIX: Fix alternative speed icon staying pressed when disabled - BUGFIX: Fix alternative speed icon staying pressed when disabled
- BUGFIX: Fix slot warning on startup - BUGFIX: Fix slot warning on startup

34
configure vendored
View File

@@ -18,9 +18,11 @@ Main options:
--help This help text. --help This help text.
Dependency options: Dependency options:
--enable-debug Enable debug mode
--disable-gui Disable qBittorrent --disable-gui Disable qBittorrent
Graphical user interface for Graphical user interface for
headless running headless running
--enable-debug Enable debug mode
--with-libboost-inc=[path] Path to libboost include --with-libboost-inc=[path] Path to libboost include
files files
--with-libboost-lib=[path] Path to libboost library --with-libboost-lib=[path] Path to libboost library
@@ -32,8 +34,6 @@ Dependency options:
executable (please follow executable (please follow
instructions in instructions in
src/geoip/README) src/geoip/README)
--disable-qtsingleapplication Disable use of
qtsingleapplication
--with-qtsingleapplication=[system|shipped] Use the shipped --with-qtsingleapplication=[system|shipped] Use the shipped
qtsingleapplication library qtsingleapplication library
or the system one or the system one
@@ -153,11 +153,21 @@ while [ $# -gt 0 ]; do
shift shift
;; ;;
--enable-debug)
QC_ENABLE_DEBUG="Y"
shift
;;
--disable-gui) --disable-gui)
QC_DISABLE_GUI="Y" QC_DISABLE_GUI="Y"
shift shift
;; ;;
--enable-debug)
QC_ENABLE_DEBUG="Y"
shift
;;
--with-libboost-inc=*) --with-libboost-inc=*)
QC_WITH_LIBBOOST_INC=$optarg QC_WITH_LIBBOOST_INC=$optarg
shift shift
@@ -183,11 +193,6 @@ while [ $# -gt 0 ]; do
shift shift
;; ;;
--disable-qtsingleapplication)
QC_DISABLE_qtsingleapplication="Y"
shift
;;
--with-qtsingleapplication=*) --with-qtsingleapplication=*)
QC_WITH_QTSINGLEAPPLICATION=$optarg QC_WITH_QTSINGLEAPPLICATION=$optarg
shift shift
@@ -214,13 +219,14 @@ echo PREFIX=$PREFIX
echo BINDIR=$BINDIR echo BINDIR=$BINDIR
echo DATADIR=$DATADIR echo DATADIR=$DATADIR
echo EX_QTDIR=$EX_QTDIR echo EX_QTDIR=$EX_QTDIR
echo QC_ENABLE_DEBUG=$QC_ENABLE_DEBUG
echo QC_DISABLE_GUI=$QC_DISABLE_GUI echo QC_DISABLE_GUI=$QC_DISABLE_GUI
echo QC_ENABLE_DEBUG=$QC_ENABLE_DEBUG
echo QC_WITH_LIBBOOST_INC=$QC_WITH_LIBBOOST_INC echo QC_WITH_LIBBOOST_INC=$QC_WITH_LIBBOOST_INC
echo QC_WITH_LIBBOOST_LIB=$QC_WITH_LIBBOOST_LIB echo QC_WITH_LIBBOOST_LIB=$QC_WITH_LIBBOOST_LIB
echo QC_DISABLE_libnotify=$QC_DISABLE_libnotify echo QC_DISABLE_libnotify=$QC_DISABLE_libnotify
echo QC_DISABLE_geoip_database=$QC_DISABLE_geoip_database echo QC_DISABLE_geoip_database=$QC_DISABLE_geoip_database
echo QC_WITH_GEOIP_DATABASE_EMBEDDED=$QC_WITH_GEOIP_DATABASE_EMBEDDED echo QC_WITH_GEOIP_DATABASE_EMBEDDED=$QC_WITH_GEOIP_DATABASE_EMBEDDED
echo QC_DISABLE_qtsingleapplication=$QC_DISABLE_qtsingleapplication
echo QC_WITH_QTSINGLEAPPLICATION=$QC_WITH_QTSINGLEAPPLICATION echo QC_WITH_QTSINGLEAPPLICATION=$QC_WITH_QTSINGLEAPPLICATION
echo echo
fi fi
@@ -327,7 +333,9 @@ cat >$1/modules.cpp <<EOT
/* /*
-----BEGIN QCMOD----- -----BEGIN QCMOD-----
name: Qt >= 4.5 name: Qt >= 4.5
arg: enable-debug, Enable debug mode
arg: disable-gui, Disable qBittorrent Graphical user interface for headless running arg: disable-gui, Disable qBittorrent Graphical user interface for headless running
arg: enable-debug, Enable debug mode
-----END QCMOD----- -----END QCMOD-----
*/ */
class qc_qt4 : public ConfObj class qc_qt4 : public ConfObj
@@ -338,9 +346,14 @@ public:
QString shortname() const { return "Qt 4.5"; } QString shortname() const { return "Qt 4.5"; }
bool exec() bool exec()
{ {
// NOX mode
if(!conf->getenv("QC_DISABLE_GUI").isEmpty()) { if(!conf->getenv("QC_DISABLE_GUI").isEmpty()) {
conf->addExtra("CONFIG += nox"); conf->addExtra("CONFIG += nox");
} }
// Debug mode
if(!conf->getenv("QC_ENABLE_DEBUG").isEmpty()) {
conf->addExtra("CONFIG += debug");
}
return(QT_VERSION >= 0x040500); return(QT_VERSION >= 0x040500);
} }
}; };
@@ -656,7 +669,7 @@ cat >$1/modules_new.cpp <<EOT
o->required = false; o->required = false;
o->disabled = false; o->disabled = false;
o = new qc_qtsingleapplication(conf); o = new qc_qtsingleapplication(conf);
o->required = false; o->required = true;
o->disabled = false; o->disabled = false;
EOT EOT
@@ -1603,13 +1616,14 @@ export PREFIX
export BINDIR export BINDIR
export DATADIR export DATADIR
export EX_QTDIR export EX_QTDIR
export QC_ENABLE_DEBUG
export QC_DISABLE_GUI export QC_DISABLE_GUI
export QC_ENABLE_DEBUG
export QC_WITH_LIBBOOST_INC export QC_WITH_LIBBOOST_INC
export QC_WITH_LIBBOOST_LIB export QC_WITH_LIBBOOST_LIB
export QC_DISABLE_libnotify export QC_DISABLE_libnotify
export QC_DISABLE_geoip_database export QC_DISABLE_geoip_database
export QC_WITH_GEOIP_DATABASE_EMBEDDED export QC_WITH_GEOIP_DATABASE_EMBEDDED
export QC_DISABLE_qtsingleapplication
export QC_WITH_QTSINGLEAPPLICATION export QC_WITH_QTSINGLEAPPLICATION
export QC_VERBOSE export QC_VERBOSE
rm -rf .qconftemp rm -rf .qconftemp

136
install.os2 Normal file
View File

@@ -0,0 +1,136 @@
QBittorrent installation
0. CONTENTS OF THIS FILE
========================
1. INTRODUCTION
2. REQUIREMENTS
3. INSTALLATION
4. CONTACT
5. CREDITS
6. SUPPORT AND DONATIONS
7. HISTORY
1. INTRODUCTION
===============
Welcome to QBittorrent port for OS/2 and eComStation.
2. REQUIREMENTS
===============
* klibc 0.6.3 or later
ftp://ftp.netlabs.org/pub/gcc/libc-0_6_3-csd3.wpi
* openssl 1.0
ftp://ftp.netlabs.org/pub/unixos2/ssl10.zip
* Qt4 dll
see http://svn.netlabs.org/qt4 for more information whats needed and where to get the latest
3. INSTALLATION
===============
To install QBittorrent, do the following:
klibc
-----
1. Download klibc 0.6.3 csd3 or later.
2. Install the package by double-clicking on the WPI file.
openssl 1.0
-----------
1. Download the zip file
2. Install the files to your libpath eg. x:\ecs\dll
Qt4 dll
-------
1. Download the package
2. Install the package by double-clicking on the wpi file.
QBittorrent
-----------
1. Create a directory for QBittorrent.
2. Extract the QBittorrent package to the new directory.
3. Create a WPS object for QBittorrent.exe.
4. Start QBittorrent
5. Happy torrenting
4. CONTACT
==========
Please send bugreports to:
ecs@aroa.ch
Only bug reports with a reproducable bug are accepted. :-)
5. CREDITS
==========
The port was done by:
Silvan Scherrer aka _diver
Thanks go to:
* Dmitry A. Kuminov
They either helped me when I had some nasty questions or did some testing for
me.
6. SUPPORT AND DONATIONS
========================
QBittorrent port is based on volunteer work. If you would like to support further
development, you can do so in one of the following ways:
* Donate to the Qt4 project: see qt.netlabs.org for more information
* Contribute to the project: Besides actual development, this also includes
maintaining the documentation and the project web site as well as help
for users.
7. HISTORY
==========
2010-12-23
* updated to 2.5.2 code level of QBittorrent
2010-11-22
* updated to 2.4.11 code level of QBittorrent
2010-xx-xx
* initial port

View File

@@ -1,3 +1,10 @@
INCLUDEPATH += $$PWD
exists(conf.pri) {
# to the conf.pri goes all system dependent stuff
include(conf.pri)
}
LIBS += -ltorrent-rasterbar \ LIBS += -ltorrent-rasterbar \
-lboost_thread \ -lboost_thread \
-lboost_system \ -lboost_system \

View File

@@ -20,5 +20,6 @@
<dep type='geoip-database'> <dep type='geoip-database'>
</dep> </dep>
<dep type='qtsingleapplication'> <dep type='qtsingleapplication'>
<required/>
</dep> </dep>
</qconf> </qconf>

View File

@@ -1,7 +1,9 @@
/* /*
-----BEGIN QCMOD----- -----BEGIN QCMOD-----
name: Qt >= 4.5 name: Qt >= 4.5
arg: enable-debug, Enable debug mode
arg: disable-gui, Disable qBittorrent Graphical user interface for headless running arg: disable-gui, Disable qBittorrent Graphical user interface for headless running
arg: enable-debug, Enable debug mode
-----END QCMOD----- -----END QCMOD-----
*/ */
class qc_qt4 : public ConfObj class qc_qt4 : public ConfObj
@@ -12,9 +14,14 @@ public:
QString shortname() const { return "Qt 4.5"; } QString shortname() const { return "Qt 4.5"; }
bool exec() bool exec()
{ {
// NOX mode
if(!conf->getenv("QC_DISABLE_GUI").isEmpty()) { if(!conf->getenv("QC_DISABLE_GUI").isEmpty()) {
conf->addExtra("CONFIG += nox"); conf->addExtra("CONFIG += nox");
} }
// Debug mode
if(!conf->getenv("QC_ENABLE_DEBUG").isEmpty()) {
conf->addExtra("CONFIG += debug");
}
return(QT_VERSION >= 0x040500); return(QT_VERSION >= 0x040500);
} }
}; };

View File

@@ -1,6 +1,6 @@
[Desktop Entry] [Desktop Entry]
Categories=Qt;Network;P2P; Categories=Qt;Network;P2P;
Comment=V2.5.2 Comment=V2.5.4
Exec=qbittorrent %f Exec=qbittorrent %f
GenericName=Bittorrent client GenericName=Bittorrent client
GenericName[ar]=العميل Bittorrent GenericName[ar]=العميل Bittorrent

View File

@@ -47,7 +47,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleGetInfoString</key> <key>CFBundleGetInfoString</key>
<string>2.5.2</string> <string>2.5.4</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>

View File

@@ -88,6 +88,7 @@ protected:
} }
} }
} }
if(abort) return;
s->set_ip_filter(filter); s->set_ip_filter(filter);
qDebug("IP Filter thread: finished parsing, filter applied"); qDebug("IP Filter thread: finished parsing, filter applied");
} }

View File

@@ -54,7 +54,8 @@ public:
std::cout << std::endl << "******** " << qPrintable(tr("Information")) << " ********" << std::endl; std::cout << std::endl << "******** " << qPrintable(tr("Information")) << " ********" << std::endl;
std::cout << qPrintable(tr("To control qBittorrent, access the Web UI at http://localhost:%1").arg(QString::number(pref.getWebUiPort()))) << std::endl; std::cout << qPrintable(tr("To control qBittorrent, access the Web UI at http://localhost:%1").arg(QString::number(pref.getWebUiPort()))) << std::endl;
std::cout << qPrintable(tr("The Web UI administrator user name is: %1").arg(pref.getWebUiUsername())) << std::endl; std::cout << qPrintable(tr("The Web UI administrator user name is: %1").arg(pref.getWebUiUsername())) << std::endl;
if(pref.getWebUiPassword() == "f6fdffe48c908deb0f4c3bd36c032e72") { qDebug() << "Password:" << pref.getWebUiPassword();
if(pref.getWebUiPassword() == "32fe0bd2bb001911bb8bcfe23fc92b63") {
std::cout << qPrintable(tr("The Web UI administrator password is still the default one: %1").arg("adminadmin")) << std::endl; std::cout << qPrintable(tr("The Web UI administrator password is still the default one: %1").arg("adminadmin")) << std::endl;
std::cout << qPrintable(tr("This is a security risk, please consider changing your password from program preferences.")) << std::endl; std::cout << qPrintable(tr("This is a security risk, please consider changing your password from program preferences.")) << std::endl;
} }

View File

@@ -263,9 +263,9 @@ int main(int argc, char *argv[]){
painter.setFont(QFont("Arial", 22, QFont::Black)); painter.setFont(QFont("Arial", 22, QFont::Black));
painter.drawText(224 - painter.fontMetrics().width(version), 270, version); painter.drawText(224 - painter.fontMetrics().width(version), 270, version);
splash = new QSplashScreen(splash_img, Qt::WindowStaysOnTopHint); splash = new QSplashScreen(splash_img, Qt::WindowStaysOnTopHint);
QTimer::singleShot(1500, splash, SLOT(deleteLater()));
splash->show(); splash->show();
app.processEvents(); app.processEvents();
QTimer::singleShot(2000, splash, SLOT(deleteLater()));
} }
#endif #endif
// Set environment variable // Set environment variable
@@ -296,6 +296,8 @@ int main(int argc, char *argv[]){
torrentCmdLine.removeFirst(); torrentCmdLine.removeFirst();
#ifndef DISABLE_GUI #ifndef DISABLE_GUI
MainWindow window(0, torrentCmdLine); MainWindow window(0, torrentCmdLine);
if(!no_splash)
window.raise();
QObject::connect(&app, SIGNAL(messageReceived(const QString&)), QObject::connect(&app, SIGNAL(messageReceived(const QString&)),
&window, SLOT(processParams(const QString&))); &window, SLOT(processParams(const QString&)));
app.setActivationWindow(&window); app.setActivationWindow(&window);

View File

@@ -163,8 +163,6 @@ MainWindow::MainWindow(QWidget *parent, QStringList torrentCmdLine) : QMainWindo
vSplitter->setCollapsible(0, true); vSplitter->setCollapsible(0, true);
vSplitter->setCollapsible(1, false); vSplitter->setCollapsible(1, false);
tabs->addTab(vSplitter, QIcon(QString::fromUtf8(":/Icons/oxygen/folder-remote.png")), tr("Transfers")); tabs->addTab(vSplitter, QIcon(QString::fromUtf8(":/Icons/oxygen/folder-remote.png")), tr("Transfers"));
connect(transferList->getSourceModel(), SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(updateNbTorrents()));
connect(transferList->getSourceModel(), SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(updateNbTorrents()));
vboxLayout->addWidget(tabs); vboxLayout->addWidget(tabs);
@@ -227,6 +225,8 @@ MainWindow::MainWindow(QWidget *parent, QStringList torrentCmdLine) : QMainWindo
} else { } else {
if(pref.startMinimized()) if(pref.startMinimized())
showMinimized(); showMinimized();
else
setFocus();
} }
// Start watching the executable for updates // Start watching the executable for updates
@@ -242,6 +242,11 @@ MainWindow::MainWindow(QWidget *parent, QStringList torrentCmdLine) : QMainWindo
// Populate the transfer list // Populate the transfer list
transferList->getSourceModel()->populate(); transferList->getSourceModel()->populate();
// Update the number of torrents (tab)
updateNbTorrents();
connect(transferList->getSourceModel(), SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(updateNbTorrents()));
connect(transferList->getSourceModel(), SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(updateNbTorrents()));
qDebug("GUI Built"); qDebug("GUI Built");
#ifdef Q_WS_WIN #ifdef Q_WS_WIN
if(!pref.neverCheckFileAssoc() && !Preferences::isFileAssocOk()) { if(!pref.neverCheckFileAssoc() && !Preferences::isFileAssocOk()) {
@@ -263,6 +268,7 @@ MainWindow::MainWindow(QWidget *parent, QStringList torrentCmdLine) : QMainWindo
connect(updater, SIGNAL(updateCheckFinished(bool, QString)), SLOT(handleUpdateCheckFinished(bool, QString))); connect(updater, SIGNAL(updateCheckFinished(bool, QString)), SLOT(handleUpdateCheckFinished(bool, QString)));
updater->checkForUpdates(); updater->checkForUpdates();
#endif #endif
} }
void MainWindow::deleteBTSession() { void MainWindow::deleteBTSession() {

View File

@@ -557,19 +557,6 @@ bool misc::isPreviewable(QString extension){
return false; return false;
} }
bool misc::removeEmptyTree(QString path) {
QDir dir(path);
foreach(const QString &child, dir.entryList(QDir::AllDirs)) {
if(child == "." || child == "..") continue;
return removeEmptyTree(dir.absoluteFilePath(child));
}
const QString dir_name = dir.dirName();
if(dir.cdUp()) {
return dir.rmdir(dir_name);
}
return false;
}
QString misc::bcLinkToMagnet(QString bc_link) { QString misc::bcLinkToMagnet(QString bc_link) {
QByteArray raw_bc = bc_link.toUtf8(); QByteArray raw_bc = bc_link.toUtf8();
raw_bc = raw_bc.mid(8); // skip bc://bt/ raw_bc = raw_bc.mid(8); // skip bc://bt/
@@ -759,3 +746,9 @@ bool misc::isValidTorrentFile(const QString &torrent_path) {
} }
return true; return true;
} }
QString misc::branchPath(QString file_path)
{
file_path.replace("\\", "/");
return file_path.left(file_path.lastIndexOf('/'));
}

View File

@@ -149,7 +149,7 @@ public:
// value must be given in bytes // value must be given in bytes
static QString friendlyUnit(double val); static QString friendlyUnit(double val);
static bool isPreviewable(QString extension); static bool isPreviewable(QString extension);
static bool removeEmptyTree(QString path); static QString branchPath(QString file_path);
static QString magnetUriToName(QString magnet_uri); static QString magnetUriToName(QString magnet_uri);
static QString magnetUriToHash(QString magnet_uri); static QString magnetUriToHash(QString magnet_uri);
static QString bcLinkToMagnet(QString bc_link); static QString bcLinkToMagnet(QString bc_link);

View File

@@ -341,7 +341,7 @@ void options_imp::saveOptions(){
pref.preAllocateAllFiles(preAllocateAllFiles()); pref.preAllocateAllFiles(preAllocateAllFiles());
pref.useAdditionDialog(useAdditionDialog()); pref.useAdditionDialog(useAdditionDialog());
pref.addTorrentsInPause(addTorrentsInPause()); pref.addTorrentsInPause(addTorrentsInPause());
ScanFoldersModel::instance()->makePersistent(pref); ScanFoldersModel::instance()->makePersistent();
addedScanDirs.clear(); addedScanDirs.clear();
QString export_dir = getExportDir(); QString export_dir = getExportDir();
#if defined(Q_WS_WIN) || defined(Q_OS_OS2) #if defined(Q_WS_WIN) || defined(Q_OS_OS2)

View File

@@ -631,7 +631,8 @@ void PropertiesWidget::renameSelectedFile() {
// Remove old folder // Remove old folder
const QDir old_folder(h.save_path()+"/"+old_path); const QDir old_folder(h.save_path()+"/"+old_path);
int timeout = 10; int timeout = 10;
while(!misc::removeEmptyTree(old_folder.absolutePath()) && timeout > 0) { while(!QDir().rmpath(old_folder.absolutePath()) && timeout > 0) {
// XXX: We should not sleep here (freezes the UI for 1 second)
SleeperThread::msleep(100); SleeperThread::msleep(100);
--timeout; --timeout;
} }

View File

@@ -155,9 +155,6 @@ QBtSession::~QBtSession() {
#endif #endif
saveSessionState(); saveSessionState();
saveFastResumeData(); saveFastResumeData();
qDebug("Deleting the session");
delete s;
qDebug("Session deleted");
// Delete our objects // Delete our objects
if(m_tracker) if(m_tracker)
delete m_tracker; delete m_tracker;
@@ -174,6 +171,8 @@ QBtSession::~QBtSession() {
delete httpServer; delete httpServer;
if(timerETA) if(timerETA)
delete timerETA; delete timerETA;
qDebug("Deleting the session");
delete s;
qDebug("BTSession destructor OUT"); qDebug("BTSession destructor OUT");
} }
@@ -276,6 +275,7 @@ void QBtSession::configureSession() {
} }
int i = 0; int i = 0;
foreach (const QString &dir, scan_dirs) { foreach (const QString &dir, scan_dirs) {
qDebug() << "Adding scan dir" << dir << downloadInDirList.at(i);
m_scanFolders->addPath(dir, downloadInDirList.at(i)); m_scanFolders->addPath(dir, downloadInDirList.at(i));
++i; ++i;
} }
@@ -735,6 +735,9 @@ void QBtSession::deleteTorrent(QString hash, bool delete_local_files) {
foreach(const QString &uneeded_file, uneeded_files) { foreach(const QString &uneeded_file, uneeded_files) {
qDebug("Removing uneeded file: %s", qPrintable(uneeded_file)); qDebug("Removing uneeded file: %s", qPrintable(uneeded_file));
misc::safeRemove(uneeded_file); misc::safeRemove(uneeded_file);
const QString parent_folder = misc::branchPath(uneeded_file);
qDebug("Attempt to remove parent folder (if empty): %s", qPrintable(parent_folder));
QDir().rmpath(parent_folder);
} }
} }
// Remove it from torrent backup directory // Remove it from torrent backup directory
@@ -1153,6 +1156,7 @@ void QBtSession::loadTorrentTempData(QTorrentHandle h, QString savePath, bool ma
if(TorrentTempData::hasTempData(hash)) { if(TorrentTempData::hasTempData(hash)) {
// sequential download // sequential download
h.set_sequential_download(TorrentTempData::isSequential(hash)); h.set_sequential_download(TorrentTempData::isSequential(hash));
h.prioritize_first_last_piece(TorrentTempData::isSequential(hash));
// The following is useless for newly added magnet // The following is useless for newly added magnet
if(!magnet) { if(!magnet) {
@@ -2106,14 +2110,14 @@ void QBtSession::readAlerts() {
#endif #endif
if(!hash.isEmpty()) { if(!hash.isEmpty()) {
if(savePathsToRemove.contains(hash)) { if(savePathsToRemove.contains(hash)) {
misc::removeEmptyTree(savePathsToRemove.take(hash)); QDir().rmpath(savePathsToRemove.take(hash));
} }
} else { } else {
// XXX: Fallback // XXX: Fallback
QStringList hashes_deleted; QStringList hashes_deleted;
foreach(const QString& key, savePathsToRemove.keys()) { foreach(const QString& key, savePathsToRemove.keys()) {
// Attempt to delete // Attempt to delete
misc::removeEmptyTree(savePathsToRemove[key]); QDir().rmpath(savePathsToRemove[key]);
if(!QDir(savePathsToRemove[key]).exists()) { if(!QDir(savePathsToRemove[key]).exists()) {
hashes_deleted << key; hashes_deleted << key;
} }
@@ -2134,7 +2138,7 @@ void QBtSession::readAlerts() {
QDir old_save_dir(old_save_path); QDir old_save_dir(old_save_path);
if(old_save_dir != QDir(defaultSavePath) && old_save_dir != QDir(defaultTempPath)) { if(old_save_dir != QDir(defaultSavePath) && old_save_dir != QDir(defaultTempPath)) {
qDebug("Attempting to remove %s", qPrintable(old_save_path)); qDebug("Attempting to remove %s", qPrintable(old_save_path));
misc::removeEmptyTree(old_save_path); QDir().rmpath(old_save_path);
} }
if(defaultTempPath.isEmpty() || !new_save_path.startsWith(defaultTempPath)) { if(defaultTempPath.isEmpty() || !new_save_path.startsWith(defaultTempPath)) {
qDebug("Storage has been moved, updating save path to %s", qPrintable(new_save_path)); qDebug("Storage has been moved, updating save path to %s", qPrintable(new_save_path));

View File

@@ -29,7 +29,7 @@
*/ */
#include "scannedfoldersmodel.h" #include "scannedfoldersmodel.h"
#include "preferences.h"
#include "filesystemwatcher.h" #include "filesystemwatcher.h"
#include <QDir> #include <QDir>
@@ -189,15 +189,16 @@ int ScanFoldersModel::findPathData(const QString &path) const {
return -1; return -1;
} }
void ScanFoldersModel::makePersistent(QIniSettings &settings) { void ScanFoldersModel::makePersistent() {
Preferences pref;
QStringList paths; QStringList paths;
QList<bool> downloadInFolderInfo; QList<bool> downloadInFolderInfo;
foreach (const PathData* pathData, m_pathList) { foreach (const PathData* pathData, m_pathList) {
paths << pathData->path; paths << pathData->path;
downloadInFolderInfo << pathData->downloadAtPath; downloadInFolderInfo << pathData->downloadAtPath;
} }
settings.setValue(QString::fromUtf8("ScanDirs"), paths); pref.setScanDirs(paths);
settings.setValue(QString::fromUtf8("DownloadInScanDirs"), misc::toStringList(downloadInFolderInfo)); pref.setDownloadInScanDirs(downloadInFolderInfo);
} }
ScanFoldersModel *ScanFoldersModel::m_instance = 0; ScanFoldersModel *ScanFoldersModel::m_instance = 0;

View File

@@ -61,7 +61,7 @@ public:
PathStatus setDownloadAtPath(int row, bool downloadAtPath); PathStatus setDownloadAtPath(int row, bool downloadAtPath);
bool downloadInTorrentFolder(const QString &filePath) const; bool downloadInTorrentFolder(const QString &filePath) const;
void makePersistent(QIniSettings &settings); void makePersistent();
signals: signals:
// The absolute paths of new torrent files in the scanned directories. // The absolute paths of new torrent files in the scanned directories.

View File

@@ -1,4 +1,4 @@
#VERSION: 1.33 #VERSION: 1.34
# 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:
@@ -35,7 +35,7 @@ def prettyPrinter(dictionary):
if isinstance(dictionary[key], str): if isinstance(dictionary[key], str):
dictionary[key] = unicode(dictionary[key], 'utf-8') dictionary[key] = unicode(dictionary[key], 'utf-8')
dictionary['size'] = anySizeToBytes(dictionary['size']) dictionary['size'] = anySizeToBytes(dictionary['size'])
print u"%s|%s|%s|%s|%s|%s"%(dictionary['link'],dictionary['name'],dictionary['size'],dictionary['seeds'],dictionary['leech'],dictionary['engine_url']) print u"%s|%s|%s|%s|%s|%s"%(dictionary['link'],dictionary['name'].replace('|', ''),dictionary['size'],dictionary['seeds'],dictionary['leech'],dictionary['engine_url'])
def anySizeToBytes(size_string): def anySizeToBytes(size_string):
""" """

View File

@@ -313,7 +313,7 @@ void SearchEngine::on_search_button_clicked(){
// Reload environment variables (proxy) // Reload environment variables (proxy)
searchProcess->setEnvironment(QProcess::systemEnvironment()); searchProcess->setEnvironment(QProcess::systemEnvironment());
QString pattern = search_pattern->text().trimmed(); const QString pattern = search_pattern->text().trimmed();
// No search pattern entered // No search pattern entered
if(pattern.isEmpty()){ if(pattern.isEmpty()){
QMessageBox::critical(0, tr("Empty search pattern"), tr("Please type a search pattern first")); QMessageBox::critical(0, tr("Empty search pattern"), tr("Please type a search pattern first"));
@@ -323,7 +323,9 @@ void SearchEngine::on_search_button_clicked(){
currentSearchTab=new SearchTab(this); currentSearchTab=new SearchTab(this);
connect(currentSearchTab->header(), SIGNAL(sectionResized(int, int, int)), this, SLOT(propagateSectionResized(int,int,int))); connect(currentSearchTab->header(), SIGNAL(sectionResized(int, int, int)), this, SLOT(propagateSectionResized(int,int,int)));
all_tab.append(currentSearchTab); all_tab.append(currentSearchTab);
tabWidget->addTab(currentSearchTab, pattern); QString tabName = pattern;
tabName.replace(QRegExp("&{1}"), "&&");
tabWidget->addTab(currentSearchTab, tabName);
tabWidget->setCurrentWidget(currentSearchTab); tabWidget->setCurrentWidget(currentSearchTab);
#if QT_VERSION < 0x040500 #if QT_VERSION < 0x040500
closeTab_button->setEnabled(true); closeTab_button->setEnabled(true);
@@ -594,7 +596,7 @@ void SearchEngine::searchFinished(int exitcode,QProcess::ExitStatus){
// SLOT to append one line to search results list // SLOT to append one line to search results list
// Line is in the following form : // Line is in the following form :
// file url | file name | file size | nb seeds | nb leechers | Search engine url // file url | file name | file size | nb seeds | nb leechers | Search engine url
void SearchEngine::appendSearchResult(QString line){ void SearchEngine::appendSearchResult(const QString &line){
if(!currentSearchTab) { if(!currentSearchTab) {
if(searchProcess->state() != QProcess::NotRunning){ if(searchProcess->state() != QProcess::NotRunning){
searchProcess->terminate(); searchProcess->terminate();
@@ -606,7 +608,7 @@ void SearchEngine::appendSearchResult(QString line){
return; return;
} }
QStringList parts = line.split("|"); QStringList parts = line.split("|");
if(parts.size() != 6){ if(parts.size() < 6){
return; return;
} }
Q_ASSERT(currentSearchTab); Q_ASSERT(currentSearchTab);

View File

@@ -91,7 +91,7 @@ protected slots:
#else #else
void closeTab(int index); void closeTab(int index);
#endif #endif
void appendSearchResult(QString line); void appendSearchResult(const QString& line);
void searchFinished(int exitcode,QProcess::ExitStatus); void searchFinished(int exitcode,QProcess::ExitStatus);
void readSearchOutput(); void readSearchOutput();
void searchStarted(); void searchStarted();

View File

@@ -2,39 +2,6 @@
TEMPLATE = app TEMPLATE = app
CONFIG += qt thread CONFIG += qt thread
unix:!macx {
exists(../conf.pri) {
# generated by configure
include(../conf.pri)
}
}
nox {
QT = core
TARGET = qbittorrent-nox
DEFINES += DISABLE_GUI
} else {
QT += xml
TARGET = qbittorrent
}
QT += network
# Vars
LANG_PATH = lang
ICONS_PATH = Icons
# use "CONFIG -= debug" to disable debug
CONFIG -= debug
CONFIG += release
# Disable debug output in release mode
!debug {
DEFINES += QT_NO_DEBUG_OUTPUT
}
# VERSION DEFINES
include(../version.pri)
# Windows specific configuration # Windows specific configuration
win32 { win32 {
include(../winconf.pri) include(../winconf.pri)
@@ -55,6 +22,32 @@ os2 {
include(../os2conf.pri) include(../os2conf.pri)
} }
nox {
QT -= gui
TARGET = qbittorrent-nox
DEFINES += DISABLE_GUI
} else {
QT += xml
TARGET = qbittorrent
}
QT += network
# Vars
LANG_PATH = lang
ICONS_PATH = Icons
CONFIG(debug, debug|release):message(Project is built in DEBUG mode.)
CONFIG(release, debug|release):message(Project is built in RELEASE mode.)
# Disable debug output in release mode
CONFIG(release, debug|release) {
message(Disabling debug output.)
DEFINES += QT_NO_DEBUG_OUTPUT
}
# VERSION DEFINES
include(../version.pri)
DEFINES += QT_NO_CAST_TO_ASCII DEFINES += QT_NO_CAST_TO_ASCII
# Fast concatenation (Qt >= 4.6) # Fast concatenation (Qt >= 4.6)
DEFINES += QT_USE_FAST_CONCATENATION QT_USE_FAST_OPERATOR_PLUS DEFINES += QT_USE_FAST_CONCATENATION QT_USE_FAST_OPERATOR_PLUS

View File

@@ -240,8 +240,6 @@ void TorrentCreatorDlg::updateOptimalPieceSize()
} }
++i; ++i;
}while(i<m_piece_sizes.size()); }while(i<m_piece_sizes.size());
qDebug("ASSERT value %d <= %d", (int)(torrent_size/(m_piece_sizes.at(i)*1024.)), NB_PIECES_MIN);
Q_ASSERT((double)torrent_size/(m_piece_sizes.at(i)*1024.) > NB_PIECES_MIN);
comboPieceSize->setCurrentIndex(i); comboPieceSize->setCurrentIndex(i);
} }

View File

@@ -92,7 +92,7 @@ void TorrentCreatorThread::run() {
add_files(fs, input_path.toUtf8().constData(), file_filter); add_files(fs, input_path.toUtf8().constData(), file_filter);
#else #else
// Adding files to the torrent // Adding files to the torrent
path full_path = complete(path(input_path.toUtf8().constData())); path full_path = path(input_path.toUtf8().constData());
add_files(fs, full_path, file_filter); add_files(fs, full_path, file_filter);
#endif #endif
if(abort) return; if(abort) return;
@@ -125,12 +125,19 @@ void TorrentCreatorThread::run() {
t.set_priv(is_private); t.set_priv(is_private);
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); qDebug("Saving to %s", qPrintable(save_path));
bencode(std::ostream_iterator<char>(out), t.generate()); std::vector<char> torrent;
bencode(back_inserter(torrent), t.generate());
QFile outfile(save_path);
if(outfile.open(QIODevice::WriteOnly)) {
outfile.write(&torrent[0], torrent.size());
outfile.close();
emit updateProgress(100); emit updateProgress(100);
emit creationSuccess(save_path, parent_path); emit creationSuccess(save_path, parent_path);
} else {
throw std::exception(tr("Cannot write the output file").toLocal8Bit().constData());
} }
catch (std::exception& e){ } catch (std::exception& e){
emit creationFailure(QString::fromUtf8(e.what())); emit creationFailure(QString::fromLocal8Bit(e.what()));
} }
} }

View File

@@ -53,9 +53,12 @@
#include <QRegExp> #include <QRegExp>
#include <QFileDialog> #include <QFileDialog>
#include <vector> #include <vector>
#include <queue>
#include "qinisettings.h" #include "qinisettings.h"
using namespace libtorrent;
TransferListWidget::TransferListWidget(QWidget *parent, MainWindow *main_window, QBtSession *_BTSession): TransferListWidget::TransferListWidget(QWidget *parent, MainWindow *main_window, QBtSession *_BTSession):
QTreeView(parent), BTSession(_BTSession), main_window(main_window) { QTreeView(parent), BTSession(_BTSession), main_window(main_window) {
// Create and apply delegate // Create and apply delegate
@@ -312,24 +315,50 @@ void TransferListWidget::deleteVisibleTorrents() {
} }
void TransferListWidget::increasePrioSelectedTorrents() { void TransferListWidget::increasePrioSelectedTorrents() {
qDebug() << Q_FUNC_INFO;
if(main_window->getCurrentTabWidget() != this) return; if(main_window->getCurrentTabWidget() != this) return;
const QStringList hashes = getSelectedTorrentsHashes(); const QStringList hashes = getSelectedTorrentsHashes();
std::priority_queue<QPair<int, QTorrentHandle>, std::vector<QPair<int, QTorrentHandle> >, std::greater<QPair<int, QTorrentHandle> > > torrent_queue;
// Sort torrents by priority
foreach(const QString &hash, hashes) { foreach(const QString &hash, hashes) {
try {
QTorrentHandle h = BTSession->getTorrentHandle(hash); QTorrentHandle h = BTSession->getTorrentHandle(hash);
if(h.is_valid() && !h.is_seed()) { if(!h.is_seed()) {
h.queue_position_up(); torrent_queue.push(qMakePair(h.queue_position(), h));
} }
}catch(invalid_handle&){}
}
// Increase torrents priority (starting with the ones with highest priority)
while(!torrent_queue.empty()) {
QTorrentHandle h = torrent_queue.top().second;
try {
h.queue_position_up();
} catch(invalid_handle& h) {}
torrent_queue.pop();
} }
} }
void TransferListWidget::decreasePrioSelectedTorrents() { void TransferListWidget::decreasePrioSelectedTorrents() {
qDebug() << Q_FUNC_INFO;
if(main_window->getCurrentTabWidget() != this) return; if(main_window->getCurrentTabWidget() != this) return;
const QStringList hashes = getSelectedTorrentsHashes(); const QStringList hashes = getSelectedTorrentsHashes();
std::priority_queue<QPair<int, QTorrentHandle>, std::vector<QPair<int, QTorrentHandle> >, std::less<QPair<int, QTorrentHandle> > > torrent_queue;
// Sort torrents by priority
foreach(const QString &hash, hashes) { foreach(const QString &hash, hashes) {
try {
QTorrentHandle h = BTSession->getTorrentHandle(hash); QTorrentHandle h = BTSession->getTorrentHandle(hash);
if(h.is_valid() && !h.is_seed()) { if(!h.is_seed()) {
h.queue_position_down(); torrent_queue.push(qMakePair(h.queue_position(), h));
} }
}catch(invalid_handle&){}
}
// Decrease torrents priority (starting with the ones with lowest priority)
while(!torrent_queue.empty()) {
QTorrentHandle h = torrent_queue.top().second;
try {
h.queue_position_down();
} catch(invalid_handle& h) {}
torrent_queue.pop();
} }
} }

View File

@@ -45,6 +45,8 @@
#include <QDebug> #include <QDebug>
#include <QRegExp> #include <QRegExp>
#include <QTemporaryFile> #include <QTemporaryFile>
#include <queue>
#include <vector>
using namespace libtorrent; using namespace libtorrent;
@@ -498,23 +500,25 @@ void HttpConnection::respondCommand(QString command)
return; return;
} }
if(command == "increasePrio") { if(command == "increasePrio") {
QTorrentHandle h = QBtSession::instance()->getTorrentHandle(parser.post("hash")); increaseTorrentsPriority(parser.post("hashes").split("|"));
if(h.is_valid()) h.queue_position_up();
return; return;
} }
if(command == "decreasePrio") { if(command == "decreasePrio") {
QTorrentHandle h = QBtSession::instance()->getTorrentHandle(parser.post("hash")); decreaseTorrentsPriority(parser.post("hashes").split("|"));
if(h.is_valid()) h.queue_position_down();
return; return;
} }
if(command == "topPrio") { if(command == "topPrio") {
QTorrentHandle h = QBtSession::instance()->getTorrentHandle(parser.post("hash")); foreach(const QString &hash, parser.post("hashes").split("|")) {
QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash);
if(h.is_valid()) h.queue_position_top(); if(h.is_valid()) h.queue_position_top();
}
return; return;
} }
if(command == "bottomPrio") { if(command == "bottomPrio") {
QTorrentHandle h = QBtSession::instance()->getTorrentHandle(parser.post("hash")); foreach(const QString &hash, parser.post("hashes").split("|")) {
QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash);
if(h.is_valid()) h.queue_position_bottom(); if(h.is_valid()) h.queue_position_bottom();
}
return; return;
} }
if(command == "recheck"){ if(command == "recheck"){
@@ -543,3 +547,49 @@ void HttpConnection::recheckAllTorrents() {
QBtSession::instance()->recheckTorrent(h.hash()); QBtSession::instance()->recheckTorrent(h.hash());
} }
} }
void HttpConnection::decreaseTorrentsPriority(const QStringList &hashes)
{
qDebug() << Q_FUNC_INFO << hashes;
std::priority_queue<QPair<int, QTorrentHandle>, std::vector<QPair<int, QTorrentHandle> >, std::less<QPair<int, QTorrentHandle> > > torrent_queue;
// Sort torrents by priority
foreach(const QString &hash, hashes) {
try {
QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash);
if(!h.is_seed()) {
torrent_queue.push(qMakePair(h.queue_position(), h));
}
}catch(invalid_handle&){}
}
// Decrease torrents priority (starting with the ones with lowest priority)
while(!torrent_queue.empty()) {
QTorrentHandle h = torrent_queue.top().second;
try {
h.queue_position_down();
} catch(invalid_handle& h) {}
torrent_queue.pop();
}
}
void HttpConnection::increaseTorrentsPriority(const QStringList &hashes)
{
qDebug() << Q_FUNC_INFO << hashes;
std::priority_queue<QPair<int, QTorrentHandle>, std::vector<QPair<int, QTorrentHandle> >, std::greater<QPair<int, QTorrentHandle> > > torrent_queue;
// Sort torrents by priority
foreach(const QString &hash, hashes) {
try {
QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash);
if(!h.is_seed()) {
torrent_queue.push(qMakePair(h.queue_position(), h));
}
}catch(invalid_handle&){}
}
// Increase torrents priority (starting with the ones with highest priority)
while(!torrent_queue.empty()) {
QTorrentHandle h = torrent_queue.top().second;
try {
h.queue_position_up();
} catch(invalid_handle& h) {}
torrent_queue.pop();
}
}

View File

@@ -67,6 +67,9 @@ protected slots:
void handleDownloadFailure(QString, QString); void handleDownloadFailure(QString, QString);
void recheckTorrent(QString hash); void recheckTorrent(QString hash);
void recheckAllTorrents(); void recheckAllTorrents();
void decreaseTorrentsPriority(const QStringList& hashes);
void increaseTorrentsPriority(const QStringList& hashes);
public: public:
HttpConnection(QTcpSocket *socket, HttpServer *httpserver); HttpConnection(QTcpSocket *socket, HttpServer *httpserver);

View File

@@ -208,7 +208,7 @@ bool HttpServer::isAuthorized(QByteArray auth, QString method) const {
return false; return false;
} }
QByteArray prop_nonce = regex_nonce.cap(1).toLocal8Bit(); QByteArray prop_nonce = regex_nonce.cap(1).toLocal8Bit();
qDebug("prop nonce is: %s", prop_nonce.data()); //qDebug("prop nonce is: %s", prop_nonce.data());
// get uri // get uri
QRegExp regex_uri(".*uri=\"([^\"]+)\".*"); QRegExp regex_uri(".*uri=\"([^\"]+)\".*");
if(regex_uri.indexIn(auth) < 0) { if(regex_uri.indexIn(auth) < 0) {
@@ -216,7 +216,7 @@ bool HttpServer::isAuthorized(QByteArray auth, QString method) const {
return false; return false;
} }
QByteArray prop_uri = regex_uri.cap(1).toLocal8Bit(); QByteArray prop_uri = regex_uri.cap(1).toLocal8Bit();
qDebug("prop uri is: %s", prop_uri.data()); //qDebug("prop uri is: %s", prop_uri.data());
// get response // get response
QRegExp regex_response(".*response=[\"]?([\\w=]+)[\"]?.*"); QRegExp regex_response(".*response=[\"]?([\\w=]+)[\"]?.*");
if(regex_response.indexIn(auth) < 0) { if(regex_response.indexIn(auth) < 0) {
@@ -224,7 +224,7 @@ bool HttpServer::isAuthorized(QByteArray auth, QString method) const {
return false; return false;
} }
QByteArray prop_response = regex_response.cap(1).toLocal8Bit(); QByteArray prop_response = regex_response.cap(1).toLocal8Bit();
qDebug("prop response is: %s", prop_response.data()); //qDebug("prop response is: %s", prop_response.data());
// Compute correct reponse // Compute correct reponse
QCryptographicHash md5_ha2(QCryptographicHash::Md5); QCryptographicHash md5_ha2(QCryptographicHash::Md5);
md5_ha2.addData(method.toLocal8Bit() + ":" + prop_uri); md5_ha2.addData(method.toLocal8Bit() + ":" + prop_uri);
@@ -239,21 +239,21 @@ bool HttpServer::isAuthorized(QByteArray auth, QString method) const {
return false; return false;
} }
QByteArray prop_nc = regex_nc.cap(1).toLocal8Bit(); QByteArray prop_nc = regex_nc.cap(1).toLocal8Bit();
qDebug("prop nc is: %s", prop_nc.data()); //qDebug("prop nc is: %s", prop_nc.data());
QRegExp regex_cnonce(".*cnonce=[\"]?([\\w=]+)[\"]?.*"); QRegExp regex_cnonce(".*cnonce=[\"]?([\\w=]+)[\"]?.*");
if(regex_cnonce.indexIn(auth) < 0) { if(regex_cnonce.indexIn(auth) < 0) {
qDebug("AUTH-PROB: qop but missing cnonce"); qDebug("AUTH-PROB: qop but missing cnonce");
return false; return false;
} }
QByteArray prop_cnonce = regex_cnonce.cap(1).toLocal8Bit(); QByteArray prop_cnonce = regex_cnonce.cap(1).toLocal8Bit();
qDebug("prop cnonce is: %s", prop_cnonce.data()); //qDebug("prop cnonce is: %s", prop_cnonce.data());
QRegExp regex_qop(".*qop=[\"]?(\\w+)[\"]?.*"); QRegExp regex_qop(".*qop=[\"]?(\\w+)[\"]?.*");
if(regex_qop.indexIn(auth) < 0) { if(regex_qop.indexIn(auth) < 0) {
qDebug("AUTH-PROB: missing qop"); qDebug("AUTH-PROB: missing qop");
return false; return false;
} }
QByteArray prop_qop = regex_qop.cap(1).toLocal8Bit(); QByteArray prop_qop = regex_qop.cap(1).toLocal8Bit();
qDebug("prop qop is: %s", prop_qop.data()); //qDebug("prop qop is: %s", prop_qop.data());
md5_ha.addData(password_ha1+":"+prop_nonce+":"+prop_nc+":"+prop_cnonce+":"+prop_qop+":"+ha2); md5_ha.addData(password_ha1+":"+prop_nonce+":"+prop_nc+":"+prop_cnonce+":"+prop_qop+":"+ha2);
response = md5_ha.result().toHex(); response = md5_ha.result().toHex();
} else { } else {
@@ -261,7 +261,7 @@ bool HttpServer::isAuthorized(QByteArray auth, QString method) const {
md5_ha.addData(password_ha1+":"+prop_nonce+":"+ha2); md5_ha.addData(password_ha1+":"+prop_nonce+":"+ha2);
response = md5_ha.result().toHex(); response = md5_ha.result().toHex();
} }
qDebug("AUTH: comparing reponses: (%d)", static_cast<int>(prop_response == response)); //qDebug("AUTH: comparing reponses: (%d)", static_cast<int>(prop_response == response));
return prop_response == response; return prop_response == response;
} }

View File

@@ -204,7 +204,7 @@ initializeWindows = function(){
} }
}; };
['pause','resume','decreasePrio','increasePrio', 'topPrio', 'bottomPrio', 'recheck'].each(function(item) { ['pause','resume', 'recheck'].each(function(item) {
addClickEvent(item, function(e){ addClickEvent(item, function(e){
new Event(e).stop(); new Event(e).stop();
var h = myTable.selectedIds(); var h = myTable.selectedIds();
@@ -221,12 +221,17 @@ initializeWindows = function(){
}); });
}); });
['decreasePrio','increasePrio', 'topPrio', 'bottomPrio'].each(function(item) {
addClickEvent(item, function(e){
new Event(e).stop();
setPriorityFN(item);
});
});
setPriorityFN = function(cmd) { setPriorityFN = function(cmd) {
var h = myTable.selectedIds(); var h = myTable.selectedIds();
if(h.length) { if(h.length) {
h.each(function(hash, index){ new Request({url: '/command/'+cmd, method: 'post', data: {hashes: h.join("|")}}).send();
new Request({url: '/command/'+cmd, method: 'post', data: {hash: hash}}).send();
});
} }
} }

View File

@@ -1,3 +1,6 @@
# Generated by the configure file
include(../conf.pri)
# COMPILATION SPECIFIC # COMPILATION SPECIFIC
QT += dbus QT += dbus
QMAKE_LFLAGS_APP += -rdynamic QMAKE_LFLAGS_APP += -rdynamic

View File

@@ -1,11 +1,11 @@
os2 { os2 {
DEFINES += VERSION=\'\"v2.5.2\"\' DEFINES += VERSION=\'\"v2.5.4\"\'
} else { } else {
DEFINES += VERSION=\\\"v2.5.2\\\" DEFINES += VERSION=\\\"v2.5.4\\\"
} }
DEFINES += VERSION_MAJOR=2 DEFINES += VERSION_MAJOR=2
DEFINES += VERSION_MINOR=5 DEFINES += VERSION_MINOR=5
DEFINES += VERSION_BUGFIX=2 DEFINES += VERSION_BUGFIX=4
# NORMAL,ALPHA,BETA,RELEASE_CANDIDATE,DEVEL # NORMAL,ALPHA,BETA,RELEASE_CANDIDATE,DEVEL
DEFINES += VERSION_TYPE=NORMAL DEFINES += VERSION_TYPE=NORMAL

View File

@@ -26,8 +26,9 @@ DEFINES += _WIN32
DEFINES += _WIN32_WINNT=0x0500 DEFINES += _WIN32_WINNT=0x0500
DEFINES += __USE_W32_SOCKETS DEFINES += __USE_W32_SOCKETS
DEFINES += WITH_SHIPPED_GEOIP_H DEFINES += WITH_SHIPPED_GEOIP_H
DEFINES += TORRENT_USE_WPATH
debug { CONFIG(debug, debug|release) {
DEFINES += TORRENT_DEBUG DEFINES += TORRENT_DEBUG
} else { } else {
DEFINES += NDEBUG DEFINES += NDEBUG
@@ -35,7 +36,7 @@ debug {
RC_FILE = qbittorrent.rc RC_FILE = qbittorrent.rc
debug { CONFIG(debug, debug|release) {
LIBS += libtorrentd.lib \ LIBS += libtorrentd.lib \
libboost_system-vc90-mt-gd.lib \ libboost_system-vc90-mt-gd.lib \
libboost_filesystem-vc90-mt-gd.lib \ libboost_filesystem-vc90-mt-gd.lib \