libamxd  6.4.1
Data Model Manager
amxd_action_object_read.c File Reference
#include <string.h>
#include <stdio.h>
#include <amxc/amxc.h>
#include <amxp/amxp.h>
#include <amxd/amxd_types.h>
#include <amxd/amxd_common.h>
#include <amxd/amxd_dm.h>
#include <amxd/amxd_action.h>
#include <amxd/amxd_object.h>
#include "amxd_priv.h"
#include "amxd_assert.h"

Go to the source code of this file.

Functions

static void filter_add_params (amxc_string_t *filter, const amxc_llist_t *names)
 
static bool amxd_action_parameter_is_in (const char *name, amxc_var_t *params)
 
static amxd_status_t amxd_action_object_read_check_params (amxd_object_t *object, const amxc_llist_t *names)
 
static void filter_add_attributes (amxc_string_t *filter, uint32_t attrs)
 
static amxd_status_t amxd_action_get_values (amxd_object_t *const object, amxd_dm_access_t access, uint32_t attributes, amxc_var_t *params, const char *expression, amxc_var_t *const retval)
 
amxd_status_t amxd_action_object_read_filter (amxc_string_t *filter, const amxc_var_t *args)
 
amxd_status_t amxd_action_object_read (amxd_object_t *const object, UNUSED amxd_param_t *const p, amxd_action_t reason, const amxc_var_t *const args, amxc_var_t *const retval, UNUSED void *priv)
 
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. More...
 
amxd_status_t amxd_object_get_params_with_attr (amxd_object_t *const object, amxc_var_t *const params, uint32_t attrs, amxd_dm_access_t access)
 
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)
 

Function Documentation

◆ amxd_action_get_values()

static amxd_status_t amxd_action_get_values ( amxd_object_t *const  object,
amxd_dm_access_t  access,
uint32_t  attributes,
amxc_var_t *  params,
const char *  expression,
amxc_var_t *const  retval 
)
static

Definition at line 160 of file amxd_action_object_read.c.

165  {
167  amxp_expr_t expr;
168  amxc_var_t description;
169  amxc_var_t args;
170  amxp_expr_status_t expr_status = amxp_expr_status_ok;
171 
172  amxc_var_init(&description);
173  amxc_var_set_type(retval, AMXC_VAR_ID_HTABLE);
174  amxc_var_init(&args);
175  amxc_var_set_type(&args, AMXC_VAR_ID_HTABLE);
176 
177  if(expression != NULL) {
178  when_failed(amxp_expr_init(&expr, expression), exit);
179  }
180 
181  amxc_var_add_key(uint32_t, &args, "access", access);
182  amxc_var_add_key(bool, &args, "no-param-value", true);
183 
184  amxc_llist_for_each(it, (&object->parameters)) {
185  amxd_param_t* param = amxc_llist_it_get_data(it, amxd_param_t, it);
186  const char* name = amxd_param_get_name(param);
187  uint32_t param_attrs = amxd_param_get_attrs(param);
188  amxc_var_t* value = NULL;
189  bool in_filter_list = amxd_action_parameter_is_in(name, params);
190  if(!amxd_action_can_add_param(param_attrs,
191  amxd_object_get_type(object),
192  access,
193  true)) {
194  if(in_filter_list) {
196  goto exit;
197  }
198  continue;
199  }
200  if(((attributes & param_attrs) == 0) && (param_attrs != 0)) {
201  continue;
202  }
203  if(params && !in_filter_list) {
204  continue;
205  }
206  if(expression != NULL) {
207  amxd_dm_invoke_action(object, param, action_param_describe, &args, &description);
208  if(amxp_expr_eval_var(&expr, &description, &expr_status)) {
209  value = amxc_var_add_new_key(retval, name);
210  amxd_dm_invoke_action(object, param, action_param_read, &args, value);
211  }
212  if(expr_status != amxp_expr_status_ok) {
214  goto exit;
215  }
216  } else {
217  value = amxc_var_add_new_key(retval, name);
218  amxd_dm_invoke_action(object, param, action_param_read, &args, value);
219  }
220  }
221 
223 
224 exit:
225  if(expression != NULL) {
226  amxp_expr_clean(&expr);
227  }
228  amxc_var_clean(&description);
229  amxc_var_clean(&args);
230  return status;
231 }
static bool amxd_action_parameter_is_in(const char *name, amxc_var_t *params)
amxd_status_t amxd_dm_invoke_action(amxd_object_t *object, amxd_param_t *param, amxd_action_t reason, const amxc_var_t *const args, amxc_var_t *const retval)
Definition: amxd_dm.c:591
bool amxd_action_can_add_param(uint32_t param_attrs, const amxd_object_type_t type, amxd_dm_access_t access, bool template_info)
const char * amxd_param_get_name(const amxd_param_t *const param)
uint32_t amxd_param_get_attrs(const amxd_param_t *const param)
@ action_param_read
Definition: amxd_types.h:112
@ action_param_describe
Definition: amxd_types.h:115
enum _amxd_status amxd_status_t
@ amxd_status_parameter_not_found
Definition: amxd_types.h:82
@ amxd_status_ok
Definition: amxd_types.h:78
@ amxd_status_unknown_error
Definition: amxd_types.h:79
static amxd_object_type_t amxd_object_get_type(const amxd_object_t *const object)
Returns the object type.
Definition: amxd_object.h:586
amxc_llist_t parameters
Definition: amxd_types.h:246
static amxd_status_t status

◆ amxd_action_object_read()

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

Definition at line 261 of file amxd_action_object_read.c.

266  {
269  const char* f = GET_CHAR(args, "filter");
270  amxc_var_t* params = NULL;
271  uint32_t attributes = 0;
272  amxc_var_t* temp = NULL;
273 
274  when_null(object, exit);
275  when_null(retval, exit);
276  when_true_status(reason != action_object_read,
277  exit,
279 
280  when_true_status(!amxc_var_is_null(args) &&
281  amxc_var_type_of(args) != AMXC_VAR_ID_HTABLE,
282  exit,
284 
285  access = (amxd_dm_access_t) GET_UINT32(args, "access");
286  when_true_status(!amxd_action_verify_access(object, access),
287  exit,
289 
290  params = GET_ARG(args, "parameters");
291  when_true_status(!amxc_var_is_null(params) && amxc_var_type_of(params) != AMXC_VAR_ID_LIST,
292  exit,
294  if(amxc_llist_is_empty(amxc_var_constcast(amxc_llist_t, params))) {
295  params = NULL;
296  } else {
298  amxc_var_constcast(amxc_llist_t, params));
299  when_failed(status, exit);
300  }
301 
302  temp = GET_ARG(args, "attributes");
303  attributes = temp == NULL? 0xFFFFFFFF : GET_UINT32(temp, NULL);
304 
305  status = amxd_action_get_values(object, access, attributes, params, f, retval);
306 
307 exit:
308  if(status != amxd_status_ok) {
309  amxc_var_clean(retval);
310  }
311  return status;
312 }
static amxd_status_t amxd_action_object_read_check_params(amxd_object_t *object, const amxc_llist_t *names)
static amxd_status_t amxd_action_get_values(amxd_object_t *const object, amxd_dm_access_t access, uint32_t attributes, amxc_var_t *params, const char *expression, amxc_var_t *const retval)
bool amxd_action_verify_access(amxd_object_t *object, amxd_dm_access_t access)
@ action_object_read
Definition: amxd_types.h:117
@ amxd_status_function_not_implemented
Definition: amxd_types.h:83
@ amxd_status_object_not_found
Definition: amxd_types.h:80
@ amxd_status_invalid_function_argument
Definition: amxd_types.h:85
enum _amxd_dm_access amxd_dm_access_t
Access level.
@ amxd_dm_access_public
Definition: amxd_types.h:136

◆ amxd_action_object_read_check_params()

static amxd_status_t amxd_action_object_read_check_params ( amxd_object_t object,
const amxc_llist_t *  names 
)
static

Definition at line 110 of file amxd_action_object_read.c.

111  {
113  amxc_var_t obj_params;
114 
115  amxc_var_init(&obj_params);
116  when_true(amxc_llist_is_empty(names), exit);
117 
118  amxd_object_list_params(object, &obj_params, amxd_dm_access_private);
119  amxc_llist_iterate(it, names) {
120  amxc_var_t* var_name = amxc_var_from_llist_it(it);
121  const char* str_name = amxc_var_constcast(cstring_t, var_name);
122  if(!amxd_action_parameter_is_in(str_name, &obj_params)) {
124  break;
125  }
126  }
127 
128 exit:
129  amxc_var_clean(&obj_params);
130  return status;
131 }
amxd_status_t amxd_object_list_params(amxd_object_t *const object, amxc_var_t *const list, amxd_dm_access_t access)
@ amxd_dm_access_private
Definition: amxd_types.h:141

◆ amxd_action_object_read_filter()

amxd_status_t amxd_action_object_read_filter ( amxc_string_t *  filter,
const amxc_var_t *  args 
)

Definition at line 233 of file amxd_action_object_read.c.

234  {
236  amxc_var_t* temp = NULL;
237  const char* f = GET_CHAR(args, "filter");
238 
239  if((f != NULL) && (*f != 0)) {
240  amxc_string_setf(filter, "%s", f);
241  goto exit;
242  }
243 
244  temp = GET_ARG(args, "parameters");
245  when_true_status(!amxc_var_is_null(temp) && amxc_var_type_of(temp) != AMXC_VAR_ID_LIST,
246  exit,
248  if(temp != NULL) {
249  filter_add_params(filter, amxc_var_constcast(amxc_llist_t, temp));
250  }
251 
252  temp = GET_ARG(args, "attributes");
253  if(temp != NULL) {
254  filter_add_attributes(filter, amxc_var_dyncast(uint32_t, temp));
255  }
256 
257 exit:
258  return status;
259 }
static void filter_add_attributes(amxc_string_t *filter, uint32_t attrs)
static void filter_add_params(amxc_string_t *filter, const amxc_llist_t *names)

◆ amxd_action_parameter_is_in()

static bool amxd_action_parameter_is_in ( const char *  name,
amxc_var_t *  params 
)
static

Definition at line 93 of file amxd_action_object_read.c.

93  {
94  bool retval = false;
95 
96  when_str_empty(name, exit)
97 
98  amxc_var_for_each(param, params) {
99  const char* param_name = GET_CHAR(param, NULL);
100  if((param_name != NULL) && (strcmp(name, param_name) == 0)) {
101  retval = true;
102  break;
103  }
104  }
105 
106 exit:
107  return retval;
108 }

◆ amxd_object_get_key_params()

amxd_status_t amxd_object_get_key_params ( amxd_object_t *const  object,
amxc_var_t *const  params,
amxd_dm_access_t  access 
)

Definition at line 388 of file amxd_action_object_read.c.

390  {
391  return amxd_object_get_params_with_attr(object,
392  params,
394  access);
395 }
amxd_status_t amxd_object_get_params_with_attr(amxd_object_t *const object, amxc_var_t *const params, uint32_t attrs, amxd_dm_access_t access)
#define SET_BIT(x)
Definition: amxd_common.h:65
@ amxd_pattr_key
Definition: amxd_types.h:362

◆ amxd_object_get_params_filtered()

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 
)

Definition at line 362 of file amxd_action_object_read.c.

365  {
367  amxc_var_t args;
368 
369  amxc_var_init(&args);
370  when_null(object, exit);
371 
372  amxc_var_set_type(&args, AMXC_VAR_ID_HTABLE);
373  amxc_var_add_key(uint32_t, &args, "access", access);
374  if(filter != NULL) {
375  amxc_var_add_key(cstring_t, &args, "filter", filter);
376  }
377  retval = amxd_dm_invoke_action(object,
378  NULL,
380  &args,
381  params);
382 
383 exit:
384  amxc_var_clean(&args);
385  return retval;
386 }

◆ amxd_object_get_params_with_attr()

amxd_status_t amxd_object_get_params_with_attr ( amxd_object_t *const  object,
amxc_var_t *const  params,
uint32_t  attrs,
amxd_dm_access_t  access 
)

Definition at line 337 of file amxd_action_object_read.c.

340  {
342  amxc_var_t args;
343 
344  amxc_var_init(&args);
345  when_null(object, exit);
346  when_null(params, exit);
347 
348  amxc_var_set_type(&args, AMXC_VAR_ID_HTABLE);
349  amxc_var_add_key(uint32_t, &args, "access", access);
350  amxc_var_add_key(uint32_t, &args, "attributes", attrs);
351  retval = amxd_dm_invoke_action(object,
352  NULL,
354  &args,
355  params);
356 
357 exit:
358  amxc_var_clean(&args);
359  return retval;
360 }

◆ filter_add_attributes()

static void filter_add_attributes ( amxc_string_t *  filter,
uint32_t  attrs 
)
static

Definition at line 133 of file amxd_action_object_read.c.

133  {
134  static const char* attr_name[] = {
135  "template",
136  "instance",
137  "private",
138  "read-only",
139  "persistent",
140  "volatile",
141  "counter",
142  "key",
143  "unique",
144  "protected"
145  };
146 
147  const char* sep = "";
148  if(!amxc_string_is_empty(filter)) {
149  sep = " && ";
150  }
151 
152  for(uint32_t i = amxd_pattr_template; i < amxd_pattr_max; i++) {
153  if(IS_BIT_SET(attrs, i)) {
154  amxc_string_appendf(filter, "%sattributes.%s == true", sep, attr_name[i]);
155  sep = " && ";
156  }
157  }
158 }
#define IS_BIT_SET(b, f)
Definition: amxd_common.h:66
@ amxd_pattr_template
Definition: amxd_types.h:355
@ amxd_pattr_max
Definition: amxd_types.h:366

◆ filter_add_params()

static void filter_add_params ( amxc_string_t *  filter,
const amxc_llist_t *  names 
)
static

Definition at line 69 of file amxd_action_object_read.c.

69  {
70  const char* sep = "";
71 
72  when_true(amxc_llist_is_empty(names), exit);
73 
74  if(amxc_string_is_empty(filter)) {
75  amxc_string_appendf(filter, "name in [ ");
76  } else {
77  amxc_string_appendf(filter, " && name in [");
78  }
79 
80  amxc_llist_iterate(it, names) {
81  amxc_var_t* var_name = amxc_var_from_llist_it(it);
82  const char* str_name = amxc_var_constcast(cstring_t, var_name);
83  amxc_string_appendf(filter, "%s'%s' ", sep, str_name);
84  sep = ",";
85  }
86 
87  amxc_string_appendf(filter, "]");
88 
89 exit:
90  return;
91 }