2#include <ossia/network/context.hpp>
3#include <ossia/network/sockets/tcp_socket.hpp>
5#include <ossia-qt/protocols/utils.hpp>
11#include <nano_observer.hpp>
17class qml_tcp_connection
19 ,
public Nano::Observer
21 W_OBJECT(qml_tcp_connection)
23 explicit qml_tcp_connection(
24 ossia::net::tcp_listener listener, boost::asio::io_context& ctx)
26 , m_listener{std::move(listener)}
29 inline boost::asio::io_context& context() noexcept {
return m_context; }
31 void write(QByteArray buffer)
34 { m_listener.write(boost::asio::const_buffer(buffer.data(), buffer.size())); });
38 void close(QByteArray buffer)
40 run_on_asio_thread({ m_listener.close(); });
44 void receive(QJSValue v)
52 auto& socket = m_listener.m_socket;
53 socket.async_read_some(
54 boost::asio::buffer(m_data,
sizeof(m_data)),
56 = QPointer{
this}](boost::system::error_code ec, std::size_t bytes_transferred) {
59 auto buf = QByteArray(self->m_data, bytes_transferred);
60 ossia::qt::run_async(self.get(), [self, buf] {
63 if(self->onBytes.isCallable())
65 self->onBytes.call({qjsEngine(self.get())->toScriptValue(buf)});
67 }, Qt::AutoConnection);
72 ossia::qt::run_async(self.get(), [self] {
73 if(self && self->onClose.isCallable())
82 W_PROPERTY(QJSValue, onClose W_MEMBER onClose);
85 boost::asio::io_context& m_context;
86 ossia::net::tcp_listener m_listener;
90class qml_tcp_inbound_socket
92 ,
public Nano::Observer
94 W_OBJECT(qml_tcp_inbound_socket)
96 qml_tcp_inbound_socket(
97 const ossia::net::inbound_socket_configuration& conf, boost::asio::io_context& ctx)
102 inline boost::asio::io_context& context() noexcept {
return server.m_context; }
108 if(onOpen.isCallable())
109 onOpen.call({qjsEngine(
this)->newQObject(
this)});
115 server.m_acceptor.close();
116 if(onClose.isCallable())
124 run_on_qt_thread({ onClose.call(); });
130 QJSValue onConnection;
131 ossia::net::tcp_server server;
136 server.m_acceptor.async_accept(
137 [self = QPointer{
this}](
138 boost::system::error_code ec, ossia::net::tcp_server::proto::socket socket) {
143 ossia::qt::run_async(self.get(), [self, socket = std::move(socket)]()
mutable {
144 auto conn = new qml_tcp_connection{
145 ossia::net::tcp_listener{std::move(socket)}, self->server.m_context};
147 if(self->onConnection.isCallable())
149 self->onConnection.call({qjsEngine(self.get())->newQObject(conn)});
157 std::atomic_bool m_open{};
Definition qml_device.cpp:43