OSSIA
Open Scenario System for Interactive Application
Loading...
Searching...
No Matches
qml_ws_outbound_socket.hpp
1#pragma once
2#include <ossia/network/context.hpp>
3#include <ossia/network/sockets/udp_socket.hpp>
4#include <ossia/network/sockets/websocket_client.hpp>
5
6#include <ossia-qt/protocols/utils.hpp>
7
8#include <QJSValue>
9#include <QObject>
10#include <QQmlEngine>
11
12#include <nano_observer.hpp>
13
14#include <verdigris>
15
16namespace ossia::qt
17{
18class qml_websocket_outbound_socket
19 : public QObject
20 , public Nano::Observer
21 , public protocols_sender
22{
23 W_OBJECT(qml_websocket_outbound_socket)
24public:
25 qml_websocket_outbound_socket(
26 const ossia::net::outbound_socket_configuration& conf,
27 boost::asio::io_context& ctx)
28 : m_url{"ws://" + conf.host + ":" + std::to_string(conf.port)} // FIXME wss
29 , m_client{ctx, [this](auto&&... args) { on_message(args...); }}
30 {
31 if(onOpen.isCallable())
32 m_client.on_open.connect<&qml_websocket_outbound_socket::on_open>(this);
33 if(onClose.isCallable())
34 m_client.on_close.connect<&qml_websocket_outbound_socket::on_close>(this);
35 if(onError.isCallable())
36 m_client.on_fail.connect<&qml_websocket_outbound_socket::on_fail>(this);
37 }
38 inline boost::asio::io_context& context() noexcept { return m_client.context(); }
39
40 void open() { m_client.connect(m_url); }
41
42 void on_message(auto hdl, auto opcode, const std::string& msg)
43 {
44 if(opcode == websocketpp::frame::opcode::text && onTextMessage.isCallable())
45 {
46 onTextMessage.call({QString::fromStdString(msg)});
47 }
48 else if(opcode == websocketpp::frame::opcode::binary && onBinaryMessage.isCallable())
49 {
50 onBinaryMessage.call(
51 {qjsEngine(this)->toScriptValue(QByteArray(msg.data(), msg.size()))});
52 }
53 }
54
55 void on_open()
56 {
57 run_on_qt_thread({ onOpen.call({qjsEngine(this)->newQObject(this)}); });
58 }
59 void on_fail()
60 {
61 run_on_qt_thread({ onError.call(); });
62 }
63 void on_close()
64 {
65 run_on_qt_thread({ onClose.call(); });
66 }
67
68 void write(QString message)
69 {
70 run_on_asio_thread({ m_client.send_message(message.toStdString()); });
71 }
72 W_SLOT(write)
73
74 void writeBinary(QByteArray buffer)
75 {
76 run_on_asio_thread({
77 m_client.send_binary_message(std::string_view(buffer.data(), buffer.size()));
78 });
79 }
80 W_SLOT(writeBinary)
81
82 void close()
83 {
84 m_client.stop();
85 if(onClose.isCallable())
86 onClose.call();
87 }
88 W_SLOT(close)
89
90 // FIXME
91 // void osc(QByteArray address, QJSValueList values) { this->send_osc(address, values); }
92 // W_SLOT(osc)
93
94 QJSValue onOpen;
95 QJSValue onClose;
96 QJSValue onError;
97 QJSValue onTextMessage;
98 QJSValue onBinaryMessage;
99
100private:
101 std::string m_url;
103};
104
105}
Low-level Websocket client.
Definition websocket_client.hpp:18
Definition qml_device.cpp:43