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