OSSIA
Open Scenario System for Interactive Application
Loading...
Searching...
No Matches
qml_udp_outbound_socket.hpp
1#pragma once
2#include <ossia/network/context.hpp>
3#include <ossia/network/sockets/udp_socket.hpp>
4
5#include <ossia-qt/protocols/utils.hpp>
6
7#include <QJSValue>
8#include <QObject>
9#include <QQmlEngine>
10
11#include <nano_observer.hpp>
12
13#include <verdigris>
14
15namespace ossia::qt
16{
17
18class qml_udp_outbound_socket
19 : public QObject
20 , public Nano::Observer
21 , public protocols_sender
22{
23 W_OBJECT(qml_udp_outbound_socket)
24public:
25 struct state
26 {
27 ossia::net::udp_send_socket socket;
28 std::atomic_bool alive{true};
29
30 state(
31 const ossia::net::outbound_socket_configuration& conf,
32 boost::asio::io_context& ctx)
33 : socket{conf, ctx}
34 {
35 }
36 };
37
38private:
39 std::shared_ptr<state> m_state;
40
41public:
42 ossia::net::udp_send_socket& socket;
43
44 qml_udp_outbound_socket(
45 const ossia::net::outbound_socket_configuration& conf,
46 boost::asio::io_context& ctx)
47 : m_state{std::make_shared<state>(conf, ctx)}
48 , socket{m_state->socket}
49 {
50 }
51
52 ~qml_udp_outbound_socket() { m_state->alive = false; }
53
54 inline boost::asio::io_context& context() noexcept { return m_state->socket.m_context; }
55
56 void open()
57 {
58 if(onClose.isCallable())
59 m_state->socket.on_close.connect<&qml_udp_outbound_socket::on_close>(*this);
60
61 m_state->socket.connect();
62
63 if(onOpen.isCallable())
64 onOpen.call({qjsEngine(this)->newQObject(this)});
65 }
66
67 void close() { m_state->socket.close(); }
68 W_SLOT(close)
69
70 void on_close()
71 {
72 if(!m_state->alive)
73 return;
74 ossia::qt::run_async(this, [=, this] { onClose.call(); }, Qt::AutoConnection);
75 }
76
77 void write(QByteArray buffer)
78 {
79 auto st = m_state;
80 boost::asio::dispatch(st->socket.m_context, [st, buffer] {
81 if(st->alive)
82 st->socket.write(buffer.data(), buffer.size());
83 });
84 }
85 W_SLOT(write)
86
87 void osc(QByteArray address, QJSValueList values) { this->send_osc(address, values); }
88 W_SLOT(osc)
89
90 QJSValue onOpen;
91 QJSValue onClose;
92 QJSValue onError;
93};
94}
Definition qml_device.cpp:43