Skip to content

Commit 06df262

Browse files
Refactor user defined handlers
1 parent 83d086d commit 06df262

File tree

6 files changed

+78
-31
lines changed

6 files changed

+78
-31
lines changed

Development/nmos-cpp-node/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ int main(int argc, char* argv[])
138138
.on_request_authorization_code(nmos::experimental::make_request_authorization_code_handler(gate)); // may be omitted, only required for OAuth client which is using the Authorization Code Flow to obtain the access token
139139
}
140140

141-
nmos::experimental::control_protocol_state control_protocol_state(node_implementation.get_lost_packet_method_handler, node_implementation.get_late_packet_method_handler, node_implementation.reset_packet_counters_method_handler, node_implementation.control_protocol_property_changed);
141+
nmos::experimental::control_protocol_state control_protocol_state(node_implementation.get_lost_packet_counters, node_implementation.get_late_packet_counters, node_implementation.reset_packet_counters, node_implementation.control_protocol_property_changed);
142142
if (0 <= nmos::fields::control_protocol_ws_port(node_model.settings))
143143
{
144144
node_implementation

Development/nmos-cpp-node/node_implementation.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1715,9 +1715,9 @@ nmos::control_protocol_property_changed_handler make_node_implementation_control
17151715
}
17161716

17171717
// Example Receiver Status Monitor callback for get_lost_packets method
1718-
nmos::experimental::control_protocol_method_handler make_node_implementation_get_lost_packet_method_handler()
1718+
nmos::get_lost_packet_counters_handler make_node_implementation_get_lost_packet_counters_handler()
17191719
{
1720-
return [&](nmos::resources& resources, const nmos::resource& resource, const web::json::value& arguments, bool is_deprecated, slog::base_gate& gate)
1720+
return [&]()
17211721
{
17221722
// Implement polling of lost packet count here
17231723
uint16_t lost_packet_count(0);
@@ -1726,9 +1726,9 @@ nmos::experimental::control_protocol_method_handler make_node_implementation_get
17261726
}
17271727

17281728
// Example Receiver Status Monitor callback for get_late_packets method
1729-
nmos::experimental::control_protocol_method_handler make_node_implementation_get_late_packet_method_handler()
1729+
nmos::get_late_packet_counters_handler make_node_implementation_get_late_packet_counters_handler()
17301730
{
1731-
return [&](nmos::resources& resources, const nmos::resource& resource, const web::json::value& arguments, bool is_deprecated, slog::base_gate& gate)
1731+
return [&]()
17321732
{
17331733
// Implement polling of late packet count here
17341734
uint16_t late_packet_count(0);
@@ -1737,9 +1737,9 @@ nmos::experimental::control_protocol_method_handler make_node_implementation_get
17371737
}
17381738

17391739
// Example Receiver Status Monitor callback for reset_packet_counters method
1740-
nmos::experimental::control_protocol_method_handler make_node_implementation_reset_packet_counters_method_handler()
1740+
nmos::reset_packet_counters_handler make_node_implementation_reset_packet_counters_handler()
17411741
{
1742-
return [&](nmos::resources& resources, const nmos::resource& resource, const web::json::value& arguments, bool is_deprecated, slog::base_gate& gate)
1742+
return [&]()
17431743
{
17441744
// Implement reset of lost and late packet counters
17451745
return nmos::details::make_nc_method_result({ nmos::nc_method_status::ok });
@@ -1904,7 +1904,7 @@ nmos::experimental::node_implementation make_node_implementation(nmos::node_mode
19041904
.on_validate_channelmapping_output_map(make_node_implementation_map_validator()) // may be omitted if not required
19051905
.on_channelmapping_activated(make_node_implementation_channelmapping_activation_handler(gate))
19061906
.on_control_protocol_property_changed(make_node_implementation_control_protocol_property_changed_handler(gate)) // may be omitted if IS-12 not required
1907-
.on_get_lost_packet(make_node_implementation_get_lost_packet_method_handler())
1908-
.on_get_late_packet(make_node_implementation_get_late_packet_method_handler())
1909-
.on_reset_packet_counters(make_node_implementation_reset_packet_counters_method_handler());
1907+
.on_get_lost_packet_counters(make_node_implementation_get_lost_packet_counters_handler())
1908+
.on_get_late_packet_counters(make_node_implementation_get_late_packet_counters_handler())
1909+
.on_reset_packet_counters(make_node_implementation_reset_packet_counters_handler());
19101910
}

Development/nmos/control_protocol_handlers.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ namespace nmos
3636
// this callback should not throw exceptions, as the relevant property will already has been changed and those changes will not be rolled back
3737
typedef std::function<void(const nmos::resource& resource, const utility::string_t& property_name, int index)> control_protocol_property_changed_handler;
3838

39+
// Receiver status callbacks
40+
// these callbacks should not throw exceptions
41+
typedef std::function<web::json::value(void)> get_lost_packet_counters_handler;
42+
typedef std::function<web::json::value(void)> get_late_packet_counters_handler;
43+
typedef std::function<web::json::value(void)> reset_packet_counters_handler;
44+
3945
namespace experimental
4046
{
4147
// control method handler definition

Development/nmos/control_protocol_state.cpp

Lines changed: 55 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "nmos/control_protocol_state.h"
22

3+
#include "cpprest/http_utils.h"
34
#include "nmos/control_protocol_methods.h"
45
#include "nmos/control_protocol_resource.h"
56

@@ -178,30 +179,69 @@ namespace nmos
178179
return get_datatype(resources, resource, arguments, is_deprecated, get_control_protocol_datatype_descriptor, gate);
179180
};
180181
}
181-
nmos::experimental::control_protocol_method_handler make_nc_get_lost_packets(experimental::control_protocol_method_handler get_lost_packet_method_handler)
182+
nmos::experimental::control_protocol_method_handler make_nc_get_lost_packet_counters_handler(get_lost_packet_counters_handler get_lost_packet_counters)
182183
{
183-
return [get_lost_packet_method_handler](nmos::resources& resources, const nmos::resource& resource, const web::json::value& arguments, bool is_deprecated, slog::base_gate& gate)
184+
return [get_lost_packet_counters](nmos::resources& resources, const nmos::resource& resource, const web::json::value& arguments, bool is_deprecated, slog::base_gate& gate)
184185
{
185-
return get_lost_packet_method_handler(resources, resource, arguments, is_deprecated, gate);
186+
// Delegate to user defined handler
187+
auto result = nmos::details::make_nc_method_result_error({ nmos::nc_method_status::method_not_implemented }, U("not implemented"));
188+
189+
if (get_lost_packet_counters)
190+
{
191+
result = get_lost_packet_counters();
192+
193+
const auto& status = nmos::fields::nc::status(result);
194+
if (!web::http::is_error_status_code((web::http::status_code)status) && is_deprecated)
195+
{
196+
return nmos::details::make_nc_method_result({ nmos::nc_method_status::method_deprecated }, nmos::fields::nc::value(result));
197+
}
198+
}
199+
return result;
186200
};
187201
}
188-
nmos::experimental::control_protocol_method_handler make_nc_get_late_packets(experimental::control_protocol_method_handler get_late_packet_method_handler)
202+
nmos::experimental::control_protocol_method_handler make_nc_get_late_packet_counters_handler(get_late_packet_counters_handler get_late_packet_counters)
189203
{
190-
return [get_late_packet_method_handler](nmos::resources& resources, const nmos::resource& resource, const web::json::value& arguments, bool is_deprecated, slog::base_gate& gate)
204+
return [get_late_packet_counters](nmos::resources& resources, const nmos::resource& resource, const web::json::value& arguments, bool is_deprecated, slog::base_gate& gate)
191205
{
192-
return get_late_packet_method_handler(resources, resource, arguments, is_deprecated, gate);
206+
// Delegate to user defined handler
207+
auto result = nmos::details::make_nc_method_result_error({ nmos::nc_method_status::method_not_implemented }, U("not implemented"));
208+
209+
if (get_late_packet_counters)
210+
{
211+
result = get_late_packet_counters();
212+
213+
const auto& status = nmos::fields::nc::status(result);
214+
if (!web::http::is_error_status_code((web::http::status_code)status) && is_deprecated)
215+
{
216+
return nmos::details::make_nc_method_result({ nmos::nc_method_status::method_deprecated }, nmos::fields::nc::value(result));
217+
}
218+
}
219+
return result;
193220
};
194221
}
195-
nmos::experimental::control_protocol_method_handler make_nc_reset_packet_counters(experimental::control_protocol_method_handler reset_packet_counters_method_handler)
222+
nmos::experimental::control_protocol_method_handler make_nc_reset_packet_counters_handler(reset_packet_counters_handler reset_packet_counters)
196223
{
197-
return [reset_packet_counters_method_handler](nmos::resources& resources, const nmos::resource& resource, const web::json::value& arguments, bool is_deprecated, slog::base_gate& gate)
224+
return [reset_packet_counters](nmos::resources& resources, const nmos::resource& resource, const web::json::value& arguments, bool is_deprecated, slog::base_gate& gate)
198225
{
199-
return reset_packet_counters_method_handler(resources, resource, arguments, is_deprecated, gate);
226+
// Delegate to user defined handler
227+
auto result = nmos::details::make_nc_method_result_error({ nmos::nc_method_status::method_not_implemented }, U("not implemented"));
228+
229+
if (reset_packet_counters)
230+
{
231+
result = reset_packet_counters();
232+
233+
const auto& status = nmos::fields::nc::status(result);
234+
if (!web::http::is_error_status_code((web::http::status_code)status) && is_deprecated)
235+
{
236+
return nmos::details::make_nc_method_result({ nmos::nc_method_status::method_deprecated }, nmos::fields::nc::value(result));
237+
}
238+
}
239+
return result;
200240
};
201241
}
202242
}
203243

204-
control_protocol_state::control_protocol_state(experimental::control_protocol_method_handler get_lost_packet_method_handler, experimental::control_protocol_method_handler get_late_packet_method_handler, experimental::control_protocol_method_handler reset_packet_couter_method_handler, control_protocol_property_changed_handler property_changed)
244+
control_protocol_state::control_protocol_state(get_lost_packet_counters_handler get_lost_packet_counters, get_late_packet_counters_handler get_late_packet_counters, reset_packet_counters_handler reset_packet_counters, control_protocol_property_changed_handler property_changed)
205245
{
206246
using web::json::value;
207247

@@ -336,9 +376,9 @@ namespace nmos
336376
to_methods_vector(make_nc_receiver_monitor_methods(),
337377
{
338378
// link NcReceiverMonitor method_ids with method functions
339-
{ nc_receiver_monitor_get_lost_packets_method_id, details::make_nc_get_lost_packets(get_lost_packet_method_handler)},
340-
{ nc_receiver_monitor_get_late_packets_method_id, details::make_nc_get_late_packets(get_late_packet_method_handler)},
341-
{ nc_receiver_monitor_reset_packet_counters_method_id, details::make_nc_reset_packet_counters(reset_packet_couter_method_handler)}
379+
{ nc_receiver_monitor_get_lost_packet_counters_method_id, details::make_nc_get_lost_packet_counters_handler(get_lost_packet_counters)},
380+
{ nc_receiver_monitor_get_late_packet_counters_method_id, details::make_nc_get_late_packet_counters_handler(get_late_packet_counters)},
381+
{ nc_receiver_monitor_reset_packet_counters_method_id, details::make_nc_reset_packet_counters_handler(reset_packet_counters)}
342382
}),
343383
// NcReceiverMonitor events
344384
to_vector(make_nc_receiver_monitor_events())) }
@@ -424,7 +464,8 @@ namespace nmos
424464
{ U("NcLinkStatus"), {make_nc_link_status_datatype() } },
425465
{ U("NcSynchronizationStatus"), {make_nc_synchronization_status_datatype() } },
426466
{ U("NcStreamStatus"), {make_nc_stream_status_datatype() } },
427-
{ U("NcMethodResultCounter"), {make_nc_method_result_counter_datatype() } }
467+
{ U("NcPacketCounter"), {make_nc_packet_counter_datatype() } },
468+
{ U("NcMethodResultCounters"), {make_nc_method_result_counters_datatype() } }
428469
};
429470
}
430471

Development/nmos/control_protocol_state.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ namespace nmos
5858
nmos::read_lock read_lock() const { return nmos::read_lock{ mutex }; }
5959
nmos::write_lock write_lock() const { return nmos::write_lock{ mutex }; }
6060

61-
control_protocol_state(experimental::control_protocol_method_handler get_lost_packet_method_handler = nullptr, experimental::control_protocol_method_handler get_late_packet_method_handler = nullptr, experimental::control_protocol_method_handler reset_packet_couter_method_handler = nullptr, control_protocol_property_changed_handler property_changed = nullptr);
61+
control_protocol_state(get_lost_packet_counters_handler get_lost_packet_counters = nullptr, get_late_packet_counters_handler get_late_packet_counters = nullptr, reset_packet_counters_handler reset_packet_counters = nullptr, control_protocol_property_changed_handler property_changed = nullptr);
6262

6363
// insert control class descriptor, false if class descriptor already inserted
6464
bool insert(const experimental::control_class_descriptor& control_class_descriptor);

Development/nmos/node_server.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,9 @@ namespace nmos
8282
node_implementation& on_get_control_datatype_descriptor(nmos::get_control_protocol_datatype_descriptor_handler get_control_protocol_datatype_descriptor) { this->get_control_protocol_datatype_descriptor = std::move(get_control_protocol_datatype_descriptor); return *this; }
8383
node_implementation& on_get_control_protocol_method_descriptor(nmos::get_control_protocol_method_descriptor_handler get_control_protocol_method_descriptor) { this->get_control_protocol_method_descriptor = std::move(get_control_protocol_method_descriptor); return *this; }
8484
node_implementation& on_control_protocol_property_changed(nmos::control_protocol_property_changed_handler control_protocol_property_changed) { this->control_protocol_property_changed = std::move(control_protocol_property_changed); return *this; }
85-
node_implementation& on_get_lost_packet(experimental::control_protocol_method_handler get_lost_packet_method_handler) { this->get_lost_packet_method_handler = std::move(get_lost_packet_method_handler); return *this; }
86-
node_implementation& on_get_late_packet(experimental::control_protocol_method_handler get_late_packet_method_handler) { this->get_late_packet_method_handler = std::move(get_late_packet_method_handler); return *this; }
87-
node_implementation& on_reset_packet_counters(experimental::control_protocol_method_handler reset_packet_counters_method_handler) { this->reset_packet_counters_method_handler = std::move(reset_packet_counters_method_handler); return *this; }
85+
node_implementation& on_get_lost_packet_counters(nmos::get_lost_packet_counters_handler get_lost_packet_counters) { this->get_lost_packet_counters = std::move(get_lost_packet_counters); return *this; }
86+
node_implementation& on_get_late_packet_counters(nmos::get_late_packet_counters_handler get_late_packet_counters) { this->get_late_packet_counters = std::move(get_late_packet_counters); return *this; }
87+
node_implementation& on_reset_packet_counters(nmos::reset_packet_counters_handler reset_packet_counters) { this->reset_packet_counters = std::move(reset_packet_counters); return *this; }
8888

8989
// deprecated, use on_validate_connection_resource_patch
9090
node_implementation& on_validate_merged(nmos::details::connection_resource_patch_validator validate_merged) { return on_validate_connection_resource_patch(std::move(validate_merged)); }
@@ -127,9 +127,9 @@ namespace nmos
127127
nmos::get_control_protocol_datatype_descriptor_handler get_control_protocol_datatype_descriptor;
128128
nmos::get_control_protocol_method_descriptor_handler get_control_protocol_method_descriptor;
129129
nmos::control_protocol_property_changed_handler control_protocol_property_changed;
130-
experimental::control_protocol_method_handler get_lost_packet_method_handler;
131-
experimental::control_protocol_method_handler get_late_packet_method_handler;
132-
experimental::control_protocol_method_handler reset_packet_counters_method_handler;
130+
nmos::get_lost_packet_counters_handler get_lost_packet_counters;
131+
nmos::get_late_packet_counters_handler get_late_packet_counters;
132+
nmos::reset_packet_counters_handler reset_packet_counters;
133133
};
134134

135135
// Construct a server instance for an NMOS Node, implementing the IS-04 Node API, IS-05 Connection API, IS-07 Events API

0 commit comments

Comments
 (0)