Basic working closure implementation.
This commit is contained in:
parent
9f1e82965d
commit
20a967a19f
|
@ -60,6 +60,7 @@ set(SOURCES
|
||||||
|
|
||||||
core/backgroundstreams.cpp
|
core/backgroundstreams.cpp
|
||||||
core/backgroundthread.cpp
|
core/backgroundthread.cpp
|
||||||
|
core/closure.cpp
|
||||||
core/commandlineoptions.cpp
|
core/commandlineoptions.cpp
|
||||||
core/crashreporting.cpp
|
core/crashreporting.cpp
|
||||||
core/database.cpp
|
core/database.cpp
|
||||||
|
@ -326,6 +327,7 @@ set(HEADERS
|
||||||
|
|
||||||
core/backgroundstreams.h
|
core/backgroundstreams.h
|
||||||
core/backgroundthread.h
|
core/backgroundthread.h
|
||||||
|
core/closure.h
|
||||||
core/crashreporting.h
|
core/crashreporting.h
|
||||||
core/database.h
|
core/database.h
|
||||||
core/deletefiles.h
|
core/deletefiles.h
|
||||||
|
|
|
@ -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_;
|
||||||
|
}
|
|
@ -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) {
|
void GrooveSharkSearchProvider::SearchAsync(int id, const QString& query) {
|
||||||
const int service_id = service_->SimpleSearch(query);
|
const int service_id = service_->SimpleSearch(query);
|
||||||
pending_searches_[service_id] = id;
|
pending_searches_[service_id] = id;
|
||||||
|
|
||||||
|
service_->SearchAlbums(query);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GrooveSharkSearchProvider::SearchDone(int id, const SongList& songs) {
|
void GrooveSharkSearchProvider::SearchDone(int id, const SongList& songs) {
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "groovesharksearchplaylisttype.h"
|
#include "groovesharksearchplaylisttype.h"
|
||||||
#include "groovesharkurlhandler.h"
|
#include "groovesharkurlhandler.h"
|
||||||
|
|
||||||
|
#include "core/closure.h"
|
||||||
#include "core/database.h"
|
#include "core/database.h"
|
||||||
#include "core/logging.h"
|
#include "core/logging.h"
|
||||||
#include "core/mergedproxymodel.h"
|
#include "core/mergedproxymodel.h"
|
||||||
|
@ -162,6 +163,28 @@ void GrooveSharkService::SimpleSearchFinished() {
|
||||||
emit SimpleSearchResults(id, songs);
|
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() {
|
void GrooveSharkService::DoSearch() {
|
||||||
QList<Param> parameters;
|
QList<Param> parameters;
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,7 @@ class GrooveSharkService : public InternetService {
|
||||||
const QString& session_id() { return session_id_; }
|
const QString& session_id() { return session_id_; }
|
||||||
|
|
||||||
int SimpleSearch(const QString& query);
|
int SimpleSearch(const QString& query);
|
||||||
|
int SearchAlbums(const QString& query);
|
||||||
|
|
||||||
static const char* kServiceName;
|
static const char* kServiceName;
|
||||||
static const char* kSettingsGroup;
|
static const char* kSettingsGroup;
|
||||||
|
@ -110,6 +110,7 @@ class GrooveSharkService : public InternetService {
|
||||||
void DoSearch();
|
void DoSearch();
|
||||||
void SearchSongsFinished();
|
void SearchSongsFinished();
|
||||||
void SimpleSearchFinished();
|
void SimpleSearchFinished();
|
||||||
|
void SearchAlbumsFinished(QNetworkReply* reply, int id);
|
||||||
void Authenticated();
|
void Authenticated();
|
||||||
void UserPlaylistsRetrieved();
|
void UserPlaylistsRetrieved();
|
||||||
void PlaylistSongsRetrieved();
|
void PlaylistSongsRetrieved();
|
||||||
|
|
Loading…
Reference in New Issue