From ed20c3082d4fd5e90703e4d6c37093dcecb5cfd1 Mon Sep 17 00:00:00 2001 From: Aaron Seigo Date: Thu, 20 Nov 2014 16:28:31 +0100 Subject: sketch in the client/resource model --- resource/CMakeLists.txt | 15 +++++++++++ resource/listener.cpp | 71 +++++++++++++++++++++++++++++++++++++++++++++++++ resource/listener.h | 37 ++++++++++++++++++++++++++ resource/main.cpp | 23 ++++++++++++++++ 4 files changed, 146 insertions(+) create mode 100644 resource/CMakeLists.txt create mode 100644 resource/listener.cpp create mode 100644 resource/listener.h create mode 100644 resource/main.cpp (limited to 'resource') diff --git a/resource/CMakeLists.txt b/resource/CMakeLists.txt new file mode 100644 index 0000000..3de51b5 --- /dev/null +++ b/resource/CMakeLists.txt @@ -0,0 +1,15 @@ +project(toynadi_resource) + +include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) + +set(common_path "../common/") + +set(toynadiresource_SRCS + ${common_path}/console.cpp + main.cpp + listener.cpp +) + +add_executable(${PROJECT_NAME} ${toynadiresource_SRCS}) +qt5_use_modules(${PROJECT_NAME} Widgets Network) +install(TARGETS ${PROJECT_NAME} DESTINATION bin) diff --git a/resource/listener.cpp b/resource/listener.cpp new file mode 100644 index 0000000..efdfe3e --- /dev/null +++ b/resource/listener.cpp @@ -0,0 +1,71 @@ +#include "listener.h" + +#include "common/console.h" + +#include + +Listener::Listener(const QString &resource, QObject *parent) + : QObject(parent), + m_server(new QLocalServer(this)) +{ + connect(m_server, &QLocalServer::newConnection, + this, &Listener::acceptConnection); + Console::main()->log(QString("Trying to open %1").arg(resource)); + if (!m_server->listen(resource)) { + // FIXME: multiple starts need to be handled here + m_server->removeServer(resource); + if (!m_server->listen(resource)) { + Console::main()->log("Utter failure to start server"); + exit(-1); + } + } + + if (m_server->isListening()) { + Console::main()->log(QString("Listening on %1").arg(m_server->serverName())); + } +} + +Listener::~Listener() +{ +} + +void Listener::closeAllConnections() +{ + //TODO: close all client connectionsin m_connections +} + +void Listener::acceptConnection() +{ + Console::main()->log(QString("Accepting connection")); + QLocalSocket *connection = m_server->nextPendingConnection(); + + if (!connection) { + return; + } + + Console::main()->log("Got a connection"); + Client client(connection); + m_connections << client; + connect(connection, &QLocalSocket::disconnected, + this, &Listener::clientDropped); + +} + +void Listener::clientDropped() +{ + QLocalSocket *connection = qobject_cast(sender()); + if (!connection) { + return; + } + + Console::main()->log("Dropping connection..."); + QMutableListIterator it(m_connections); + while (it.hasNext()) { + const Client &client = it.next(); + if (client.m_socket == connection) { + Console::main()->log(" dropped..."); + it.remove(); + break; + } + } +} diff --git a/resource/listener.h b/resource/listener.h new file mode 100644 index 0000000..79c7ba5 --- /dev/null +++ b/resource/listener.h @@ -0,0 +1,37 @@ +#pragma once + +#include +#include +#include +#include + +class Client +{ +public: + Client(QLocalSocket *s) + : m_socket(s), + m_commanded(false) + { + } + + QLocalSocket *m_socket; + bool m_commanded; +}; + +class Listener : public QObject +{ +public: + Listener(const QString &resourceName, QObject *parent = 0); + ~Listener(); + +public Q_SLOTS: + void closeAllConnections(); + +private Q_SLOTS: + void acceptConnection(); + void clientDropped(); + +private: + QLocalServer *m_server; + QList m_connections; +}; \ No newline at end of file diff --git a/resource/main.cpp b/resource/main.cpp new file mode 100644 index 0000000..3bd4656 --- /dev/null +++ b/resource/main.cpp @@ -0,0 +1,23 @@ + +#include + +#include "common/console.h" +#include "listener.h" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + new Console(QString("Toy Resource: %1").arg(argv[1])); + if (argc < 2) { + Console::main()->log("Not enough args"); + return app.exec(); + } + + Listener *listener = new Listener(argv[1]); + + QObject::connect(&app, &QCoreApplication::aboutToQuit, + listener, &Listener::closeAllConnections); + + return app.exec(); +} \ No newline at end of file -- cgit v1.2.3