2 #include <ossia/detail/small_vector.hpp>
4 #include <ossia/network/exceptions.hpp>
5 #include <ossia/network/oscquery/detail/html_writer.hpp>
6 #include <ossia/network/oscquery/detail/json_writer.hpp>
7 #include <ossia/network/oscquery/detail/outbound_visitor.hpp>
8 #include <ossia/network/oscquery/oscquery_client.hpp>
9 #include <ossia/network/oscquery/oscquery_server.hpp>
15 struct parameter_data;
28 template <
typename OscqueryProtocol>
29 static json_writer::string_t handle_listen(
30 OscqueryProtocol& proto,
const oscquery_server_protocol::connection_handler& hdl,
34 auto clt = proto.find_client(hdl);
39 if(listen_text == detail::text_true())
41 clt->start_listen(std::string(path), node.get_parameter());
44 else if(listen_text == detail::text_false())
46 clt->stop_listen(std::string(path));
62 template <
typename OscqueryProtocol>
64 OscqueryProtocol& proto,
const oscquery_server_protocol::connection_handler& hdl)
66 return [&proto, &hdl](
67 std::string_view path,
68 string_map<std::string>&& parameters) -> ossia::net::server_reply {
70 if(parameters.size() == 0)
72 auto& root = proto.get_device().get_root_node();
79 auto node = ossia::net::find_node(root, path);
88 auto host_it = parameters.find(
"HOST_INFO");
89 if(host_it == parameters.end())
91 auto node = ossia::net::find_node(proto.get_device().get_root_node(), path);
97 auto listen_it = parameters.find(detail::listen());
98 if(listen_it != parameters.end())
100 return handle_listen(proto, hdl, *node, path, listen_it->second);
104 auto html_it = parameters.find(
"HTML");
105 if(html_it != parameters.end())
107 return static_html_builder{}.build_tree(*node);
111 auto add_instance_it = parameters.find(detail::add_node());
112 if(add_instance_it != parameters.end())
114 proto.add_node(path, std::move(parameters));
119 auto rm_instance_it = parameters.find(detail::remove_node());
120 if(rm_instance_it != parameters.end())
123 proto.remove_node(path, rm_instance_it->second);
128 auto rn_instance_it = parameters.find(detail::rename_node());
129 if(rn_instance_it != parameters.end())
132 proto.rename_node(path, rn_instance_it->second);
137 ossia::small_vector<std::string, 5> attributes;
138 for(
const auto& elt : parameters)
140 if(elt.second.empty())
142 attributes.push_back(elt.first);
146 if(!attributes.empty())
153 websocketpp::connection<websocketpp::config::asio>& sockets
154 = *proto.m_websocketServer->impl().get_con_from_hdl(hdl);
155 auto& socket = sockets.get_socket();
157 std::string local_client_ip = socket.local_endpoint().address().to_string();
158 return oscquery::json_writer::query_host_info(
159 proto.get_device().get_name(), proto.get_osc_port(), local_client_ip,
160 proto.get_ws_port());
The node_base class.
Definition: network/base/node.hpp:48
OSCQuery get query-answering logic.
Definition: get_query_parser.hpp:26
static string_t query_attributes(const ossia::net::node_base &node, const StringVec_T &methods)
Reply to a query of attributes : /foo/bar?VALUE&RANGE.
Definition: json_writer.hpp:38
static string_t query_namespace(const ossia::net::node_base &node)
Reply to the namespace query : /foo/bar.
Definition: json_writer_detail.cpp:564
Used when a bad network request is done on a local server.
Definition: network/exceptions.hpp:72
Used when a requested node could not be found.
Definition: network/exceptions.hpp:60