OSSIA
Open Scenario System for Interactive Application
Loading...
Searching...
No Matches
qml_unix_outbound_socket.hpp
1#pragma once
2#include <ossia/network/context.hpp>
3#if defined(BOOST_ASIO_HAS_LOCAL_SOCKETS)
4#include <ossia/network/sockets/unix_socket.hpp>
5
6#include <ossia-qt/protocols/utils.hpp>
7
8#include <QJSValue>
9#include <QObject>
10#include <QQmlEngine>
11
12#include <nano_observer.hpp>
13
14#include <verdigris>
15
16namespace ossia::qt
17{
18class qml_unix_datagram_outbound_socket
19 : public QObject
20 , public Nano::Observer
21 , public protocols_sender
22{
23 W_OBJECT(qml_unix_datagram_outbound_socket)
24public:
25 qml_unix_datagram_outbound_socket(
26 const ossia::net::fd_configuration& conf, boost::asio::io_context& ctx)
27 : socket{conf, ctx}
28 {
29 }
30 inline boost::asio::io_context& context() noexcept { return socket.m_context; }
31
32 void open()
33 {
34 if(onClose.isCallable())
35 socket.on_close.connect<&qml_unix_datagram_outbound_socket::on_close>(this);
36
37 socket.connect();
38
39 if(onOpen.isCallable())
40
41 onOpen.call({qjsEngine(this)->newQObject(this)});
42 }
43
44 void close() { socket.close(); }
45 W_SLOT(close)
46
47 void on_close()
48 {
49 run_on_qt_thread({ onClose.call(); });
50 }
51
52 void write(QByteArray buffer)
53 {
54 run_on_asio_thread({ socket.write(buffer.data(), buffer.size()); });
55 }
56 W_SLOT(write)
57
58 void osc(QByteArray address, QJSValueList values) { this->send_osc(address, values); }
59 W_SLOT(osc)
60
61 QJSValue onOpen;
62 QJSValue onClose;
63 QJSValue onError;
64
65 ossia::net::unix_datagram_socket socket;
66};
67
68class qml_unix_stream_outbound_socket
69 : public QObject
70 , public Nano::Observer
71 , public protocols_sender
72{
73 W_OBJECT(qml_unix_stream_outbound_socket)
74public:
75 qml_unix_stream_outbound_socket(
76 const ossia::net::fd_configuration& conf, boost::asio::io_context& ctx)
77 : socket{conf, ctx}
78 {
79 }
80 inline boost::asio::io_context& context() noexcept { return socket.m_context; }
81
82 void open()
83 {
84 try
85 {
86 if(onOpen.isCallable())
87 socket.on_open.connect<&qml_unix_stream_outbound_socket::on_open>(this);
88 if(onClose.isCallable())
89 socket.on_close.connect<&qml_unix_stream_outbound_socket::on_close>(this);
90 if(onError.isCallable())
91 socket.on_fail.connect<&qml_unix_stream_outbound_socket::on_fail>(this);
92 socket.connect();
93 }
94 catch(const std::exception& e)
95 {
96 if(onError.isCallable())
97 {
98 onError.call({QString::fromStdString(e.what())});
99 }
100 }
101 }
102
103 void write(QByteArray buffer)
104 {
105 run_on_asio_thread({ socket.write(buffer.data(), buffer.size()); });
106 }
107 W_SLOT(write)
108
109 void close() { socket.close(); }
110 W_SLOT(close)
111
112 void on_open()
113 {
114 run_on_qt_thread({ onOpen.call({qjsEngine(this)->newQObject(this)}); });
115 }
116 void on_fail()
117 {
118 run_on_qt_thread({ onError.call(); });
119 }
120 void on_close()
121 {
122 run_on_qt_thread({ onClose.call(); });
123 }
124
125 void osc(QByteArray address, QJSValueList values) { this->send_osc(address, values); }
126 W_SLOT(osc)
127
128 QJSValue onOpen;
129 QJSValue onClose;
130 QJSValue onError;
131
132 ossia::net::unix_stream_client socket;
133};
134
135}
136#endif
Definition qml_device.cpp:43