63 #include <amxc/amxc.h>
65 #include <amxp/amxp_signal.h>
66 #include <amxp/amxp_slot.h>
89 amxc_llist_it_init(&func->
it);
96 if((ret_type == AMXC_VAR_ID_ANY) ||
97 ( amxc_var_get_type(ret_type) != NULL)) {
98 func->
name = strdup(name);
99 when_null(func->
name, exit);
101 amxc_llist_init(&func->
args);
113 amxc_llist_it_take(&func->
it);
115 amxc_var_delete(&func->
flags);
126 uint32_t attributes = 0;
138 const uint32_t attr) {
148 const uint32_t ret_type,
151 when_null(func, exit);
157 when_null((*func), exit);
162 if((retval != 0) && (func != NULL)) {
170 when_null(func, exit);
171 when_null((*func), exit);
184 when_null(dest, exit);
185 when_null(source, exit);
188 when_null((*dest), exit);
192 source->
impl), exit);
193 (*dest)->attr = source->
attr;
195 amxc_llist_for_each(it, (&source->
args)) {
218 if((retval !=
amxd_status_ok) && (dest != NULL) && (*dest != NULL)) {
228 when_null(func, exit);
229 when_null(func->
it.llist, exit);
241 when_null(
object, exit);
262 amxc_var_t*
const args,
263 amxc_var_t*
const ret) {
267 when_null(
object, exit);
268 when_null(base_func, exit);
269 if(base_func->
impl == NULL) {
273 status = base_func->
impl(
object, base_func, args, ret);
280 return func == NULL ? NULL : func->
name;
288 when_null(func, exit);
297 flags |= (1 << attr);
299 flags &= ~(1 << attr);
311 const uint32_t bitmask,
321 when_null(func, exit);
340 uint32_t attributes = 0;
341 when_null(func, exit);
357 when_null(func, exit);
361 retval = (flags & (1 << attr)) != 0 ? true :
false;
368 when_null(func, exit);
369 when_null(flag, exit);
370 when_true(*flag == 0, exit);
379 when_null(func, exit);
380 when_null(flag, exit);
381 when_true(*flag == 0, exit);
391 when_null(func, exit);
392 when_null(flag, exit);
393 when_true(*flag == 0, exit);
404 when_null(func, exit);
414 amxc_var_t*
const value) {
416 amxc_var_t* table = NULL;
417 uint32_t retvalt = 0;
419 static const char* attr_name[] = {
427 when_null(func, exit);
428 when_null(value, exit);
431 amxc_var_set_type(value, AMXC_VAR_ID_HTABLE);
433 amxc_var_add_key(uint32_t, value,
"type_id", retvalt);
434 amxc_var_add_key(cstring_t,
437 amxc_var_get_type_name_from_id(retvalt));
438 table = amxc_var_add_key(amxc_htable_t, value,
"attributes", NULL);
440 amxc_var_add_key(
bool,
446 table = amxc_var_add_key(amxc_llist_t, value,
"arguments", NULL);
447 amxc_llist_for_each(it, (&func->
args)) {
449 amxc_var_t* arg = amxc_var_add(amxc_htable_t, table, NULL);
453 table = amxc_var_add_key(amxc_llist_t, value,
"flags", NULL);
454 if(func->
flags != NULL) {
455 amxc_var_for_each(flag, func->
flags) {
456 if(amxc_var_dyncast(
bool, flag)) {
457 amxc_var_add(cstring_t, table, amxc_var_key(flag));
471 when_null(func, exit);
472 when_str_empty(name, exit);
474 amxc_llist_for_each(it, (&func->
args)) {
476 if(strcmp(arg->
name, name) == 0) {
490 when_null(func, exit);
491 when_null(args, exit);
492 when_false(amxc_var_type_of(args) == AMXC_VAR_ID_HTABLE, exit);
494 amxc_llist_for_each(it, (&func->
args)) {
496 amxc_var_t* in_arg = amxc_var_get_key(args,
498 AMXC_VAR_FLAG_DEFAULT);
503 when_null(in_arg, exit);
505 if((in_arg == NULL) &&
506 ( amxc_var_type_of(&arg->
default_value) != AMXC_VAR_ID_NULL)) {
507 in_arg = amxc_var_add_new_key(args, arg->
name);
512 when_true(arg->
type != amxc_var_type_of(in_arg), exit);
bool amxd_name_is_valid(const char *name)
bool PRIVATE amxd_common_has_flag(const amxc_var_t *const flags, const char *flag)
void PRIVATE amxd_common_set_flag(amxc_var_t **flags, const char *flag)
void PRIVATE amxd_common_unset_flag(amxc_var_t **flags, const char *flag)
static void amxd_function_free_arg_it(amxc_llist_it_t *it)
static void amxd_function_set_attributes(amxd_function_t *const func, const uint32_t attr)
static uint32_t amxd_function_get_attributes(const amxd_function_t *const func)
static amxd_status_t amxd_function_init(amxd_function_t *const func, const char *name, uint32_t ret_type, amxd_object_fn_t impl)
static int amxd_function_clean(amxd_function_t *const func)
Ambiorix Data Model RPC methods API header file.
Ambiorix Data Model API header file.
void PRIVATE amxd_function_arg_clean(amxd_func_arg_t *const arg)
enum _amxd_status amxd_status_t
amxd_status_t(* amxd_object_fn_t)(amxd_object_t *object, amxd_function_t *func, amxc_var_t *args, amxc_var_t *ret)
@ amxd_status_invalid_name
@ amxd_status_invalid_attr
@ amxd_status_function_not_implemented
@ amxd_status_unknown_error
enum _amxd_fattr_id amxd_fattr_id_t
The method attributes.
amxd_object_t * amxd_object_get_parent(const amxd_object_t *const object)
Get the parent object.
amxd_function_t * amxd_object_get_function(const amxd_object_t *const object, const char *name)
Get the definition of a RPC method from an object.
static amxd_object_type_t amxd_object_get_type(const amxd_object_t *const object)
Returns the object type.
amxd_status_t amxd_function_set_attr(amxd_function_t *func, const amxd_fattr_id_t attr, const bool enable)
Sets or unsets a method attribute.
amxd_status_t amxd_function_describe(amxd_function_t *const func, amxc_var_t *const value)
Fetches the full RPC method definition in a variant.
const char * amxd_function_get_name(const amxd_function_t *const func)
Get the name of a method.
void amxd_function_delete(amxd_function_t **func)
Data model RPC method destructor function.
amxd_status_t amxd_function_arg_set_attr(amxd_function_t *const func, const char *name, const amxd_aattr_id_t attr, const bool enable)
Sets or unsets a method argument attribute.
amxd_func_arg_t * amxd_function_get_arg(const amxd_function_t *const func, const char *name)
Gets the argument definition of a RPC method.
bool amxd_function_arg_is_attr_set(const amxd_function_t *const func, const char *name, const amxd_aattr_id_t attr)
Checks if a method argument attribute is set.
amxd_status_t amxd_function_arg_describe(amxd_func_arg_t *const arg, amxc_var_t *const value)
Fetches the argument definition in a variant.
amxd_object_t * amxd_function_get_owner(const amxd_function_t *const func)
Get the object pointer of the object containing the function definition.
static uint32_t amxd_function_get_type(const amxd_function_t *const func)
Gets the return type of a method.
void amxd_function_unset_flag(amxd_function_t *func, const char *flag)
Removes a flag from a function.
amxd_status_t amxd_function_new(amxd_function_t **func, const char *name, const uint32_t ret_type, amxd_object_fn_t impl)
Data model RPC method constructor function.
amxd_status_t amxd_function_call_base(const amxd_function_t *const func, amxd_object_t *const object, amxc_var_t *const args, amxc_var_t *const ret)
Call the base function of an overridden function.
amxd_status_t amxd_function_set_attrs(amxd_function_t *func, const uint32_t bitmask, bool enable)
Sets or unsets method attributes using a bitmap.
amxd_status_t amxd_function_copy(amxd_function_t **dest, const amxd_function_t *const source)
Data model RPC method copy constructor function.
bool amxd_function_are_args_valid(amxd_function_t *func, amxc_var_t *args)
Validates that the input arguments are valid.
bool amxd_function_is_attr_set(const amxd_function_t *const func, const amxd_fattr_id_t attr)
Checks if a method attribute is set.
bool amxd_function_has_flag(const amxd_function_t *const func, const char *flag)
Checks if a flag is set.
void amxd_function_set_flag(amxd_function_t *func, const char *flag)
Sets a flag on a function.
uint32_t amxd_function_get_attrs(const amxd_function_t *const func)
Gets the set attributes of a RPC method.
amxd_function_t * amxd_function_get_base(const amxd_function_t *const func)
Get the base function definition of an overridden function.
amxd_status_t amxd_function_new_arg(amxd_function_t *func, const char *name, const uint32_t type, amxc_var_t *default_value)
Adds an argument definition to a RPC method definition.
amxd_status_t amxd_function_set_impl(amxd_function_t *const func, amxd_object_fn_t impl)
Set an implementation for a RPC method.
amxc_llist_it_t derived_from
static amxd_status_t status