libamxb  4.8.2
Bus Agnostic C API
amxb_ba_subscribe.c File Reference
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <amxc/amxc.h>
#include <amxp/amxp.h>
#include <amxp/amxp_expression.h>
#include <amxd/amxd_common.h>
#include <amxd/amxd_dm.h>
#include <amxd/amxd_object.h>
#include <amxd/amxd_object_event.h>
#include <amxd/amxd_path.h>
#include <amxb/amxb_be_intf.h>
#include <amxb/amxb.h>
#include "amxb_priv.h"

Go to the source code of this file.

Macros

#define _GNU_SOURCE
 

Functions

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 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 void amxb_build_path (amxc_var_t *info, amxd_path_t *path)
 
static int amxb_build_expression (amxc_string_t *str_expr, amxd_path_t *obj_path, const char *expression)
 
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. More...
 
int amxb_unsubscribe (amxb_bus_ctx_t *const ctx, const char *object, amxp_slot_fn_t slot_cb, void *priv)
 Removes an event subscription. More...
 
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. More...
 

Macro Definition Documentation

◆ _GNU_SOURCE

#define _GNU_SOURCE

Definition at line 56 of file amxb_ba_subscribe.c.

Function Documentation

◆ amxb_build_expression()

static int amxb_build_expression ( amxc_string_t *  str_expr,
amxd_path_t *  obj_path,
const char *  expression 
)
static

Definition at line 171 of file amxb_ba_subscribe.c.

173  {
174  amxp_expr_status_t status = amxp_expr_status_ok;
175  const char* sep = "";
176  amxp_expr_t expr;
177 
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, "')");
183  sep = " && ";
184  } else {
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')))");
189  sep = " && ";
190  }
191 
192  if((expression != NULL) && (*expression != 0)) {
193  amxc_string_appendf(str_expr, "%s(%s)", sep, expression);
194  }
195 
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);
199  }
200 
201  return status == amxp_expr_status_ok ? 0 : -1;
202 }

◆ amxb_build_path()

static void amxb_build_path ( amxc_var_t *  info,
amxd_path_t *  path 
)
static

Definition at line 152 of file amxb_ba_subscribe.c.

152  {
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"));
157  char* spath = NULL;
158 
159  free(amxd_path_get_fixed_part(path, true));
160  spath = strdup(amxd_path_get(path, AMXD_OBJECT_TERMINATE));
161 
162  if(type == amxd_object_instance) {
163  amxd_path_setf(path, false, "%s%d.%s", obj_path, index, spath);
164  } else {
165  amxd_path_setf(path, false, "%s%s", obj_path, spath);
166  }
167 
168  free(spath);
169 }

◆ amxb_subscribe_be_impl()

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

Definition at line 124 of file amxb_ba_subscribe.c.

128  {
129  int retval = -1;
130  amxp_signal_t* signal = NULL;
131 
132  signal = amxp_sigmngr_find_signal(&ctx->sigmngr, path);
133  if(signal == NULL) {
134  const amxb_be_funcs_t* fns = ctx->bus_fn;
135  if(amxb_is_valid_be_func(fns, subscribe, fns->subscribe)) {
136  retval = fns->subscribe(ctx->bus_ctx, path);
137  when_failed(retval, exit);
138  amxp_sigmngr_add_signal(&ctx->sigmngr, path);
139  } else {
141  goto exit;
142  }
143  }
144  amxp_slot_connect(&ctx->sigmngr, path, expression, slot_cb, priv);
145 
146  retval = 0;
147 
148 exit:
149  return retval;
150 }
#define amxb_is_valid_be_func(ft, member, ptr)
Definition: amxb_priv.h:78
#define AMXB_ERROR_NOT_SUPPORTED_OP
Function/operation not supported.
Definition: amxb_error.h:110
The back-end interface structure.
amxb_be_subscribe_fn_t subscribe
const amxb_be_funcs_t * bus_fn
Definition: amxb_types.h:121
amxp_signal_mngr_t sigmngr
Definition: amxb_types.h:120
void * bus_ctx
Definition: amxb_types.h:122

◆ amxb_subscribe_local_impl()

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

Definition at line 79 of file amxb_ba_subscribe.c.

83  {
84  int retval = -1;
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;
90 
91  amxc_string_init(&local_expr, 0);
92 
93  when_null(object, exit);
94 
95  signal = amxp_sigmngr_find_signal(&ctx->sigmngr, path);
96  if(signal == NULL) {
97  amxp_sigmngr_add_signal(&ctx->sigmngr, path);
98  }
99  retval = amxp_slot_connect(&ctx->sigmngr, path, expression, slot_cb, priv);
100  when_failed(retval, exit);
101 
102  if(amxc_htable_contains(&ctx->subscriptions, path)) {
103  goto exit;
104  }
105 
106  sub_hit = (amxc_htable_it_t*) calloc(1, sizeof(amxc_htable_it_t));
107  amxc_htable_insert(&ctx->subscriptions, path, sub_hit);
108 
109  amxc_string_appendf(&local_expr,
110  "object starts with \"%s.\" || path starts with \"%s.\"",
111  path,
112  path);
113  retval = amxp_slot_connect(&ctx->dm->sigmngr,
114  "*",
115  amxc_string_get(&local_expr, 0),
117  sub_hit);
118 
119 exit:
120  amxc_string_clean(&local_expr);
121  return retval;
122 }
void PRIVATE amxb_dm_event_to_object_event(const char *const sig_name, const amxc_var_t *const data, void *const priv)
Definition: amxb_ba_priv.c:76
amxd_dm_t * dm
Definition: amxb_types.h:123
amxc_htable_t subscriptions
Definition: amxb_types.h:124
static amxd_dm_t dm
Definition: test_amxb_e2e.c:85