OSSIA
Open Scenario System for Interactive Application
Loading...
Searching...
No Matches
qml_ws_inbound_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{
17class qml_websocket_inbound_socket
18 : public QObject
19 , public Nano::Observer
20{
21 W_OBJECT(qml_websocket_inbound_socket)
22public:
23 struct state
24 {
25 boost::asio::io_context& context;
26 std::atomic_bool alive{true};
27
28 state(boost::asio::io_context& ctx)
29 : context{ctx}
30 {
31 }
32 };
33
34 qml_websocket_inbound_socket() { }
35
36 ~qml_websocket_inbound_socket()
37 {
38 if(m_state)
39 {
40 m_state->alive = false;
41 close();
42 }
43 }
44
45 bool isOpen() const noexcept { return m_state != nullptr; }
46
47 void open(
48 const ossia::net::inbound_socket_configuration& conf,
49 boost::asio::io_context& ctx)
50 {
51 m_state = std::make_shared<state>(ctx);
52
53 // FIXME
54 // WebSocket server implementation simplified for now
55 if(onOpen.isCallable())
56 onOpen.call({qjsEngine(this)->newQObject(this)});
57 }
58
59 void close()
60 {
61 if(!m_state)
62 return;
63 if(onClose.isCallable())
64 onClose.call();
65 }
66 W_SLOT(close)
67
68 QJSValue onOpen;
69 QJSValue onClose;
70 QJSValue onError;
71 QJSValue onConnection;
72 QJSValue onBytes;
73 QJSValue onTextMessage;
74 QJSValue onBinaryMessage;
75
76private:
77 std::shared_ptr<state> m_state;
78};
79}
Definition qml_device.cpp:43