libamxd  6.4.1
Data Model Manager
amxd_action_param_validate.c File Reference
#include <stdlib.h>
#include <string.h>
#include "amxd_priv.h"
#include <amxd/amxd_dm.h>
#include <amxd/amxd_path.h>
#include <amxd/amxd_action.h>
#include <amxd/amxd_object.h>
#include <amxd/amxd_parameter.h>
#include <amxd/amxd_object_parameter.h>
#include <amxd/amxd_object_hierarchy.h>
#include "amxd_assert.h"

Go to the source code of this file.

Functions

static amxd_status_t amxd_param_check_minimum (amxd_param_t *param, amxc_var_t *data, const amxc_var_t *value)
 
static amxd_status_t amxd_param_check_maximum (amxd_param_t *param, amxc_var_t *data, const amxc_var_t *value)
 
static bool is_value_in (amxc_var_t *value, const amxc_llist_t *values)
 
static bool is_string_empty (const amxc_var_t *value)
 
static bool is_key_in_template (const amxd_object_t *object, const amxd_param_t *param)
 
amxc_var_t * amxd_resolve_param_ref (amxd_object_t *obj, amxc_var_t *ref)
 
amxd_status_t amxd_action_param_validate (UNUSED amxd_object_t *object, amxd_param_t *param, amxd_action_t reason, const amxc_var_t *const args, UNUSED amxc_var_t *const retval, UNUSED void *priv)
 
amxd_status_t amxd_action_param_check_range (amxd_object_t *object, amxd_param_t *param, amxd_action_t reason, const amxc_var_t *const args, amxc_var_t *const retval, void *priv)
 Default check range parameter validate action implementation. More...
 
amxd_status_t amxd_action_param_check_minimum (amxd_object_t *object, amxd_param_t *param, amxd_action_t reason, const amxc_var_t *const args, amxc_var_t *const retval, void *priv)
 Default check minimum parameter validate action implementation. More...
 
amxd_status_t amxd_action_param_check_maximum (amxd_object_t *object, amxd_param_t *param, amxd_action_t reason, const amxc_var_t *const args, amxc_var_t *const retval, void *priv)
 Default check maximum parameter validate action implementation. More...
 
amxd_status_t amxd_action_param_check_enum (amxd_object_t *object, amxd_param_t *param, amxd_action_t reason, const amxc_var_t *const args, amxc_var_t *const retval, void *priv)
 Default check enum parameter validate action implementation. More...
 
amxd_status_t amxd_action_param_check_is_in (amxd_object_t *object, amxd_param_t *param, amxd_action_t reason, const amxc_var_t *const args, amxc_var_t *const retval, void *priv)
 Default check is in parameter validate action implementation. More...
 
amxd_status_t amxd_param_validate (amxd_param_t *const param, const amxc_var_t *const value)
 

Function Documentation

◆ amxd_action_param_validate()

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

Definition at line 228 of file amxd_action_param_validate.c.

233  {
235  amxc_var_t temp;
236 
237  amxc_var_init(&temp);
238  when_null(param, exit);
239  when_true_status(reason != action_param_validate,
240  exit,
242 
243  when_true_status((args == NULL ||
244  amxc_var_type_of(args) == AMXC_VAR_ID_NULL),
245  exit,
247 
248  // TODO: Change in amxc_var_can_covert when the function is available
249  when_failed_status(amxc_var_convert(&temp,
250  args,
251  amxc_var_type_of(&param->value)),
252  exit,
254 
256 
257 exit:
258  amxc_var_clean(&temp);
259  return status;
260 }
#define when_failed_status(x, l, c)
Definition: amxd_assert.h:65
@ action_param_validate
Definition: amxd_types.h:114
enum _amxd_status amxd_status_t
@ amxd_status_function_not_implemented
Definition: amxd_types.h:83
@ amxd_status_ok
Definition: amxd_types.h:78
@ amxd_status_unknown_error
Definition: amxd_types.h:79
@ amxd_status_invalid_value
Definition: amxd_types.h:88
amxc_var_t value
Definition: amxd_types.h:390
static amxd_status_t status

◆ amxd_param_check_maximum()

static amxd_status_t amxd_param_check_maximum ( amxd_param_t param,
amxc_var_t *  data,
const amxc_var_t *  value 
)
static

Definition at line 109 of file amxd_action_param_validate.c.

111  {
113  amxc_var_t def_val;
114  amxc_var_init(&def_val);
115  amxc_var_copy(&def_val, data);
116  if(amxc_var_cast(&def_val, amxd_param_get_type(param)) != 0) {
117  amxc_var_set_type(&def_val, amxd_param_get_type(param));
118  }
119 
120  if(amxc_var_type_of(data) == AMXC_VAR_ID_CSTRING) {
121  amxd_object_t* object = amxd_param_get_owner(param);
122  amxc_var_t* ref_value = amxd_resolve_param_ref(object, data);
123  data = ref_value == NULL ? data : ref_value;
124  }
125 
126  if((amxd_param_get_type(param) == AMXC_VAR_ID_CSTRING) ||
127  ( amxd_param_get_type(param) == AMXC_VAR_ID_CSV_STRING) ||
128  ( amxd_param_get_type(param) == AMXC_VAR_ID_SSV_STRING)) {
129  int64_t max = amxc_var_dyncast(int64_t, data);
130  char* text = amxc_var_dyncast(cstring_t, value);
131  int64_t length = text == NULL ? 0 : strlen(text);
132  if(length > max) {
134  }
135  free(text);
136  } else {
137  int result = 0;
138  amxc_var_compare(data, value, &result);
139  if(result < 0) {
141  }
142  }
143 
144  amxc_var_clean(&def_val);
145  return status;
146 }
amxc_var_t * amxd_resolve_param_ref(amxd_object_t *obj, amxc_var_t *ref)
static uint32_t amxd_param_get_type(const amxd_param_t *const param)
amxd_object_t * amxd_param_get_owner(const amxd_param_t *const param)

◆ amxd_param_check_minimum()

static amxd_status_t amxd_param_check_minimum ( amxd_param_t param,
amxc_var_t *  data,
const amxc_var_t *  value 
)
static

Definition at line 70 of file amxd_action_param_validate.c.

72  {
74  amxc_var_t def_val;
75  amxc_var_init(&def_val);
76  amxc_var_copy(&def_val, data);
77  if(amxc_var_cast(&def_val, amxd_param_get_type(param)) != 0) {
78  amxc_var_set_type(&def_val, amxd_param_get_type(param));
79  }
80 
81  if(amxc_var_type_of(data) == AMXC_VAR_ID_CSTRING) {
82  amxd_object_t* object = amxd_param_get_owner(param);
83  amxc_var_t* ref_value = amxd_resolve_param_ref(object, data);
84  data = ref_value == NULL ? &def_val : ref_value;
85  }
86 
87  if((amxd_param_get_type(param) == AMXC_VAR_ID_CSTRING) ||
88  ( amxd_param_get_type(param) == AMXC_VAR_ID_CSV_STRING) ||
89  ( amxd_param_get_type(param) == AMXC_VAR_ID_SSV_STRING)) {
90  int64_t min = amxc_var_dyncast(int64_t, data);
91  char* text = amxc_var_dyncast(cstring_t, value);
92  int64_t length = text == NULL ? 0 : strlen(text);
93  if(length < min) {
95  }
96  free(text);
97  } else {
98  int result = 0;
99  amxc_var_compare(data, value, &result);
100  if(result > 0) {
102  }
103  }
104 
105  amxc_var_clean(&def_val);
106  return status;
107 }

◆ amxd_param_validate()

amxd_status_t amxd_param_validate ( amxd_param_t *const  param,
const amxc_var_t *const  value 
)

Definition at line 448 of file amxd_action_param_validate.c.

449  {
451  amxd_object_t* object = NULL;
452  when_null(param, exit);
453 
454  object = amxd_param_get_owner(param);
455  retval = amxd_dm_invoke_action(object,
456  param,
458  value,
459  NULL);
460 
461 exit:
462  return retval;
463 }
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

◆ amxd_resolve_param_ref()

amxc_var_t* amxd_resolve_param_ref ( amxd_object_t obj,
amxc_var_t *  ref 
)

Definition at line 189 of file amxd_action_param_validate.c.

190  {
191  amxd_object_t* ref_object = NULL;
192  amxd_param_t* ref_param = NULL;
193  amxc_var_t* ref_value = NULL;
195  char* full_ref = amxc_var_dyncast(cstring_t, ref);
196  int ref_len = strlen(full_ref);
197  char* object = full_ref;
198  char* param = NULL;
199 
200  for(int i = ref_len; i >= 0; i--) {
201  if(full_ref[i] == '.') {
202  full_ref[i] = 0;
203  param = full_ref + i + 1;
204  break;
205  }
206  }
207 
208  when_str_empty(param, exit);
209 
210  if(object[0] == 0) {
211  ref_object = obj;
212  } else {
213  if(object[0] == '.') {
214  ref_object = amxd_object_findf(obj, "%s", object);
215  } else {
216  ref_object = amxd_dm_findf(dm, "%s", object);
217  }
218  }
219  ref_param = amxd_object_get_param_def(ref_object, param);
220  when_null(ref_param, exit);
221  ref_value = &ref_param->value;
222 
223 exit:
224  free(full_ref);
225  return ref_value;
226 }
amxd_object_t * amxd_dm_findf(amxd_dm_t *const dm, const char *abs_path,...) __attribute__((format(printf
amxd_object_t * amxd_object_findf(amxd_object_t *object, const char *rel_path,...) __attribute__((format(printf
Find an object in the data model tree, starting from an object.
amxd_dm_t * amxd_object_get_dm(const amxd_object_t *const object)
Get the data model.
amxd_param_t * amxd_object_get_param_def(const amxd_object_t *const object, const char *name)
Gets a parameter definition from an object.
static amxd_dm_t dm

◆ is_key_in_template()

static bool is_key_in_template ( const amxd_object_t object,
const amxd_param_t param 
)
static

Definition at line 183 of file amxd_action_param_validate.c.

184  {
185  return (amxd_param_is_attr_set(param, amxd_pattr_key) &&
187 }
bool amxd_param_is_attr_set(const amxd_param_t *const param, const amxd_pattr_id_t attr)
@ amxd_pattr_key
Definition: amxd_types.h:362
@ amxd_object_template
Definition: amxd_types.h:183
static amxd_object_type_t amxd_object_get_type(const amxd_object_t *const object)
Returns the object type.
Definition: amxd_object.h:586

◆ is_string_empty()

static bool is_string_empty ( const amxc_var_t *  value)
static

Definition at line 176 of file amxd_action_param_validate.c.

176  {
177  char* v = amxc_var_dyncast(cstring_t, value);
178  bool retval = (v == NULL || *v == 0);
179  free(v);
180  return retval;
181 }

◆ is_value_in()

static bool is_value_in ( amxc_var_t *  value,
const amxc_llist_t *  values 
)
static

Definition at line 148 of file amxd_action_param_validate.c.

148  {
149  bool is_in = false;
150  int result = 0;
151 
152  if((amxc_var_type_of(value) == AMXC_VAR_ID_SSV_STRING) ||
153  (amxc_var_type_of(value) == AMXC_VAR_ID_CSV_STRING)) {
154  amxc_var_cast(value, AMXC_VAR_ID_LIST);
155  is_in = true;
156  amxc_var_for_each(v, value) {
157  is_in &= is_value_in(v, values);
158  if(!is_in) {
159  break;
160  }
161  }
162  } else {
163  amxc_llist_for_each(it, values) {
164  amxc_var_t* check = amxc_var_from_llist_it(it);
165  amxc_var_compare(value, check, &result);
166  if(result == 0) {
167  is_in = true;
168  break;
169  }
170  }
171  }
172 
173  return is_in;
174 }
static bool is_value_in(amxc_var_t *value, const amxc_llist_t *values)