OSSIA
Open Scenario System for Interactive Application
http_protocol.hpp
1 #pragma once
2 #include <ossia/network/base/protocol.hpp>
3 #include <ossia/network/generic/wrapped_parameter.hpp>
4 
5 #include <ossia-qt/js_utilities.hpp>
6 
7 #include <QByteArray>
8 #include <QJSValue>
9 #include <QList>
10 #include <QObject>
11 
12 #include <verdigris>
13 
14 class QQmlEngine;
15 class QQmlComponent;
16 class QNetworkAccessManager;
17 class QNetworkReply;
18 
19 namespace ossia::net
20 {
21 
22 struct http_parameter_data_base
23 {
24  http_parameter_data_base() = default;
25  http_parameter_data_base(const http_parameter_data_base&) = default;
26  http_parameter_data_base(http_parameter_data_base&&) = default;
27  http_parameter_data_base& operator=(const http_parameter_data_base&) = default;
28  http_parameter_data_base& operator=(http_parameter_data_base&&) = default;
29  http_parameter_data_base(const QJSValue& val)
30  {
31  auto r = val.property("request");
32  if(r.isString())
33  {
34  request = r.toString();
35 
36  auto a = val.property("answer");
37  if(a.isCallable())
38  {
39  answer = a;
40  }
41  }
42  }
43 
44  QString request;
45  QJSValue answer;
46 };
47 
48 struct http_parameter_data
49  : public parameter_data
50  , public http_parameter_data_base
51 {
52  using base_data_type = http_parameter_data_base;
53  http_parameter_data() = default;
54  http_parameter_data(const http_parameter_data&) = default;
55  http_parameter_data(http_parameter_data&&) = default;
56  http_parameter_data& operator=(const http_parameter_data&) = default;
57  http_parameter_data& operator=(http_parameter_data&&) = default;
58 
59  http_parameter_data(const std::string& name)
60  : parameter_data{name}
61  {
62  }
63 
64  http_parameter_data(const QJSValue& val)
65  : parameter_data{ossia::qt::make_parameter_data(val)}
66  , http_parameter_data_base{val}
67  {
68  }
69 
70  bool valid() const noexcept { return !request.isEmpty() || type; }
71 };
72 
73 using http_parameter = wrapped_parameter<http_parameter_data>;
74 using http_node = ossia::net::wrapped_node<http_parameter_data, http_parameter>;
75 class OSSIA_EXPORT http_protocol final
76  : public QObject
78 {
79  W_OBJECT(http_protocol)
80 
81 public:
82  http_protocol(QByteArray code);
83 
84  http_protocol(const http_protocol&) = delete;
85  http_protocol(http_protocol&&) = delete;
86  http_protocol& operator=(const http_protocol&) = delete;
87  http_protocol& operator=(http_protocol&&) = delete;
88 
89  ~http_protocol() override;
90 
91  bool update(ossia::net::node_base& node_base) override;
92 
93  bool pull(ossia::net::parameter_base& parameter_base) override;
94 
95  bool
96  push(const ossia::net::parameter_base& parameter_base, const ossia::value& v) override;
97  bool push_raw(const ossia::net::full_parameter_data& parameter_base) override;
98 
99  bool observe(ossia::net::parameter_base& parameter_base, bool enable) override;
100 
101  void set_device(ossia::net::device_base& dev) override;
102 
103  static http_parameter_data read_data(const QJSValue& js) { return js; }
104 
105 public:
106  void sig_push(const http_parameter* arg_1, const ossia::value& v)
107  E_SIGNAL(OSSIA_EXPORT, sig_push, arg_1, v)
108 
109  private : void slot_push(const http_parameter*, const ossia::value& v);
110  W_SLOT(slot_push);
111 
112 private:
113  void apply_reply(QJSValue);
114 
115  QQmlEngine* m_engine{};
116  QQmlComponent* m_component{};
117 
118  QNetworkAccessManager* m_access{};
119 
120  QByteArray m_code;
121  ossia::net::device_base* m_device{};
122  ossia::hash_map<QNetworkReply*, const http_parameter*> m_replies;
123 };
124 using http_device = ossia::net::wrapped_device<http_node, http_protocol>;
125 class OSSIA_EXPORT HTTP : public QObject
126 {
127 };
128 }
129 
130 Q_DECLARE_METATYPE(ossia::net::http_parameter*)
131 W_REGISTER_ARGTYPE(ossia::net::http_parameter*)
132 W_REGISTER_ARGTYPE(const ossia::net::http_parameter*)
Root of a device tree.
Definition: ossia/network/base/device.hpp:58
The node_base class.
Definition: network/base/node.hpp:48
The parameter_base class.
Definition: ossia/network/base/parameter.hpp:48
The protocol_base class.
Definition: protocol.hpp:40
The value class.
Definition: value.hpp:173
Definition: git_info.h:7
Full information about a parameter.
Definition: parameter_data.hpp:61