libamxd  6.4.1
Data Model Manager
amxd_object_event.c File Reference
#include <stdlib.h>
#include <string.h>
#include <amxc/amxc.h>
#include <amxp/amxp_signal.h>
#include <amxp/amxp_slot.h>
#include <amxp/amxp_timer.h>
#include <amxd/amxd_types.h>
#include <amxd/amxd_object.h>
#include <amxd/amxd_object_event.h>
#include <amxd/amxd_dm.h>
#include <amxd/amxd_dm_functions.h>
#include "amxd_priv.h"
#include "amxd_dm_priv.h"
#include "amxd_assert.h"

Go to the source code of this file.

Macros

#define _GNU_SOURCE
 

Functions

static amxd_status_t amxd_object_delete_timer (amxd_object_t *object, UNUSED amxd_param_t *const p, amxd_action_t reason, UNUSED const amxc_var_t *const args, amxc_var_t *const retval, void *priv)
 
static void amxd_periodic_inform (UNUSED amxp_timer_t *timer, void *priv)
 
static void amxd_object_instance_sig_data (amxd_object_t *object, amxc_var_t *data)
 
static bool amxd_object_event_filter (amxd_object_t *const object, UNUSED int32_t depth, UNUSED void *priv)
 
static bool amxd_object_event_filter_add (amxd_object_t *const object, int32_t depth, void *priv)
 
static void amxd_object_send_event_add (amxd_object_t *const object, UNUSED int32_t depth, void *priv)
 
static void amxd_object_send_event_del (amxd_object_t *const object, UNUSED int32_t depth, void *priv)
 
static void amxd_build_param_changed (const char *name, amxc_var_t *values, amxc_var_t *data, amxc_var_t *ovalue)
 
void amxd_object_send_signal (amxd_object_t *const object, const char *name, amxc_var_t *const data, bool trigger)
 Send an object signal/event. More...
 
void amxd_object_send_add_inst (amxd_object_t *instance, bool trigger)
 Send an add instance object event. More...
 
void amxd_object_send_del_object (amxd_object_t *object, bool trigger)
 
void amxd_object_send_del_inst (amxd_object_t *instance, bool trigger)
 Send a delete instance object event. More...
 
void amxd_object_send_changed (amxd_object_t *object, amxc_var_t *params, bool trigger)
 Send an object changed event. More...
 
amxd_status_t amxd_object_new_pi (amxd_object_t *object, uint32_t sec)
 Creates and starts a periodic inform event timer. More...
 
amxd_status_t amxd_object_delete_pi (amxd_object_t *object)
 Stops and deletes a periodic inform event timer. More...
 
amxd_status_t amxd_object_add_event_ext (amxd_object_t *const object, const char *event_name, amxc_var_t *event_data)
 Adds an event definition to the object. More...
 
amxd_status_t amxd_object_add_event (amxd_object_t *const object, const char *event_name)
 Adds an event definition to the object. More...
 
void amxd_object_remove_event (amxd_object_t *const object, const char *event_name)
 Removes an event definition to the object. More...
 
amxc_var_t * amxd_object_new_event_data (const amxd_object_t *object, const char *event_name)
 Allocates a variant that contains the predefined event data. More...
 

Macro Definition Documentation

◆ _GNU_SOURCE

#define _GNU_SOURCE

Definition at line 56 of file amxd_object_event.c.

Function Documentation

◆ amxd_build_param_changed()

static void amxd_build_param_changed ( const char *  name,
amxc_var_t *  values,
amxc_var_t *  data,
amxc_var_t *  ovalue 
)
static

Definition at line 206 of file amxd_object_event.c.

209  {
210  amxc_var_t* new_value = NULL;
211  amxc_var_t* data_param = NULL;
212  int result = 0;
213 
214  new_value = amxc_var_get_pathf(values,
215  AMXC_VAR_FLAG_DEFAULT,
216  "'%s'",
217  name);
218 
219  data_param = amxc_var_add_new_key(data, name);
220  amxc_var_set_type(data_param, AMXC_VAR_ID_HTABLE);
221  amxc_var_set_key(data_param, "from", ovalue, AMXC_VAR_FLAG_COPY);
222  amxc_var_set_key(data_param, "to", new_value, AMXC_VAR_FLAG_DEFAULT);
223  // when no change in value, remove from event data
224  amxc_var_compare(ovalue, new_value, &result);
225  if(result == 0) {
226  amxc_var_delete(&data_param);
227  }
228 }

◆ amxd_object_delete_timer()

static amxd_status_t amxd_object_delete_timer ( amxd_object_t object,
UNUSED amxd_param_t *const  p,
amxd_action_t  reason,
UNUSED const amxc_var_t *const  args,
amxc_var_t *const  retval,
void *  priv 
)
static

Definition at line 77 of file amxd_object_event.c.

82  {
84  amxp_timer_t* timer = (amxp_timer_t*) priv;
85 
86  when_null(object, exit);
87  when_null(timer, exit);
88 
89  when_true_status(reason != action_object_destroy,
90  exit,
92 
93 
94  amxp_timer_delete(&timer);
95 
96  amxc_var_clean(retval);
97 
98 exit:
99  return status;
100 }
@ action_object_destroy
Definition: amxd_types.h:125
enum _amxd_status amxd_status_t
@ amxd_status_function_not_implemented
Definition: amxd_types.h:83
@ amxd_status_ok
Definition: amxd_types.h:78
static amxd_status_t status

◆ amxd_object_event_filter()

static bool amxd_object_event_filter ( amxd_object_t *const  object,
UNUSED int32_t  depth,
UNUSED void *  priv 
)
static

Definition at line 132 of file amxd_object_event.c.

134  {
135  bool retval = true;
136  when_true(amxd_object_get_type(object) == amxd_object_root, exit);
137 
139  retval = false;
140  goto exit;
141  }
142 
143 exit:
144  return retval;
145 }
@ amxd_oattr_private
Definition: amxd_types.h:202
@ amxd_object_root
Definition: amxd_types.h:178
static amxd_object_type_t amxd_object_get_type(const amxd_object_t *const object)
Returns the object type.
Definition: amxd_object.h:586
bool amxd_object_is_attr_set(const amxd_object_t *const object, const amxd_oattr_id_t attr)
Checks if an attribute is set.
Definition: amxd_object.c:348

◆ amxd_object_event_filter_add()

static bool amxd_object_event_filter_add ( amxd_object_t *const  object,
int32_t  depth,
void *  priv 
)
static

Definition at line 147 of file amxd_object_event.c.

149  {
150  bool retval = amxd_object_event_filter(object, depth, priv);
151  when_false(retval, exit);
152 
154  retval = false;
155  goto exit;
156  }
157 
158 exit:
159  return retval;
160 }
static bool amxd_object_event_filter(amxd_object_t *const object, UNUSED int32_t depth, UNUSED void *priv)
@ amxd_object_instance
Definition: amxd_types.h:186

◆ amxd_object_instance_sig_data()

static void amxd_object_instance_sig_data ( amxd_object_t object,
amxc_var_t *  data 
)
static

Definition at line 120 of file amxd_object_event.c.

121  {
122  amxc_var_t* params = NULL;
123 
124  amxc_var_add_key(uint32_t, data, "index", object->index);
125  amxc_var_add_key(cstring_t, data, "name", object->name);
126  params = amxc_var_add_key(amxc_htable_t, data, "parameters", NULL);
127  amxd_object_get_params_filtered(object, params, "attributes.volatile == false", amxd_dm_access_protected);
128  params = amxc_var_add_key(amxc_htable_t, data, "keys", NULL);
130 }
amxd_status_t amxd_object_get_params_filtered(amxd_object_t *const object, amxc_var_t *const params, const char *filter, amxd_dm_access_t access)
amxd_status_t amxd_object_get_key_params(amxd_object_t *const object, amxc_var_t *const params, amxd_dm_access_t access)
@ amxd_dm_access_protected
Definition: amxd_types.h:139
uint32_t index
Definition: amxd_types.h:240
char * name
Definition: amxd_types.h:238

◆ amxd_object_send_del_object()

void amxd_object_send_del_object ( amxd_object_t object,
bool  trigger 
)

Definition at line 262 of file amxd_object_event.c.

262  {
263  when_null(object, exit);
264 
269  INT32_MAX,
270  &trigger);
271 
272 exit:
273  return;
274 }
static void amxd_object_send_event_del(amxd_object_t *const object, UNUSED int32_t depth, void *priv)
@ amxd_direction_down_reverse
Definition: amxd_types.h:217
void amxd_object_hierarchy_walk(amxd_object_t *const object, const amxd_direction_t direction, amxd_object_filter_fn_t filter, amxd_object_cb_fn_t cb, int32_t depth, void *priv)
Iterates over all objects in the data model tree.

◆ amxd_object_send_event_add()

static void amxd_object_send_event_add ( amxd_object_t *const  object,
UNUSED int32_t  depth,
void *  priv 
)
static

Definition at line 162 of file amxd_object_event.c.

164  {
165  bool* trigger = (bool*) priv;
166  amxc_var_t data;
167 
168  amxc_var_init(&data);
169  amxc_var_set_type(&data, AMXC_VAR_ID_HTABLE);
170 
172  amxd_object_t* templ = amxd_object_get_parent(object);
173  amxd_object_instance_sig_data(object, &data);
174  amxd_dm_event("dm:instance-added", templ, &data, *trigger);
175  } else {
176  amxc_var_t* params = amxc_var_add_key(amxc_htable_t, &data, "parameters", NULL);
177  amxd_object_get_params_filtered(object, params, "attributes.volatile == false", amxd_dm_access_protected);
178  amxd_dm_event("dm:object-added", object, &data, *trigger);
179  }
180 
181  amxc_var_clean(&data);
182 }
void PRIVATE amxd_dm_event(const char *signal, const amxd_object_t *const object, amxc_var_t *const data, bool trigger)
Definition: amxd_dm_priv.c:550
static void amxd_object_instance_sig_data(amxd_object_t *object, amxc_var_t *data)
amxd_object_t * amxd_object_get_parent(const amxd_object_t *const object)
Get the parent object.

◆ amxd_object_send_event_del()

static void amxd_object_send_event_del ( amxd_object_t *const  object,
UNUSED int32_t  depth,
void *  priv 
)
static

Definition at line 184 of file amxd_object_event.c.

186  {
187  bool* trigger = (bool*) priv;
188  amxc_var_t data;
189 
190  amxc_var_init(&data);
191  amxc_var_set_type(&data, AMXC_VAR_ID_HTABLE);
192 
194  amxd_object_t* templ = amxd_object_get_parent(object);
195  amxd_object_instance_sig_data(object, &data);
196  amxd_dm_event("dm:instance-removed", templ, &data, *trigger);
197  } else {
198  amxc_var_t* params = amxc_var_add_key(amxc_htable_t, &data, "parameters", NULL);
199  amxd_object_get_params_filtered(object, params, "attributes.volatile == false", amxd_dm_access_protected);
200  amxd_dm_event("dm:object-removed", object, &data, *trigger);
201  }
202 
203  amxc_var_clean(&data);
204 }

◆ amxd_periodic_inform()

static void amxd_periodic_inform ( UNUSED amxp_timer_t *  timer,
void *  priv 
)
static

Definition at line 102 of file amxd_object_event.c.

102  {
103  amxd_object_t* object = (amxd_object_t*) priv;
104  amxc_var_t data;
105  amxc_var_t* parameters = NULL;
106 
107  amxc_var_init(&data);
108  when_null(object, exit);
109  amxc_var_set_type(&data, AMXC_VAR_ID_HTABLE);
110 
111  parameters = amxc_var_add_key(amxc_htable_t, &data, "parameters", NULL);
113  amxd_dm_event("dm:periodic-inform", object, &data, false);
114 
115 exit:
116  amxc_var_clean(&data);
117  return;
118 }
amxd_status_t amxd_object_get_params(amxd_object_t *const object, amxc_var_t *const params, amxd_dm_access_t access)
Gets all parameter values of an object.