Commit ca0aacd3 authored by Cristian Greco's avatar Cristian Greco

Imported Upstream version 2.5.3

parent 0fc6e8f2
* Sat Jan 1 2010 - 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
- BUGFIX: Fix alternative speed icon staying pressed when disabled
- BUGFIX: Fix slot warning on startup
......
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
INCLUDEPATH += $$PWD
exists(conf.pri) {
# to the conf.pri goes all system dependent stuff
include(conf.pri)
}
LIBS += -ltorrent-rasterbar \
-lboost_thread \
-lboost_system \
......
[Desktop Entry]
Categories=Qt;Network;P2P;
Comment=V2.5.2
Comment=V2.5.3
Exec=qbittorrent %f
GenericName=Bittorrent client
GenericName[ar]=العميل Bittorrent
......
......@@ -47,7 +47,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleGetInfoString</key>
<string>2.5.2</string>
<string>2.5.3</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleExecutable</key>
......
......@@ -263,9 +263,9 @@ int main(int argc, char *argv[]){
painter.setFont(QFont("Arial", 22, QFont::Black));
painter.drawText(224 - painter.fontMetrics().width(version), 270, version);
splash = new QSplashScreen(splash_img, Qt::WindowStaysOnTopHint);
QTimer::singleShot(1500, splash, SLOT(deleteLater()));
splash->show();
app.processEvents();
QTimer::singleShot(2000, splash, SLOT(deleteLater()));
}
#endif
// Set environment variable
......@@ -296,6 +296,8 @@ int main(int argc, char *argv[]){
torrentCmdLine.removeFirst();
#ifndef DISABLE_GUI
MainWindow window(0, torrentCmdLine);
if(!no_splash)
window.raise();
QObject::connect(&app, SIGNAL(messageReceived(const QString&)),
&window, SLOT(processParams(const QString&)));
app.setActivationWindow(&window);
......
......@@ -163,8 +163,6 @@ MainWindow::MainWindow(QWidget *parent, QStringList torrentCmdLine) : QMainWindo
vSplitter->setCollapsible(0, true);
vSplitter->setCollapsible(1, false);
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);
......@@ -227,6 +225,8 @@ MainWindow::MainWindow(QWidget *parent, QStringList torrentCmdLine) : QMainWindo
} else {
if(pref.startMinimized())
showMinimized();
else
setFocus();
}
// Start watching the executable for updates
......@@ -242,6 +242,11 @@ MainWindow::MainWindow(QWidget *parent, QStringList torrentCmdLine) : QMainWindo
// Populate the transfer list
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");
#ifdef Q_WS_WIN
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)));
updater->checkForUpdates();
#endif
}
void MainWindow::deleteBTSession() {
......
......@@ -557,19 +557,6 @@ bool misc::isPreviewable(QString extension){
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) {
QByteArray raw_bc = bc_link.toUtf8();
raw_bc = raw_bc.mid(8); // skip bc://bt/
......@@ -759,3 +746,9 @@ bool misc::isValidTorrentFile(const QString &torrent_path) {
}
return true;
}
QString misc::branchPath(QString file_path)
{
file_path.replace("\\", "/");
return file_path.left(file_path.lastIndexOf('/'));
}
......@@ -149,7 +149,7 @@ public:
// value must be given in bytes
static QString friendlyUnit(double val);
static bool isPreviewable(QString extension);
static bool removeEmptyTree(QString path);
static QString branchPath(QString file_path);
static QString magnetUriToName(QString magnet_uri);
static QString magnetUriToHash(QString magnet_uri);
static QString bcLinkToMagnet(QString bc_link);
......
......@@ -341,7 +341,7 @@ void options_imp::saveOptions(){
pref.preAllocateAllFiles(preAllocateAllFiles());
pref.useAdditionDialog(useAdditionDialog());
pref.addTorrentsInPause(addTorrentsInPause());
ScanFoldersModel::instance()->makePersistent(pref);
ScanFoldersModel::instance()->makePersistent();
addedScanDirs.clear();
QString export_dir = getExportDir();
#if defined(Q_WS_WIN) || defined(Q_OS_OS2)
......
......@@ -631,7 +631,8 @@ void PropertiesWidget::renameSelectedFile() {
// Remove old folder
const QDir old_folder(h.save_path()+"/"+old_path);
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);
--timeout;
}
......
......@@ -276,6 +276,7 @@ void QBtSession::configureSession() {
}
int i = 0;
foreach (const QString &dir, scan_dirs) {
qDebug() << "Adding scan dir" << dir << downloadInDirList.at(i);
m_scanFolders->addPath(dir, downloadInDirList.at(i));
++i;
}
......@@ -735,6 +736,9 @@ void QBtSession::deleteTorrent(QString hash, bool delete_local_files) {
foreach(const QString &uneeded_file, uneeded_files) {
qDebug("Removing uneeded file: %s", qPrintable(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
......@@ -2106,14 +2110,14 @@ void QBtSession::readAlerts() {
#endif
if(!hash.isEmpty()) {
if(savePathsToRemove.contains(hash)) {
misc::removeEmptyTree(savePathsToRemove.take(hash));
QDir().rmpath(savePathsToRemove.take(hash));
}
} else {
// XXX: Fallback
QStringList hashes_deleted;
foreach(const QString& key, savePathsToRemove.keys()) {
// Attempt to delete
misc::removeEmptyTree(savePathsToRemove[key]);
QDir().rmpath(savePathsToRemove[key]);
if(!QDir(savePathsToRemove[key]).exists()) {
hashes_deleted << key;
}
......@@ -2134,7 +2138,7 @@ void QBtSession::readAlerts() {
QDir old_save_dir(old_save_path);
if(old_save_dir != QDir(defaultSavePath) && old_save_dir != QDir(defaultTempPath)) {
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)) {
qDebug("Storage has been moved, updating save path to %s", qPrintable(new_save_path));
......
......@@ -29,7 +29,7 @@
*/
#include "scannedfoldersmodel.h"
#include "preferences.h"
#include "filesystemwatcher.h"
#include <QDir>
......@@ -189,15 +189,16 @@ int ScanFoldersModel::findPathData(const QString &path) const {
return -1;
}
void ScanFoldersModel::makePersistent(QIniSettings &settings) {
void ScanFoldersModel::makePersistent() {
Preferences pref;
QStringList paths;
QList<bool> downloadInFolderInfo;
foreach (const PathData* pathData, m_pathList) {
paths << pathData->path;
downloadInFolderInfo << pathData->downloadAtPath;
}
settings.setValue(QString::fromUtf8("ScanDirs"), paths);
settings.setValue(QString::fromUtf8("DownloadInScanDirs"), misc::toStringList(downloadInFolderInfo));
pref.setScanDirs(paths);
pref.setDownloadInScanDirs(downloadInFolderInfo);
}
ScanFoldersModel *ScanFoldersModel::m_instance = 0;
......@@ -61,7 +61,7 @@ public:
PathStatus setDownloadAtPath(int row, bool downloadAtPath);
bool downloadInTorrentFolder(const QString &filePath) const;
void makePersistent(QIniSettings &settings);
void makePersistent();
signals:
// The absolute paths of new torrent files in the scanned directories.
......
......@@ -313,7 +313,7 @@ void SearchEngine::on_search_button_clicked(){
// Reload environment variables (proxy)
searchProcess->setEnvironment(QProcess::systemEnvironment());
QString pattern = search_pattern->text().trimmed();
const QString pattern = search_pattern->text().trimmed();
// No search pattern entered
if(pattern.isEmpty()){
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);
connect(currentSearchTab->header(), SIGNAL(sectionResized(int, int, int)), this, SLOT(propagateSectionResized(int,int,int)));
all_tab.append(currentSearchTab);
tabWidget->addTab(currentSearchTab, pattern);
QString tabName = pattern;
tabName.replace(QRegExp("&{1}"), "&&");
tabWidget->addTab(currentSearchTab, tabName);
tabWidget->setCurrentWidget(currentSearchTab);
#if QT_VERSION < 0x040500
closeTab_button->setEnabled(true);
......@@ -594,7 +596,7 @@ void SearchEngine::searchFinished(int exitcode,QProcess::ExitStatus){
// SLOT to append one line to search results list
// Line is in the following form :
// 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(searchProcess->state() != QProcess::NotRunning){
searchProcess->terminate();
......@@ -606,7 +608,7 @@ void SearchEngine::appendSearchResult(QString line){
return;
}
QStringList parts = line.split("|");
if(parts.size() != 6){
if(parts.size() < 6){
return;
}
Q_ASSERT(currentSearchTab);
......
......@@ -91,7 +91,7 @@ protected slots:
#else
void closeTab(int index);
#endif
void appendSearchResult(QString line);
void appendSearchResult(const QString& line);
void searchFinished(int exitcode,QProcess::ExitStatus);
void readSearchOutput();
void searchStarted();
......
......@@ -53,9 +53,12 @@
#include <QRegExp>
#include <QFileDialog>
#include <vector>
#include <queue>
#include "qinisettings.h"
using namespace libtorrent;
TransferListWidget::TransferListWidget(QWidget *parent, MainWindow *main_window, QBtSession *_BTSession):
QTreeView(parent), BTSession(_BTSession), main_window(main_window) {
// Create and apply delegate
......@@ -312,24 +315,50 @@ void TransferListWidget::deleteVisibleTorrents() {
}
void TransferListWidget::increasePrioSelectedTorrents() {
qDebug() << Q_FUNC_INFO;
if(main_window->getCurrentTabWidget() != this) return;
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) {
QTorrentHandle h = BTSession->getTorrentHandle(hash);
if(h.is_valid() && !h.is_seed()) {
try {
QTorrentHandle h = BTSession->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();
}
}
void TransferListWidget::decreasePrioSelectedTorrents() {
qDebug() << Q_FUNC_INFO;
if(main_window->getCurrentTabWidget() != this) return;
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) {
QTorrentHandle h = BTSession->getTorrentHandle(hash);
if(h.is_valid() && !h.is_seed()) {
try {
QTorrentHandle h = BTSession->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();
}
}
......
......@@ -45,6 +45,8 @@
#include <QDebug>
#include <QRegExp>
#include <QTemporaryFile>
#include <queue>
#include <vector>
using namespace libtorrent;
......@@ -498,23 +500,25 @@ void HttpConnection::respondCommand(QString command)
return;
}
if(command == "increasePrio") {
QTorrentHandle h = QBtSession::instance()->getTorrentHandle(parser.post("hash"));
if(h.is_valid()) h.queue_position_up();
increaseTorrentsPriority(parser.post("hashes").split("|"));
return;
}
if(command == "decreasePrio") {
QTorrentHandle h = QBtSession::instance()->getTorrentHandle(parser.post("hash"));
if(h.is_valid()) h.queue_position_down();
decreaseTorrentsPriority(parser.post("hashes").split("|"));
return;
}
if(command == "topPrio") {
QTorrentHandle h = QBtSession::instance()->getTorrentHandle(parser.post("hash"));
if(h.is_valid()) h.queue_position_top();
foreach(const QString &hash, parser.post("hashes").split("|")) {
QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash);
if(h.is_valid()) h.queue_position_top();
}
return;
}
if(command == "bottomPrio") {
QTorrentHandle h = QBtSession::instance()->getTorrentHandle(parser.post("hash"));
if(h.is_valid()) h.queue_position_bottom();
foreach(const QString &hash, parser.post("hashes").split("|")) {
QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash);
if(h.is_valid()) h.queue_position_bottom();
}
return;
}
if(command == "recheck"){
......@@ -543,3 +547,49 @@ void HttpConnection::recheckAllTorrents() {
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();
}
}
......@@ -67,6 +67,9 @@ protected slots:
void handleDownloadFailure(QString, QString);
void recheckTorrent(QString hash);
void recheckAllTorrents();
void decreaseTorrentsPriority(const QStringList& hashes);
void increaseTorrentsPriority(const QStringList& hashes);
public:
HttpConnection(QTcpSocket *socket, HttpServer *httpserver);
......
......@@ -208,7 +208,7 @@ bool HttpServer::isAuthorized(QByteArray auth, QString method) const {
return false;
}
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
QRegExp regex_uri(".*uri=\"([^\"]+)\".*");
if(regex_uri.indexIn(auth) < 0) {
......@@ -216,7 +216,7 @@ bool HttpServer::isAuthorized(QByteArray auth, QString method) const {
return false;
}
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
QRegExp regex_response(".*response=[\"]?([\\w=]+)[\"]?.*");
if(regex_response.indexIn(auth) < 0) {
......@@ -224,7 +224,7 @@ bool HttpServer::isAuthorized(QByteArray auth, QString method) const {
return false;
}
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
QCryptographicHash md5_ha2(QCryptographicHash::Md5);
md5_ha2.addData(method.toLocal8Bit() + ":" + prop_uri);
......@@ -239,21 +239,21 @@ bool HttpServer::isAuthorized(QByteArray auth, QString method) const {
return false;
}
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=]+)[\"]?.*");
if(regex_cnonce.indexIn(auth) < 0) {
qDebug("AUTH-PROB: qop but missing cnonce");
return false;
}
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+)[\"]?.*");
if(regex_qop.indexIn(auth) < 0) {
qDebug("AUTH-PROB: missing qop");
return false;
}
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);
response = md5_ha.result().toHex();
} else {
......@@ -261,7 +261,7 @@ bool HttpServer::isAuthorized(QByteArray auth, QString method) const {
md5_ha.addData(password_ha1+":"+prop_nonce+":"+ha2);
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;
}
......
......@@ -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){
new Event(e).stop();
var h = myTable.selectedIds();
......@@ -220,13 +220,18 @@ initializeWindows = function(){
new Request({url: '/command/'+item+'all'}).send();
});
});
['decreasePrio','increasePrio', 'topPrio', 'bottomPrio'].each(function(item) {
addClickEvent(item, function(e){
new Event(e).stop();
setPriorityFN(item);
});
});
setPriorityFN = function(cmd) {
var h = myTable.selectedIds();
if(h.length){
h.each(function(hash, index){
new Request({url: '/command/'+cmd, method: 'post', data: {hash: hash}}).send();
});
if(h.length) {
new Request({url: '/command/'+cmd, method: 'post', data: {hashes: h.join("|")}}).send();
}
}
......
os2 {
DEFINES += VERSION=\'\"v2.5.2\"\'
DEFINES += VERSION=\'\"v2.5.3\"\'
} else {
DEFINES += VERSION=\\\"v2.5.2\\\"
DEFINES += VERSION=\\\"v2.5.3\\\"
}
DEFINES += VERSION_MAJOR=2
DEFINES += VERSION_MINOR=5
DEFINES += VERSION_BUGFIX=2
DEFINES += VERSION_BUGFIX=3
# NORMAL,ALPHA,BETA,RELEASE_CANDIDATE,DEVEL
DEFINES += VERSION_TYPE=NORMAL
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment