64 #include <amxc/amxc.h>
65 #include <amxp/amxp.h>
66 #include <amxp/amxp_expression.h>
68 #include <amxd/amxd_common.h>
69 #include <amxd/amxd_dm.h>
70 #include <amxd/amxd_object.h>
71 #include <amxd/amxd_object_event.h>
72 #include <amxd/amxd_path.h>
81 const char* expression,
82 amxp_slot_fn_t slot_cb,
85 amxd_dm_t*
dm = ctx->
dm;
86 amxd_object_t*
object = amxd_dm_findf(
dm,
"%s", path);
87 amxp_signal_t* signal = NULL;
88 amxc_string_t local_expr;
89 amxc_htable_it_t* sub_hit = NULL;
91 amxc_string_init(&local_expr, 0);
93 when_null(
object, exit);
95 signal = amxp_sigmngr_find_signal(&ctx->
sigmngr, path);
97 amxp_sigmngr_add_signal(&ctx->
sigmngr, path);
99 retval = amxp_slot_connect(&ctx->
sigmngr, path, expression, slot_cb, priv);
100 when_failed(retval, exit);
106 sub_hit = (amxc_htable_it_t*) calloc(1,
sizeof(amxc_htable_it_t));
109 amxc_string_appendf(&local_expr,
110 "object starts with \"%s.\" || path starts with \"%s.\"",
113 retval = amxp_slot_connect(&ctx->
dm->sigmngr,
115 amxc_string_get(&local_expr, 0),
120 amxc_string_clean(&local_expr);
126 const char* expression,
127 amxp_slot_fn_t slot_cb,
130 amxp_signal_t* signal = NULL;
132 signal = amxp_sigmngr_find_signal(&ctx->
sigmngr, path);
137 when_failed(retval, exit);
138 amxp_sigmngr_add_signal(&ctx->
sigmngr, path);
144 amxp_slot_connect(&ctx->
sigmngr, path, expression, slot_cb, priv);
153 amxc_var_t* obj_data = GETI_ARG(info, 0);
154 uint32_t type = amxc_var_dyncast(uint32_t, GET_ARG(obj_data,
"type_id"));
155 const char* obj_path = GET_CHAR(obj_data,
"path");
156 uint32_t index = amxc_var_dyncast(uint32_t, GET_ARG(obj_data,
"index"));
159 free(amxd_path_get_fixed_part(path,
true));
160 spath = strdup(amxd_path_get(path, AMXD_OBJECT_TERMINATE));
162 if(type == amxd_object_instance) {
163 amxd_path_setf(path,
false,
"%s%d.%s", obj_path, index, spath);
165 amxd_path_setf(path,
false,
"%s%s", obj_path, spath);
172 amxd_path_t* obj_path,
173 const char* expression) {
174 amxp_expr_status_t status = amxp_expr_status_ok;
175 const char* sep =
"";
178 if(amxd_path_is_search_path(obj_path)) {
179 amxc_string_setf(str_expr,
"%s", amxd_path_get(obj_path, AMXD_OBJECT_TERMINATE));
180 amxc_string_replace(str_expr,
"'",
"\"", UINT32_MAX);
181 amxc_string_prependf(str_expr,
"path starts with search_path('");
182 amxc_string_appendf(str_expr,
"')");
185 amxc_string_setf(str_expr,
"%s", amxd_path_get(obj_path, AMXD_OBJECT_TERMINATE));
186 amxc_string_replace(str_expr,
"'",
"\"", UINT32_MAX);
187 amxc_string_prependf(str_expr,
"(path starts with '");
188 amxc_string_appendf(str_expr,
"' || !(contains('path') && contains('object')))");
192 if((expression != NULL) && (*expression != 0)) {
193 amxc_string_appendf(str_expr,
"%s(%s)", sep, expression);
196 if(!amxc_string_is_empty(str_expr)) {
197 status = amxp_expr_init(&expr, amxc_string_get(str_expr, 0));
198 amxp_expr_clean(&expr);
201 return status == amxp_expr_status_ok ? 0 : -1;
207 const char* expression,
208 amxp_slot_fn_t slot_cb,
211 char* obj_path = NULL;
215 amxc_string_t rel_path;
216 amxc_string_t str_expr;
218 amxd_path_init(&path, NULL);
219 amxc_var_init(&info);
220 amxc_string_init(&rel_path, 64);
221 amxc_string_init(&str_expr, 0);
223 when_null(ctx, exit);
225 when_null(
object, exit);
226 when_null(slot_cb, exit);
228 amxd_path_setf(&path,
true,
"%s",
object);
229 if((path.type == amxd_path_invalid) ||
230 (path.type == amxd_path_reference) ||
231 (path.type == amxd_path_supported)) {
234 obj_path = amxd_path_get_fixed_part(&path,
false);
240 obj_path = amxd_path_get_fixed_part(&path,
false);
243 when_null(obj_path, exit);
245 amxc_var_set_type(&info, AMXC_VAR_ID_HTABLE);
246 amxc_var_add_key(cstring_t, &info,
"expression", expression);
251 obj_path[strlen(obj_path) - 1] = 0;
255 when_failed(retval, exit);
256 expression = amxc_string_get(&str_expr, 0);
258 if(ctx->
dm != NULL) {
260 when_true(retval == 0, exit);
266 amxc_string_clean(&str_expr);
267 amxc_string_clean(&rel_path);
268 amxd_path_clean(&path);
269 amxc_var_clean(&info);
276 amxp_slot_fn_t slot_cb,
281 amxp_signal_t* signal = NULL;
282 char* obj_path = NULL;
286 amxd_path_init(&path, NULL);
287 amxc_var_init(&info);
289 when_null(ctx, exit);
291 when_str_empty(
object, exit);
293 amxd_path_setf(&path,
true,
"%s",
object);
294 if((path.type == amxd_path_invalid) ||
295 (path.type == amxd_path_reference) ||
296 (path.type == amxd_path_supported)) {
299 obj_path = amxd_path_get_fixed_part(&path,
false);
305 obj_path = amxd_path_get_fixed_part(&path,
false);
308 when_null(obj_path, exit);
310 amxc_var_set_type(&info, AMXC_VAR_ID_HTABLE);
311 req =
amxb_async_call(ctx, obj_path,
"_unsubscribe", &info, NULL, NULL);
315 obj_path[strlen(obj_path) - 1] = 0;
319 signal = amxp_sigmngr_find_signal(&ctx->
sigmngr, obj_path);
320 when_null(signal, exit);
323 amxp_slot_disconnect(&ctx->
sigmngr, obj_path, slot_cb);
325 amxp_slot_disconnect_signal_with_priv(&ctx->
sigmngr, obj_path, slot_cb, priv);
328 when_true(amxp_signal_has_slots(signal), exit);
338 amxp_signal_delete(&signal);
342 amxd_path_clean(&path);
343 amxc_var_clean(&info);
352 amxd_object_t* obj = NULL;
354 when_null(ctx, exit);
355 when_null(ctx->
dm, exit);
357 when_str_empty(
object, exit);
358 when_str_empty(name, exit);
360 obj = amxd_object_findf(amxd_dm_get_root(ctx->
dm),
"%s",
object);
363 amxd_object_emit_signal(obj, name, data);
364 retval = amxd_status_ok;
366 retval = amxd_status_object_not_found;
Ambiorix bus agnostic API header file.
static int amxb_subscribe_be_impl(amxb_bus_ctx_t *ctx, const char *path, const char *expression, amxp_slot_fn_t slot_cb, void *priv)
static int amxb_build_expression(amxc_string_t *str_expr, amxd_path_t *obj_path, const char *expression)
static int amxb_subscribe_local_impl(amxb_bus_ctx_t *ctx, const char *path, const char *expression, amxp_slot_fn_t slot_cb, void *priv)
static void amxb_build_path(amxc_var_t *info, amxd_path_t *path)
Ambiorix Bus Backend Interface.
#define amxb_is_valid_be_func(ft, member, ptr)
void PRIVATE amxb_dm_event_to_object_event(const char *const sig_name, const amxc_var_t *const data, void *const priv)
#define AMXB_ERROR_NOT_SUPPORTED_OP
Function/operation not supported.
#define AMXB_STATUS_OK
All ok.
int amxb_unsubscribe(amxb_bus_ctx_t *const ctx, const char *object, amxp_slot_fn_t slot_cb, void *priv)
Removes an event subscription.
int amxb_publish(amxb_bus_ctx_t *const ctx, const char *object, const char *name, amxc_var_t *data)
Publish an event for a specific object.
int amxb_subscribe(amxb_bus_ctx_t *const ctx, const char *object, const char *expression, amxp_slot_fn_t slot_cb, void *priv)
Subscribes for events of a object tree.
int amxb_close_request(amxb_request_t **req)
Closes a previously create remote function called context.
int amxb_describe(amxb_bus_ctx_t *const bus_ctx, const char *object, uint32_t flags, amxc_var_t *ret, int timeout)
Describes an object.
amxb_request_t * amxb_async_call(amxb_bus_ctx_t *const bus_ctx, const char *object, const char *method, amxc_var_t *args, amxb_be_done_cb_fn_t done_fn, void *priv)
Invokes a data model function.
The back-end interface structure.
amxb_be_subscribe_fn_t subscribe
amxb_be_unsubscribe_fn_t unsubscribe
const amxb_be_funcs_t * bus_fn
amxp_signal_mngr_t sigmngr
amxc_htable_t subscriptions