Improve upgrade to v3.3. Fixes #4195.

This commit is contained in:
Vladimir Golovnev (Glassez) 2015-11-30 20:33:45 +03:00
parent f4ef0633c9
commit bdac97147f

View file

@ -43,6 +43,8 @@
#include "core/logger.h" #include "core/logger.h"
#include "core/utils/fs.h" #include "core/utils/fs.h"
#include "core/utils/misc.h" #include "core/utils/misc.h"
#include "core/utils/string.h"
#include "core/qinisettings.h"
bool userAcceptsUpgrade() bool userAcceptsUpgrade()
{ {
@ -73,7 +75,7 @@ bool userAcceptsUpgrade()
return false; return false;
} }
bool upgradeResumeFile(const QString &filepath) bool upgradeResumeFile(const QString &filepath, const QVariantHash &oldTorrent, int &maxPrio)
{ {
QFile file1(filepath); QFile file1(filepath);
if (!file1.open(QIODevice::ReadOnly)) if (!file1.open(QIODevice::ReadOnly))
@ -91,6 +93,12 @@ bool upgradeResumeFile(const QString &filepath)
fastNew = fastOld; fastNew = fastOld;
int priority = fastOld.dict_find_int_value("qBt-queuePosition"); int priority = fastOld.dict_find_int_value("qBt-queuePosition");
if (priority > maxPrio)
maxPrio = priority;
fastNew["qBt-name"] = Utils::String::toStdString(oldTorrent.value("name").toString());
fastNew["qBt-tempPathDisabled"] = false;
QFile file2(QString("%1.%2").arg(filepath).arg(priority > 0 ? priority : 0)); QFile file2(QString("%1.%2").arg(filepath).arg(priority > 0 ? priority : 0));
QVector<char> out; QVector<char> out;
libtorrent::bencode(std::back_inserter(out), fastNew); libtorrent::bencode(std::back_inserter(out), fastNew);
@ -106,26 +114,63 @@ bool upgradeResumeFile(const QString &filepath)
bool upgrade(bool ask = true) bool upgrade(bool ask = true)
{ {
QIniSettings *oldResumeSettings = new QIniSettings("qBittorrent", "qBittorrent-resume");
QString oldResumeFilename = oldResumeSettings->fileName();
QVariantHash oldResumeData = oldResumeSettings->value("torrents").toHash();
delete oldResumeSettings;
if (oldResumeData.isEmpty())
Utils::Fs::forceRemove(oldResumeFilename);
QString backupFolderPath = Utils::Fs::expandPathAbs(Utils::Fs::QDesktopServicesDataLocation() + "BT_backup"); QString backupFolderPath = Utils::Fs::expandPathAbs(Utils::Fs::QDesktopServicesDataLocation() + "BT_backup");
QDir backupFolderDir(backupFolderPath); QDir backupFolderDir(backupFolderPath);
if (!backupFolderDir.exists()) return true;
QStringList backupFiles = backupFolderDir.entryList(QStringList() << QLatin1String("*.fastresume"), QDir::Files, QDir::Unsorted); QStringList backupFiles = backupFolderDir.entryList(QStringList() << QLatin1String("*.fastresume"), QDir::Files, QDir::Unsorted);
if (!backupFiles.isEmpty()) { if (backupFiles.isEmpty() && oldResumeData.isEmpty()) return true;
if (ask && !userAcceptsUpgrade()) return false; if (ask && !userAcceptsUpgrade()) return false;
QRegExp rx(QLatin1String("^([A-Fa-f0-9]{40})\\.fastresume$")); int maxPrio = 0;
foreach (QString backupFile, backupFiles) { QRegExp rx(QLatin1String("^([A-Fa-f0-9]{40})\\.fastresume$"));
if (rx.indexIn(backupFile) != -1) { foreach (QString backupFile, backupFiles) {
if (!upgradeResumeFile(backupFolderDir.absoluteFilePath(backupFile))) if (rx.indexIn(backupFile) != -1) {
Logger::instance()->addMessage(QObject::tr("Couldn't migrate torrent with hash: %1").arg(rx.cap(1)), Log::WARNING); if (upgradeResumeFile(backupFolderDir.absoluteFilePath(backupFile), oldResumeData[rx.cap(1)].toHash(), maxPrio))
} oldResumeData.remove(rx.cap(1));
else { else
Logger::instance()->addMessage(QObject::tr("Couldn't migrate torrent. Invalid fastresume file name: %1").arg(backupFile), Log::WARNING); Logger::instance()->addMessage(QObject::tr("Couldn't migrate torrent with hash: %1").arg(rx.cap(1)), Log::WARNING);
} }
else {
Logger::instance()->addMessage(QObject::tr("Couldn't migrate torrent. Invalid fastresume file name: %1").arg(backupFile), Log::WARNING);
} }
} }
foreach (const QString &hash, oldResumeData.keys()) {
QVariantHash oldTorrent = oldResumeData[hash].toHash();
if (oldTorrent.value("is_magnet", false).toBool()) {
libtorrent::entry resumeData;
resumeData["qBt-magnetUri"] = Utils::String::toStdString(oldTorrent.value("magnet_uri").toString());
resumeData["qBt-paused"] = false;
resumeData["qBt-forced"] = false;
resumeData["qBt-savePath"] = Utils::String::toStdString(oldTorrent.value("save_path").toString());
resumeData["qBt-ratioLimit"] = Utils::String::toStdString(QString::number(oldTorrent.value("max_ratio", -2).toReal()));
resumeData["qBt-label"] = Utils::String::toStdString(oldTorrent.value("label").toString());
resumeData["qBt-name"] = Utils::String::toStdString(oldTorrent.value("name").toString());
resumeData["qBt-seedStatus"] = oldTorrent.value("seed").toBool();
resumeData["qBt-tempPathDisabled"] = false;
QString filename = QString("%1.fastresume.%2").arg(hash).arg(++maxPrio);
QString filepath = backupFolderDir.absoluteFilePath(filename);
QFile resumeFile(filepath);
QVector<char> out;
libtorrent::bencode(std::back_inserter(out), resumeData);
if (resumeFile.open(QIODevice::WriteOnly))
resumeFile.write(&out[0], out.size());
}
}
if (!oldResumeData.isEmpty())
QFile(oldResumeFilename).rename(oldResumeFilename + ".bak");
return true; return true;
} }