64 #include <amxc/amxc.h>
65 #include <amxp/amxp.h>
82 amxc_llist_for_each(it, (&templ->
instances)) {
86 if(strcmp(n, name) == 0) {
100 amxc_llist_for_each(it, (&templ->
instances)) {
102 if(result->
index == index) {
116 amxc_var_t* templ_params,
117 amxc_htable_t* values,
121 amxc_var_t* alias = amxc_var_get_key(templ_params,
"Alias", AMXC_VAR_FLAG_DEFAULT);
122 amxc_htable_it_t* halias = amxc_htable_get(values,
"Alias");
124 uint32_t new_index = index == 0 ? (templ->
last_index + 1) : index;
125 amxc_var_t* alias_var = NULL;
127 when_null(alias, exit);
128 when_true(!amxc_var_constcast(
bool,
GET_FIELD(alias,
"attributes.key")), exit);
129 when_true(!amxc_var_constcast(
bool,
GET_FIELD(alias,
"attributes.unique")), exit);
132 amxc_var_new(&alias_var);
133 if((*name != NULL) && ((*name)[0] != 0)) {
134 amxc_var_set(cstring_t, alias_var, *name);
136 amxc_string_t alias_name;
137 amxc_string_init(&alias_name, 0);
138 amxc_string_appendf(&alias_name,
"cpe-%s-%d", obj_name, new_index);
139 amxc_var_push(amxc_string_t, alias_var, &alias_name);
140 amxc_string_clean(&alias_name);
142 amxc_htable_insert(values,
"Alias", &alias_var->hit);
144 alias_var = amxc_var_from_htable_it(halias);
145 if((amxc_var_type_of(alias_var) != AMXC_VAR_ID_CSTRING) &&
146 ( amxc_var_type_of(alias_var) != AMXC_VAR_ID_SSV_STRING) &&
147 ( amxc_var_type_of(alias_var) != AMXC_VAR_ID_CSV_STRING)) {
153 *name = amxc_var_constcast(cstring_t, alias_var);
154 if(isdigit((*name)[0]) != 0) {
166 amxc_var_t* templ_params,
167 amxc_var_t* values) {
169 amxp_expr_t* expr = NULL;
170 amxc_htable_t* hvalues = (amxc_htable_t*) amxc_var_constcast(amxc_htable_t, values);
171 bool has_matches =
false;
183 when_failed(retval, exit);
189 if((*name != NULL) && ((*name)[0] != 0)) {
199 amxp_expr_delete(&expr);
208 uint32_t index_try = 0;
222 object->index = index;
225 size_needed = snprintf(NULL, 0,
"%" PRIu32, object->
index);
226 object->index_name = (
char*) calloc(size_needed + 1,
sizeof(
char));
228 snprintf(object->
index_name, size_needed + 1,
"%" PRIu32, object->
index);
229 if(object->
name == NULL) {
230 if((name == NULL) || (name[0] == 0)) {
232 when_null(object->
name, exit);
249 amxc_var_t* templ_params,
250 amxc_var_t* tmp_values) {
256 when_null((*
object), exit);
264 amxc_llist_append(&templ->
instances, &(*object)->it);
266 when_failed(retval, exit);
268 when_failed(retval, exit);
276 if(*
object != NULL) {
289 UNUSED
const amxc_var_t*
const args,
290 UNUSED amxc_var_t*
const retval,
293 amxc_var_t* data = (amxc_var_t*) priv;
300 amxc_var_delete(&data);
308 amxc_var_t* max_var) {
309 if(max_var != NULL) {
310 amxc_var_delete(&max_var);
322 amxc_var_t* max_var = NULL;
325 amxc_var_new(&max_var);
326 amxc_var_set(uint32_t, max_var, max);
340 amxc_var_delete(&max_var);
354 amxc_var_t* values) {
356 amxc_var_t templ_params;
357 amxc_var_t* tmp_values = NULL;
360 amxc_var_init(&templ_params);
362 when_null(
object, exit);
363 when_null(templ, exit);
367 when_true_status(values != NULL && amxc_var_type_of(values) != AMXC_VAR_ID_HTABLE,
371 amxc_var_new(&tmp_values);
372 amxc_var_set_type(tmp_values, AMXC_VAR_ID_HTABLE);
378 when_failed(retval, exit);
380 when_failed(retval, exit);
382 when_failed(retval, exit);
385 tmp_values, &rv,
true);
390 amxc_var_delete(&tmp_values);
393 amxc_var_clean(&templ_params);
400 amxc_var_t* max_var = NULL;
401 uint32_t instances = 0;
402 when_null(
object, exit);
414 if(max == UINT32_MAX) {
420 if(max_var != NULL) {
421 amxc_var_set(uint32_t, max_var, max);
424 when_failed(retval, exit);
Ambiorix Data Model Default actions header file.
amxd_status_t amxd_action_object_add_inst(amxd_object_t *const object, amxd_param_t *const param, amxd_action_t reason, const amxc_var_t *const args, amxc_var_t *const retval, void *priv)
#define when_failed_status(x, l, c)
bool amxd_name_is_valid(const char *name)
Ambiorix Data Model API header file.
Ambiorix Data Model API header file.
bool amxd_object_has_action_cb(amxd_object_t *const object, const amxd_action_t reason, amxd_action_fn_t fn)
amxd_status_t amxd_object_add_action_cb(amxd_object_t *const object, const amxd_action_t reason, amxd_action_fn_t fn, void *priv)
void amxd_object_set_action_cb_data(amxd_object_t *const object, const amxd_action_t reason, amxd_action_fn_t fn, void *data)
void * amxd_object_get_action_cb_data(amxd_object_t *const object, const amxd_action_t reason, amxd_action_fn_t fn)
amxd_status_t amxd_object_remove_action_cb(amxd_object_t *const object, const amxd_action_t reason, amxd_action_fn_t fn)
bool amxd_object_has_matching_instances(const amxd_object_t *const templ, amxp_expr_t *expr)
static uint32_t amxd_object_get_instance_count(const amxd_object_t *object)
static void amxd_object_remove_max_instance_check(amxd_object_t *object, amxc_var_t *max_var)
static bool amxd_template_has_instance(const amxd_object_t *const templ, const char *name)
static bool amxd_template_has_index(const amxd_object_t *const templ, uint32_t index)
static amxd_status_t amxd_object_instantiate(amxd_object_t **object, amxd_object_t *templ, const char *name, uint32_t index, amxc_var_t *templ_params, amxc_var_t *tmp_values)
static amxd_status_t amxd_object_instance_set_index_name(amxd_object_t *object, amxd_object_t *templ, const char *name, uint32_t index)
static amxd_status_t amxd_object_add_max_instance_check(amxd_object_t *object, uint32_t max)
static amxd_status_t amxd_object_instance_validate_id(amxd_object_t *templ, const char **name, uint32_t index, amxc_var_t *templ_params, amxc_var_t *values)
amxd_status_t amxd_object_set_max_instances(amxd_object_t *object, uint32_t max)
static amxd_status_t amxd_cleanup_max_instance(amxd_object_t *const object, UNUSED amxd_param_t *const param, amxd_action_t reason, UNUSED const amxc_var_t *const args, UNUSED amxc_var_t *const retval, void *priv)
static amxd_status_t amxd_object_check_instance_alias(amxd_object_t *const templ, amxc_var_t *templ_params, amxc_htable_t *values, uint32_t index, const char **name)
amxd_param_t * amxd_object_get_param_counter_by_counted_object(const amxd_object_t *const object)
Gets a parameter definition associated with a counted object.
amxd_status_t amxd_object_describe_key_params(amxd_object_t *const object, amxc_var_t *const value, amxd_dm_access_t access)
PRIVATE amxd_status_t amxd_object_build_key_expr(amxc_var_t *const templ_params, amxp_expr_t **expr, const amxc_htable_t *const data)
PRIVATE void amxd_object_clean(amxd_object_t *const object)
PRIVATE amxd_status_t amxd_object_copy_params(amxd_object_t *const dst, const amxd_object_t *const src)
PRIVATE amxd_status_t amxd_object_copy_children(amxd_object_t *const dst, const amxd_object_t *const src)
PRIVATE amxd_status_t amxd_object_init(amxd_object_t *const object, const amxd_object_type_t type, const char *name, amxc_var_t *templ_params, amxc_var_t *values)
PRIVATE amxd_status_t amxd_object_copy_mib_names(amxd_object_t *const dst, const amxd_object_t *const src)
amxd_status_t amxd_param_counter_update(amxd_param_t *counter)
#define GET_FIELD(var, field)
amxd_status_t PRIVATE amxd_action_set_values(amxd_object_t *const object, amxd_dm_access_t access, bool ro, const amxc_var_t *values, amxc_var_t *retval, bool required)
enum _amxd_action amxd_action_t
enum _amxd_status amxd_status_t
@ amxd_status_invalid_name
@ amxd_status_invalid_type
@ amxd_status_unknown_error
@ amxd_status_invalid_value
#define AMXD_OBJECT_NAMED
Name and path format flag - default behavior, use name for instance objects.
@ amxd_dm_access_protected
amxd_status_t amxd_object_new_instance(amxd_object_t **object, amxd_object_t *templ, const char *name, uint32_t index, amxc_var_t *values)
Data model object constructor function.
const char * amxd_object_get_name(const amxd_object_t *const object, const uint32_t flags)
Get the name of the object (or index as a string for instance objects)
amxd_status_t amxd_object_set_attrs(amxd_object_t *const object, const uint32_t bitmask, bool enable)
Sets or unsets object attributes using a bitmap.
uint32_t amxd_object_get_attrs(const amxd_object_t *const object)
Gets the set attributes of an object.
static amxd_status_t status