From 8b226c21710864c6f92d124647c65ba8dc4873eb Mon Sep 17 00:00:00 2001
From: Chocobozzz
Date: Sat, 11 Apr 2015 22:52:31 +0200
Subject: [PATCH] Update non optionnals sources to qt5
---
ext/libclementine-common/core/logging.cpp | 23 ++-
src/core/database.cpp | 44 ++--
src/core/mergedproxymodel.cpp | 9 +-
src/core/metatypes.cpp | 2 +-
src/core/organiseformat.h | 1 +
src/core/potranslator.h | 2 +-
src/core/qxtglobalshortcutbackend.cpp | 1 -
src/core/qxtglobalshortcutbackend.h | 1 +
src/covers/amazoncoverprovider.cpp | 9 +-
src/covers/musicbrainzcoverprovider.cpp | 7 +-
src/dbus/org.mpris.MediaPlayer2.TrackList.xml | 15 +-
src/devices/devicedatabasebackend.cpp | 24 +--
src/devices/deviceproperties.cpp | 2 +-
src/engines/gstengine.cpp | 2 +-
src/engines/gstenginepipeline.cpp | 2 +-
src/globalsearch/globalsearchsettingspage.cpp | 4 +-
src/internet/core/geolocator.cpp | 16 +-
.../core/internetshowsettingspage.cpp | 4 +-
src/internet/core/oauthenticator.cpp | 55 ++---
.../digitally/digitallyimportedclient.cpp | 63 +++---
.../grooveshark/groovesharkservice.cpp | 191 +++++++++--------
src/internet/grooveshark/groovesharkservice.h | 16 +-
src/internet/icecast/icecastbackend.cpp | 21 +-
src/internet/icecast/icecastmodel.cpp | 3 +-
.../jamendo/jamendodynamicplaylist.cpp | 32 +--
src/internet/jamendo/jamendoservice.cpp | 6 +-
.../magnatune/magnatunedownloaddialog.cpp | 11 +-
src/internet/magnatune/magnatuneservice.cpp | 2 +-
src/internet/podcasts/itunessearchpage.cpp | 41 ++--
src/internet/podcasts/podcastbackend.cpp | 81 ++++----
src/internet/podcasts/podcastparser.cpp | 12 +-
src/internet/podcasts/podcasturlloader.cpp | 6 +-
src/internet/soundcloud/soundcloudservice.cpp | 100 ++++-----
src/internet/soundcloud/soundcloudservice.h | 9 +-
src/internet/subsonic/subsonicservice.cpp | 23 ++-
src/internet/subsonic/subsonicurlhandler.cpp | 6 +-
src/library/librarybackend.cpp | 192 +++++++++---------
src/library/librarymodel.cpp | 3 +-
src/library/libraryquery.cpp | 3 +-
src/main.cpp | 49 +----
src/musicbrainz/acoustidclient.cpp | 39 ++--
src/musicbrainz/chromaprinter.cpp | 2 +-
src/musicbrainz/musicbrainzclient.cpp | 9 +-
src/networkremote/outgoingdatacreator.cpp | 2 +-
src/playlist/playlistbackend.cpp | 58 +++---
src/playlist/playlistdelegates.cpp | 4 +-
src/playlist/playlistview.cpp | 11 +-
src/playlist/playlistview.h | 6 +-
src/smartplaylists/searchtermwidget.cpp | 2 +-
src/songinfo/songinfobase.cpp | 2 +-
src/songinfo/songkickconcerts.cpp | 48 ++---
src/songinfo/songkickconcertwidget.cpp | 9 +-
src/songinfo/ultimatelyricsprovider.cpp | 4 +-
src/transcoder/transcodedialog.cpp | 2 +-
src/transcoder/transcoder.cpp | 6 +-
src/ui/albumcoverchoicecontroller.cpp | 1 +
src/ui/edittagdialog.cpp | 13 +-
src/ui/flowlayout.cpp | 2 +-
src/ui/globalshortcutssettingspage.cpp | 2 +-
src/ui/mainwindow.cpp | 1 -
src/ui/qtsystemtrayicon.cpp | 12 +-
src/widgets/errordialog.cpp | 2 +-
src/widgets/fancytabwidget.cpp | 8 +-
src/widgets/forcescrollperpixel.cpp | 3 +-
src/widgets/groupediconview.cpp | 2 +-
src/widgets/groupediconview.h | 2 +-
src/widgets/nowplayingwidget.cpp | 4 +-
src/widgets/stylehelper.cpp | 8 +-
src/widgets/stylehelper.h | 4 +-
tests/scopedtransaction_test.cpp | 9 +-
tools/ultimate_lyrics_parser/main.cpp | 2 -
71 files changed, 714 insertions(+), 658 deletions(-)
diff --git a/ext/libclementine-common/core/logging.cpp b/ext/libclementine-common/core/logging.cpp
index acbc0e2f0..b0a3564d8 100644
--- a/ext/libclementine-common/core/logging.cpp
+++ b/ext/libclementine-common/core/logging.cpp
@@ -28,6 +28,7 @@
#include
#include
#include
+#include
#include
@@ -43,7 +44,7 @@ const char* kDefaultLogLevels = "GstEnginePipeline:2,*:3";
static const char* kMessageHandlerMagic = "__logging_message__";
static const int kMessageHandlerMagicLength = strlen(kMessageHandlerMagic);
-static QtMsgHandler sOriginalMessageHandler = nullptr;
+static QtMessageHandler sOriginalMessageHandler = nullptr;
void GLog(const char* domain, int level, const char* message, void* user_data) {
switch (level) {
@@ -67,9 +68,9 @@ void GLog(const char* domain, int level, const char* message, void* user_data) {
}
}
-static void MessageHandler(QtMsgType type, const char* message) {
- if (strncmp(kMessageHandlerMagic, message, kMessageHandlerMagicLength) == 0) {
- fprintf(stderr, "%s\n", message + kMessageHandlerMagicLength);
+static void MessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &message) {
+ if (strncmp(kMessageHandlerMagic, message.toLocal8Bit().data(), kMessageHandlerMagicLength) == 0) {
+ fprintf(stderr, "%s\n", message.toLocal8Bit().data() + kMessageHandlerMagicLength);
return;
}
@@ -88,7 +89,7 @@ static void MessageHandler(QtMsgType type, const char* message) {
break;
}
- for (const QString& line : QString::fromLocal8Bit(message).split('\n')) {
+ for (const QString& line : message.split('\n')) {
CreateLogger(level, "unknown", -1) << line.toLocal8Bit().constData();
}
@@ -106,7 +107,7 @@ void Init() {
// Catch other messages from Qt
if (!sOriginalMessageHandler) {
- sOriginalMessageHandler = qInstallMsgHandler(MessageHandler);
+ sOriginalMessageHandler = qInstallMessageHandler(MessageHandler);
}
}
@@ -204,9 +205,9 @@ QDebug CreateLogger(Level level, const QString& class_name, int line) {
QDebug ret(type);
ret.nospace() << kMessageHandlerMagic << QDateTime::currentDateTime()
.toString("hh:mm:ss.zzz")
- .toAscii()
+ .toLatin1()
.constData() << level_name
- << function_line.leftJustified(32).toAscii().constData();
+ << function_line.leftJustified(32).toLatin1().constData();
return ret.space();
}
@@ -214,9 +215,9 @@ QDebug CreateLogger(Level level, const QString& class_name, int line) {
QString CXXDemangle(const QString& mangled_function) {
int status;
char* demangled_function = abi::__cxa_demangle(
- mangled_function.toAscii().constData(), nullptr, nullptr, &status);
+ mangled_function.toLatin1().constData(), nullptr, nullptr, &status);
if (status == 0) {
- QString ret = QString::fromAscii(demangled_function);
+ QString ret = QString::fromLatin1(demangled_function);
free(demangled_function);
return ret;
}
@@ -257,7 +258,7 @@ void DumpStackTrace() {
backtrace_symbols(reinterpret_cast(&callstack), callstack_size);
// Start from 1 to skip ourself.
for (int i = 1; i < callstack_size; ++i) {
- qLog(Debug) << DemangleSymbol(QString::fromAscii(symbols[i]));
+ qLog(Debug) << DemangleSymbol(QString::fromLatin1(symbols[i]));
}
free(symbols);
#else
diff --git a/src/core/database.cpp b/src/core/database.cpp
index e351aa32e..908ee7f4b 100644
--- a/src/core/database.cpp
+++ b/src/core/database.cpp
@@ -265,13 +265,14 @@ QSqlDatabase Database::Connect() {
StaticInit();
{
- QSqlQuery set_fts_tokenizer("SELECT fts3_tokenizer(:name, :pointer)", db);
+ QSqlQuery set_fts_tokenizer(db);
+ set_fts_tokenizer.prepare("SELECT fts3_tokenizer(:name, :pointer)");
set_fts_tokenizer.bindValue(":name", "unicode");
set_fts_tokenizer.bindValue(
":pointer", QByteArray(reinterpret_cast(&sFTSTokenizer),
sizeof(&sFTSTokenizer)));
if (!set_fts_tokenizer.exec()) {
- qLog(Warning) << "Couldn't register FTS3 tokenizer";
+ qLog(Warning) << "Couldn't register FTS3 tokenizer : " << set_fts_tokenizer.lastError();
}
// Implicit invocation of ~QSqlQuery() when leaving the scope
// to release any remaining database locks!
@@ -290,12 +291,13 @@ QSqlDatabase Database::Connect() {
if (!injected_database_name_.isNull()) filename = injected_database_name_;
// Attach the db
- QSqlQuery q("ATTACH DATABASE :filename AS :alias", db);
+ QSqlQuery q(db);
+ q.prepare("ATTACH DATABASE :filename AS :alias");
q.bindValue(":filename", filename);
q.bindValue(":alias", key);
if (!q.exec()) {
qFatal("Couldn't attach external database '%s'",
- key.toAscii().constData());
+ key.toLatin1().constData());
}
}
@@ -310,10 +312,10 @@ QSqlDatabase Database::Connect() {
attached_databases_[key].schema_.isEmpty())
continue;
// Find out if there are any tables in this database
- QSqlQuery q(QString(
+ QSqlQuery q(db);
+ q.prepare(QString(
"SELECT ROWID FROM %1.sqlite_master"
- " WHERE type='table'").arg(key),
- db);
+ " WHERE type='table'").arg(key));
if (!q.exec() || !q.next()) {
q.finish();
ExecSchemaCommandsFromFile(db, attached_databases_[key].schema_, 0);
@@ -360,7 +362,8 @@ void Database::RecreateAttachedDb(const QString& database_name) {
{
QSqlDatabase db(Connect());
- QSqlQuery q("DETACH DATABASE :alias", db);
+ QSqlQuery q(db);
+ q.prepare("DETACH DATABASE :alias");
q.bindValue(":alias", database_name);
if (!q.exec()) {
qLog(Warning) << "Failed to detach database" << database_name;
@@ -391,12 +394,13 @@ void Database::AttachDatabaseOnDbConnection(const QString& database_name,
AttachDatabase(database_name, database);
// Attach the db
- QSqlQuery q("ATTACH DATABASE :filename AS :alias", db);
+ QSqlQuery q(db);
+ q.prepare("ATTACH DATABASE :filename AS :alias");
q.bindValue(":filename", database.filename_);
q.bindValue(":alias", database_name);
if (!q.exec()) {
qFatal("Couldn't attach external database '%s'",
- database_name.toAscii().constData());
+ database_name.toLatin1().constData());
}
}
@@ -405,7 +409,8 @@ void Database::DetachDatabase(const QString& database_name) {
{
QSqlDatabase db(Connect());
- QSqlQuery q("DETACH DATABASE :alias", db);
+ QSqlQuery q(db);
+ q.prepare("DETACH DATABASE :alias");
q.bindValue(":alias", database_name);
if (!q.exec()) {
qLog(Warning) << "Failed to detach database" << database_name;
@@ -448,10 +453,10 @@ void Database::UpdateDatabaseSchema(int version, QSqlDatabase& db) {
}
void Database::UrlEncodeFilenameColumn(const QString& table, QSqlDatabase& db) {
- QSqlQuery select(QString("SELECT ROWID, filename FROM %1").arg(table), db);
- QSqlQuery update(
- QString("UPDATE %1 SET filename=:filename WHERE ROWID=:id").arg(table),
- db);
+ QSqlQuery select(db);
+ select.prepare(QString("SELECT ROWID, filename FROM %1").arg(table));
+ QSqlQuery update(db);
+ update.prepare(QString("UPDATE %1 SET filename=:filename WHERE ROWID=:id").arg(table));
select.exec();
if (CheckErrors(select)) return;
while (select.next()) {
@@ -545,12 +550,11 @@ QStringList Database::SongsTables(QSqlDatabase& db, int schema_version) const {
// look for the tables in attached dbs
for (const QString& key : attached_databases_.keys()) {
- QSqlQuery q(
- QString(
+ QSqlQuery q(db);
+ q.prepare(QString(
"SELECT NAME FROM %1.sqlite_master"
" WHERE type='table' AND name='songs' OR name LIKE '%songs'")
- .arg(key),
- db);
+ .arg(key));
if (q.exec()) {
while (q.next()) {
QString tab_name = key + "." + q.value(0).toString();
@@ -587,7 +591,7 @@ bool Database::IntegrityCheck(QSqlDatabase db) {
bool ok = false;
bool error_reported = false;
// Ask for 10 error messages at most.
- QSqlQuery q(QString("PRAGMA integrity_check(10)"), db);
+ QSqlQuery q("PRAGMA integrity_check(10)", db);
while (q.next()) {
QString message = q.value(0).toString();
diff --git a/src/core/mergedproxymodel.cpp b/src/core/mergedproxymodel.cpp
index 56217f6fd..e7f6587f9 100644
--- a/src/core/mergedproxymodel.cpp
+++ b/src/core/mergedproxymodel.cpp
@@ -183,12 +183,14 @@ void MergedProxyModel::SourceModelReset() {
// Delete all mappings
DeleteAllMappings();
+ // Reset the proxy
+ beginResetModel();
+
// Clear the containers
p_->mappings_.clear();
merge_points_.clear();
- // Reset the proxy
- reset();
+ endResetModel();
}
void MergedProxyModel::SubModelReset() {
@@ -497,7 +499,8 @@ void MergedProxyModel::LayoutChanged() {
const int new_row = merge_points_[key].row();
if (old_row != new_row) {
- reset();
+ beginResetModel();
+ endResetModel();
return;
}
}
diff --git a/src/core/metatypes.cpp b/src/core/metatypes.cpp
index daf5b71f7..7691e4e32 100644
--- a/src/core/metatypes.cpp
+++ b/src/core/metatypes.cpp
@@ -29,6 +29,7 @@
#include "covers/albumcoverfetcher.h"
#include "engines/enginebase.h"
#include "engines/gstengine.h"
+#include "engines/gstenginepipeline.h"
#include "globalsearch/searchprovider.h"
#include "internet/digitally/digitallyimportedclient.h"
#include "internet/core/geolocator.h"
@@ -53,7 +54,6 @@ class GstEnginePipeline;
class QNetworkReply;
void RegisterMetaTypes() {
- qRegisterMetaType("ColumnAlignmentMap");
qRegisterMetaType("const char*");
qRegisterMetaType("CoverSearchResult");
qRegisterMetaType("CoverSearchResults");
diff --git a/src/core/organiseformat.h b/src/core/organiseformat.h
index e24a22461..77005794c 100644
--- a/src/core/organiseformat.h
+++ b/src/core/organiseformat.h
@@ -22,6 +22,7 @@
#include
#include
+#include
#include "core/song.h"
diff --git a/src/core/potranslator.h b/src/core/potranslator.h
index eafdccf2f..e92ba3429 100644
--- a/src/core/potranslator.h
+++ b/src/core/potranslator.h
@@ -29,7 +29,7 @@
class PoTranslator : public QTranslator {
public:
QString translate(const char* context, const char* source_text,
- const char* disambiguation = 0) const {
+ const char* disambiguation = 0, int n = -1) const {
QString ret = QTranslator::translate(context, source_text, disambiguation);
if (!ret.isEmpty()) return ret;
return QTranslator::translate(nullptr, source_text, disambiguation);
diff --git a/src/core/qxtglobalshortcutbackend.cpp b/src/core/qxtglobalshortcutbackend.cpp
index f33b3e325..c04e41d4a 100644
--- a/src/core/qxtglobalshortcutbackend.cpp
+++ b/src/core/qxtglobalshortcutbackend.cpp
@@ -40,7 +40,6 @@ bool QxtGlobalShortcutBackend::DoRegister() {
void QxtGlobalShortcutBackend::AddShortcut(QAction* action) {
if (action->shortcut().isEmpty()) return;
-
QxtGlobalShortcut* shortcut = new QxtGlobalShortcut(action->shortcut(), this);
connect(shortcut, SIGNAL(activated()), action, SLOT(trigger()));
shortcuts_ << shortcut;
diff --git a/src/core/qxtglobalshortcutbackend.h b/src/core/qxtglobalshortcutbackend.h
index 32361291c..4976241c5 100644
--- a/src/core/qxtglobalshortcutbackend.h
+++ b/src/core/qxtglobalshortcutbackend.h
@@ -23,6 +23,7 @@
#include "globalshortcutbackend.h"
class QxtGlobalShortcut;
+class QAction;
class QxtGlobalShortcutBackend : public GlobalShortcutBackend {
public:
diff --git a/src/covers/amazoncoverprovider.cpp b/src/covers/amazoncoverprovider.cpp
index 63aead35a..7d991bb0d 100644
--- a/src/covers/amazoncoverprovider.cpp
+++ b/src/covers/amazoncoverprovider.cpp
@@ -24,6 +24,7 @@
#include
#include
#include
+#include
#include "core/closure.h"
#include "core/logging.h"
@@ -79,14 +80,14 @@ bool AmazonCoverProvider::StartSearch(const QString& artist,
const QByteArray data_to_sign =
QString("GET\n%1\n%2\n%3")
.arg(url.host(), url.path(), query_items.join("&"))
- .toAscii();
+ .toLatin1();
const QByteArray signature(Utilities::HmacSha256(
QByteArray::fromBase64(kSecretAccessKeyB64), data_to_sign));
// Add the signature to the request
- encoded_args << EncodedArg("Signature",
- QUrl::toPercentEncoding(signature.toBase64()));
- url.setEncodedQueryItems(encoded_args);
+ QUrlQuery url_query;
+ url_query.addQueryItem("Signature", QUrl::toPercentEncoding(signature.toBase64()));
+ url.setQuery(url_query);
QNetworkReply* reply = network_->get(QNetworkRequest(url));
NewClosure(reply, SIGNAL(finished()), this,
diff --git a/src/covers/musicbrainzcoverprovider.cpp b/src/covers/musicbrainzcoverprovider.cpp
index 827bd085c..fffaab179 100644
--- a/src/covers/musicbrainzcoverprovider.cpp
+++ b/src/covers/musicbrainzcoverprovider.cpp
@@ -22,6 +22,7 @@
#include
#include
+#include
#include "core/closure.h"
#include "core/network.h"
@@ -46,8 +47,10 @@ bool MusicbrainzCoverProvider::StartSearch(const QString& artist,
QString query = QString("release:\"%1\" AND artist:\"%2\"")
.arg(album.trimmed().replace('"', "\\\""))
.arg(artist.trimmed().replace('"', "\\\""));
- url.addQueryItem("query", query);
- url.addQueryItem("limit", "5");
+ QUrlQuery url_query;
+ url_query.addQueryItem("query", query);
+ url_query.addQueryItem("limit", "5");
+ url.setQuery(url_query);
QNetworkRequest request(url);
QNetworkReply* reply = network_->get(request);
diff --git a/src/dbus/org.mpris.MediaPlayer2.TrackList.xml b/src/dbus/org.mpris.MediaPlayer2.TrackList.xml
index 51b4bbc6a..5b609c7b3 100644
--- a/src/dbus/org.mpris.MediaPlayer2.TrackList.xml
+++ b/src/dbus/org.mpris.MediaPlayer2.TrackList.xml
@@ -5,9 +5,8 @@
-
-
-
+
+
@@ -25,19 +24,17 @@
-
-
-
+
+
-
-
-
+
+
diff --git a/src/devices/devicedatabasebackend.cpp b/src/devices/devicedatabasebackend.cpp
index 14f28ed66..308805507 100644
--- a/src/devices/devicedatabasebackend.cpp
+++ b/src/devices/devicedatabasebackend.cpp
@@ -36,11 +36,10 @@ DeviceDatabaseBackend::DeviceList DeviceDatabaseBackend::GetAllDevices() {
DeviceList ret;
- QSqlQuery q(
- "SELECT ROWID, unique_id, friendly_name, size, icon,"
+ QSqlQuery q(db);
+ q.prepare("SELECT ROWID, unique_id, friendly_name, size, icon,"
" transcode_mode, transcode_format"
- " FROM devices",
- db);
+ " FROM devices");
q.exec();
if (db_->CheckErrors(q)) return ret;
@@ -65,13 +64,12 @@ int DeviceDatabaseBackend::AddDevice(const Device& device) {
ScopedTransaction t(&db);
// Insert the device into the devices table
- QSqlQuery q(
- "INSERT INTO devices ("
+ QSqlQuery q(db);
+ q.prepare("INSERT INTO devices ("
" unique_id, friendly_name, size, icon,"
" transcode_mode, transcode_format)"
" VALUES (:unique_id, :friendly_name, :size, :icon,"
- " :transcode_mode, :transcode_format)",
- db);
+ " :transcode_mode, :transcode_format)");
q.bindValue(":unique_id", device.unique_id_);
q.bindValue(":friendly_name", device.friendly_name_);
q.bindValue(":size", device.size_);
@@ -103,7 +101,8 @@ void DeviceDatabaseBackend::RemoveDevice(int id) {
ScopedTransaction t(&db);
// Remove the device from the devices table
- QSqlQuery q("DELETE FROM devices WHERE ROWID=:id", db);
+ QSqlQuery q(db);
+ q.prepare("DELETE FROM devices WHERE ROWID=:id");
q.bindValue(":id", id);
q.exec();
if (db_->CheckErrors(q)) return;
@@ -125,14 +124,13 @@ void DeviceDatabaseBackend::SetDeviceOptions(int id,
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery q(
- "UPDATE devices"
+ QSqlQuery q(db);
+ q.prepare("UPDATE devices"
" SET friendly_name=:friendly_name,"
" icon=:icon_name,"
" transcode_mode=:transcode_mode,"
" transcode_format=:transcode_format"
- " WHERE ROWID=:id",
- db);
+ " WHERE ROWID=:id");
q.bindValue(":friendly_name", friendly_name);
q.bindValue(":icon_name", icon_name);
q.bindValue(":transcode_mode", mode);
diff --git a/src/devices/deviceproperties.cpp b/src/devices/deviceproperties.cpp
index c097d409d..1b6cd2f64 100644
--- a/src/devices/deviceproperties.cpp
+++ b/src/devices/deviceproperties.cpp
@@ -155,7 +155,7 @@ void DeviceProperties::UpdateHardwareInfo() {
AddHardwareInfo(row++, tr("Model"), lister->DeviceModel(id));
AddHardwareInfo(row++, tr("Manufacturer"), lister->DeviceManufacturer(id));
for (const QString& key : info.keys()) {
- AddHardwareInfo(row++, tr(key.toAscii()), info[key].toString());
+ AddHardwareInfo(row++, tr(key.toLatin1()), info[key].toString());
}
ui_->hardware_info->sortItems(0);
diff --git a/src/engines/gstengine.cpp b/src/engines/gstengine.cpp
index 7f903ff7b..35b9bbfc7 100755
--- a/src/engines/gstengine.cpp
+++ b/src/engines/gstengine.cpp
@@ -709,7 +709,7 @@ GstElement* GstEngine::CreateElement(const QString& factoryName,
QString name = factoryName + "-" + QString::number(next_element_id_++);
GstElement* element = gst_element_factory_make(
- factoryName.toAscii().constData(), name.toAscii().constData());
+ factoryName.toLatin1().constData(), name.toLatin1().constData());
if (!element) {
emit Error(QString(
diff --git a/src/engines/gstenginepipeline.cpp b/src/engines/gstenginepipeline.cpp
index 7f48f1fb2..d381f0b04 100644
--- a/src/engines/gstenginepipeline.cpp
+++ b/src/engines/gstenginepipeline.cpp
@@ -413,7 +413,7 @@ bool GstEnginePipeline::InitFromString(const QString& pipeline) {
pipeline_ = gst_pipeline_new("pipeline");
GstElement* new_bin =
- CreateDecodeBinFromString(pipeline.toAscii().constData());
+ CreateDecodeBinFromString(pipeline.toLatin1().constData());
if (!new_bin) {
return false;
}
diff --git a/src/globalsearch/globalsearchsettingspage.cpp b/src/globalsearch/globalsearchsettingspage.cpp
index 460d63a81..3ea953630 100644
--- a/src/globalsearch/globalsearchsettingspage.cpp
+++ b/src/globalsearch/globalsearchsettingspage.cpp
@@ -28,8 +28,8 @@ GlobalSearchSettingsPage::GlobalSearchSettingsPage(SettingsDialog* dialog)
: SettingsPage(dialog), ui_(new Ui::GlobalSearchSettingsPage) {
ui_->setupUi(this);
- ui_->sources->header()->setResizeMode(0, QHeaderView::Stretch);
- ui_->sources->header()->setResizeMode(1, QHeaderView::ResizeToContents);
+ ui_->sources->header()->setSectionResizeMode(0, QHeaderView::Stretch);
+ ui_->sources->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
warning_icon_ = IconLoader::Load("dialog-warning");
diff --git a/src/internet/core/geolocator.cpp b/src/internet/core/geolocator.cpp
index f527dd81d..990308d0c 100644
--- a/src/internet/core/geolocator.cpp
+++ b/src/internet/core/geolocator.cpp
@@ -22,9 +22,10 @@
#include
#include
-#include
-
#include
+#include
+#include
+#include
#include "core/closure.h"
#include "core/logging.h"
@@ -97,16 +98,15 @@ void Geolocator::RequestFinished(QNetworkReply* reply) {
return;
}
- QJson::Parser parser;
- bool ok = false;
- QVariant result = parser.parse(reply, &ok);
- if (!ok) {
+ QJsonParseError error;
+ QJsonDocument json_document = QJsonDocument::fromJson(reply->readAll(), &error);
+ if (error.error != QJsonParseError::NoError) {
emit Finished(LatLng());
return;
}
- QVariantMap map = result.toMap();
- QString latlng = map["latlng"].toString();
+ QJsonObject json_object = json_document.object();
+ QString latlng = json_object["latlng"].toString();
LatLng ll(latlng);
emit Finished(ll);
diff --git a/src/internet/core/internetshowsettingspage.cpp b/src/internet/core/internetshowsettingspage.cpp
index 6df377921..639f22ab7 100644
--- a/src/internet/core/internetshowsettingspage.cpp
+++ b/src/internet/core/internetshowsettingspage.cpp
@@ -29,8 +29,8 @@ InternetShowSettingsPage::InternetShowSettingsPage(SettingsDialog* parent)
: SettingsPage(parent), ui_(new Ui::InternetShowSettingsPage) {
ui_->setupUi(this);
- ui_->sources->header()->setResizeMode(0, QHeaderView::Stretch);
- ui_->sources->header()->setResizeMode(1, QHeaderView::ResizeToContents);
+ ui_->sources->header()->setSectionResizeMode(0, QHeaderView::Stretch);
+ ui_->sources->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
}
void InternetShowSettingsPage::Load() {
diff --git a/src/internet/core/oauthenticator.cpp b/src/internet/core/oauthenticator.cpp
index 8996da5f4..08f78f947 100644
--- a/src/internet/core/oauthenticator.cpp
+++ b/src/internet/core/oauthenticator.cpp
@@ -23,8 +23,10 @@
#include
#include
#include
-
-#include
+#include
+#include
+#include
+#include
#include "core/closure.h"
#include "core/logging.h"
@@ -49,24 +51,29 @@ void OAuthenticator::StartAuthorisation(const QString& oauth_endpoint,
server->Listen();
QUrl url = QUrl(oauth_endpoint);
- url.addQueryItem("response_type", "code");
- url.addQueryItem("client_id", client_id_);
+ QUrlQuery url_query;
+ url_query.addQueryItem("response_type", "code");
+ url_query.addQueryItem("client_id", client_id_);
QUrl redirect_url;
+ QUrlQuery redirect_url_query;
const QString port = QString::number(server->url().port());
if (redirect_style_ == RedirectStyle::REMOTE) {
redirect_url = QUrl(kRemoteURL);
- redirect_url.addQueryItem("port", port);
+ redirect_url_query.addQueryItem("port", port);
} else if (redirect_style_ == RedirectStyle::REMOTE_WITH_STATE) {
redirect_url = QUrl(kRemoteURL);
- url.addQueryItem("state", port);
+ url_query.addQueryItem("state", port);
} else {
redirect_url = server->url();
}
- url.addQueryItem("redirect_uri", redirect_url.toString());
- url.addQueryItem("scope", scope);
+ url_query.addQueryItem("redirect_uri", redirect_url.toString());
+ url_query.addQueryItem("scope", scope);
+
+ url.setQuery(url_query);
+ redirect_url.setQuery(redirect_url_query);
NewClosure(server, SIGNAL(Finished()), this, &OAuthenticator::RedirectArrived,
server, redirect_url);
@@ -78,7 +85,7 @@ void OAuthenticator::RedirectArrived(LocalRedirectServer* server, QUrl url) {
server->deleteLater();
QUrl request_url = server->request_url();
qLog(Debug) << Q_FUNC_INFO << request_url;
- RequestAccessToken(request_url.queryItemValue("code").toUtf8(), url);
+ RequestAccessToken(QUrlQuery(request_url).queryItemValue("code").toUtf8(), url);
}
QByteArray OAuthenticator::ParseHttpRequest(const QByteArray& request) const {
@@ -126,19 +133,20 @@ void OAuthenticator::FetchAccessTokenFinished(QNetworkReply* reply) {
return;
}
- QJson::Parser parser;
- bool ok = false;
- QVariantMap result = parser.parse(reply, &ok).toMap();
- if (!ok) {
+ QJsonParseError error;
+ QJsonDocument json_document = QJsonDocument::fromJson(reply->readAll(), &error);
+
+ if (error.error != QJsonParseError::NoError) {
qLog(Error) << "Failed to parse oauth reply";
return;
}
- qLog(Debug) << result;
+ QJsonObject json_result = json_document.object();
+ qLog(Debug) << json_result;
- access_token_ = result["access_token"].toString();
- refresh_token_ = result["refresh_token"].toString();
- SetExpiryTime(result["expires_in"].toInt());
+ access_token_ = json_result["access_token"].toString();
+ refresh_token_ = json_result["refresh_token"].toString();
+ SetExpiryTime(json_result["expires_in"].toInt());
emit Finished();
}
@@ -178,14 +186,13 @@ void OAuthenticator::SetExpiryTime(int expires_in_seconds) {
void OAuthenticator::RefreshAccessTokenFinished(QNetworkReply* reply) {
reply->deleteLater();
- QJson::Parser parser;
- bool ok = false;
- QVariantMap result = parser.parse(reply, &ok).toMap();
- access_token_ = result["access_token"].toString();
- if (result.contains("refresh_token")) {
- refresh_token_ = result["refresh_token"].toString();
+ QJsonObject json_result = QJsonDocument::fromJson(reply->readAll()).object();
+
+ access_token_ = json_result["access_token"].toString();
+ if (json_result.contains("refresh_token")) {
+ refresh_token_ = json_result["refresh_token"].toString();
}
- SetExpiryTime(result["expires_in"].toInt());
+ SetExpiryTime(json_result["expires_in"].toInt());
emit Finished();
}
diff --git a/src/internet/digitally/digitallyimportedclient.cpp b/src/internet/digitally/digitallyimportedclient.cpp
index 9609301d6..f72d2ea34 100644
--- a/src/internet/digitally/digitallyimportedclient.cpp
+++ b/src/internet/digitally/digitallyimportedclient.cpp
@@ -19,10 +19,11 @@
#include "digitallyimportedclient.h"
-#include
-
#include
#include
+#include
+#include
+#include
#include "core/logging.h"
#include "core/network.h"
@@ -52,7 +53,7 @@ void DigitallyImportedClient::SetAuthorisationHeader(
req->setRawHeader("Authorization", "Basic " +
QString("%1:%2")
.arg(kApiUsername, kApiPassword)
- .toAscii()
+ .toLatin1()
.toBase64());
}
@@ -82,32 +83,30 @@ DigitallyImportedClient::AuthReply DigitallyImportedClient::ParseAuthReply(
return ret;
}
- QJson::Parser parser;
- QVariantMap data = parser.parse(reply).toMap();
+ QJsonObject json_root_object = QJsonDocument::fromJson(reply->readAll()).object();
- if (!data.contains("subscriptions")) {
+ if (json_root_object["subscriptions"].isUndefined()) {
return ret;
}
- QVariantList subscriptions =
- data.value("subscriptions", QVariantList()).toList();
- if (subscriptions.isEmpty() ||
- subscriptions[0].toMap().value("status").toString() != "active") {
+ QJsonArray json_subscriptions = json_root_object["subscriptions"].toArray();
+ if (json_subscriptions.isEmpty() ||
+ json_subscriptions[0].toObject()["status"].toString() != "active") {
ret.error_reason_ = tr("You do not have an active subscription");
return ret;
}
- if (!data.contains("first_name") || !data.contains("last_name") ||
- !subscriptions[0].toMap().contains("expires_on") ||
- !data.contains("listen_key"))
+ if (json_root_object["first_name"].isUndefined() || json_root_object["last_name"].isUndefined() ||
+ json_subscriptions[0].toObject()["expires_on"].isUndefined() ||
+ json_root_object["listen_key"].isUndefined())
return ret;
ret.success_ = true;
- ret.first_name_ = data["first_name"].toString();
- ret.last_name_ = data["last_name"].toString();
+ ret.first_name_ = json_root_object["first_name"].toString();
+ ret.last_name_ = json_root_object["last_name"].toString();
ret.expires_ = QDateTime::fromString(
- subscriptions[0].toMap()["expires_on"].toString(), Qt::ISODate);
- ret.listen_hash_ = data["listen_key"].toString();
+ json_subscriptions[0].toObject()["expires_on"].toString(), Qt::ISODate);
+ ret.listen_hash_ = json_root_object["listen_key"].toString();
return ret;
}
@@ -123,30 +122,28 @@ DigitallyImportedClient::ChannelList DigitallyImportedClient::ParseChannelList(
QNetworkReply* reply) const {
ChannelList ret;
- QJson::Parser parser;
- QVariantMap data = parser.parse(reply).toMap();
+ QJsonObject json_root_object = QJsonDocument::fromJson(reply->readAll()).object();
- if (!data.contains("channel_filters")) return ret;
+ if (json_root_object["channel_filters"].isUndefined()) return ret;
- QVariantList filters = data["channel_filters"].toList();
+ QJsonArray json_filters = json_root_object["channel_filters"].toArray();
- for (const QVariant& filter : filters) {
+ for (const QJsonValue & filter: json_filters) {
// Find the filter called "All"
- QVariantMap filter_map = filter.toMap();
- if (filter_map.value("name", QString()).toString() != "All") continue;
+ QJsonObject json_filter = filter.toObject();
+ if (json_filter["name"].toString() != "All") continue;
// Add all its stations to the result
- QVariantList channels =
- filter_map.value("channels", QVariantList()).toList();
- for (const QVariant& channel_var : channels) {
- QVariantMap channel_map = channel_var.toMap();
+ QJsonArray json_channels = json_filter["channels"].toArray();
+ for (const QJsonValue& channel_var : json_channels) {
+ QJsonObject json_channel = channel_var.toObject();
Channel channel;
- channel.art_url_ = QUrl(channel_map.value("asset_url").toString());
- channel.description_ = channel_map.value("description").toString();
- channel.director_ = channel_map.value("channel_director").toString();
- channel.key_ = channel_map.value("key").toString();
- channel.name_ = channel_map.value("name").toString();
+ channel.art_url_ = QUrl(json_channel["asset_url"].toString());
+ channel.description_ = json_channel["description"].toString();
+ channel.director_ = json_channel["channel_director"].toString();
+ channel.key_ = json_channel["key"].toString();
+ channel.name_ = json_channel["name"].toString();
ret << channel;
}
diff --git a/src/internet/grooveshark/groovesharkservice.cpp b/src/internet/grooveshark/groovesharkservice.cpp
index dd9bca060..5c5f8e67a 100644
--- a/src/internet/grooveshark/groovesharkservice.cpp
+++ b/src/internet/grooveshark/groovesharkservice.cpp
@@ -35,9 +35,11 @@
#include
#include
#include
-
-#include
-#include
+#include
+#include
+#include
+#include
+#include
#include "qtiocompressor.h"
@@ -215,7 +217,7 @@ int GroovesharkService::SimpleSearch(const QString& query) {
void GroovesharkService::SimpleSearchFinished(QNetworkReply* reply, int id) {
reply->deleteLater();
- QVariantMap result = ExtractResult(reply);
+ QJsonObject result = ExtractResult(reply).object();
SongList songs = ExtractSongs(result);
emit SimpleSearchResults(id, songs);
}
@@ -238,12 +240,12 @@ int GroovesharkService::SearchAlbums(const QString& query) {
void GroovesharkService::SearchAlbumsFinished(QNetworkReply* reply, int id) {
reply->deleteLater();
- QVariantMap result = ExtractResult(reply);
- QVariantList albums = result["albums"].toList();
+ QJsonObject result = ExtractResult(reply).object();
+ QJsonArray json_albums = result["albums"].toArray();
QList ret;
- for (const QVariant& v : albums) {
- quint64 album_id = v.toMap()["AlbumID"].toULongLong();
+ for (const QJsonValue& v : json_albums) {
+ quint64 album_id = v.toObject()["AlbumID"].toString().toULongLong();
GetAlbumSongs(album_id);
ret << album_id;
}
@@ -263,7 +265,7 @@ void GroovesharkService::GetAlbumSongs(quint64 album_id) {
void GroovesharkService::GetAlbumSongsFinished(QNetworkReply* reply,
quint64 album_id) {
reply->deleteLater();
- QVariantMap result = ExtractResult(reply);
+ QJsonObject result = ExtractResult(reply).object();
SongList songs = ExtractSongs(result);
emit AlbumSongsLoaded(album_id, songs);
@@ -291,7 +293,7 @@ void GroovesharkService::SearchSongsFinished(QNetworkReply* reply) {
if (reply != last_search_reply_) return;
- QVariantMap result = ExtractResult(reply);
+ QJsonObject result = ExtractResult(reply).object();
SongList songs = ExtractSongs(result);
app_->task_manager()->SetTaskFinished(task_search_id_);
task_search_id_ = 0;
@@ -311,7 +313,7 @@ void GroovesharkService::InitCountry() {
// Get country info
QNetworkReply* reply_country = CreateRequest("getCountry", QList());
if (WaitForReply(reply_country)) {
- country_ = ExtractResult(reply_country);
+ country_ = ExtractResult(reply_country).object().toVariantMap();
}
reply_country->deleteLater();
}
@@ -332,12 +334,12 @@ QUrl GroovesharkService::GetStreamingUrlFromSongId(const QString& song_id,
reply->deleteLater();
if (reply_has_timeouted) return QUrl();
- QVariantMap result = ExtractResult(reply);
+ QJsonObject result = ExtractResult(reply).object();
server_id->clear();
server_id->append(result["StreamServerID"].toString());
stream_key->clear();
stream_key->append(result["StreamKey"].toString());
- *length_nanosec = result["uSecs"].toLongLong() * 1000;
+ *length_nanosec = result["uSecs"].toString().toLongLong() * 1000;
// Keep in mind that user has request to listen to this song
last_songs_ids_.append(song_id.toInt());
last_artists_ids_.append(artist_id.toInt());
@@ -375,7 +377,7 @@ void GroovesharkService::SessionCreated(QNetworkReply* reply) {
return;
}
- QVariantMap result = ExtractResult(reply);
+ QJsonObject result = ExtractResult(reply).object();
if (!result["success"].toBool()) {
qLog(Error) << "Grooveshark returned an error during session creation";
}
@@ -397,7 +399,7 @@ void GroovesharkService::AuthenticateSession() {
void GroovesharkService::Authenticated(QNetworkReply* reply) {
reply->deleteLater();
- QVariantMap result = ExtractResult(reply);
+ QJsonObject result = ExtractResult(reply).object();
// Check if the user has been authenticated correctly
QString error;
if (!result["success"].toBool() || result["UserID"].toInt() == 0) {
@@ -700,7 +702,7 @@ void GroovesharkService::RetrieveUserPlaylists() {
void GroovesharkService::UserPlaylistsRetrieved(QNetworkReply* reply) {
reply->deleteLater();
- QVariantMap result = ExtractResult(reply);
+ QJsonObject result = ExtractResult(reply).object();
QList playlists = ExtractPlaylistInfo(result);
for (const PlaylistInfo& playlist_info : playlists) {
@@ -737,7 +739,7 @@ void GroovesharkService::PlaylistSongsRetrieved(QNetworkReply* reply,
: &playlists_[playlist_id];
playlist_info->item_->removeRows(0, playlist_info->item_->rowCount());
- QVariantMap result = ExtractResult(reply);
+ QJsonObject result = ExtractResult(reply).object();
SongList songs = ExtractSongs(result);
SortSongsAlphabeticallyIfNeeded(&songs);
@@ -778,7 +780,7 @@ void GroovesharkService::UserFavoritesRetrieved(QNetworkReply* reply,
favorites_->removeRows(0, favorites_->rowCount());
- QVariantMap result = ExtractResult(reply);
+ QJsonObject result = ExtractResult(reply).object();
SongList songs = ExtractSongs(result);
SortSongsAlphabeticallyIfNeeded(&songs);
@@ -812,7 +814,7 @@ void GroovesharkService::UserLibrarySongsRetrieved(QNetworkReply* reply,
library_->removeRows(0, library_->rowCount());
- QVariantMap result = ExtractResult(reply);
+ QJsonObject result = ExtractResult(reply).object();
SongList songs = ExtractSongs(result);
SortSongsAlphabeticallyIfNeeded(&songs);
@@ -841,7 +843,7 @@ void GroovesharkService::RetrievePopularSongsMonth() {
void GroovesharkService::PopularSongsMonthRetrieved(QNetworkReply* reply) {
reply->deleteLater();
- QVariantMap result = ExtractResult(reply);
+ QJsonObject result = ExtractResult(reply).object();
SongList songs = ExtractSongs(result);
app_->task_manager()->IncreaseTaskProgress(task_popular_id_, 50, 100);
@@ -867,7 +869,7 @@ void GroovesharkService::RetrievePopularSongsToday() {
void GroovesharkService::PopularSongsTodayRetrieved(QNetworkReply* reply) {
reply->deleteLater();
- QVariantMap result = ExtractResult(reply);
+ QJsonObject result = ExtractResult(reply).object();
SongList songs = ExtractSongs(result);
app_->task_manager()->IncreaseTaskProgress(task_popular_id_, 50, 100);
@@ -893,7 +895,7 @@ void GroovesharkService::RetrieveSubscribedPlaylists() {
void GroovesharkService::SubscribedPlaylistsRetrieved(QNetworkReply* reply) {
reply->deleteLater();
- QVariantMap result = ExtractResult(reply);
+ QJsonObject result = ExtractResult(reply).object();
QList playlists = ExtractPlaylistInfo(result);
for (const PlaylistInfo& playlist_info : playlists) {
@@ -924,9 +926,10 @@ void GroovesharkService::RetrieveAutoplayTags() {
void GroovesharkService::AutoplayTagsRetrieved(QNetworkReply* reply) {
reply->deleteLater();
- QVariantMap result = ExtractResult(reply);
- QVariantMap::const_iterator it;
+ QJsonObject result = ExtractResult(reply).object();
+ QJsonObject::const_iterator it;
if (!stations_) return;
+
for (it = result.constBegin(); it != result.constEnd(); ++it) {
int id = it.key().toInt();
QString name = it.value().toString().toLower();
@@ -955,9 +958,9 @@ Song GroovesharkService::StartAutoplayTag(int tag_id,
reply->deleteLater();
if (reply_has_timeouted) return Song();
- QVariantMap result = ExtractResult(reply);
- autoplay_state = result["autoplayState"].toMap();
- return ExtractSong(result["nextSong"].toMap());
+ QJsonObject result = ExtractResult(reply).object();
+ autoplay_state = result["autoplayState"].toObject().toVariantMap();
+ return ExtractSong(result["nextSong"].toObject());
}
Song GroovesharkService::StartAutoplay(QVariantMap& autoplay_state) {
@@ -978,9 +981,9 @@ Song GroovesharkService::StartAutoplay(QVariantMap& autoplay_state) {
reply->deleteLater();
if (reply_has_timeouted) return Song();
- QVariantMap result = ExtractResult(reply);
- autoplay_state = result["autoplayState"].toMap();
- return ExtractSong(result["nextSong"].toMap());
+ QJsonObject result = ExtractResult(reply).object();
+ autoplay_state = result["autoplayState"].toObject().toVariantMap();
+ return ExtractSong(result["nextSong"].toObject());
}
Song GroovesharkService::GetAutoplaySong(QVariantMap& autoplay_state) {
@@ -992,9 +995,9 @@ Song GroovesharkService::GetAutoplaySong(QVariantMap& autoplay_state) {
reply->deleteLater();
if (reply_has_timeouted) return Song();
- QVariantMap result = ExtractResult(reply);
- autoplay_state = result["autoplayState"].toMap();
- return ExtractSong(result["nextSong"].toMap());
+ QJsonObject result = ExtractResult(reply).object();
+ autoplay_state = result["autoplayState"].toObject().toVariantMap();
+ return ExtractSong(result["nextSong"].toObject());
}
void GroovesharkService::MarkStreamKeyOver30Secs(const QString& stream_key,
@@ -1010,7 +1013,7 @@ void GroovesharkService::MarkStreamKeyOver30Secs(const QString& stream_key,
void GroovesharkService::StreamMarked(QNetworkReply* reply) {
reply->deleteLater();
- QVariantMap result = ExtractResult(reply);
+ QJsonObject result = ExtractResult(reply).object();
if (!result["success"].toBool()) {
qLog(Warning) << "Grooveshark markStreamKeyOver30Secs failed";
}
@@ -1030,7 +1033,7 @@ void GroovesharkService::MarkSongComplete(const QString& song_id,
void GroovesharkService::SongMarkedAsComplete(QNetworkReply* reply) {
reply->deleteLater();
- QVariantMap result = ExtractResult(reply);
+ QJsonObject result = ExtractResult(reply).object();
if (!result["success"].toBool()) {
qLog(Warning) << "Grooveshark markSongComplete failed";
}
@@ -1177,8 +1180,8 @@ void GroovesharkService::GetSongUrlToShare(int song_id) {
void GroovesharkService::SongUrlToShareReceived(QNetworkReply* reply) {
reply->deleteLater();
- QVariantMap result = ExtractResult(reply);
- if (!result["url"].isValid()) return;
+ QJsonObject result = ExtractResult(reply).object();
+ if (result["url"].isUndefined()) return;
QString url = result["url"].toString();
ShowUrlBox(tr("Grooveshark song's URL"), url);
}
@@ -1199,8 +1202,8 @@ void GroovesharkService::GetPlaylistUrlToShare(int playlist_id) {
void GroovesharkService::PlaylistUrlToShareReceived(QNetworkReply* reply) {
reply->deleteLater();
- QVariantMap result = ExtractResult(reply);
- if (!result["url"].isValid()) return;
+ QJsonObject result = ExtractResult(reply).object();
+ if (result["url"].isUndefined()) return;
QString url = result["url"].toString();
ShowUrlBox(tr("Grooveshark playlist's URL"), url);
}
@@ -1249,7 +1252,7 @@ void GroovesharkService::PlaylistSongsSet(QNetworkReply* reply, int playlist_id,
reply->deleteLater();
app_->task_manager()->SetTaskFinished(task_id);
- QVariantMap result = ExtractResult(reply);
+ QJsonObject result = ExtractResult(reply).object();
if (!result["success"].toBool()) {
qLog(Warning) << "Grooveshark setPlaylistSongs failed";
return;
@@ -1289,8 +1292,8 @@ void GroovesharkService::CreateNewPlaylist() {
void GroovesharkService::NewPlaylistCreated(QNetworkReply* reply,
const QString& name) {
reply->deleteLater();
- QVariantMap result = ExtractResult(reply);
- if (!result["success"].toBool() || !result["playlistID"].isValid()) {
+ QJsonObject result = ExtractResult(reply).object();
+ if (!result["success"].toBool() || result["playlistID"].isUndefined()) {
qLog(Warning) << "Grooveshark createPlaylist failed";
return;
}
@@ -1336,7 +1339,7 @@ void GroovesharkService::DeletePlaylist(int playlist_id) {
void GroovesharkService::PlaylistDeleted(QNetworkReply* reply,
int playlist_id) {
reply->deleteLater();
- QVariantMap result = ExtractResult(reply);
+ QJsonObject result = ExtractResult(reply).object();
if (!result["success"].toBool()) {
qLog(Warning) << "Grooveshark deletePlaylist failed";
return;
@@ -1384,7 +1387,7 @@ void GroovesharkService::RenamePlaylist(int playlist_id) {
void GroovesharkService::PlaylistRenamed(QNetworkReply* reply, int playlist_id,
const QString& new_name) {
reply->deleteLater();
- QVariantMap result = ExtractResult(reply);
+ QJsonObject result = ExtractResult(reply).object();
if (!result["success"].toBool()) {
qLog(Warning) << "Grooveshark renamePlaylist failed";
return;
@@ -1411,7 +1414,7 @@ void GroovesharkService::UserFavoriteSongAdded(QNetworkReply* reply,
reply->deleteLater();
app_->task_manager()->SetTaskFinished(task_id);
- QVariantMap result = ExtractResult(reply);
+ QJsonObject result = ExtractResult(reply).object();
if (!result["success"].toBool()) {
qLog(Warning) << "Grooveshark addUserFavoriteSong failed";
return;
@@ -1447,7 +1450,7 @@ void GroovesharkService::UserLibrarySongAdded(QNetworkReply* reply,
reply->deleteLater();
app_->task_manager()->SetTaskFinished(task_id);
- QVariantMap result = ExtractResult(reply);
+ QJsonObject result = ExtractResult(reply).object();
if (!result["success"].toBool()) {
qLog(Warning) << "Grooveshark addUserLibrarySongs failed";
return;
@@ -1536,7 +1539,7 @@ void GroovesharkService::SongsRemovedFromFavorites(QNetworkReply* reply,
app_->task_manager()->SetTaskFinished(task_id);
reply->deleteLater();
- QVariantMap result = ExtractResult(reply);
+ QJsonObject result = ExtractResult(reply).object();
if (!result["success"].toBool()) {
qLog(Warning) << "Grooveshark removeUserFavoriteSongs failed";
return;
@@ -1595,7 +1598,7 @@ void GroovesharkService::SongsRemovedFromLibrary(QNetworkReply* reply,
app_->task_manager()->SetTaskFinished(task_id);
reply->deleteLater();
- QVariantMap result = ExtractResult(reply);
+ QJsonObject result = ExtractResult(reply).object();
if (!result["success"].toBool()) {
qLog(Warning) << "Grooveshark removeUserLibrarySongs failed";
return;
@@ -1606,11 +1609,12 @@ void GroovesharkService::SongsRemovedFromLibrary(QNetworkReply* reply,
QNetworkReply* GroovesharkService::CreateRequest(const QString& method_name,
const QList& params,
bool use_https) {
- QVariantMap request_params;
- request_params.insert("method", method_name);
+ QJsonDocument json_document;
+ QJsonObject json_request_params;
+ json_request_params.insert("method", QJsonValue(method_name));
- QVariantMap header;
- header.insert("wsKey", kApiKey);
+ QJsonObject json_header;
+ json_header.insert("wsKey", QJsonValue(kApiKey));
if (session_id_.isEmpty()) {
if (method_name != "startSession") {
// It's normal to not have a session_id when calling startSession.
@@ -1618,26 +1622,28 @@ QNetworkReply* GroovesharkService::CreateRequest(const QString& method_name,
qLog(Warning) << "Session ID is empty: will not be added to query";
}
} else {
- header.insert("sessionID", session_id_);
+ json_header.insert("sessionID", QJsonValue(session_id_));
}
- request_params.insert("header", header);
+ json_request_params["header"] = json_header;
- QVariantMap parameters;
+ QJsonObject json_parameters;
for (const Param& param : params) {
- parameters.insert(param.first, param.second);
+ json_parameters.insert(param.first, QJsonValue(param.second.toString()));
}
- request_params.insert("parameters", parameters);
+ json_request_params["parameters"] = json_parameters;
- QJson::Serializer serializer;
- QByteArray post_params = serializer.serialize(request_params);
+ json_document.setObject(json_request_params);
+ QByteArray post_params = json_document.toBinaryData();
QUrl url(kUrl);
if (use_https) {
url.setScheme("https");
}
- url.setQueryItems(
+ QUrlQuery url_query;
+ url_query.setQueryItems(
QList>() << QPair(
"sig", Utilities::HmacMd5(api_key_, post_params).toHex()));
+ url.setQuery(url_query);
QNetworkRequest req(url);
QNetworkReply* reply = network_->post(req, post_params);
@@ -1673,20 +1679,24 @@ bool GroovesharkService::WaitForReply(QNetworkReply* reply) {
return true;
}
-QVariantMap GroovesharkService::ExtractResult(QNetworkReply* reply) {
- QJson::Parser parser;
- bool ok;
- QVariantMap result = parser.parse(reply, &ok).toMap();
- if (!ok) {
+QJsonDocument GroovesharkService::ExtractResult(QNetworkReply* reply) {
+ reply->deleteLater();
+
+ QJsonParseError error;
+ QJsonDocument json_document = QJsonDocument::fromJson(reply->readAll(), &error);
+ if (error.error != QJsonParseError::NoError) {
qLog(Error) << "Error while parsing Grooveshark result";
}
- QVariantList errors = result["errors"].toList();
- QVariantList::iterator it;
- for (it = errors.begin(); it != errors.end(); ++it) {
- QVariantMap error = (*it).toMap();
- qLog(Error) << "Grooveshark error: (" << error["code"].toInt() << ") "
- << error["message"].toString();
- switch (error["code"].toInt()) {
+
+ QJsonObject json_object = json_document.object();
+ QJsonArray json_errors = json_object["errors"].toArray();
+
+ for(const QJsonValue & error : json_errors) {
+ QJsonObject json_error = error.toObject();
+
+ qLog(Error) << "Grooveshark error: (" << json_error["code"].toInt() << ") "
+ << json_error["message"].toString();
+ switch (json_error["code"].toInt()) {
case 100: // User auth required
case 102: // User premium required
case 300: // Session required
@@ -1697,7 +1707,10 @@ QVariantMap GroovesharkService::ExtractResult(QNetworkReply* reply) {
break;
}
}
- return result["result"].toMap();
+
+ QJsonDocument doc_ret;
+ doc_ret.setObject(json_object["result"].toObject());
+ return doc_ret;
}
namespace {
@@ -1709,24 +1722,26 @@ bool CompareSongs(const QVariant& song1, const QVariant& song2) {
if (song1_sort == song2_sort) {
// Favorite songs have a "TSFavorited" and (currently) no "Sort" field
return song1_map["TSFavorited"].toString() <
- song2_map["TSFavorited"].toString();
+ song2_map["TSFavorited"].toString();
}
return song1_sort < song2_sort;
}
-} // namespace
+} // namespace
-SongList GroovesharkService::ExtractSongs(const QVariantMap& result) {
- QVariantList result_songs = result["songs"].toList();
+SongList GroovesharkService::ExtractSongs(const QJsonObject& result) {
+ QVariantList result_songs = result["songs"].toArray().toVariantList();
+ // We don't automatically sort QJsonValue because it doesn't implement swap and so I think it simplier like that
+ // https://bugreports.qt.io/browse/QTBUG-44944
qStableSort(result_songs.begin(), result_songs.end(), CompareSongs);
SongList songs;
for (int i = 0; i < result_songs.size(); ++i) {
QVariantMap result_song = result_songs[i].toMap();
- songs << ExtractSong(result_song);
+ songs << ExtractSong(QJsonObject::fromVariantMap(result_song));
}
return songs;
}
-Song GroovesharkService::ExtractSong(const QVariantMap& result_song) {
+Song GroovesharkService::ExtractSong(const QJsonObject& result_song) {
Song song;
if (!result_song.isEmpty()) {
int song_id = result_song["SongID"].toInt();
@@ -1765,11 +1780,11 @@ Song GroovesharkService::ExtractSong(const QVariantMap& result_song) {
return song;
}
-QList GroovesharkService::ExtractSongsIds(const QVariantMap& result) {
- QVariantList result_songs = result["songs"].toList();
+QList GroovesharkService::ExtractSongsIds(const QJsonObject& result) {
+ QJsonArray result_songs = result["songs"].toArray();
QList songs_ids;
for (int i = 0; i < result_songs.size(); ++i) {
- QVariantMap result_song = result_songs[i].toMap();
+ QJsonObject result_song = result_songs[i].toObject();
int song_id = result_song["SongID"].toInt();
songs_ids << song_id;
}
@@ -1798,16 +1813,16 @@ int GroovesharkService::ExtractSongId(const QUrl& url) {
}
QList GroovesharkService::ExtractPlaylistInfo(
- const QVariantMap& result) {
- QVariantList playlists_qvariant = result["playlists"].toList();
+ const QJsonObject result) {
+ QJsonArray json_playlists = result["playlists"].toArray();
QList playlists;
// Get playlists info
- for (const QVariant& playlist_qvariant : playlists_qvariant) {
- QVariantMap playlist = playlist_qvariant.toMap();
- int playlist_id = playlist["PlaylistID"].toInt();
- QString playlist_name = playlist["PlaylistName"].toString();
+ for (const QJsonValue& playlist : json_playlists) {
+ QJsonObject json_playlist = playlist.toObject();
+ int playlist_id = json_playlist["PlaylistID"].toInt();
+ QString playlist_name = json_playlist["PlaylistName"].toString();
playlists << PlaylistInfo(playlist_id, playlist_name);
}
diff --git a/src/internet/grooveshark/groovesharkservice.h b/src/internet/grooveshark/groovesharkservice.h
index 17c16c42f..dc946890a 100644
--- a/src/internet/grooveshark/groovesharkservice.h
+++ b/src/internet/grooveshark/groovesharkservice.h
@@ -106,8 +106,8 @@ class GroovesharkService : public InternetService {
void GetPlaylistUrlToShare(int playlist_id);
// Start autoplay for the given tag_id, fill the autoplay_state, returns a
// first song to play
- Song StartAutoplayTag(int tag_id, QVariantMap& autoplay_state);
- Song StartAutoplay(QVariantMap& autoplay_state);
+ Song StartAutoplayTag(int tag_id, QVariantMap &autoplay_state);
+ Song StartAutoplay(QVariantMap &autoplay_state);
// Get another autoplay song. autoplay_state is the autoplay_state received
// from StartAutoplayTag
Song GetAutoplaySong(QVariantMap& autoplay_state);
@@ -232,22 +232,22 @@ class GroovesharkService : public InternetService {
// seconds. Returns false if reply has timeouted
bool WaitForReply(QNetworkReply* reply);
// Convenient function for extracting result from reply
- QVariantMap ExtractResult(QNetworkReply* reply);
+ QJsonDocument ExtractResult(QNetworkReply* reply);
// Convenient function for extracting songs from grooveshark result. result
// should be the "result" field of most Grooveshark replies
- SongList ExtractSongs(const QVariantMap& result);
+ SongList ExtractSongs(const QJsonObject &result);
// Convenient function for extracting song from grooveshark result.
// result_song should be the song field ('song', 'nextSong', ...) of the
// Grooveshark reply
- Song ExtractSong(const QVariantMap& result_song);
+ Song ExtractSong(const QJsonObject &result_song);
// Convenient functions for extracting Grooveshark songs ids
- QList ExtractSongsIds(const QVariantMap& result);
+ QList ExtractSongsIds(const QJsonObject &result);
QList ExtractSongsIds(const QList& urls);
int ExtractSongId(
const QUrl& url); // Returns 0 if url is not a Grooveshark url
// Convenient function for extracting basic playlist info (only 'id' and
// 'name': QStandardItem still need to be created), and sort them by name
- QList ExtractPlaylistInfo(const QVariantMap& result);
+ QList ExtractPlaylistInfo(const QJsonObject result);
void ResetSessionId();
@@ -308,7 +308,7 @@ class GroovesharkService : public InternetService {
QString password_; // In fact, password's md5 hash
QString user_id_;
QString session_id_;
- QMap country_;
+ QVariantMap country_;
// The last artists and songs ids th users has listened to. Used for autoplay
QList last_artists_ids_;
QList last_songs_ids_;
diff --git a/src/internet/icecast/icecastbackend.cpp b/src/internet/icecast/icecastbackend.cpp
index 35daa3c24..2c9f1bbe7 100644
--- a/src/internet/icecast/icecastbackend.cpp
+++ b/src/internet/icecast/icecastbackend.cpp
@@ -43,7 +43,8 @@ QStringList IcecastBackend::GetGenresAlphabetical(const QString& filter) {
QString sql = QString("SELECT DISTINCT genre FROM %1 %2 ORDER BY genre")
.arg(kTableName, where);
- QSqlQuery q(sql, db);
+ QSqlQuery q(db);
+ q.prepare(sql);
if (!filter.isEmpty()) {
q.bindValue(":filter", QString("%" + filter + "%"));
}
@@ -69,7 +70,8 @@ QStringList IcecastBackend::GetGenresByPopularity(const QString& filter) {
" %2"
" GROUP BY genre"
" ORDER BY count DESC").arg(kTableName, where);
- QSqlQuery q(sql, db);
+ QSqlQuery q(db);
+ q.prepare(sql);
if (!filter.isEmpty()) {
q.bindValue(":filter", QString("%" + filter + "%"));
}
@@ -109,7 +111,8 @@ IcecastBackend::StationList IcecastBackend::GetStations(const QString& filter,
if (!where_clauses.isEmpty()) {
sql += " WHERE " + where_clauses.join(" AND ");
}
- QSqlQuery q(sql, db);
+ QSqlQuery q(db);
+ q.prepare(sql);
for (const QString& value : bound_items) {
q.addBindValue(value);
}
@@ -134,7 +137,8 @@ IcecastBackend::StationList IcecastBackend::GetStations(const QString& filter,
bool IcecastBackend::IsEmpty() {
QMutexLocker l(db_->Mutex());
QSqlDatabase db = db_->Connect();
- QSqlQuery q(QString("SELECT ROWID FROM %1 LIMIT 1").arg(kTableName), db);
+ QSqlQuery q(db);
+ q.prepare(QString("SELECT ROWID FROM %1 LIMIT 1").arg(kTableName));
q.exec();
return !q.next();
}
@@ -146,17 +150,16 @@ void IcecastBackend::ClearAndAddStations(const StationList& stations) {
ScopedTransaction t(&db);
// Remove all existing items
- QSqlQuery q(QString("DELETE FROM %1").arg(kTableName), db);
+ QSqlQuery q(db);
+ q.prepare(QString("DELETE FROM %1").arg(kTableName));
q.exec();
if (db_->CheckErrors(q)) return;
- q = QSqlQuery(
- QString(
+ q.prepare(QString(
"INSERT INTO %1 (name, url, mime_type, bitrate,"
" channels, samplerate, genre)"
" VALUES (:name, :url, :mime_type, :bitrate,"
- " :channels, :samplerate, :genre)").arg(kTableName),
- db);
+ " :channels, :samplerate, :genre)").arg(kTableName));
// Add these ones
for (const Station& station : stations) {
diff --git a/src/internet/icecast/icecastmodel.cpp b/src/internet/icecast/icecastmodel.cpp
index 98ef34493..79d4c99fd 100644
--- a/src/internet/icecast/icecastmodel.cpp
+++ b/src/internet/icecast/icecastmodel.cpp
@@ -46,7 +46,8 @@ void IcecastModel::Reset() {
LazyPopulate(root_);
- reset();
+ beginResetModel();
+ endResetModel();
}
void IcecastModel::LazyPopulate(IcecastItem* parent) {
diff --git a/src/internet/jamendo/jamendodynamicplaylist.cpp b/src/internet/jamendo/jamendodynamicplaylist.cpp
index cfcfb16a8..4424a978a 100644
--- a/src/internet/jamendo/jamendodynamicplaylist.cpp
+++ b/src/internet/jamendo/jamendodynamicplaylist.cpp
@@ -21,9 +21,8 @@
#include "jamendodynamicplaylist.h"
#include
-#include
-#include
#include
+#include
#include "core/logging.h"
#include "core/network.h"
@@ -119,35 +118,36 @@ QString JamendoDynamicPlaylist::OrderSpec(OrderBy by, OrderDirection dir) {
void JamendoDynamicPlaylist::Fetch() {
QUrl url(kUrl);
- url.addQueryItem("pn", QString::number(current_page_++));
- url.addQueryItem("n", QString::number(kPageSize));
- url.addQueryItem("order", OrderSpec(order_by_, order_direction_));
+ QUrlQuery url_query;
+ url_query.addQueryItem("pn", QString::number(current_page_++));
+ url_query.addQueryItem("n", QString::number(kPageSize));
+ url_query.addQueryItem("order", OrderSpec(order_by_, order_direction_));
+ url.setQuery(url_query);
+ // TODO
// We have to use QHttp here because there's no way to disable Keep-Alive
// with QNetworkManager.
- QHttpRequestHeader header(
- "GET", QString(url.encodedPath() + "?" + url.encodedQuery()));
- header.setValue("Host", url.encodedHost());
-
- QHttp http(url.host());
- http.request(header);
+ QNetworkAccessManager network(this);
+ QNetworkRequest req(url);
+ QNetworkReply *reply = network.get(req);
// Wait for the reply
{
QEventLoop event_loop;
- connect(&http, SIGNAL(requestFinished(int, bool)), &event_loop,
- SLOT(quit()));
+ connect(reply, SIGNAL(finished()), &event_loop, SLOT(quit()));
event_loop.exec();
}
- if (http.error() != QHttp::NoError) {
- qLog(Warning) << "HTTP error returned from Jamendo:" << http.errorString()
+ reply->deleteLater();
+
+ if (reply->error() != QNetworkReply::NoError) {
+ qLog(Warning) << "HTTP error returned from Jamendo:" << reply->errorString()
<< ", url:" << url.toString();
return;
}
// The reply will contain one track ID per line
- QStringList lines = QString::fromAscii(http.readAll()).split('\n');
+ QStringList lines = QString::fromLatin1(reply->readAll()).split('\n');
// Get the songs from the database
SongList songs = backend_->GetSongsByForeignId(
diff --git a/src/internet/jamendo/jamendoservice.cpp b/src/internet/jamendo/jamendoservice.cpp
index d68662e1d..6fba45482 100644
--- a/src/internet/jamendo/jamendoservice.cpp
+++ b/src/internet/jamendo/jamendoservice.cpp
@@ -289,9 +289,9 @@ void JamendoService::InsertTrackIds(const TrackIdList& ids) const {
ScopedTransaction t(&db);
- QSqlQuery insert(QString("INSERT INTO %1 (%2) VALUES (:id)")
- .arg(kTrackIdsTable, kTrackIdsColumn),
- db);
+ QSqlQuery insert(db);
+ insert.prepare(QString("INSERT INTO %1 (%2) VALUES (:id)")
+ .arg(kTrackIdsTable, kTrackIdsColumn));
for (int id : ids) {
insert.bindValue(":id", id);
diff --git a/src/internet/magnatune/magnatunedownloaddialog.cpp b/src/internet/magnatune/magnatunedownloaddialog.cpp
index c502a0682..12957913b 100644
--- a/src/internet/magnatune/magnatunedownloaddialog.cpp
+++ b/src/internet/magnatune/magnatunedownloaddialog.cpp
@@ -31,6 +31,7 @@
#include
#include
#include
+#include
#include "magnatuneservice.h"
#include "internet/core/internetmodel.h"
@@ -49,8 +50,8 @@ MagnatuneDownloadDialog::MagnatuneDownloadDialog(MagnatuneService* service,
current_reply_(nullptr),
next_row_(0) {
ui_->setupUi(this);
- ui_->albums->header()->setResizeMode(QHeaderView::ResizeToContents);
- ui_->albums->header()->setResizeMode(1, QHeaderView::Fixed);
+ ui_->albums->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
+ ui_->albums->header()->setSectionResizeMode(1, QHeaderView::Fixed);
ui_->albums->header()->resizeSection(1, 150);
ui_->albums->setItemDelegateForColumn(1, new ProgressItemDelegate(this));
@@ -126,8 +127,10 @@ void MagnatuneDownloadDialog::DownloadNext() {
QUrl url(MagnatuneService::kDownloadUrl);
url.setUserName(service_->username());
url.setPassword(service_->password());
- url.addQueryItem("id", MagnatuneService::kPartnerId);
- url.addQueryItem("sku", sku);
+
+ QUrlQuery url_query;
+ url_query.addQueryItem("id", MagnatuneService::kPartnerId);
+ url_query.addQueryItem("sku", sku);
current_reply_ = network_->get(QNetworkRequest(url));
diff --git a/src/internet/magnatune/magnatuneservice.cpp b/src/internet/magnatune/magnatuneservice.cpp
index 7206e8808..2c7f1764b 100644
--- a/src/internet/magnatune/magnatuneservice.cpp
+++ b/src/internet/magnatune/magnatuneservice.cpp
@@ -227,7 +227,7 @@ Song MagnatuneService::ReadTrack(QXmlStreamReader& reader) {
if (name == "url") {
QUrl url;
// Magnatune's URLs are already encoded
- url.setEncodedUrl(value.toLocal8Bit());
+ url.setUrl(value.toLocal8Bit());
url.setScheme("magnatune");
song.set_url(url);
}
diff --git a/src/internet/podcasts/itunessearchpage.cpp b/src/internet/podcasts/itunessearchpage.cpp
index a17005f95..dccfebded 100644
--- a/src/internet/podcasts/itunessearchpage.cpp
+++ b/src/internet/podcasts/itunessearchpage.cpp
@@ -19,9 +19,13 @@
#include "itunessearchpage.h"
-#include
#include
#include
+#include
+#include
+#include
+#include
+#include
#include "core/closure.h"
#include "core/network.h"
@@ -47,7 +51,9 @@ void ITunesSearchPage::SearchClicked() {
emit Busy(true);
QUrl url(QUrl::fromEncoded(kUrlBase));
- url.addQueryItem("term", ui_->query->text());
+ QUrlQuery url_query;
+ url_query.addQueryItem("term", ui_->query->text());
+ url.setQuery(url_query);
QNetworkReply* reply = network_->get(QNetworkRequest(url));
NewClosure(reply, SIGNAL(finished()), this,
@@ -67,37 +73,38 @@ void ITunesSearchPage::SearchFinished(QNetworkReply* reply) {
return;
}
- QJson::Parser parser;
- QVariant data = parser.parse(reply);
+ QJsonParseError error;
+ QJsonDocument json_document = QJsonDocument::fromJson(reply->readAll(), &error);
- // Was it valid JSON?
- if (data.isNull()) {
+ if (error.error != QJsonParseError::NoError) {
QMessageBox::warning(
this, tr("Failed to fetch podcasts"),
tr("There was a problem parsing the response from the iTunes Store"));
return;
}
+ QJsonObject json_data = json_document.object();
+
// Was there an error message in the JSON?
- if (data.toMap().contains("errorMessage")) {
+ if (!json_data["errorMessage"].isUndefined()) {
QMessageBox::warning(this, tr("Failed to fetch podcasts"),
- data.toMap()["errorMessage"].toString());
+ json_data["errorMessage"].toString());
return;
}
- for (const QVariant& result_variant : data.toMap()["results"].toList()) {
- QVariantMap result(result_variant.toMap());
- if (result["kind"].toString() != "podcast") {
+ for (const QJsonValue& result : json_data["results"].toArray()) {
+ QJsonObject json_result = result.toObject();
+ if (json_result["kind"].toString() != "podcast") {
continue;
}
Podcast podcast;
- podcast.set_author(result["artistName"].toString());
- podcast.set_title(result["trackName"].toString());
- podcast.set_url(result["feedUrl"].toUrl());
- podcast.set_link(result["trackViewUrl"].toUrl());
- podcast.set_image_url_small(QUrl(result["artworkUrl30"].toString()));
- podcast.set_image_url_large(QUrl(result["artworkUrl100"].toString()));
+ podcast.set_author(json_result["artistName"].toString());
+ podcast.set_title(json_result["trackName"].toString());
+ podcast.set_url(QUrl(json_result["feedUrl"].toString()));
+ podcast.set_link(QUrl(json_result["trackViewUrl"].toString()));
+ podcast.set_image_url_small(QUrl(json_result["artworkUrl30"].toString()));
+ podcast.set_image_url_large(QUrl(json_result["artworkUrl100"].toString()));
model()->appendRow(model()->CreatePodcastItem(podcast));
}
diff --git a/src/internet/podcasts/podcastbackend.cpp b/src/internet/podcasts/podcastbackend.cpp
index c6657586e..c37bb701c 100644
--- a/src/internet/podcasts/podcastbackend.cpp
+++ b/src/internet/podcasts/podcastbackend.cpp
@@ -47,11 +47,11 @@ void PodcastBackend::Subscribe(Podcast* podcast) {
ScopedTransaction t(&db);
// Insert the podcast.
- QSqlQuery q("INSERT INTO podcasts (" + Podcast::kColumnSpec +
+ QSqlQuery q(db);
+ q.prepare("INSERT INTO podcasts (" + Podcast::kColumnSpec +
")"
" VALUES (" +
- Podcast::kBindSpec + ")",
- db);
+ Podcast::kBindSpec + ")");
podcast->BindToQuery(&q);
q.exec();
@@ -86,13 +86,14 @@ void PodcastBackend::Unsubscribe(const Podcast& podcast) {
ScopedTransaction t(&db);
// Remove the podcast.
- QSqlQuery q("DELETE FROM podcasts WHERE ROWID = :id", db);
+ QSqlQuery q(db);
+ q.prepare("DELETE FROM podcasts WHERE ROWID = :id");
q.bindValue(":id", podcast.database_id());
q.exec();
if (db_->CheckErrors(q)) return;
// Remove all episodes in the podcast
- q = QSqlQuery("DELETE FROM podcast_episodes WHERE podcast_id = :id", db);
+ q.prepare("DELETE FROM podcast_episodes WHERE podcast_id = :id");
q.bindValue(":id", podcast.database_id());
q.exec();
if (db_->CheckErrors(q)) return;
@@ -104,11 +105,11 @@ void PodcastBackend::Unsubscribe(const Podcast& podcast) {
void PodcastBackend::AddEpisodes(PodcastEpisodeList* episodes,
QSqlDatabase* db) {
- QSqlQuery q("INSERT INTO podcast_episodes (" + PodcastEpisode::kColumnSpec +
+ QSqlQuery q(*db);
+ q.prepare("INSERT INTO podcast_episodes (" + PodcastEpisode::kColumnSpec +
")"
" VALUES (" +
- PodcastEpisode::kBindSpec + ")",
- *db);
+ PodcastEpisode::kBindSpec + ")");
for (auto it = episodes->begin(); it != episodes->end(); ++it) {
it->BindToQuery(&q);
@@ -136,14 +137,13 @@ void PodcastBackend::UpdateEpisodes(const PodcastEpisodeList& episodes) {
QSqlDatabase db(db_->Connect());
ScopedTransaction t(&db);
- QSqlQuery q(
- "UPDATE podcast_episodes"
+ QSqlQuery q(db);
+ q.prepare("UPDATE podcast_episodes"
" SET listened = :listened,"
" listened_date = :listened_date,"
" downloaded = :downloaded,"
" local_url = :local_url"
- " WHERE ROWID = :id",
- db);
+ " WHERE ROWID = :id");
for (const PodcastEpisode& episode : episodes) {
q.bindValue(":listened", episode.listened());
@@ -166,7 +166,8 @@ PodcastList PodcastBackend::GetAllSubscriptions() {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery q("SELECT ROWID, " + Podcast::kColumnSpec + " FROM podcasts", db);
+ QSqlQuery q(db);
+ q.prepare("SELECT ROWID, " + Podcast::kColumnSpec + " FROM podcasts");
q.exec();
if (db_->CheckErrors(q)) return ret;
@@ -185,10 +186,10 @@ Podcast PodcastBackend::GetSubscriptionById(int id) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery q("SELECT ROWID, " + Podcast::kColumnSpec +
+ QSqlQuery q(db);
+ q.prepare("SELECT ROWID, " + Podcast::kColumnSpec +
" FROM podcasts"
- " WHERE ROWID = :id",
- db);
+ " WHERE ROWID = :id");
q.bindValue(":id", id);
q.exec();
if (!db_->CheckErrors(q) && q.next()) {
@@ -204,10 +205,10 @@ Podcast PodcastBackend::GetSubscriptionByUrl(const QUrl& url) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery q("SELECT ROWID, " + Podcast::kColumnSpec +
+ QSqlQuery q(db);
+ q.prepare("SELECT ROWID, " + Podcast::kColumnSpec +
" FROM podcasts"
- " WHERE url = :url",
- db);
+ " WHERE url = :url");
q.bindValue(":url", url.toEncoded());
q.exec();
if (!db_->CheckErrors(q) && q.next()) {
@@ -223,11 +224,11 @@ PodcastEpisodeList PodcastBackend::GetEpisodes(int podcast_id) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery q("SELECT ROWID, " + PodcastEpisode::kColumnSpec +
+ QSqlQuery q(db);
+ q.prepare("SELECT ROWID, " + PodcastEpisode::kColumnSpec +
" FROM podcast_episodes"
" WHERE podcast_id = :id"
- " ORDER BY publication_date DESC",
- db);
+ " ORDER BY publication_date DESC");
q.bindValue(":db", podcast_id);
q.exec();
if (db_->CheckErrors(q)) return ret;
@@ -247,10 +248,10 @@ PodcastEpisode PodcastBackend::GetEpisodeById(int id) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery q("SELECT ROWID, " + PodcastEpisode::kColumnSpec +
+ QSqlQuery q(db);
+ q.prepare("SELECT ROWID, " + PodcastEpisode::kColumnSpec +
" FROM podcast_episodes"
- " WHERE ROWID = :id",
- db);
+ " WHERE ROWID = :id");
q.bindValue(":db", id);
q.exec();
if (!db_->CheckErrors(q) && q.next()) {
@@ -266,10 +267,10 @@ PodcastEpisode PodcastBackend::GetEpisodeByUrl(const QUrl& url) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery q("SELECT ROWID, " + PodcastEpisode::kColumnSpec +
+ QSqlQuery q(db);
+ q.prepare("SELECT ROWID, " + PodcastEpisode::kColumnSpec +
" FROM podcast_episodes"
- " WHERE url = :url",
- db);
+ " WHERE url = :url");
q.bindValue(":url", url.toEncoded());
q.exec();
if (!db_->CheckErrors(q) && q.next()) {
@@ -285,11 +286,11 @@ PodcastEpisode PodcastBackend::GetEpisodeByUrlOrLocalUrl(const QUrl& url) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery q("SELECT ROWID, " + PodcastEpisode::kColumnSpec +
+ QSqlQuery q(db);
+ q.prepare("SELECT ROWID, " + PodcastEpisode::kColumnSpec +
" FROM podcast_episodes"
" WHERE url = :url"
- " OR local_url = :url",
- db);
+ " OR local_url = :url");
q.bindValue(":url", url.toEncoded());
q.exec();
if (!db_->CheckErrors(q) && q.next()) {
@@ -306,11 +307,11 @@ PodcastEpisodeList PodcastBackend::GetOldDownloadedEpisodes(
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery q("SELECT ROWID, " + PodcastEpisode::kColumnSpec +
+ QSqlQuery q(db);
+ q.prepare("SELECT ROWID, " + PodcastEpisode::kColumnSpec +
" FROM podcast_episodes"
" WHERE downloaded = 'true'"
- " AND listened_date <= :max_listened_date",
- db);
+ " AND listened_date <= :max_listened_date");
q.bindValue(":max_listened_date", max_listened_date.toTime_t());
q.exec();
if (db_->CheckErrors(q)) return ret;
@@ -330,12 +331,12 @@ PodcastEpisode PodcastBackend::GetOldestDownloadedListenedEpisode() {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery q("SELECT ROWID, " + PodcastEpisode::kColumnSpec +
+ QSqlQuery q(db);
+ q.prepare("SELECT ROWID, " + PodcastEpisode::kColumnSpec +
" FROM podcast_episodes"
" WHERE downloaded = 'true'"
" AND listened = 'true'"
- " ORDER BY listened_date ASC",
- db);
+ " ORDER BY listened_date ASC");
q.exec();
if (db_->CheckErrors(q)) return ret;
q.next();
@@ -350,11 +351,11 @@ PodcastEpisodeList PodcastBackend::GetNewDownloadedEpisodes() {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery q("SELECT ROWID, " + PodcastEpisode::kColumnSpec +
+ QSqlQuery q(db);
+ q.prepare("SELECT ROWID, " + PodcastEpisode::kColumnSpec +
" FROM podcast_episodes"
" WHERE downloaded = 'true'"
- " AND listened = 'false'",
- db);
+ " AND listened = 'false'");
q.exec();
if (db_->CheckErrors(q)) return ret;
diff --git a/src/internet/podcasts/podcastparser.cpp b/src/internet/podcasts/podcastparser.cpp
index 0476d5e9b..3e163448e 100644
--- a/src/internet/podcasts/podcastparser.cpp
+++ b/src/internet/podcasts/podcastparser.cpp
@@ -114,7 +114,7 @@ void PodcastParser::ParseChannel(QXmlStreamReader* reader, Podcast* ret) const {
if (name == "title") {
ret->set_title(reader->readElementText());
} else if (name == "link" && lower_namespace.isEmpty()) {
- ret->set_link(QUrl::fromEncoded(reader->readElementText().toAscii()));
+ ret->set_link(QUrl::fromEncoded(reader->readElementText().toLatin1()));
} else if (name == "description") {
ret->set_description(reader->readElementText());
} else if (name == "owner" && lower_namespace == kItunesNamespace) {
@@ -126,7 +126,7 @@ void PodcastParser::ParseChannel(QXmlStreamReader* reader, Podcast* ret) const {
} else if (name == "link" && lower_namespace == kAtomNamespace &&
ret->url().isEmpty() &&
reader->attributes().value("rel") == "self") {
- ret->set_url(QUrl::fromEncoded(reader->readElementText().toAscii()));
+ ret->set_url(QUrl::fromEncoded(reader->readElementText().toLatin1()));
} else if (name == "item") {
ParseItem(reader, ret);
} else {
@@ -152,7 +152,7 @@ void PodcastParser::ParseImage(QXmlStreamReader* reader, Podcast* ret) const {
const QStringRef name = reader->name();
if (name == "url") {
ret->set_image_url_large(
- QUrl::fromEncoded(reader->readElementText().toAscii()));
+ QUrl::fromEncoded(reader->readElementText().toLatin1()));
} else {
Utilities::ConsumeCurrentElement(reader);
}
@@ -231,7 +231,7 @@ void PodcastParser::ParseItem(QXmlStreamReader* reader, Podcast* ret) const {
const QString type = reader->attributes().value("type").toString();
if (type.startsWith("audio/") || type.startsWith("x-audio/")) {
episode.set_url(QUrl::fromEncoded(
- reader->attributes().value("url").toString().toAscii()));
+ reader->attributes().value("url").toString().toLatin1()));
}
Utilities::ConsumeCurrentElement(reader);
} else if (name == "author" && lower_namespace == kItunesNamespace) {
@@ -293,9 +293,9 @@ void PodcastParser::ParseOutline(QXmlStreamReader* reader,
podcast.set_description(attributes.value("description").toString());
podcast.set_title(attributes.value("text").toString());
podcast.set_image_url_large(QUrl::fromEncoded(
- attributes.value("imageHref").toString().toAscii()));
+ attributes.value("imageHref").toString().toLatin1()));
podcast.set_url(QUrl::fromEncoded(
- attributes.value("xmlUrl").toString().toAscii()));
+ attributes.value("xmlUrl").toString().toLatin1()));
ret->feeds.append(podcast);
// Consume any children and the EndElement.
diff --git a/src/internet/podcasts/podcasturlloader.cpp b/src/internet/podcasts/podcasturlloader.cpp
index b6509e4ad..c08265fd6 100644
--- a/src/internet/podcasts/podcasturlloader.cpp
+++ b/src/internet/podcasts/podcasturlloader.cpp
@@ -20,6 +20,7 @@
#include "podcasturlloader.h"
#include
+#include
#include "podcastparser.h"
#include "core/closure.h"
@@ -73,14 +74,15 @@ QUrl PodcastUrlLoader::FixPodcastUrl(const QString& url_text) {
QUrl PodcastUrlLoader::FixPodcastUrl(const QUrl& url_orig) {
QUrl url(url_orig);
+ QUrlQuery url_query(url);
// Replace schemes
if (url.scheme().isEmpty() || url.scheme() == "feed" ||
url.scheme() == "itpc" || url.scheme() == "itms") {
url.setScheme("http");
} else if (url.scheme() == "zune" && url.host() == "subscribe" &&
- !url.queryItems().isEmpty()) {
- url = QUrl(url.queryItems()[0].second);
+ !url_query.queryItems().isEmpty()) {
+ url = QUrl(url_query.queryItems()[0].second);
}
return url;
diff --git a/src/internet/soundcloud/soundcloudservice.cpp b/src/internet/soundcloud/soundcloudservice.cpp
index 4883afa96..955f723d1 100644
--- a/src/internet/soundcloud/soundcloudservice.cpp
+++ b/src/internet/soundcloud/soundcloudservice.cpp
@@ -25,9 +25,11 @@
#include
#include
#include
-
-#include
-#include
+#include
+#include
+#include
+#include
+#include
#include "internet/core/internetmodel.h"
#include "internet/core/oauthenticator.h"
@@ -217,7 +219,7 @@ void SoundCloudService::RetrieveUserData() {
void SoundCloudService::RetrieveUserTracks() {
QList parameters;
parameters << Param("oauth_token", access_token_);
- QNetworkReply* reply = CreateRequest("me/tracks", parameters);
+ QNetworkReply* reply = CreateRequest("/me/tracks", parameters);
NewClosure(reply, SIGNAL(finished()), this,
SLOT(UserTracksRetrieved(QNetworkReply*)), reply);
}
@@ -225,7 +227,7 @@ void SoundCloudService::RetrieveUserTracks() {
void SoundCloudService::UserTracksRetrieved(QNetworkReply* reply) {
reply->deleteLater();
- SongList songs = ExtractSongs(ExtractResult(reply));
+ SongList songs = ExtractSongs(ExtractResult(reply).array());
// Fill results list
for (const Song& song : songs) {
QStandardItem* child = CreateSongItem(song);
@@ -236,7 +238,7 @@ void SoundCloudService::UserTracksRetrieved(QNetworkReply* reply) {
void SoundCloudService::RetrieveUserActivities() {
QList parameters;
parameters << Param("oauth_token", access_token_);
- QNetworkReply* reply = CreateRequest("me/activities", parameters);
+ QNetworkReply* reply = CreateRequest("/me/activities", parameters);
NewClosure(reply, SIGNAL(finished()), this,
SLOT(UserActivitiesRetrieved(QNetworkReply*)), reply);
}
@@ -244,7 +246,7 @@ void SoundCloudService::RetrieveUserActivities() {
void SoundCloudService::UserActivitiesRetrieved(QNetworkReply* reply) {
reply->deleteLater();
- QList activities = ExtractActivities(ExtractResult(reply));
+ QList activities = ExtractActivities(ExtractResult(reply).object());
// Fill results list
for (QStandardItem* activity : activities) {
user_activities_->appendRow(activity);
@@ -254,7 +256,7 @@ void SoundCloudService::UserActivitiesRetrieved(QNetworkReply* reply) {
void SoundCloudService::RetrieveUserPlaylists() {
QList parameters;
parameters << Param("oauth_token", access_token_);
- QNetworkReply* reply = CreateRequest("me/playlists", parameters);
+ QNetworkReply* reply = CreateRequest("/me/playlists", parameters);
NewClosure(reply, SIGNAL(finished()), this,
SLOT(UserPlaylistsRetrieved(QNetworkReply*)), reply);
}
@@ -262,12 +264,12 @@ void SoundCloudService::RetrieveUserPlaylists() {
void SoundCloudService::UserPlaylistsRetrieved(QNetworkReply* reply) {
reply->deleteLater();
- QList playlists = ExtractResult(reply).toList();
- for (const QVariant& playlist : playlists) {
- QMap playlist_map = playlist.toMap();
+ QJsonArray json_playlists = ExtractResult(reply).array();
+ for (const QJsonValue& playlist : json_playlists) {
+ QJsonObject json_playlist = playlist.toObject();
- QStandardItem* playlist_item = CreatePlaylistItem(playlist_map["title"].toString());
- SongList songs = ExtractSongs(playlist_map["tracks"]);
+ QStandardItem* playlist_item = CreatePlaylistItem(json_playlist["title"].toString());
+ SongList songs = ExtractSongs(json_playlist["tracks"].toArray());
for (const Song& song : songs) {
playlist_item->appendRow(CreateSongItem(song));
}
@@ -299,7 +301,7 @@ void SoundCloudService::DoSearch() {
QList parameters;
parameters << Param("q", pending_search_);
- QNetworkReply* reply = CreateRequest("tracks", parameters);
+ QNetworkReply* reply = CreateRequest("/tracks", parameters);
const int id = next_pending_search_id_++;
NewClosure(reply, SIGNAL(finished()), this,
SLOT(SearchFinished(QNetworkReply*, int)), reply, id);
@@ -308,7 +310,7 @@ void SoundCloudService::DoSearch() {
void SoundCloudService::SearchFinished(QNetworkReply* reply, int task_id) {
reply->deleteLater();
- SongList songs = ExtractSongs(ExtractResult(reply));
+ SongList songs = ExtractSongs(ExtractResult(reply).array());
// Fill results list
for (const Song& song : songs) {
QStandardItem* child = CreateSongItem(song);
@@ -328,7 +330,7 @@ void SoundCloudService::ClearSearchResults() {
int SoundCloudService::SimpleSearch(const QString& text) {
QList parameters;
parameters << Param("q", text);
- QNetworkReply* reply = CreateRequest("tracks", parameters);
+ QNetworkReply* reply = CreateRequest("/tracks", parameters);
const int id = next_pending_search_id_++;
NewClosure(reply, SIGNAL(finished()), this,
SLOT(SimpleSearchFinished(QNetworkReply*, int)), reply, id);
@@ -338,7 +340,7 @@ int SoundCloudService::SimpleSearch(const QString& text) {
void SoundCloudService::SimpleSearchFinished(QNetworkReply* reply, int id) {
reply->deleteLater();
- SongList songs = ExtractSongs(ExtractResult(reply));
+ SongList songs = ExtractSongs(ExtractResult(reply).array());
emit SimpleSearchResults(id, songs);
}
@@ -372,12 +374,15 @@ QNetworkReply* SoundCloudService::CreateRequest(const QString& ressource_name,
QUrl url(kUrl);
url.setPath(ressource_name);
+ QUrlQuery url_query;
- url.addQueryItem("client_id", kApiClientId);
+ url_query.addQueryItem("client_id", kApiClientId);
for (const Param& param : params) {
- url.addQueryItem(param.first, param.second);
+ url_query.addQueryItem(param.first, param.second);
}
+ url.setQuery(url_query);
+
qLog(Debug) << "Request Url: " << url.toEncoded();
QNetworkRequest req(url);
@@ -386,7 +391,7 @@ QNetworkReply* SoundCloudService::CreateRequest(const QString& ressource_name,
return reply;
}
-QVariant SoundCloudService::ExtractResult(QNetworkReply* reply) {
+QJsonDocument SoundCloudService::ExtractResult(QNetworkReply* reply) {
if (reply->error() != QNetworkReply::NoError) {
qLog(Error) << "Error when retrieving SoundCloud results:"
<< reply->errorString() << QString(" (%1)").arg(reply->error());
@@ -396,16 +401,16 @@ QVariant SoundCloudService::ExtractResult(QNetworkReply* reply) {
reply->error() == QNetworkReply::AuthenticationRequiredError) {
// In case of access denied errors (invalid token?) logout
Logout();
- return QVariant();
+ return QJsonDocument();
}
}
- QJson::Parser parser;
- bool ok;
- QVariant result = parser.parse(reply, &ok);
- if (!ok) {
+ QJsonParseError error;
+ QJsonDocument document = QJsonDocument::fromJson(reply->readAll(), &error);
+ if (error.error != QJsonParseError::NoError) {
qLog(Error) << "Error while parsing SoundCloud result";
}
- return result;
+
+ return document;
}
void SoundCloudService::RetrievePlaylist(int playlist_id,
@@ -416,7 +421,7 @@ void SoundCloudService::RetrievePlaylist(int playlist_id,
QList parameters;
parameters << Param("oauth_token", access_token_);
QNetworkReply* reply =
- CreateRequest("playlists/" + QString::number(playlist_id), parameters);
+ CreateRequest("/playlists/" + QString::number(playlist_id), parameters);
NewClosure(reply, SIGNAL(finished()), this,
SLOT(PlaylistRetrieved(QNetworkReply*, int)), reply, request_id);
}
@@ -425,42 +430,41 @@ void SoundCloudService::PlaylistRetrieved(QNetworkReply* reply,
int request_id) {
if (!pending_playlists_requests_.contains(request_id)) return;
PlaylistInfo playlist_info = pending_playlists_requests_.take(request_id);
- QVariant res = ExtractResult(reply);
- SongList songs = ExtractSongs(res.toMap()["tracks"]);
+ QJsonDocument res = ExtractResult(reply);
+ SongList songs = ExtractSongs(res.object()["tracks"].toArray());
for (const Song& song : songs) {
QStandardItem* child = CreateSongItem(song);
playlist_info.item_->appendRow(child);
}
}
-QList SoundCloudService::ExtractActivities(const QVariant& result) {
+QList SoundCloudService::ExtractActivities(const QJsonObject& result) {
QList activities;
- QVariantList q_variant_list = result.toMap()["collection"].toList();
- for (const QVariant& q : q_variant_list) {
- QMap activity = q.toMap();
- const QString type = activity["type"].toString();
+ QJsonArray q_list = result["collection"].toArray();
+ for (const QJsonValue& q : q_list) {
+ QJsonObject json_activity = q.toObject();
+ const QString type = json_activity["type"].toString();
if (type == "track") {
- Song song = ExtractSong(activity["origin"].toMap());
+ Song song = ExtractSong(json_activity["origin"].toObject());
if (song.is_valid()) {
activities << CreateSongItem(song);
}
} else if (type == "playlist") {
- QMap origin_map = activity["origin"].toMap();
+ QJsonObject json_origin = json_activity["origin"].toObject();
QStandardItem* playlist_item =
- CreatePlaylistItem(origin_map["title"].toString());
+ CreatePlaylistItem(json_origin["title"].toString());
activities << playlist_item;
- RetrievePlaylist(origin_map["id"].toInt(), playlist_item);
+ RetrievePlaylist(json_origin["id"].toInt(), playlist_item);
}
}
return activities;
}
-SongList SoundCloudService::ExtractSongs(const QVariant& result) {
+SongList SoundCloudService::ExtractSongs(const QJsonArray & result) {
SongList songs;
- QVariantList q_variant_list = result.toList();
- for (const QVariant& q : q_variant_list) {
- Song song = ExtractSong(q.toMap());
+ for (const QJsonValue& q : result) {
+ Song song = ExtractSong(q.toObject());
if (song.is_valid()) {
songs << song;
}
@@ -468,14 +472,16 @@ SongList SoundCloudService::ExtractSongs(const QVariant& result) {
return songs;
}
-Song SoundCloudService::ExtractSong(const QVariantMap& result_song) {
+Song SoundCloudService::ExtractSong(const QJsonObject& result_song) {
Song song;
if (!result_song.isEmpty() && result_song["streamable"].toBool()) {
- QUrl stream_url = result_song["stream_url"].toUrl();
- stream_url.addQueryItem("client_id", kApiClientId);
+ QUrl stream_url(result_song["stream_url"].toString());
+ QUrlQuery stream_url_query;
+ stream_url_query.addQueryItem("client_id", kApiClientId);
+ stream_url.setQuery(stream_url_query);
song.set_url(stream_url);
- QString username = result_song["user"].toMap()["username"].toString();
+ QString username = result_song["user"].toObject()["username"].toString();
// We don't have a real artist name, but username is the most similar thing
// we have
song.set_artist(username);
@@ -486,7 +492,7 @@ Song SoundCloudService::ExtractSong(const QVariantMap& result_song) {
QString genre = result_song["genre"].toString();
song.set_genre(genre);
- float bpm = result_song["bpm"].toFloat();
+ float bpm = result_song["bpm"].toDouble();
song.set_bpm(bpm);
QVariant cover = result_song["artwork_url"];
diff --git a/src/internet/soundcloud/soundcloudservice.h b/src/internet/soundcloud/soundcloudservice.h
index a806204b4..0063a291f 100644
--- a/src/internet/soundcloud/soundcloudservice.h
+++ b/src/internet/soundcloud/soundcloudservice.h
@@ -26,6 +26,7 @@
class NetworkAccessManager;
class OAuthenticator;
class SearchBoxWidget;
+class QJsonDocument;
class QMenu;
class QNetworkReply;
@@ -101,11 +102,11 @@ class SoundCloudService : public InternetService {
QNetworkReply* CreateRequest(const QString& ressource_name,
const QList>& params);
// Convenient function for extracting result from reply
- QVariant ExtractResult(QNetworkReply* reply);
+ QJsonDocument ExtractResult(QNetworkReply* reply);
// Returns items directly, as activities can be playlists or songs
- QList ExtractActivities(const QVariant& result);
- SongList ExtractSongs(const QVariant& result);
- Song ExtractSong(const QVariantMap& result_song);
+ QList ExtractActivities(const QJsonObject &result);
+ SongList ExtractSongs(const QJsonArray &result);
+ Song ExtractSong(const QJsonObject& result_song);
QStandardItem* root_;
QStandardItem* search_;
diff --git a/src/internet/subsonic/subsonicservice.cpp b/src/internet/subsonic/subsonicservice.cpp
index 91dc18eae..a55de21ef 100644
--- a/src/internet/subsonic/subsonicservice.cpp
+++ b/src/internet/subsonic/subsonicservice.cpp
@@ -29,6 +29,7 @@
#include
#include
#include
+#include
#include "core/application.h"
#include "core/closure.h"
@@ -209,10 +210,12 @@ void SubsonicService::Ping() {
QUrl SubsonicService::BuildRequestUrl(const QString& view) const {
QUrl url(working_server_ + "/rest/" + view + ".view");
- url.addQueryItem("v", kApiVersion);
- url.addQueryItem("c", kApiClientName);
- url.addQueryItem("u", username_);
- url.addQueryItem("p", QString("enc:" + password_.toUtf8().toHex()));
+ QUrlQuery url_query;
+ url_query.addQueryItem("v", kApiVersion);
+ url_query.addQueryItem("c", kApiClientName);
+ url_query.addQueryItem("u", username_);
+ url_query.addQueryItem("p", QString("enc:" + password_.toUtf8().toHex()));
+ url.setQuery(url_query);
return url;
}
@@ -496,9 +499,11 @@ void SubsonicLibraryScanner::OnGetAlbumFinished(QNetworkReply* reply) {
void SubsonicLibraryScanner::GetAlbumList(int offset) {
QUrl url = service_->BuildRequestUrl("getAlbumList2");
- url.addQueryItem("type", "alphabeticalByName");
- url.addQueryItem("size", QString::number(kAlbumChunkSize));
- url.addQueryItem("offset", QString::number(offset));
+ QUrlQuery url_query;
+ url_query.addQueryItem("type", "alphabeticalByName");
+ url_query.addQueryItem("size", QString::number(kAlbumChunkSize));
+ url_query.addQueryItem("offset", QString::number(offset));
+ url.setQuery(url_query);
QNetworkReply* reply = service_->Send(url);
NewClosure(reply, SIGNAL(finished()), this,
SLOT(OnGetAlbumListFinished(QNetworkReply*, int)), reply, offset);
@@ -506,7 +511,9 @@ void SubsonicLibraryScanner::GetAlbumList(int offset) {
void SubsonicLibraryScanner::GetAlbum(const QString& id) {
QUrl url = service_->BuildRequestUrl("getAlbum");
- url.addQueryItem("id", id);
+ QUrlQuery url_query;
+ url_query.addQueryItem("id", id);
+ url.setQuery(url_query);
QNetworkReply* reply = service_->Send(url);
NewClosure(reply, SIGNAL(finished()), this,
SLOT(OnGetAlbumFinished(QNetworkReply*)), reply);
diff --git a/src/internet/subsonic/subsonicurlhandler.cpp b/src/internet/subsonic/subsonicurlhandler.cpp
index d133f291c..a9dcbda4a 100644
--- a/src/internet/subsonic/subsonicurlhandler.cpp
+++ b/src/internet/subsonic/subsonicurlhandler.cpp
@@ -17,6 +17,8 @@
along with Clementine. If not, see .
*/
+#include
+
#include "subsonicservice.h"
#include "subsonicurlhandler.h"
@@ -29,6 +31,8 @@ UrlHandler::LoadResult SubsonicUrlHandler::StartLoading(const QUrl& url) {
return LoadResult();
QUrl newurl = service_->BuildRequestUrl("stream");
- newurl.addQueryItem("id", url.host());
+ QUrlQuery url_query;
+ url_query.addQueryItem("id", url.host());
+ newurl.setQuery(url_query);
return LoadResult(url, LoadResult::TrackAvailable, newurl);
}
diff --git a/src/library/librarybackend.cpp b/src/library/librarybackend.cpp
index 7efe0ee9b..0966346a5 100644
--- a/src/library/librarybackend.cpp
+++ b/src/library/librarybackend.cpp
@@ -111,8 +111,8 @@ void LibraryBackend::ChangeDirPath(int id, const QString& old_path,
ScopedTransaction t(&db);
// Do the dirs table
- QSqlQuery q(
- QString("UPDATE %1 SET path=:path WHERE ROWID=:id").arg(dirs_table_), db);
+ QSqlQuery q(db);
+ q.prepare(QString("UPDATE %1 SET path=:path WHERE ROWID=:id").arg(dirs_table_));
q.bindValue(":path", new_path);
q.bindValue(":id", id);
q.exec();
@@ -124,24 +124,24 @@ void LibraryBackend::ChangeDirPath(int id, const QString& old_path,
const int path_len = old_url.length();
// Do the subdirs table
- q = QSqlQuery(QString(
+ q = QSqlQuery(db);
+ q.prepare(QString(
"UPDATE %1 SET path=:path || substr(path, %2)"
" WHERE directory=:id")
.arg(subdirs_table_)
- .arg(path_len),
- db);
+ .arg(path_len));
q.bindValue(":path", new_url);
q.bindValue(":id", id);
q.exec();
if (db_->CheckErrors(q)) return;
// Do the songs table
- q = QSqlQuery(QString(
+ q = QSqlQuery(db);
+ q.prepare(QString(
"UPDATE %1 SET filename=:path || substr(filename, %2)"
" WHERE directory=:id")
.arg(songs_table_)
- .arg(path_len),
- db);
+ .arg(path_len));
q.bindValue(":path", new_url);
q.bindValue(":id", id);
q.exec();
@@ -156,7 +156,8 @@ DirectoryList LibraryBackend::GetAllDirectories() {
DirectoryList ret;
- QSqlQuery q(QString("SELECT ROWID, path FROM %1").arg(dirs_table_), db);
+ QSqlQuery q(db);
+ q.prepare(QString("SELECT ROWID, path FROM %1").arg(dirs_table_));
q.exec();
if (db_->CheckErrors(q)) return ret;
@@ -177,10 +178,10 @@ SubdirectoryList LibraryBackend::SubdirsInDirectory(int id) {
}
SubdirectoryList LibraryBackend::SubdirsInDirectory(int id, QSqlDatabase& db) {
- QSqlQuery q(QString(
+ QSqlQuery q(db);
+ q.prepare(QString(
"SELECT path, mtime FROM %1"
- " WHERE directory = :dir").arg(subdirs_table_),
- db);
+ " WHERE directory = :dir").arg(subdirs_table_));
q.bindValue(":dir", id);
q.exec();
if (db_->CheckErrors(q)) return SubdirectoryList();
@@ -201,9 +202,9 @@ void LibraryBackend::UpdateTotalSongCount() {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery q(QString("SELECT COUNT(*) FROM %1 WHERE unavailable = 0")
- .arg(songs_table_),
- db);
+ QSqlQuery q(db);
+ q.prepare(QString("SELECT COUNT(*) FROM %1 WHERE unavailable = 0")
+ .arg(songs_table_));
q.exec();
if (db_->CheckErrors(q)) return;
if (!q.next()) return;
@@ -225,10 +226,10 @@ void LibraryBackend::AddDirectory(const QString& path) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery q(QString(
+ QSqlQuery q(db);
+ q.prepare(QString(
"INSERT INTO %1 (path, subdirs)"
- " VALUES (:path, 1)").arg(dirs_table_),
- db);
+ " VALUES (:path, 1)").arg(dirs_table_));
q.bindValue(":path", db_path);
q.exec();
if (db_->CheckErrors(q)) return;
@@ -250,15 +251,15 @@ void LibraryBackend::RemoveDirectory(const Directory& dir) {
ScopedTransaction transaction(&db);
// Delete the subdirs that were in this directory
- QSqlQuery q(
- QString("DELETE FROM %1 WHERE directory = :id").arg(subdirs_table_), db);
+ QSqlQuery q(db);
+ q.prepare(QString("DELETE FROM %1 WHERE directory = :id").arg(subdirs_table_));
q.bindValue(":id", dir.id);
q.exec();
if (db_->CheckErrors(q)) return;
// Now remove the directory itself
- q = QSqlQuery(QString("DELETE FROM %1 WHERE ROWID = :id").arg(dirs_table_),
- db);
+ q = QSqlQuery(db);
+ q.prepare(QString("DELETE FROM %1 WHERE ROWID = :id").arg(dirs_table_));
q.bindValue(":id", dir.id);
q.exec();
if (db_->CheckErrors(q)) return;
@@ -272,10 +273,10 @@ SongList LibraryBackend::FindSongsInDirectory(int id) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery q(
+ QSqlQuery q(db);
+ q.prepare(
QString("SELECT ROWID, " + Song::kColumnSpec +
- " FROM %1 WHERE directory = :directory").arg(songs_table_),
- db);
+ " FROM %1 WHERE directory = :directory").arg(songs_table_));
q.bindValue(":directory", id);
q.exec();
if (db_->CheckErrors(q)) return SongList();
@@ -292,25 +293,22 @@ SongList LibraryBackend::FindSongsInDirectory(int id) {
void LibraryBackend::AddOrUpdateSubdirs(const SubdirectoryList& subdirs) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery find_query(
- QString(
+ QSqlQuery find_query(db);
+ find_query.prepare(QString(
"SELECT ROWID FROM %1"
- " WHERE directory = :id AND path = :path").arg(subdirs_table_),
- db);
- QSqlQuery add_query(QString(
+ " WHERE directory = :id AND path = :path").arg(subdirs_table_));
+ QSqlQuery add_query(db);
+ add_query.prepare(QString(
"INSERT INTO %1 (directory, path, mtime)"
- " VALUES (:id, :path, :mtime)").arg(subdirs_table_),
- db);
- QSqlQuery update_query(
- QString(
+ " VALUES (:id, :path, :mtime)").arg(subdirs_table_));
+ QSqlQuery update_query(db);
+ update_query.prepare(QString(
"UPDATE %1 SET mtime = :mtime"
- " WHERE directory = :id AND path = :path").arg(subdirs_table_),
- db);
- QSqlQuery delete_query(
- QString(
+ " WHERE directory = :id AND path = :path").arg(subdirs_table_));
+ QSqlQuery delete_query(db);
+ delete_query.prepare(QString(
"DELETE FROM %1"
- " WHERE directory = :id AND path = :path").arg(subdirs_table_),
- db);
+ " WHERE directory = :id AND path = :path").arg(subdirs_table_));
ScopedTransaction transaction(&db);
for (const Subdirectory& subdir : subdirs) {
@@ -349,25 +347,24 @@ void LibraryBackend::AddOrUpdateSongs(const SongList& songs) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery check_dir(
- QString("SELECT ROWID FROM %1 WHERE ROWID = :id").arg(dirs_table_), db);
- QSqlQuery add_song(QString("INSERT INTO %1 (" + Song::kColumnSpec +
+ QSqlQuery check_dir(db);
+ check_dir.prepare(QString("SELECT ROWID FROM %1 WHERE ROWID = :id").arg(dirs_table_));
+ QSqlQuery add_song(db);
+ add_song.prepare(QString("INSERT INTO %1 (" + Song::kColumnSpec +
")"
" VALUES (" +
- Song::kBindSpec + ")").arg(songs_table_),
- db);
- QSqlQuery update_song(QString("UPDATE %1 SET " + Song::kUpdateSpec +
- " WHERE ROWID = :id").arg(songs_table_),
- db);
- QSqlQuery add_song_fts(
- QString("INSERT INTO %1 (ROWID, " + Song::kFtsColumnSpec +
+ Song::kBindSpec + ")").arg(songs_table_));
+ QSqlQuery update_song(db);
+ update_song.prepare(QString("UPDATE %1 SET " + Song::kUpdateSpec +
+ " WHERE ROWID = :id").arg(songs_table_));
+ QSqlQuery add_song_fts(db);
+ add_song_fts.prepare(QString("INSERT INTO %1 (ROWID, " + Song::kFtsColumnSpec +
")"
" VALUES (:id, " +
- Song::kFtsBindSpec + ")").arg(fts_table_),
- db);
- QSqlQuery update_song_fts(QString("UPDATE %1 SET " + Song::kFtsUpdateSpec +
- " WHERE ROWID = :id").arg(fts_table_),
- db);
+ Song::kFtsBindSpec + ")").arg(fts_table_));
+ QSqlQuery update_song_fts(db);
+ update_song_fts.prepare(QString("UPDATE %1 SET " + Song::kFtsUpdateSpec +
+ " WHERE ROWID = :id").arg(fts_table_));
ScopedTransaction transaction(&db);
@@ -440,9 +437,9 @@ void LibraryBackend::UpdateMTimesOnly(const SongList& songs) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery q(QString("UPDATE %1 SET mtime = :mtime WHERE ROWID = :id")
- .arg(songs_table_),
- db);
+ QSqlQuery q(db);
+ q.prepare(QString("UPDATE %1 SET mtime = :mtime WHERE ROWID = :id")
+ .arg(songs_table_));
ScopedTransaction transaction(&db);
for (const Song& song : songs) {
@@ -458,10 +455,10 @@ void LibraryBackend::DeleteSongs(const SongList& songs) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery remove(
- QString("DELETE FROM %1 WHERE ROWID = :id").arg(songs_table_), db);
- QSqlQuery remove_fts(
- QString("DELETE FROM %1 WHERE ROWID = :id").arg(fts_table_), db);
+ QSqlQuery remove(db);
+ remove.prepare(QString("DELETE FROM %1 WHERE ROWID = :id").arg(songs_table_));
+ QSqlQuery remove_fts(db);
+ remove_fts.prepare(QString("DELETE FROM %1 WHERE ROWID = :id").arg(fts_table_));
ScopedTransaction transaction(&db);
for (const Song& song : songs) {
@@ -485,10 +482,10 @@ void LibraryBackend::MarkSongsUnavailable(const SongList& songs,
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery remove(QString("UPDATE %1 SET unavailable = %2 WHERE ROWID = :id")
+ QSqlQuery remove(db);
+ remove.prepare(QString("UPDATE %1 SET unavailable = %2 WHERE ROWID = :id")
.arg(songs_table_)
- .arg(int(unavailable)),
- db);
+ .arg(int(unavailable)));
ScopedTransaction transaction(&db);
for (const Song& song : songs) {
@@ -612,14 +609,14 @@ SongList LibraryBackend::GetSongsByForeignId(const QStringList& ids,
QString in = ids.join(",");
- QSqlQuery q(
- QString(
+ QSqlQuery q(db);
+ q.prepare(
+ QString(
"SELECT %2.ROWID, " + Song::kColumnSpec +
", %2.%3"
" FROM %2, %1"
" WHERE %2.%3 IN (%4) AND %1.ROWID = %2.ROWID AND unavailable = 0")
- .arg(songs_table_, table, column, in),
- db);
+ .arg(songs_table_, table, column, in));
q.exec();
if (db_->CheckErrors(q)) return SongList();
@@ -644,10 +641,10 @@ SongList LibraryBackend::GetSongsById(const QStringList& ids,
QSqlDatabase& db) {
QString in = ids.join(",");
- QSqlQuery q(QString("SELECT ROWID, " + Song::kColumnSpec +
+ QSqlQuery q(db);
+ q.prepare(QString("SELECT ROWID, " + Song::kColumnSpec +
" FROM %1"
- " WHERE ROWID IN (%2)").arg(songs_table_, in),
- db);
+ " WHERE ROWID IN (%2)").arg(songs_table_, in));
q.exec();
if (db_->CheckErrors(q)) return SongList();
@@ -722,11 +719,11 @@ void LibraryBackend::UpdateCompilations() {
// in the same
// directory
- QSqlQuery q(
+ QSqlQuery q(db);
+ q.prepare(
QString(
"SELECT effective_albumartist, album, filename, sampler "
- "FROM %1 WHERE unavailable = 0 ORDER BY album").arg(songs_table_),
- db);
+ "FROM %1 WHERE unavailable = 0 ORDER BY album").arg(songs_table_));
q.exec();
if (db_->CheckErrors(q)) return;
@@ -754,21 +751,21 @@ void LibraryBackend::UpdateCompilations() {
}
// Now mark the songs that we think are in compilations
- QSqlQuery update(
+ QSqlQuery update(db);
+ update.prepare(
QString(
"UPDATE %1"
" SET sampler = :sampler,"
" effective_compilation = ((compilation OR :sampler OR "
"forced_compilation_on) AND NOT forced_compilation_off) + 0"
- " WHERE album = :album AND unavailable = 0").arg(songs_table_),
- db);
- QSqlQuery find_songs(
+ " WHERE album = :album AND unavailable = 0").arg(songs_table_));
+ QSqlQuery find_songs(db);
+ find_songs.prepare(
QString(
"SELECT ROWID, " + Song::kColumnSpec +
" FROM %1"
" WHERE album = :album AND sampler = :sampler AND unavailable = 0")
- .arg(songs_table_),
- db);
+ .arg(songs_table_));
SongList deleted_songs;
SongList added_songs;
@@ -932,7 +929,8 @@ void LibraryBackend::UpdateManualAlbumArt(const QString& artist,
" WHERE album = :album AND unavailable = 0").arg(songs_table_));
if (!artist.isNull()) sql += " AND artist = :artist";
- QSqlQuery q(sql, db);
+ QSqlQuery q(db);
+ q.prepare(sql);
q.bindValue(":art", art);
q.bindValue(":album", album);
if (!artist.isNull()) q.bindValue(":artist", artist);
@@ -987,7 +985,8 @@ void LibraryBackend::ForceCompilation(const QString& album,
" WHERE album = :album AND unavailable = 0").arg(songs_table_));
if (!artist.isEmpty()) sql += " AND artist = :artist";
- QSqlQuery q(sql, db);
+ QSqlQuery q(db);
+ q.prepare(sql);
q.bindValue(":forced_compilation_on", on ? 1 : 0);
q.bindValue(":forced_compilation_off", on ? 0 : 1);
q.bindValue(":album", album);
@@ -1025,7 +1024,8 @@ SongList LibraryBackend::FindSongs(const smart_playlists::Search& search) {
// Run the query
SongList ret;
- QSqlQuery query(sql, db);
+ QSqlQuery query(db);
+ query.prepare(sql);
query.exec();
if (db_->CheckErrors(query)) return ret;
@@ -1052,13 +1052,13 @@ void LibraryBackend::IncrementPlayCount(int id) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery q(QString(
+ QSqlQuery q(db);
+ q.prepare(QString(
"UPDATE %1 SET playcount = playcount + 1,"
" lastplayed = :now,"
" score = " +
QString(kNewScoreSql).arg("1.0") +
- " WHERE ROWID = :id").arg(songs_table_),
- db);
+ " WHERE ROWID = :id").arg(songs_table_));
q.bindValue(":now", QDateTime::currentDateTime().toTime_t());
q.bindValue(":id", id);
q.exec();
@@ -1075,12 +1075,12 @@ void LibraryBackend::IncrementSkipCount(int id, float progress) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery q(QString(
+ QSqlQuery q(db);
+ q.prepare(QString(
"UPDATE %1 SET skipcount = skipcount + 1,"
" score = " +
QString(kNewScoreSql).arg(progress) +
- " WHERE ROWID = :id").arg(songs_table_),
- db);
+ " WHERE ROWID = :id").arg(songs_table_));
q.bindValue(":id", id);
q.exec();
if (db_->CheckErrors(q)) return;
@@ -1095,11 +1095,11 @@ void LibraryBackend::ResetStatistics(int id) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery q(QString(
+ QSqlQuery q(db);
+ q.prepare(QString(
"UPDATE %1 SET playcount = 0, skipcount = 0,"
" lastplayed = -1, score = 0"
- " WHERE ROWID = :id").arg(songs_table_),
- db);
+ " WHERE ROWID = :id").arg(songs_table_));
q.bindValue(":id", id);
q.exec();
if (db_->CheckErrors(q)) return;
@@ -1128,10 +1128,10 @@ void LibraryBackend::UpdateSongsRating(const QList& id_list,
id_str_list << QString::number(i);
}
QString ids = id_str_list.join(",");
- QSqlQuery q(QString(
+ QSqlQuery q(db);
+ q.prepare(QString(
"UPDATE %1 SET rating = :rating"
- " WHERE ROWID IN (%2)").arg(songs_table_, ids),
- db);
+ " WHERE ROWID IN (%2)").arg(songs_table_, ids));
q.bindValue(":rating", rating);
q.exec();
if (db_->CheckErrors(q)) return;
diff --git a/src/library/librarymodel.cpp b/src/library/librarymodel.cpp
index 9d5e1e39f..73c92e228 100644
--- a/src/library/librarymodel.cpp
+++ b/src/library/librarymodel.cpp
@@ -151,7 +151,8 @@ void LibraryModel::Init(bool async) {
new LibraryItem(LibraryItem::Type_LoadingIndicator, root_);
loading->display_text = tr("Loading...");
loading->lazy_loaded = true;
- reset();
+ beginResetModel();
+ endResetModel();
// Show a loading indicator in the status bar too.
init_task_id_ = app_->task_manager()->StartTask(tr("Loading songs"));
diff --git a/src/library/libraryquery.cpp b/src/library/libraryquery.cpp
index 02177bf42..dd7bdc634 100644
--- a/src/library/libraryquery.cpp
+++ b/src/library/libraryquery.cpp
@@ -166,7 +166,8 @@ QSqlQuery LibraryQuery::Exec(QSqlDatabase db, const QString& songs_table,
sql.replace("%fts_table_noprefix", fts_table.section('.', -1, -1));
sql.replace("%fts_table", fts_table);
- query_ = QSqlQuery(sql, db);
+ query_ = QSqlQuery(db);
+ query_.prepare(sql);
// Bind values
for (const QVariant& value : bound_values_) {
diff --git a/src/main.cpp b/src/main.cpp
index eee7bbef2..4a90b0951 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -69,14 +69,14 @@
#include "tagreadermessages.pb.h"
-#include "qtsingleapplication.h"
-#include "qtsinglecoreapplication.h"
+#include "singleapplication.h"
+#include "singlecoreapplication.h"
#include
#include
#include
-#include
+#include
#ifdef HAVE_SPOTIFY_DOWNLOADER
#include
@@ -109,28 +109,18 @@ const QDBusArgument& operator>>(const QDBusArgument& arg, QImage& image);
// Load sqlite plugin on windows and mac.
#include
-Q_IMPORT_PLUGIN(qsqlite)
+Q_IMPORT_PLUGIN(QSQLiteDriverPlugin)
namespace {
void LoadTranslation(const QString& prefix, const QString& path,
const QString& language) {
-#if QT_VERSION < 0x040700
- // QTranslator::load will try to open and read "clementine" if it exists,
- // without checking if it's a file first.
- // This was fixed in Qt 4.7
- QFileInfo maybe_clementine_directory(path + "/clementine");
- if (maybe_clementine_directory.exists() &&
- !maybe_clementine_directory.isFile())
- return;
-#endif
QTranslator* t = new PoTranslator;
if (t->load(prefix + "_" + language, path))
QCoreApplication::installTranslator(t);
else
delete t;
- QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
}
void IncreaseFDLimit() {
@@ -272,10 +262,10 @@ int main(int argc, char* argv[]) {
}
#endif
- QCoreApplication::setApplicationName("Clementine");
+ QCoreApplication::setApplicationName("Clementine-qt5");
QCoreApplication::setApplicationVersion(CLEMENTINE_VERSION_DISPLAY);
- QCoreApplication::setOrganizationName("Clementine");
- QCoreApplication::setOrganizationDomain("clementine-player.org");
+ QCoreApplication::setOrganizationName("Clementine-qt5");
+ QCoreApplication::setOrganizationDomain("clementine-player-qt5.org");
// This makes us show up nicely in gnome-volume-control
#if !GLIB_CHECK_VERSION(2, 36, 0)
@@ -298,7 +288,7 @@ int main(int argc, char* argv[]) {
// Clementine running without needing an X server.
// This MUST be done before parsing the commandline options so QTextCodec
// gets the right system locale for filenames.
- QtSingleCoreApplication a(argc, argv);
+ SingleCoreApplication a(argc, argv);
CheckPortable();
crash_reporting.SetApplicationPath(a.applicationFilePath());
@@ -307,16 +297,6 @@ int main(int argc, char* argv[]) {
if (!options.Parse()) return 1;
logging::SetLevels(options.log_levels());
- if (a.isRunning()) {
- if (options.is_empty()) {
- qLog(Info)
- << "Clementine is already running - activating existing window";
- }
- if (a.sendMessage(options.Serialize(), 5000)) {
- return 0;
- }
- // Couldn't send the message so start anyway
- }
}
#ifdef Q_OS_DARWIN
@@ -335,7 +315,7 @@ int main(int argc, char* argv[]) {
// Output the version, so when people attach log output to bug reports they
// don't have to tell us which version they're using.
- qLog(Info) << "Clementine" << CLEMENTINE_VERSION_DISPLAY;
+ qLog(Info) << "Clementine-qt5" << CLEMENTINE_VERSION_DISPLAY;
// Seed the random number generators.
time_t t = time(nullptr);
@@ -344,7 +324,7 @@ int main(int argc, char* argv[]) {
IncreaseFDLimit();
- QtSingleApplication a(argc, argv);
+ SingleApplication a(argc, argv);
// A bug in Qt means the wheel_scroll_lines setting gets ignored and replaced
// with the default value of 3 in QApplicationPrivate::initialize.
@@ -363,11 +343,6 @@ int main(int argc, char* argv[]) {
a.setQuitOnLastWindowClosed(false);
- // Do this check again because another instance might have started by now
- if (a.isRunning() && a.sendMessage(options.Serialize(), 5000)) {
- return 0;
- }
-
#ifndef Q_OS_DARWIN
// Gnome on Ubuntu has menu icons disabled by default. I think that's a bad
// idea, and makes some menus in Clementine look confusing.
@@ -491,10 +466,8 @@ int main(int argc, char* argv[]) {
#ifdef HAVE_DBUS
QObject::connect(&mpris, SIGNAL(RaiseMainWindow()), &w, SLOT(Raise()));
#endif
- QObject::connect(&a, SIGNAL(messageReceived(QByteArray)), &w,
- SLOT(CommandlineOptionsReceived(QByteArray)));
- w.CommandlineOptionsReceived(options);
+ w.CommandlineOptionsReceived(options);
int ret = a.exec();
#ifdef Q_OS_LINUX
diff --git a/src/musicbrainz/acoustidclient.cpp b/src/musicbrainz/acoustidclient.cpp
index ba29dc060..9f92ec8c6 100644
--- a/src/musicbrainz/acoustidclient.cpp
+++ b/src/musicbrainz/acoustidclient.cpp
@@ -20,8 +20,11 @@
#include
#include
#include
-
-#include
+#include
+#include
+#include
+#include
+#include
#include "core/closure.h"
#include "core/logging.h"
@@ -50,7 +53,9 @@ void AcoustidClient::Start(int id, const QString& fingerprint,
<< Param("fingerprint", fingerprint);
QUrl url(kUrl);
- url.setQueryItems(parameters);
+ QUrlQuery url_query;
+ url_query.setQueryItems(parameters);
+ url.setQuery(url_query);
QNetworkRequest req(url);
QNetworkReply* reply = network_->get(req);
@@ -94,15 +99,17 @@ void AcoustidClient::RequestFinished(QNetworkReply* reply, int request_id) {
return;
}
- QJson::Parser parser;
- bool ok = false;
- QVariantMap result = parser.parse(reply, &ok).toMap();
- if (!ok) {
+ QJsonParseError error;
+ QJsonDocument json_document = QJsonDocument::fromJson(reply->readAll(), &error);
+
+ if (error.error != QJsonParseError::NoError) {
emit Finished(request_id, QStringList());
return;
}
- QString status = result["status"].toString();
+ QJsonObject json_object = json_document.object();
+
+ QString status = json_object["status"].toString();
if (status != "ok") {
emit Finished(request_id, QStringList());
return;
@@ -113,18 +120,18 @@ void AcoustidClient::RequestFinished(QNetworkReply* reply, int request_id) {
// -then sort results by number of sources (the results are originally
// unsorted but results with more sources are likely to be more accurate)
// -keep only the ids, as sources where useful only to sort the results
- QVariantList results = result["results"].toList();
+ QJsonArray json_results = json_object["results"].toArray();
// List of pairs
QList id_source_list;
- for (const QVariant& v : results) {
- QVariantMap r = v.toMap();
- if (r.contains("recordings")) {
- QVariantList recordings = r["recordings"].toList();
- for (const QVariant& recording : recordings) {
- QVariantMap o = recording.toMap();
- if (o.contains("id")) {
+ for (const QJsonValue& v : json_results) {
+ QJsonObject r = v.toObject();
+ if (!r["recordings"].isUndefined()) {
+ QJsonArray json_recordings = r["recordings"].toArray();
+ for (const QJsonValue& recording : json_recordings) {
+ QJsonObject o = recording.toObject();
+ if (!o["id"].isUndefined()) {
id_source_list << IdSource(o["id"].toString(), o["sources"].toInt());
}
}
diff --git a/src/musicbrainz/chromaprinter.cpp b/src/musicbrainz/chromaprinter.cpp
index 212075835..dbb3ef0f0 100644
--- a/src/musicbrainz/chromaprinter.cpp
+++ b/src/musicbrainz/chromaprinter.cpp
@@ -44,7 +44,7 @@ Chromaprinter::~Chromaprinter() {}
GstElement* Chromaprinter::CreateElement(const QString& factory_name,
GstElement* bin) {
GstElement* ret = gst_element_factory_make(
- factory_name.toAscii().constData(), factory_name.toAscii().constData());
+ factory_name.toLatin1().constData(), factory_name.toLatin1().constData());
if (ret && bin) gst_bin_add(GST_BIN(bin), ret);
diff --git a/src/musicbrainz/musicbrainzclient.cpp b/src/musicbrainz/musicbrainzclient.cpp
index 576af44d8..79c056827 100644
--- a/src/musicbrainz/musicbrainzclient.cpp
+++ b/src/musicbrainz/musicbrainzclient.cpp
@@ -21,6 +21,7 @@
#include
#include
#include
+#include
#include "core/closure.h"
#include "core/logging.h"
@@ -50,7 +51,9 @@ void MusicBrainzClient::Start(int id, const QStringList& mbid_list) {
parameters << Param("inc", "artists+releases+media");
QUrl url(kTrackUrl + mbid);
- url.setQueryItems(parameters);
+ QUrlQuery url_query;
+ url_query.setQueryItems(parameters);
+ url.setQuery(url_query);
QNetworkRequest req(url);
QNetworkReply* reply = network_->get(req);
@@ -74,7 +77,9 @@ void MusicBrainzClient::StartDiscIdRequest(const QString& discid) {
parameters << Param("inc", "artists+recordings");
QUrl url(kDiscUrl + discid);
- url.setQueryItems(parameters);
+ QUrlQuery url_query;
+ url_query.setQueryItems(parameters);
+ url.setQuery(url_query);
QNetworkRequest req(url);
QNetworkReply* reply = network_->get(req);
diff --git a/src/networkremote/outgoingdatacreator.cpp b/src/networkremote/outgoingdatacreator.cpp
index 55ec7c114..e65e8a529 100644
--- a/src/networkremote/outgoingdatacreator.cpp
+++ b/src/networkremote/outgoingdatacreator.cpp
@@ -180,7 +180,7 @@ void OutgoingDataCreator::SendClementineInfo() {
QString version =
QString("%1 %2").arg(QCoreApplication::applicationName(),
QCoreApplication::applicationVersion());
- info->set_version(version.toAscii());
+ info->set_version(version.toLatin1());
SendDataToClients(&msg);
}
diff --git a/src/playlist/playlistbackend.cpp b/src/playlist/playlistbackend.cpp
index d8f3d3fd7..bb5d065a5 100644
--- a/src/playlist/playlistbackend.cpp
+++ b/src/playlist/playlistbackend.cpp
@@ -78,14 +78,13 @@ PlaylistBackend::PlaylistList PlaylistBackend::GetPlaylists(
condition = " WHERE " + condition_list.join(" OR ");
}
- QSqlQuery q(
- "SELECT ROWID, name, last_played, dynamic_playlist_type,"
+ QSqlQuery q(db);
+ q.prepare("SELECT ROWID, name, last_played, dynamic_playlist_type,"
" dynamic_playlist_data, dynamic_playlist_backend,"
" special_type, ui_path, is_favorite"
" FROM playlists"
" " +
- condition + " ORDER BY ui_order",
- db);
+ condition + " ORDER BY ui_order");
q.exec();
if (db_->CheckErrors(q)) return ret;
@@ -110,13 +109,12 @@ PlaylistBackend::Playlist PlaylistBackend::GetPlaylist(int id) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery q(
- "SELECT ROWID, name, last_played, dynamic_playlist_type,"
+ QSqlQuery q(db);
+ q.prepare("SELECT ROWID, name, last_played, dynamic_playlist_type,"
" dynamic_playlist_data, dynamic_playlist_backend,"
" special_type, ui_path, is_favorite"
" FROM playlists"
- " WHERE ROWID=:id",
- db);
+ " WHERE ROWID=:id");
q.bindValue(":id", id);
q.exec();
if (db_->CheckErrors(q)) return Playlist();
@@ -293,23 +291,22 @@ void PlaylistBackend::SavePlaylist(int playlist, const PlaylistItemList& items,
qLog(Debug) << "Saving playlist" << playlist;
- QSqlQuery clear("DELETE FROM playlist_items WHERE playlist = :playlist", db);
- QSqlQuery insert(
- "INSERT INTO playlist_items"
+ QSqlQuery clear(db);
+ clear.prepare("DELETE FROM playlist_items WHERE playlist = :playlist");
+ QSqlQuery insert(db);
+ insert.prepare("INSERT INTO playlist_items"
" (playlist, type, library_id, radio_service, " +
Song::kColumnSpec +
")"
" VALUES (:playlist, :type, :library_id, :radio_service, " +
- Song::kBindSpec + ")",
- db);
- QSqlQuery update(
- "UPDATE playlists SET "
+ Song::kBindSpec + ")");
+ QSqlQuery update(db);
+ update.prepare("UPDATE playlists SET "
" last_played=:last_played,"
" dynamic_playlist_type=:dynamic_type,"
" dynamic_playlist_data=:dynamic_data,"
" dynamic_playlist_backend=:dynamic_backend"
- " WHERE ROWID=:playlist",
- db);
+ " WHERE ROWID=:playlist");
ScopedTransaction transaction(&db);
@@ -350,10 +347,10 @@ int PlaylistBackend::CreatePlaylist(const QString& name,
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery q(
+ QSqlQuery q(db);
+ q.prepare(
"INSERT INTO playlists (name, special_type)"
- " VALUES (:name, :special_type)",
- db);
+ " VALUES (:name, :special_type)");
q.bindValue(":name", name);
q.bindValue(":special_type", special_type);
q.exec();
@@ -365,8 +362,10 @@ int PlaylistBackend::CreatePlaylist(const QString& name,
void PlaylistBackend::RemovePlaylist(int id) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery delete_playlist("DELETE FROM playlists WHERE ROWID=:id", db);
- QSqlQuery delete_items("DELETE FROM playlist_items WHERE playlist=:id", db);
+ QSqlQuery delete_playlist(db);
+ delete_playlist.prepare("DELETE FROM playlists WHERE ROWID=:id");
+ QSqlQuery delete_items(db);
+ delete_items.prepare("DELETE FROM playlist_items WHERE playlist=:id");
delete_playlist.bindValue(":id", id);
delete_items.bindValue(":id", id);
@@ -385,7 +384,8 @@ void PlaylistBackend::RemovePlaylist(int id) {
void PlaylistBackend::RenamePlaylist(int id, const QString& new_name) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery q("UPDATE playlists SET name=:name WHERE ROWID=:id", db);
+ QSqlQuery q(db);
+ q.prepare("UPDATE playlists SET name=:name WHERE ROWID=:id");
q.bindValue(":name", new_name);
q.bindValue(":id", id);
@@ -396,8 +396,8 @@ void PlaylistBackend::RenamePlaylist(int id, const QString& new_name) {
void PlaylistBackend::FavoritePlaylist(int id, bool is_favorite) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery q("UPDATE playlists SET is_favorite=:is_favorite WHERE ROWID=:id",
- db);
+ QSqlQuery q(db);
+ q.prepare("UPDATE playlists SET is_favorite=:is_favorite WHERE ROWID=:id");
q.bindValue(":is_favorite", is_favorite ? 1 : 0);
q.bindValue(":id", id);
@@ -410,11 +410,12 @@ void PlaylistBackend::SetPlaylistOrder(const QList& ids) {
QSqlDatabase db(db_->Connect());
ScopedTransaction transaction(&db);
- QSqlQuery q("UPDATE playlists SET ui_order=-1", db);
+ QSqlQuery q(db);
+ q.prepare("UPDATE playlists SET ui_order=-1");
q.exec();
if (db_->CheckErrors(q)) return;
- q = QSqlQuery("UPDATE playlists SET ui_order=:index WHERE ROWID=:id", db);
+ q.prepare("UPDATE playlists SET ui_order=:index WHERE ROWID=:id");
for (int i = 0; i < ids.count(); ++i) {
q.bindValue(":index", i);
q.bindValue(":id", ids[i]);
@@ -428,7 +429,8 @@ void PlaylistBackend::SetPlaylistOrder(const QList& ids) {
void PlaylistBackend::SetPlaylistUiPath(int id, const QString& path) {
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
- QSqlQuery q("UPDATE playlists SET ui_path=:path WHERE ROWID=:id", db);
+ QSqlQuery q(db);
+ q.prepare("UPDATE playlists SET ui_path=:path WHERE ROWID=:id");
ScopedTransaction transaction(&db);
diff --git a/src/playlist/playlistdelegates.cpp b/src/playlist/playlistdelegates.cpp
index 76b15544c..580e78a40 100644
--- a/src/playlist/playlistdelegates.cpp
+++ b/src/playlist/playlistdelegates.cpp
@@ -220,7 +220,7 @@ bool PlaylistDelegateBase::helpEvent(QHelpEvent* event, QAbstractItemView* view,
// Special case: we want newlines in the comment tooltip
if (index.column() == Playlist::Column_Comment) {
- text = Qt::escape(index.data(Qt::ToolTipRole).toString());
+ text = index.data(Qt::ToolTipRole).toString().toHtmlEscaped();
text.replace("\\r\\n", "
");
text.replace("\\n", "
");
text.replace("\r\n", "
");
@@ -436,7 +436,7 @@ QString NativeSeparatorsDelegate::displayText(const QVariant& value,
if (value.type() == QVariant::Url) {
url = value.toUrl();
} else if (string_value.contains("://")) {
- url = QUrl::fromEncoded(string_value.toAscii());
+ url = QUrl::fromEncoded(string_value.toLatin1());
} else {
return QDir::toNativeSeparators(string_value);
}
diff --git a/src/playlist/playlistview.cpp b/src/playlist/playlistview.cpp
index fe4ec4562..c1cebc56c 100644
--- a/src/playlist/playlistview.cpp
+++ b/src/playlist/playlistview.cpp
@@ -27,7 +27,7 @@
#include "covers/currentartloader.h"
#include "ui/qt_blurimage.h"
-#include
+#include
#include
#include
#include
@@ -39,6 +39,7 @@
#include
#include
#include
+#include
#include
@@ -60,7 +61,7 @@ const int PlaylistView::kDefaultBlurRadius = 0;
const int PlaylistView::kDefaultOpacityLevel = 40;
PlaylistProxyStyle::PlaylistProxyStyle(QStyle* base)
- : QProxyStyle(base), cleanlooks_(new QCleanlooksStyle) {}
+ : QProxyStyle(base), common_style_(new QCommonStyle) {}
void PlaylistProxyStyle::drawControl(ControlElement element,
const QStyleOption* option,
@@ -85,7 +86,7 @@ void PlaylistProxyStyle::drawControl(ControlElement element,
}
if (element == CE_ItemViewItem)
- cleanlooks_->drawControl(element, option, painter, widget);
+ common_style_->drawControl(element, option, painter, widget);
else
QProxyStyle::drawControl(element, option, painter, widget);
}
@@ -96,7 +97,7 @@ void PlaylistProxyStyle::drawPrimitive(PrimitiveElement element,
const QWidget* widget) const {
if (element == QStyle::PE_PanelItemViewRow ||
element == QStyle::PE_PanelItemViewItem)
- cleanlooks_->drawPrimitive(element, option, painter, widget);
+ common_style_->drawPrimitive(element, option, painter, widget);
else
QProxyStyle::drawPrimitive(element, option, painter, widget);
}
@@ -132,7 +133,7 @@ PlaylistView::PlaylistView(QWidget* parent)
drag_over_(false),
dynamic_controls_(new DynamicPlaylistControls(this)) {
setHeader(header_);
- header_->setMovable(true);
+ header_->setSectionsMovable(true);
setStyle(style_);
setMouseTracking(true);
diff --git a/src/playlist/playlistview.h b/src/playlist/playlistview.h
index fedc207e0..d72312b8d 100644
--- a/src/playlist/playlistview.h
+++ b/src/playlist/playlistview.h
@@ -26,7 +26,7 @@
#include "playlist.h"
-class QCleanlooksStyle;
+class QCommonStyle;
class Application;
class DynamicPlaylistControls;
@@ -40,7 +40,7 @@ class QTimeLine;
// that uses Gtk to paint row backgrounds, ignoring any custom brush or palette
// the caller set in the QStyleOption. That breaks our currently playing track
// animation, which relies on the background painted by Qt to be transparent.
-// This proxy style uses QCleanlooksStyle to paint the affected elements.
+// This proxy style uses QCommonStyle to paint the affected elements.
// This class is used by the global search view as well.
class PlaylistProxyStyle : public QProxyStyle {
public:
@@ -51,7 +51,7 @@ class PlaylistProxyStyle : public QProxyStyle {
QPainter* painter, const QWidget* widget) const;
private:
- std::unique_ptr cleanlooks_;
+ std::unique_ptr common_style_;
};
class PlaylistView : public QTreeView {
diff --git a/src/smartplaylists/searchtermwidget.cpp b/src/smartplaylists/searchtermwidget.cpp
index 74bf64b07..9cf989475 100644
--- a/src/smartplaylists/searchtermwidget.cpp
+++ b/src/smartplaylists/searchtermwidget.cpp
@@ -118,7 +118,7 @@ SearchTermWidget::SearchTermWidget(LibraryBackend* library, QWidget* parent)
// Set stylesheet
QFile stylesheet_file(":/smartplaylistsearchterm.css");
stylesheet_file.open(QIODevice::ReadOnly);
- QString stylesheet = QString::fromAscii(stylesheet_file.readAll());
+ QString stylesheet = QString::fromLatin1(stylesheet_file.readAll());
const QColor base(222, 97, 97, 128);
stylesheet.replace("%light2", Utilities::ColorToRgba(base.lighter(140)));
stylesheet.replace("%light", Utilities::ColorToRgba(base.lighter(120)));
diff --git a/src/songinfo/songinfobase.cpp b/src/songinfo/songinfobase.cpp
index 35bd0c517..770b8d5a3 100644
--- a/src/songinfo/songinfobase.cpp
+++ b/src/songinfo/songinfobase.cpp
@@ -59,7 +59,7 @@ SongInfoBase::SongInfoBase(QWidget* parent)
// Set stylesheet
QFile stylesheet(":/songinfo.css");
stylesheet.open(QIODevice::ReadOnly);
- setStyleSheet(QString::fromAscii(stylesheet.readAll()));
+ setStyleSheet(QString::fromLatin1(stylesheet.readAll()));
connect(fetcher_, SIGNAL(ResultReady(int, SongInfoFetcher::Result)),
SLOT(ResultReady(int, SongInfoFetcher::Result)));
diff --git a/src/songinfo/songkickconcerts.cpp b/src/songinfo/songkickconcerts.cpp
index 1b36e420e..0f21633cf 100644
--- a/src/songinfo/songkickconcerts.cpp
+++ b/src/songinfo/songkickconcerts.cpp
@@ -20,11 +20,12 @@
#include
#include
#include
+#include
+#include
+#include
#include
-#include
-
#include "core/closure.h"
#include "core/logging.h"
#include "songkickconcertwidget.h"
@@ -107,22 +108,23 @@ void SongkickConcerts::FetchSongkickCalendar(const QString& artist_id, int id) {
}
void SongkickConcerts::CalendarRequestFinished(QNetworkReply* reply, int id) {
- QJson::Parser parser;
- bool ok = false;
- QVariant result = parser.parse(reply, &ok);
+ reply->deleteLater();
- if (!ok) {
+ QJsonParseError error;
+ QJsonDocument json_document = QJsonDocument::fromJson(reply->readAll(), &error);
+
+ if (error.error != QJsonParseError::NoError) {
qLog(Error) << "Error parsing Songkick reply";
emit Finished(id);
return;
}
- QVariantMap root = result.toMap();
- QVariantMap results_page = root["resultsPage"].toMap();
- QVariantMap results = results_page["results"].toMap();
- QVariantList events = results["event"].toList();
+ QJsonObject json_root = json_document.object();
+ QJsonObject json_results_page = json_root["resultsPage"].toObject();
+ QJsonObject json_results = json_results_page["results"].toObject();
+ QJsonArray json_events = json_results["event"].toArray();
- if (events.isEmpty()) {
+ if (json_events.isEmpty()) {
emit Finished(id);
return;
}
@@ -130,21 +132,21 @@ void SongkickConcerts::CalendarRequestFinished(QNetworkReply* reply, int id) {
QWidget* container = new QWidget;
QVBoxLayout* layout = new QVBoxLayout(container);
- for (const QVariant& v : events) {
- QVariantMap event = v.toMap();
- QString display_name = event["displayName"].toString();
- QString start_date = event["start"].toMap()["date"].toString();
- QString city = event["location"].toMap()["city"].toString();
- QString uri = event["uri"].toString();
+ for (const QJsonValue& v : json_events) {
+ QJsonObject json_event = v.toObject();
+ QString display_name = json_event["displayName"].toString();
+ QString start_date = json_event["start"].toObject()["date"].toString();
+ QString city = json_event["location"].toObject()["city"].toString();
+ QString uri = json_event["uri"].toString();
// Try to get the lat/lng coordinates of the venue.
- QVariantMap venue = event["venue"].toMap();
- const bool valid_latlng = venue["lng"].isValid() && venue["lat"].isValid();
+ QJsonObject json_venue = json_event["venue"].toObject();
+ const bool valid_latlng = !json_venue["lng"].isUndefined() && !json_venue["lat"].isUndefined();
if (valid_latlng && latlng_.IsValid()) {
static const int kFilterDistanceMetres = 250 * 1e3; // 250km
- Geolocator::LatLng latlng(venue["lat"].toString(),
- venue["lng"].toString());
+ Geolocator::LatLng latlng(json_venue["lat"].toString(),
+ json_venue["lng"].toString());
if (latlng_.IsValid() && latlng.IsValid()) {
int distance_metres = latlng_.Distance(latlng);
if (distance_metres > kFilterDistanceMetres) {
@@ -159,8 +161,8 @@ void SongkickConcerts::CalendarRequestFinished(QNetworkReply* reply, int id) {
widget->Init(display_name, uri, start_date, city);
if (valid_latlng) {
- widget->SetMap(venue["lat"].toString(), venue["lng"].toString(),
- venue["displayName"].toString());
+ widget->SetMap(json_venue["lat"].toString(), json_venue["lng"].toString(),
+ json_venue["displayName"].toString());
}
layout->addWidget(widget);
diff --git a/src/songinfo/songkickconcertwidget.cpp b/src/songinfo/songkickconcertwidget.cpp
index 691f9fb02..21655f1f0 100644
--- a/src/songinfo/songkickconcertwidget.cpp
+++ b/src/songinfo/songkickconcertwidget.cpp
@@ -21,6 +21,7 @@
#include
#include
#include
+#include
#include "songinfotextview.h"
#include "ui_songkickconcertwidget.h"
@@ -58,7 +59,7 @@ void SongKickConcertWidget::ReloadSettings() {
void SongKickConcertWidget::Init(const QString& title, const QString& url,
const QString& date, const QString& location) {
ui_->title->setText(
- QString("%2").arg(Qt::escape(url), Qt::escape(title)));
+ QString("%2").arg(url.toHtmlEscaped(), title.toHtmlEscaped()));
if (!location.isEmpty()) {
ui_->location->setText(location);
@@ -96,10 +97,12 @@ void SongKickConcertWidget::SetMap(const QString& lat, const QString& lng,
ui_->map->show();
map_url_ = QUrl("https://maps.google.com/");
- map_url_.addQueryItem("ll", QString("%1,%2").arg(lat, lng));
+ QUrlQuery map_url_query;
+ map_url_query.addQueryItem("ll", QString("%1,%2").arg(lat, lng));
if (!venue_name.isEmpty()) {
- map_url_.addQueryItem("q", venue_name);
+ map_url_query.addQueryItem("q", venue_name);
}
+ map_url_.setQuery(map_url_query);
// Request the static map image
const QUrl url(QString(kStaticMapUrl).arg(QString::number(kStaticMapWidth),
diff --git a/src/songinfo/ultimatelyricsprovider.cpp b/src/songinfo/ultimatelyricsprovider.cpp
index 586e5d239..915d62a00 100644
--- a/src/songinfo/ultimatelyricsprovider.cpp
+++ b/src/songinfo/ultimatelyricsprovider.cpp
@@ -37,7 +37,7 @@ UltimateLyricsProvider::UltimateLyricsProvider()
void UltimateLyricsProvider::FetchInfo(int id, const Song& metadata) {
// Get the text codec
const QTextCodec* codec =
- QTextCodec::codecForName(charset_.toAscii().constData());
+ QTextCodec::codecForName(charset_.toLatin1().constData());
if (!codec) {
qLog(Warning) << "Invalid codec" << charset_;
emit Finished(id);
@@ -100,7 +100,7 @@ void UltimateLyricsProvider::LyricsFetched() {
}
const QTextCodec* codec =
- QTextCodec::codecForName(charset_.toAscii().constData());
+ QTextCodec::codecForName(charset_.toLatin1().constData());
const QString original_content = codec->toUnicode(reply->readAll());
QString lyrics;
diff --git a/src/transcoder/transcodedialog.cpp b/src/transcoder/transcodedialog.cpp
index 49f2f8ef8..981e3178a 100644
--- a/src/transcoder/transcodedialog.cpp
+++ b/src/transcoder/transcodedialog.cpp
@@ -54,7 +54,7 @@ TranscodeDialog::TranscodeDialog(QWidget* parent)
finished_success_(0),
finished_failed_(0) {
ui_->setupUi(this);
- ui_->files->header()->setResizeMode(QHeaderView::ResizeToContents);
+ ui_->files->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
log_ui_->setupUi(log_dialog_);
QPushButton* clear_button =
diff --git a/src/transcoder/transcoder.cpp b/src/transcoder/transcoder.cpp
index 973a161cc..a51b77bd6 100644
--- a/src/transcoder/transcoder.cpp
+++ b/src/transcoder/transcoder.cpp
@@ -47,9 +47,9 @@ TranscoderPreset::TranscoderPreset(Song::FileType type, const QString& name,
GstElement* Transcoder::CreateElement(const QString& factory_name,
GstElement* bin, const QString& name) {
GstElement* ret = gst_element_factory_make(
- factory_name.toAscii().constData(),
- name.isNull() ? factory_name.toAscii().constData()
- : name.toAscii().constData());
+ factory_name.toLatin1().constData(),
+ name.isNull() ? factory_name.toLatin1().constData()
+ : name.toLatin1().constData());
if (ret && bin) gst_bin_add(GST_BIN(bin), ret);
diff --git a/src/ui/albumcoverchoicecontroller.cpp b/src/ui/albumcoverchoicecontroller.cpp
index 06a40f3c5..0fa6f15e0 100644
--- a/src/ui/albumcoverchoicecontroller.cpp
+++ b/src/ui/albumcoverchoicecontroller.cpp
@@ -39,6 +39,7 @@
#include
#include
#include
+#include
const char* AlbumCoverChoiceController::kLoadImageFileFilter = QT_TR_NOOP(
"Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)");
diff --git a/src/ui/edittagdialog.cpp b/src/ui/edittagdialog.cpp
index a69c67fbe..d3075fec2 100644
--- a/src/ui/edittagdialog.cpp
+++ b/src/ui/edittagdialog.cpp
@@ -461,21 +461,20 @@ void EditTagDialog::UpdateSummaryTab(const Song& song) {
app_->album_cover_loader()->LoadImageAsync(cover_options_, song);
QString summary =
- "" + Qt::escape(song.PrettyTitleWithArtist()) + "
";
+ "" + song.PrettyTitleWithArtist().toHtmlEscaped() + "
";
bool art_is_set = true;
if (song.has_manually_unset_cover()) {
- summary += Qt::escape(tr("Cover art manually unset"));
+ summary += tr("Cover art manually unset").toHtmlEscaped();
art_is_set = false;
} else if (!song.art_manual().isEmpty()) {
- summary += Qt::escape(tr("Cover art set from %1").arg(song.art_manual()));
+ summary += tr("Cover art set from %1").arg(song.art_manual()).toHtmlEscaped();
} else if (song.has_embedded_cover()) {
- summary += Qt::escape(tr("Cover art from embedded image"));
+ summary += tr("Cover art from embedded image");
} else if (!song.art_automatic().isEmpty()) {
- summary += Qt::escape(
- tr("Cover art loaded automatically from %1").arg(song.art_automatic()));
+ summary += tr("Cover art loaded automatically from %1").arg(song.art_automatic()).toHtmlEscaped();
} else {
- summary += Qt::escape(tr("Cover art not set"));
+ summary += tr("Cover art not set").toHtmlEscaped();
art_is_set = false;
}
diff --git a/src/ui/flowlayout.cpp b/src/ui/flowlayout.cpp
index cccb1a1c4..582ec92bd 100644
--- a/src/ui/flowlayout.cpp
+++ b/src/ui/flowlayout.cpp
@@ -38,7 +38,7 @@
**
****************************************************************************/
-#include
+#include
#include "flowlayout.h"
//! [1]
diff --git a/src/ui/globalshortcutssettingspage.cpp b/src/ui/globalshortcutssettingspage.cpp
index 8217594a0..8a25d27ae 100644
--- a/src/ui/globalshortcutssettingspage.cpp
+++ b/src/ui/globalshortcutssettingspage.cpp
@@ -39,7 +39,7 @@ GlobalShortcutsSettingsPage::GlobalShortcutsSettingsPage(SettingsDialog* dialog)
grabber_(new GlobalShortcutGrabber) {
ui_->setupUi(this);
ui_->shortcut_options->setEnabled(false);
- ui_->list->header()->setResizeMode(QHeaderView::ResizeToContents);
+ ui_->list->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
setWindowIcon(IconLoader::Load("input-keyboard"));
settings_.beginGroup(GlobalShortcuts::kSettingsGroup);
diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp
index 736762b2a..cba1d91d9 100644
--- a/src/ui/mainwindow.cpp
+++ b/src/ui/mainwindow.cpp
@@ -951,7 +951,6 @@ MainWindow::~MainWindow() {
void MainWindow::ReloadSettings() {
#ifndef Q_OS_DARWIN
bool show_tray = settings_.value("showtray", true).toBool();
-
tray_icon_->SetVisible(show_tray);
if (!show_tray && !isVisible()) show();
#endif
diff --git a/src/ui/qtsystemtrayicon.cpp b/src/ui/qtsystemtrayicon.cpp
index 39677bc21..436cdc395 100644
--- a/src/ui/qtsystemtrayicon.cpp
+++ b/src/ui/qtsystemtrayicon.cpp
@@ -57,7 +57,7 @@ QtSystemTrayIcon::QtSystemTrayIcon(QObject* parent)
QFile pattern_file(":/now_playing_tooltip.txt");
pattern_file.open(QIODevice::ReadOnly);
- pattern_ = QString::fromAscii(pattern_file.readAll());
+ pattern_ = QString::fromLatin1(pattern_file.readAll());
connect(tray_, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
SLOT(Clicked(QSystemTrayIcon::ActivationReason)));
@@ -216,7 +216,7 @@ void QtSystemTrayIcon::SetVisible(bool visible) { tray_->setVisible(visible); }
void QtSystemTrayIcon::SetNowPlaying(const Song& song,
const QString& image_path) {
-#ifdef Q_WS_WIN
+#ifdef Q_OS_WIN
// Windows doesn't support HTML in tooltips, so just show something basic
tray_->setToolTip(song.PrettyTitleWithArtist());
return;
@@ -230,14 +230,14 @@ void QtSystemTrayIcon::SetNowPlaying(const Song& song,
clone.replace("%appName", QCoreApplication::applicationName());
clone.replace("%titleKey", tr("Title") % ":");
- clone.replace("%titleValue", Qt::escape(song.PrettyTitle()));
+ clone.replace("%titleValue", song.PrettyTitle().toHtmlEscaped());
clone.replace("%artistKey", tr("Artist") % ":");
- clone.replace("%artistValue", Qt::escape(song.artist()));
+ clone.replace("%artistValue", song.artist().toHtmlEscaped());
clone.replace("%albumKey", tr("Album") % ":");
- clone.replace("%albumValue", Qt::escape(song.album()));
+ clone.replace("%albumValue", song.album().toHtmlEscaped());
clone.replace("%lengthKey", tr("Length") % ":");
- clone.replace("%lengthValue", Qt::escape(song.PrettyLength()));
+ clone.replace("%lengthValue", song.PrettyLength().toHtmlEscaped());
if (columns == 2) {
QString final_path =
diff --git a/src/widgets/errordialog.cpp b/src/widgets/errordialog.cpp
index eb6e0bef8..1086305f3 100644
--- a/src/widgets/errordialog.cpp
+++ b/src/widgets/errordialog.cpp
@@ -53,7 +53,7 @@ void ErrorDialog::UpdateContent() {
QString html;
for (const QString& message : current_messages_) {
if (!html.isEmpty()) html += "
";
- html += Qt::escape(message);
+ html += message.toHtmlEscaped();
}
ui_->messages->setHtml(html);
}
diff --git a/src/widgets/fancytabwidget.cpp b/src/widgets/fancytabwidget.cpp
index c61d3fe83..9f73584e7 100644
--- a/src/widgets/fancytabwidget.cpp
+++ b/src/widgets/fancytabwidget.cpp
@@ -47,7 +47,7 @@
#include
#include
#include
-#include
+#include
using namespace Core;
using namespace Internal;
@@ -128,7 +128,7 @@ void FancyTabProxyStyle::drawControl(ControlElement element,
p->drawText(text_rect, textFlags, text);
p->setPen(selected ? QColor(60, 60, 60)
: Utils::StyleHelper::panelTextColor());
-#ifndef Q_WS_MAC
+#ifndef Q_OS_MAC
if (widget) {
const QString fader_key = "tab_" + text + "_fader";
const QString animation_key = "tab_" + text + "_animation";
@@ -253,7 +253,7 @@ void FancyTab::setFader(float value) {
FancyTabBar::FancyTabBar(QWidget* parent) : QWidget(parent) {
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
- setStyle(new QWindowsStyle);
+ setStyle(new QCommonStyle);
setMinimumWidth(qMax(2 * m_rounding, 40));
setAttribute(Qt::WA_Hover, true);
setFocusPolicy(Qt::NoFocus);
@@ -439,7 +439,7 @@ void FancyTabBar::paintTab(QPainter* painter, int tabIndex) const {
painter->drawText(tabTextRect, textFlags, tabText);
painter->setPen(selected ? QColor(60, 60, 60)
: Utils::StyleHelper::panelTextColor());
-#ifndef Q_WS_MAC
+#ifndef Q_OS_MAC
if (!selected) {
painter->save();
int fader = int(m_tabs[tabIndex]->fader());
diff --git a/src/widgets/forcescrollperpixel.cpp b/src/widgets/forcescrollperpixel.cpp
index 065c1e47b..f7aea32c1 100644
--- a/src/widgets/forcescrollperpixel.cpp
+++ b/src/widgets/forcescrollperpixel.cpp
@@ -29,8 +29,7 @@ ForceScrollPerPixel::ForceScrollPerPixel(QAbstractItemView* item_view,
bool ForceScrollPerPixel::eventFilter(QObject* object, QEvent* event) {
if (object == item_view_ && event->type() != QEvent::Destroy &&
- event->type() != QEvent::WinIdChange &&
- event->type() != QEvent::AccessibilityPrepare) {
+ event->type() != QEvent::WinIdChange) {
item_view_->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
item_view_->verticalScrollBar()->setSingleStep(20);
}
diff --git a/src/widgets/groupediconview.cpp b/src/widgets/groupediconview.cpp
index ba0fef26b..60a53a85b 100644
--- a/src/widgets/groupediconview.cpp
+++ b/src/widgets/groupediconview.cpp
@@ -108,7 +108,7 @@ void GroupedIconView::rowsInserted(const QModelIndex& parent, int start,
}
void GroupedIconView::dataChanged(const QModelIndex& topLeft,
- const QModelIndex& bottomRight) {
+ const QModelIndex& bottomRight, const QVector &) {
QListView::dataChanged(topLeft, bottomRight);
LayoutItems();
}
diff --git a/src/widgets/groupediconview.h b/src/widgets/groupediconview.h
index 42e08bf1f..025e5584d 100644
--- a/src/widgets/groupediconview.h
+++ b/src/widgets/groupediconview.h
@@ -72,7 +72,7 @@ class GroupedIconView : public QListView {
void resizeEvent(QResizeEvent* e);
// QAbstractItemView
- void dataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight);
+ void dataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight, const QVector& = QVector());
QModelIndex indexAt(const QPoint& p) const;
void rowsInserted(const QModelIndex& parent, int start, int end);
void setSelection(const QRect& rect,
diff --git a/src/widgets/nowplayingwidget.cpp b/src/widgets/nowplayingwidget.cpp
index 10194e18a..588736599 100644
--- a/src/widgets/nowplayingwidget.cpp
+++ b/src/widgets/nowplayingwidget.cpp
@@ -290,8 +290,8 @@ void NowPlayingWidget::UpdateDetailsText() {
// TODO: Make this configurable
html += QString("%1
%2
%3").arg(
- Qt::escape(metadata_.PrettyTitle()), Qt::escape(metadata_.artist()),
- Qt::escape(metadata_.album()));
+ metadata_.PrettyTitle().toHtmlEscaped(), metadata_.artist().toHtmlEscaped(),
+ metadata_.album().toHtmlEscaped());
html += "
";
details_->setHtml(html);
diff --git a/src/widgets/stylehelper.cpp b/src/widgets/stylehelper.cpp
index 23ab4c697..87674af37 100644
--- a/src/widgets/stylehelper.cpp
+++ b/src/widgets/stylehelper.cpp
@@ -30,12 +30,12 @@
#include "stylehelper.h"
#include
-#include
+#include
#include
#include
-#include
+#include
#include
-#include
+#include
#include
// Clamps float color values within (0, 255)
@@ -47,7 +47,7 @@ static int clamp(float x) {
namespace Utils {
qreal StyleHelper::sidebarFontSize() {
-#if defined(Q_WS_MAC)
+#if defined(Q_OS_MAC)
return 10;
#else
return 7.5;
diff --git a/src/widgets/stylehelper.h b/src/widgets/stylehelper.h
index f73f4b442..77c62b9ec 100644
--- a/src/widgets/stylehelper.h
+++ b/src/widgets/stylehelper.h
@@ -30,8 +30,8 @@
#ifndef STYLEHELPER_H
#define STYLEHELPER_H
-#include
-#include
+#include
+#include
#include "ui/qt_blurimage.h"
diff --git a/tests/scopedtransaction_test.cpp b/tests/scopedtransaction_test.cpp
index 2a7fa98da..3261574b9 100644
--- a/tests/scopedtransaction_test.cpp
+++ b/tests/scopedtransaction_test.cpp
@@ -63,13 +63,15 @@ TEST_F(ScopedTransactionTest, RollbackOnDtor) {
ScopedTransaction t(&database_);
database_.exec("INSERT INTO foo (bar) VALUES (42)");
- QSqlQuery q("SELECT * FROM foo", database_);
+ QSqlQuery q(database_);
+ q.prepare("SELECT * FROM foo");
ASSERT_TRUE(q.exec());
ASSERT_TRUE(q.next());
EXPECT_EQ(42, q.value(0).toInt());
}
- QSqlQuery q("SELECT * FROM foo", database_);
+ QSqlQuery q(database_);
+ q.prepare("SELECT * FROM foo");
ASSERT_TRUE(q.exec());
ASSERT_FALSE(q.next());
}
@@ -83,7 +85,8 @@ TEST_F(ScopedTransactionTest, Commit) {
t.Commit();
}
- QSqlQuery q("SELECT * FROM foo", database_);
+ QSqlQuery q(database_);
+ q.prepare("SELECT * FROM foo");
ASSERT_TRUE(q.exec());
ASSERT_TRUE(q.next());
EXPECT_EQ(42, q.value(0).toInt());
diff --git a/tools/ultimate_lyrics_parser/main.cpp b/tools/ultimate_lyrics_parser/main.cpp
index 19083ff43..a92d3ad5f 100644
--- a/tools/ultimate_lyrics_parser/main.cpp
+++ b/tools/ultimate_lyrics_parser/main.cpp
@@ -17,8 +17,6 @@
#include
#include
-#include
-#include
#include
#include