diff --git a/CMakeLists.txt b/CMakeLists.txt index 7986064..a8973ad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,7 +34,8 @@ set(QREDIS_SRC # QRedis header files requiring MOC. qt5_wrap_cpp(QREDIS_MOC include/qredis/client.h - include/qredis/request.h) + include/qredis/request.h + src/client_p.h) # Create the client library. add_library(qredis SHARED diff --git a/src/client.cpp b/src/client.cpp index 235688e..8f43de3 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -3,11 +3,75 @@ using namespace QRedis; +ClientPrivate::ClientPrivate(Client * client) + : q(client) +{ + connect(&socket, &QTcpSocket::connected, q, &Client::connected); + connect(&socket, &QTcpSocket::disconnected, q, &Client::disconnected); + connect(&socket, &QTcpSocket::disconnected, this, &ClientPrivate::reset); + connect(&socket, &QTcpSocket::readyRead, this, &ClientPrivate::readReply); +} + +bool ClientPrivate::readStatusOrError() +{ + return false; +} + +bool ClientPrivate::readInteger() +{ + return false; +} + +bool ClientPrivate::readBulk() +{ + return false; +} + +bool ClientPrivate::readMultiBulk() +{ + return false; +} + +void ClientPrivate::reset() +{ + foreach(Request * request, queue) + request->deleteLater(); + queue.clear(); +} + +// TODO: unrecognized replies in the switch should be handled. + +void ClientPrivate::readReply() +{ + buffer.append(socket.readAll()); + while(!buffer.isEmpty()) + { + bool finished; + switch(buffer[0]) + { + case '+': + case '-': + finished = readStatusOrError(); + break; + case ':': + finished = readInteger(); + break; + case '$': + finished = readBulk(); + break; + case '*': + finished = readMultiBulk(); + break; + } + + if(!finished) + break; + } +} + Client::Client(QObject * parent) : QObject(parent), d(new ClientPrivate) { - connect(&d->socket, &QTcpSocket::connected, this, &Client::connected); - connect(&d->socket, &QTcpSocket::disconnected, this, &Client::disconnected); } Client::~Client() @@ -26,6 +90,9 @@ void Client::disconnectFromHost() Request * Client::sendCommand(const QString & command) { + d->socket.write(QString("%1\r\n").arg(command).toUtf8()); + Request * request = new Request(this); d->queue.enqueue(request); + return request; } diff --git a/src/client_p.h b/src/client_p.h index dbdfedd..d82fdb1 100644 --- a/src/client_p.h +++ b/src/client_p.h @@ -1,19 +1,41 @@ #ifndef QREDIS_CLIENT_P_H #define QREDIS_CLIENT_P_H +#include #include #include +#include #include namespace QRedis { - class ClientPrivate + class ClientPrivate : public QObject { + Q_OBJECT + public: + ClientPrivate(Client *); + + bool readStatusOrError(); + bool readInteger(); + bool readBulk(); + bool readMultiBulk(); + QTcpSocket socket; + QQueue queue; + QByteArray buffer; + + public slots: + + void reset(); + void readReply(); + + private: + + Client * const q; }; }