OSSIA
Open Scenario System for Interactive Application
Loading...
Searching...
No Matches
qml_tcp_outbound_socket.hpp
1#pragma once
2#include <ossia/network/context.hpp>
3#include <ossia/network/sockets/tcp_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{
17class qml_tcp_outbound_socket
18 : public QObject
19 , public Nano::Observer
20 , public protocols_sender
21{
22 W_OBJECT(qml_tcp_outbound_socket)
23public:
24 qml_tcp_outbound_socket(
25 const ossia::net::outbound_socket_configuration& conf,
26 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 try
35 {
36 if(onOpen.isCallable())
37 socket.on_open.connect<&qml_tcp_outbound_socket::on_open>(this);
38 if(onClose.isCallable())
39 socket.on_close.connect<&qml_tcp_outbound_socket::on_close>(this);
40 if(onError.isCallable())
41 socket.on_fail.connect<&qml_tcp_outbound_socket::on_fail>(this);
42 socket.connect();
43 }
44 catch(const std::exception& e)
45 {
46 if(onError.isCallable())
47 {
48 onError.call({QString::fromStdString(e.what())});
49 }
50 }
51 }
52
53 void write(QByteArray buffer)
54 {
55 run_on_asio_thread({ socket.write(buffer.data(), buffer.size()); });
56 }
57 W_SLOT(write)
58
59 void close() { socket.close(); }
60 W_SLOT(close)
61
62 void on_open()
63 {
64 run_on_qt_thread({ onOpen.call({qjsEngine(this)->newQObject(this)}); });
65 }
66 void on_fail()
67 {
68 run_on_qt_thread({ onError.call(); });
69 }
70 void on_close()
71 {
72 run_on_qt_thread({ onClose.call(); });
73 }
74
75 void osc(QByteArray address, QJSValueList values) { this->send_osc(address, values); }
76 W_SLOT(osc)
77
78 QJSValue onOpen;
79 QJSValue onClose;
80 QJSValue onError;
81 QJSValue onBytes;
82
83 ossia::net::tcp_client socket;
84};
85
86}
Definition qml_device.cpp:43