diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8bd80b488..7c4416ba2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -60,6 +60,7 @@ set(SOURCES core/backgroundstreams.cpp core/backgroundthread.cpp + core/closure.cpp core/commandlineoptions.cpp core/crashreporting.cpp core/database.cpp @@ -326,6 +327,7 @@ set(HEADERS core/backgroundstreams.h core/backgroundthread.h + core/closure.h core/crashreporting.h core/database.h core/deletefiles.h diff --git a/src/core/closure.cpp b/src/core/closure.cpp new file mode 100644 index 000000000..9693a7d37 --- /dev/null +++ b/src/core/closure.cpp @@ -0,0 +1,29 @@ +#include "closure.h" + +#include "core/logging.h" + +Closure::Closure(QObject* sender, + const char* signal, + QObject* receiver, + const char* slot, + const ClosureArgumentWrapper* val1, + const ClosureArgumentWrapper* val2) + : QObject(receiver), + val1_(val1), + val2_(val2) { + const QMetaObject* meta_receiver = receiver->metaObject(); + + QByteArray normalised_slot = QMetaObject::normalizedSignature(slot + 1); + slot_ = meta_receiver->method( + meta_receiver->indexOfSlot(normalised_slot.constData())); + + connect(sender, signal, this, SLOT(Invoked()), Qt::AutoConnection); +} + +void Closure::Invoked() { + qLog(Debug) << "Invoking:" << slot_.signature() << val1_->arg().name(); + slot_.invoke(parent(), val1_->arg(), val2_->arg()); + + delete val1_; + delete val2_; +} diff --git a/src/core/closure.h b/src/core/closure.h new file mode 100644 index 000000000..8780590be --- /dev/null +++ b/src/core/closure.h @@ -0,0 +1,54 @@ +#ifndef CLOSURE_H +#define CLOSURE_H + +#include +#include + +#include "core/logging.h" + +class ClosureArgumentWrapper { + public: + virtual ~ClosureArgumentWrapper() {} + + virtual QGenericArgument arg() const { + qLog(Debug) << Q_FUNC_INFO; + return QGenericArgument(); + } +}; + +template +class ClosureArgument : public ClosureArgumentWrapper { + public: + ClosureArgument(const T& data) : data_(data) {} + + virtual QGenericArgument arg() const { + qLog(Debug) << Q_FUNC_INFO; + return Q_ARG(T, data_); + } + + private: + T data_; +}; + +class Closure : public QObject { + Q_OBJECT + + public: + Closure(QObject* sender, const char* signal, + QObject* receiver, const char* slot, + const ClosureArgumentWrapper* val1, + const ClosureArgumentWrapper* val2); + + private slots: + void Invoked(); + + private: + QMetaMethod slot_; + + const ClosureArgumentWrapper* val1_; + const ClosureArgumentWrapper* val2_; +}; + +#define C_ARG(type, data) new ClosureArgument(data) + +#endif // CLOSURE_H diff --git a/src/globalsearch/groovesharksearchprovider.cpp b/src/globalsearch/groovesharksearchprovider.cpp index f35374f8c..3c40d6ca8 100644 --- a/src/globalsearch/groovesharksearchprovider.cpp +++ b/src/globalsearch/groovesharksearchprovider.cpp @@ -49,6 +49,8 @@ void GrooveSharkSearchProvider::Init(GrooveSharkService* service) { void GrooveSharkSearchProvider::SearchAsync(int id, const QString& query) { const int service_id = service_->SimpleSearch(query); pending_searches_[service_id] = id; + + service_->SearchAlbums(query); } void GrooveSharkSearchProvider::SearchDone(int id, const SongList& songs) { diff --git a/src/internet/groovesharkservice.cpp b/src/internet/groovesharkservice.cpp index a26f46ded..e001262c7 100644 --- a/src/internet/groovesharkservice.cpp +++ b/src/internet/groovesharkservice.cpp @@ -32,6 +32,7 @@ #include "groovesharksearchplaylisttype.h" #include "groovesharkurlhandler.h" +#include "core/closure.h" #include "core/database.h" #include "core/logging.h" #include "core/mergedproxymodel.h" @@ -162,6 +163,28 @@ void GrooveSharkService::SimpleSearchFinished() { emit SimpleSearchResults(id, songs); } +int GrooveSharkService::SearchAlbums(const QString& query) { + QList parameters; + parameters << Param("query", query) + << Param("country", "") + << Param("limit", QString::number(kSongSearchLimit)); + + QNetworkReply* reply = CreateRequest("getAlbumSearchResults", parameters, false); + + int id = next_pending_search_id_++; + + new Closure(reply, SIGNAL(finished()), + this, SLOT(SearchAlbumsFinished(QNetworkReply*,int)), + C_ARG(QNetworkReply*, reply), + C_ARG(int, id)); + + return id; +} + +void GrooveSharkService::SearchAlbumsFinished(QNetworkReply* reply, int id) { + qLog(Debug) << reply << id; +} + void GrooveSharkService::DoSearch() { QList parameters; diff --git a/src/internet/groovesharkservice.h b/src/internet/groovesharkservice.h index 659d7a79b..5717690d2 100644 --- a/src/internet/groovesharkservice.h +++ b/src/internet/groovesharkservice.h @@ -72,7 +72,7 @@ class GrooveSharkService : public InternetService { const QString& session_id() { return session_id_; } int SimpleSearch(const QString& query); - + int SearchAlbums(const QString& query); static const char* kServiceName; static const char* kSettingsGroup; @@ -110,6 +110,7 @@ class GrooveSharkService : public InternetService { void DoSearch(); void SearchSongsFinished(); void SimpleSearchFinished(); + void SearchAlbumsFinished(QNetworkReply* reply, int id); void Authenticated(); void UserPlaylistsRetrieved(); void PlaylistSongsRetrieved();