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 --- client/CMakeLists.txt | 14 +++++++ client/main.cpp | 19 ++++++++++ client/resourceaccess.cpp | 95 +++++++++++++++++++++++++++++++++++++++++++++++ client/resourceaccess.h | 33 ++++++++++++++++ 4 files changed, 161 insertions(+) create mode 100644 client/CMakeLists.txt create mode 100644 client/main.cpp create mode 100644 client/resourceaccess.cpp create mode 100644 client/resourceaccess.h (limited to 'client') diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt new file mode 100644 index 0000000..186e3fe --- /dev/null +++ b/client/CMakeLists.txt @@ -0,0 +1,14 @@ +project(toynadi_client) + +include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) + +set(common_path "../common/") + +set(toynadiclient_SRCS + ${common_path}/console.cpp + main.cpp + resourceaccess.cpp +) +add_executable(${PROJECT_NAME} ${toynadiclient_SRCS}) +qt5_use_modules(${PROJECT_NAME} Widgets Network) +install(TARGETS ${PROJECT_NAME} DESTINATION bin) diff --git a/client/main.cpp b/client/main.cpp new file mode 100644 index 0000000..2fbb8fe --- /dev/null +++ b/client/main.cpp @@ -0,0 +1,19 @@ + +#include + +#include "common/console.h" +#include "resourceaccess.h" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + new Console("Toy Client"); + ResourceAccess *resAccess = new ResourceAccess("toyResource"); + + QObject::connect(&app, &QCoreApplication::aboutToQuit, + resAccess, &ResourceAccess::close); + + resAccess->open(); + return app.exec(); +} \ No newline at end of file diff --git a/client/resourceaccess.cpp b/client/resourceaccess.cpp new file mode 100644 index 0000000..1eadc34 --- /dev/null +++ b/client/resourceaccess.cpp @@ -0,0 +1,95 @@ +#include "resourceaccess.h" + +#include "common/console.h" + +#include +#include + +ResourceAccess::ResourceAccess(const QString &resourceName, QObject *parent) + : QObject(parent), + m_resourceName(resourceName), + m_socket(new QLocalSocket(this)), + m_startingProcess(false) +{ + Console::main()->log(QString("Starting access to %1").arg(m_socket->serverName())); + connect(m_socket, &QLocalSocket::connected, + this, &ResourceAccess::connected); + connect(m_socket, &QLocalSocket::disconnected, + this, &ResourceAccess::disconnected); + connect(m_socket, SIGNAL(error(QLocalSocket::LocalSocketError)), + this, SLOT(connectionError(QLocalSocket::LocalSocketError))); +} + +ResourceAccess::~ResourceAccess() +{ + +} + +QString ResourceAccess::resourceName() const +{ + return m_resourceName; +} + +bool ResourceAccess::isReady() const +{ + return m_socket->isValid(); +} + +void ResourceAccess::open() +{ + static int count = 0; + if (m_startingProcess) { + QMetaObject::invokeMethod(this, "open", Qt::QueuedConnection); + } + + if (m_socket->isValid()) { + return; + } + + ++count; + if (count > 10000) { + return; + } + + m_socket->setServerName(m_resourceName); + Console::main()->log(QString("Opening: %1").arg(m_socket->serverName())); + //FIXME: race between starting the exec and opening the socket? + m_socket->open(); +} + +void ResourceAccess::close() +{ + Console::main()->log(QString("Closing: %1").arg(m_socket->fullServerName())); + m_socket->close(); +} + +void ResourceAccess::connected() +{ + m_startingProcess = false; + Console::main()->log(QString("Connected: %1").arg(m_socket->fullServerName())); + emit ready(true); +} + +void ResourceAccess::disconnected() +{ + Console::main()->log(QString("Disconnected: %1").arg(m_socket->fullServerName())); + emit ready(false); +} + +void ResourceAccess::connectionError(QLocalSocket::LocalSocketError error) +{ + Console::main()->log(QString("Could not connect to %1 due to error %2").arg(m_socket->serverName()).arg(error)); + if (m_startingProcess) { + QMetaObject::invokeMethod(this, "open", Qt::QueuedConnection); + return; + } + + m_startingProcess = true; + Console::main()->log(QString("Attempting to start resource...")); + QStringList args; + args << m_resourceName; + if (QProcess::startDetached("toynadi_resource", args)) { + m_socket->open(); + } +} + diff --git a/client/resourceaccess.h b/client/resourceaccess.h new file mode 100644 index 0000000..f4c4ad4 --- /dev/null +++ b/client/resourceaccess.h @@ -0,0 +1,33 @@ +#pragma once + +#include +#include + +class ResourceAccess : public QObject +{ + Q_OBJECT + +public: + ResourceAccess(const QString &resourceName, QObject *parent = 0); + ~ResourceAccess(); + + QString resourceName() const; + bool isReady() const; + +public Q_SLOTS: + void open(); + void close(); + +Q_SIGNALS: + void ready(bool isReady); + +private Q_SLOTS: + void connected(); + void disconnected(); + void connectionError(QLocalSocket::LocalSocketError error); + +private: + QString m_resourceName; + QLocalSocket *m_socket; + bool m_startingProcess; +}; -- cgit v1.2.3