#pragma once
#include <QObject>
#include <relpipe/reader/typedefs.h>
#include <relpipe/reader/TypeId.h>
#include <relpipe/reader/handlers/RelationalReaderStringHandler.h>
#include <relpipe/reader/handlers/AttributeMetadata.h>
using namespace relpipe::reader;
using namespace relpipe::reader::handlers;
// signal/slot parameters must be declared here and registered with qRegisterMetaType()
Q_DECLARE_METATYPE(string_t)
Q_DECLARE_METATYPE(std::vector<AttributeMetadata>)
class QtRelationalReaderStringHadler : public QObject, public RelationalReaderStringHadler {
Q_OBJECT
private:
RelationalReaderStringHadler* target;
public:
QtRelationalReaderStringHadler(QObject* parent, RelationalReaderStringHadler* target) :
QObject(parent), target(target) {
// see Q_DECLARE_METATYPE above
qRegisterMetaType<string_t>();
qRegisterMetaType<std::vector < AttributeMetadata >> ();
QObject::connect(this, &QtRelationalReaderStringHadler::signal_startRelation, this, &QtRelationalReaderStringHadler::slot_startRelation);
QObject::connect(this, &QtRelationalReaderStringHadler::signal_attribute, this, &QtRelationalReaderStringHadler::slot_attribute);
QObject::connect(this, &QtRelationalReaderStringHadler::signal_endOfPipe, this, &QtRelationalReaderStringHadler::slot_endOfPipe);
}
virtual ~QtRelationalReaderStringHadler() {
}
virtual void startRelation(string_t name, std::vector<AttributeMetadata> attributes) override {
emit signal_startRelation(name, attributes);
}
virtual void attribute(const string_t& value) override {
emit signal_attribute(value);
};
virtual void endOfPipe() override {
emit signal_endOfPipe();
};
signals:
void signal_startRelation(string_t name, std::vector<AttributeMetadata> attributes);
void signal_attribute(const string_t& value);
void signal_endOfPipe();
private slots:
// FIXME: asynchronous signal-slot data passing between two threads
void slot_startRelation(string_t name, std::vector<AttributeMetadata> attributes) {
target->startRelation(name, attributes);
};
void slot_attribute(const string_t& value) {
target->attribute(value);
};
void slot_endOfPipe() {
target->endOfPipe();
};
};