Basic working closure implementation.

This commit is contained in:
John Maguire 2011-10-04 18:26:40 +02:00
parent 9f1e82965d
commit 20a967a19f
6 changed files with 112 additions and 1 deletions

View File

@ -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
View 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
View 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

View File

@ -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) {

View File

@ -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;

View File

@ -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();