mirror of
https://github.com/clementine-player/Clementine
synced 2025-02-01 11:56:45 +01:00
Basic working closure implementation.
This commit is contained in:
parent
9f1e82965d
commit
20a967a19f
@ -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
|
||||
|
29
src/core/closure.cpp
Normal file
29
src/core/closure.cpp
Normal file
@ -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_;
|
||||
}
|
54
src/core/closure.h
Normal file
54
src/core/closure.h
Normal file
@ -0,0 +1,54 @@
|
||||
#ifndef CLOSURE_H
|
||||
#define CLOSURE_H
|
||||
|
||||
#include <QMetaMethod>
|
||||
#include <QObject>
|
||||
|
||||
#include "core/logging.h"
|
||||
|
||||
class ClosureArgumentWrapper {
|
||||
public:
|
||||
virtual ~ClosureArgumentWrapper() {}
|
||||
|
||||
virtual QGenericArgument arg() const {
|
||||
qLog(Debug) << Q_FUNC_INFO;
|
||||
return QGenericArgument();
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
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<type>(data)
|
||||
|
||||
#endif // CLOSURE_H
|
@ -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) {
|
||||
|
@ -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<Param> 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<Param> parameters;
|
||||
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user