libamxb  4.8.2
Bus Agnostic C API
amxb_subscription.c File Reference
#include <stdlib.h>
#include <string.h>
#include <amxc/amxc_macros.h>
#include <amxc/amxc.h>
#include <amxp/amxp.h>
#include <amxd/amxd_types.h>
#include <amxd/amxd_path.h>
#include <amxb/amxb_error.h>
#include <amxb/amxb_types.h>
#include <amxb/amxb_subscription.h>
#include <amxb/amxb_subscribe.h>
#include "amxb_priv.h"

Go to the source code of this file.

Macros

#define _GNU_SOURCE
 

Functions

static amxb_sub_tamxb_sub_alloc (const char *object, amxp_slot_fn_t slot_cb, void *priv)
 
static bool amxb_subscription_matches (const char *p1, const char *p2, int len1, int len2)
 
static amxb_subscription_tamxb_subscription_find_relation (amxb_bus_ctx_t *bus_ctx, const char *object, bool parent)
 
int amxb_subscription_remove (amxb_subscription_t *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. More...
 
amxb_subscription_tamxb_subscription_find (amxb_bus_ctx_t *bus_ctx, const char *object, amxp_slot_fn_t slot_cb, void *priv)
 Find an exact subscription. More...
 
amxb_subscription_tamxb_subscription_find_parent (amxb_bus_ctx_t *bus_ctx, const char *object)
 Find a parent subscription. More...
 
amxb_subscription_tamxb_subscription_find_child (amxb_bus_ctx_t *bus_ctx, const char *object)
 Find a child subscription. More...
 
int amxb_subscription_delete (amxb_subscription_t **subscription)
 Deletes a subscription object and unsubscribe for events of a object tree. More...
 
void amxb_subscription_remove_it (amxc_llist_it_t *it)
 

Macro Definition Documentation

◆ _GNU_SOURCE

#define _GNU_SOURCE

Definition at line 55 of file amxb_subscription.c.

Function Documentation

◆ amxb_sub_alloc()

static amxb_sub_t* amxb_sub_alloc ( const char *  object,
amxp_slot_fn_t  slot_cb,
void *  priv 
)
static

Definition at line 75 of file amxb_subscription.c.

77  {
78  amxb_sub_t* sub = NULL;
79  amxd_path_t path;
80 
81  amxd_path_init(&path, NULL);
82 
83  when_str_empty(object, exit);
84  when_null(slot_cb, exit);
85 
86  amxd_path_setf(&path, true, "%s", object);
87 
88  sub = (amxb_sub_t*) calloc(1, sizeof(amxb_sub_t));
89  when_null((sub), exit);
90  sub->data.slot_cb = slot_cb;
91  sub->data.priv = priv;
92 
93  sub->data.object = amxd_path_get_fixed_part(&path, false);
94  if(sub->data.object == NULL) {
95  free(sub);
96  sub = NULL;
97  goto exit;
98  }
99 
100  if(*sub->data.object != 0) {
101  sub->data.object[strlen(sub->data.object) - 1] = 0;
102  }
103 
104 exit:
105  amxd_path_clean(&path);
106  return sub;
107 }
amxp_slot_fn_t slot_cb
Definition: amxb_types.h:159
Definition: amxb_priv.h:64
amxb_subscription_t data
Definition: amxb_priv.h:66

◆ amxb_subscription_find_relation()

static amxb_subscription_t* amxb_subscription_find_relation ( amxb_bus_ctx_t bus_ctx,
const char *  object,
bool  parent 
)
static

Definition at line 122 of file amxb_subscription.c.

124  {
125  amxb_subscription_t* subscription = NULL;
126  amxd_path_t search_path;
127  amxd_path_t sub_path;
128  char* fsp = NULL;
129  int search_len = 0;
130 
131  amxd_path_init(&search_path, NULL);
132  amxd_path_init(&sub_path, NULL);
133 
134  when_str_empty(object, exit);
135 
136  amxd_path_setf(&search_path, true, "%s", object);
137  fsp = amxd_path_get_fixed_part(&search_path, false);
138  search_len = strlen(fsp);
139 
140  amxc_llist_iterate(it, (&bus_ctx->client_subs)) {
141  amxb_sub_t* sub = amxc_container_of(it, amxb_sub_t, it);
142  char* fp = NULL;
143  int sub_len = 0;
144  amxd_path_setf(&sub_path, true, "%s", sub->data.object);
145 
146  fp = amxd_path_get_fixed_part(&sub_path, false);
147  sub_len = strlen(fp);
148  subscription = &sub->data;
149 
150  if(parent) {
151  if(amxb_subscription_matches(fp, fsp, sub_len, search_len)) {
152  free(fp);
153  break;
154  }
155  } else {
156  if(amxb_subscription_matches(fsp, fp, search_len, sub_len)) {
157  free(fp);
158  break;
159  }
160  }
161  free(fp);
162  subscription = NULL;
163  }
164 
165 exit:
166  amxd_path_clean(&search_path);
167  amxd_path_clean(&sub_path);
168  free(fsp);
169  return subscription;
170 }
static bool amxb_subscription_matches(const char *p1, const char *p2, int len1, int len2)
amxc_llist_t client_subs
Definition: amxb_types.h:127
static amxb_bus_ctx_t * bus_ctx
Definition: test_amxb_e2e.c:84

◆ amxb_subscription_matches()

static bool amxb_subscription_matches ( const char *  p1,
const char *  p2,
int  len1,
int  len2 
)
static

Definition at line 109 of file amxb_subscription.c.

112  {
113  bool match = false;
114  if(len1 < len2) {
115  if(strncmp(p1, p2, len1) == 0) {
116  match = true;
117  }
118  }
119  return match;
120 }

◆ amxb_subscription_remove()

int amxb_subscription_remove ( amxb_subscription_t subscription)

Definition at line 172 of file amxb_subscription.c.

172  {
173  int rv = AMXB_STATUS_OK;
174  amxb_sub_t* sub = amxc_container_of(subscription, amxb_sub_t, data);
175 
176  if(sub->it.llist != NULL) {
177  amxb_bus_ctx_t* bus_ctx = NULL;
178  bus_ctx = amxc_container_of(sub->it.llist, amxb_bus_ctx_t, client_subs);
179  amxc_llist_it_take(&sub->it);
180  rv = amxb_unsubscribe(bus_ctx, subscription->object, subscription->slot_cb,
181  subscription->priv);
182  }
183 
184  return rv;
185 }
#define AMXB_STATUS_OK
All ok.
Definition: amxb_error.h:86
int amxb_unsubscribe(amxb_bus_ctx_t *const ctx, const char *object, amxp_slot_fn_t slot_cb, void *priv)
Removes an event subscription.
amxc_llist_it_t it
Definition: amxb_priv.h:65

◆ amxb_subscription_remove_it()

void amxb_subscription_remove_it ( amxc_llist_it_t *  it)

Definition at line 270 of file amxb_subscription.c.

270  {
271  amxb_subscription_t* subscription = amxc_container_of(it, amxb_subscription_t, it);
272  amxb_subscription_delete(&subscription);
273 }
int amxb_subscription_delete(amxb_subscription_t **subscription)
Deletes a subscription object and unsubscribe for events of a object tree.