summaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorAaron Seigo <aseigo@kde.org>2014-11-20 16:28:31 +0100
committerAaron Seigo <aseigo@kde.org>2014-11-20 16:28:31 +0100
commited20c3082d4fd5e90703e4d6c37093dcecb5cfd1 (patch)
treec4ad96fde99c38ee66c0ba7d0f8231bc5326b3d6 /client
downloadsink-ed20c3082d4fd5e90703e4d6c37093dcecb5cfd1.tar.gz
sink-ed20c3082d4fd5e90703e4d6c37093dcecb5cfd1.zip
sketch in the client/resource model
Diffstat (limited to 'client')
-rw-r--r--client/CMakeLists.txt14
-rw-r--r--client/main.cpp19
-rw-r--r--client/resourceaccess.cpp95
-rw-r--r--client/resourceaccess.h33
4 files changed, 161 insertions, 0 deletions
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 @@
1project(toynadi_client)
2
3include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
4
5set(common_path "../common/")
6
7set(toynadiclient_SRCS
8 ${common_path}/console.cpp
9 main.cpp
10 resourceaccess.cpp
11)
12add_executable(${PROJECT_NAME} ${toynadiclient_SRCS})
13qt5_use_modules(${PROJECT_NAME} Widgets Network)
14install(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 @@
1
2#include <QApplication>
3
4#include "common/console.h"
5#include "resourceaccess.h"
6
7int main(int argc, char *argv[])
8{
9 QApplication app(argc, argv);
10
11 new Console("Toy Client");
12 ResourceAccess *resAccess = new ResourceAccess("toyResource");
13
14 QObject::connect(&app, &QCoreApplication::aboutToQuit,
15 resAccess, &ResourceAccess::close);
16
17 resAccess->open();
18 return app.exec();
19} \ 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 @@
1#include "resourceaccess.h"
2
3#include "common/console.h"
4
5#include <QDebug>
6#include <QProcess>
7
8ResourceAccess::ResourceAccess(const QString &resourceName, QObject *parent)
9 : QObject(parent),
10 m_resourceName(resourceName),
11 m_socket(new QLocalSocket(this)),
12 m_startingProcess(false)
13{
14 Console::main()->log(QString("Starting access to %1").arg(m_socket->serverName()));
15 connect(m_socket, &QLocalSocket::connected,
16 this, &ResourceAccess::connected);
17 connect(m_socket, &QLocalSocket::disconnected,
18 this, &ResourceAccess::disconnected);
19 connect(m_socket, SIGNAL(error(QLocalSocket::LocalSocketError)),
20 this, SLOT(connectionError(QLocalSocket::LocalSocketError)));
21}
22
23ResourceAccess::~ResourceAccess()
24{
25
26}
27
28QString ResourceAccess::resourceName() const
29{
30 return m_resourceName;
31}
32
33bool ResourceAccess::isReady() const
34{
35 return m_socket->isValid();
36}
37
38void ResourceAccess::open()
39{
40 static int count = 0;
41 if (m_startingProcess) {
42 QMetaObject::invokeMethod(this, "open", Qt::QueuedConnection);
43 }
44
45 if (m_socket->isValid()) {
46 return;
47 }
48
49 ++count;
50 if (count > 10000) {
51 return;
52 }
53
54 m_socket->setServerName(m_resourceName);
55 Console::main()->log(QString("Opening: %1").arg(m_socket->serverName()));
56 //FIXME: race between starting the exec and opening the socket?
57 m_socket->open();
58}
59
60void ResourceAccess::close()
61{
62 Console::main()->log(QString("Closing: %1").arg(m_socket->fullServerName()));
63 m_socket->close();
64}
65
66void ResourceAccess::connected()
67{
68 m_startingProcess = false;
69 Console::main()->log(QString("Connected: %1").arg(m_socket->fullServerName()));
70 emit ready(true);
71}
72
73void ResourceAccess::disconnected()
74{
75 Console::main()->log(QString("Disconnected: %1").arg(m_socket->fullServerName()));
76 emit ready(false);
77}
78
79void ResourceAccess::connectionError(QLocalSocket::LocalSocketError error)
80{
81 Console::main()->log(QString("Could not connect to %1 due to error %2").arg(m_socket->serverName()).arg(error));
82 if (m_startingProcess) {
83 QMetaObject::invokeMethod(this, "open", Qt::QueuedConnection);
84 return;
85 }
86
87 m_startingProcess = true;
88 Console::main()->log(QString("Attempting to start resource..."));
89 QStringList args;
90 args << m_resourceName;
91 if (QProcess::startDetached("toynadi_resource", args)) {
92 m_socket->open();
93 }
94}
95
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 @@
1#pragma once
2
3#include <QLocalSocket>
4#include <QObject>
5
6class ResourceAccess : public QObject
7{
8 Q_OBJECT
9
10public:
11 ResourceAccess(const QString &resourceName, QObject *parent = 0);
12 ~ResourceAccess();
13
14 QString resourceName() const;
15 bool isReady() const;
16
17public Q_SLOTS:
18 void open();
19 void close();
20
21Q_SIGNALS:
22 void ready(bool isReady);
23
24private Q_SLOTS:
25 void connected();
26 void disconnected();
27 void connectionError(QLocalSocket::LocalSocketError error);
28
29private:
30 QString m_resourceName;
31 QLocalSocket *m_socket;
32 bool m_startingProcess;
33};