61 #include <amxc/amxc_macros.h>
62 #include <amxc/amxc.h>
63 #include <amxp/amxp.h>
65 #include <amxd/amxd_types.h>
66 #include <amxd/amxd_path.h>
76 amxp_slot_fn_t slot_cb,
81 amxd_path_init(&path, NULL);
83 when_str_empty(
object, exit);
84 when_null(slot_cb, exit);
86 amxd_path_setf(&path,
true,
"%s",
object);
89 when_null((sub), exit);
93 sub->
data.
object = amxd_path_get_fixed_part(&path,
false);
105 amxd_path_clean(&path);
115 if(strncmp(p1, p2, len1) == 0) {
126 amxd_path_t search_path;
127 amxd_path_t sub_path;
131 amxd_path_init(&search_path, NULL);
132 amxd_path_init(&sub_path, NULL);
134 when_str_empty(
object, exit);
136 amxd_path_setf(&search_path,
true,
"%s",
object);
137 fsp = amxd_path_get_fixed_part(&search_path,
false);
138 search_len = strlen(fsp);
144 amxd_path_setf(&sub_path,
true,
"%s", sub->
data.
object);
146 fp = amxd_path_get_fixed_part(&sub_path,
false);
147 sub_len = strlen(fp);
148 subscription = &sub->
data;
166 amxd_path_clean(&search_path);
167 amxd_path_clean(&sub_path);
176 if(sub->
it.llist != NULL) {
179 amxc_llist_it_take(&sub->
it);
190 const char* expression,
191 amxp_slot_fn_t slot_cb,
196 when_null(sub, exit);
197 *subscription = &sub->
data;
202 (*subscription)->slot_cb,
203 (*subscription)->
priv);
204 when_failed(retval, exit);
209 free((*subscription)->object);
211 *subscription = NULL;
218 amxp_slot_fn_t slot_cb,
222 when_str_empty(
object, exit);
223 when_null(slot_cb, exit);
227 subscription = &sub->
data;
228 if((strcmp(subscription->
object,
object) == 0) &&
229 ( subscription->
slot_cb == slot_cb) &&
230 ( subscription->
priv == priv)) {
241 const char*
object) {
246 const char*
object) {
254 when_null(subscription, exit);
255 when_null(*subscription, exit);
257 sub = amxc_container_of((*subscription),
amxb_sub_t, data);
260 amxc_llist_it_take(&(*subscription)->it);
261 free((*subscription)->object);
264 *subscription = NULL;
Ambiorix Bus Agnostic Data Model eventing API.
static amxb_subscription_t * amxb_subscription_find_relation(amxb_bus_ctx_t *bus_ctx, const char *object, bool parent)
int amxb_subscription_remove(amxb_subscription_t *subscription)
static amxb_sub_t * amxb_sub_alloc(const char *object, amxp_slot_fn_t slot_cb, void *priv)
void amxb_subscription_remove_it(amxc_llist_it_t *it)
static bool amxb_subscription_matches(const char *p1, const char *p2, int len1, int len2)
#define AMXB_ERROR_UNKNOWN
Unknown error.
#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.
amxb_subscription_t * amxb_subscription_find_child(amxb_bus_ctx_t *bus_ctx, const char *object)
Find a child subscription.
int amxb_subscription_delete(amxb_subscription_t **subscription)
Deletes a subscription object and unsubscribe for events of a object tree.
amxb_subscription_t * amxb_subscription_find_parent(amxb_bus_ctx_t *bus_ctx, const char *object)
Find a parent subscription.
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.
amxb_subscription_t * amxb_subscription_find(amxb_bus_ctx_t *bus_ctx, const char *object, amxp_slot_fn_t slot_cb, void *priv)
Find an exact subscription.
int amxb_subscription_new(amxb_subscription_t **subscription, amxb_bus_ctx_t *bus_ctx, const char *object, const char *expression, amxp_slot_fn_t slot_cb, void *priv)
Creates a subscription object and subscribes for events of a object tree.
static amxb_bus_ctx_t * bus_ctx