libamxd  6.4.1
Data Model Manager
amxd_action_object_list.c File Reference
#include <string.h>
#include "amxd_priv.h"
#include <amxd/amxd_dm.h>
#include <amxd/amxd_action.h>
#include <amxd/amxd_object.h>
#include "amxd_object_priv.h"
#include "amxd_dm_priv.h"
#include "amxd_assert.h"

Go to the source code of this file.

Functions

static amxd_status_t amxd_action_list_params (amxd_object_t *const object, const amxc_var_t *args, amxc_var_t *const retval)
 
static bool amxd_is_function_in_list (const amxc_llist_t *funcs, const char *name)
 
static void amxd_object_list_functions_impl (const amxd_object_t *object, amxd_dm_access_t access, bool template_info, amxc_var_t *const funcs, const amxd_object_type_t type)
 
static amxd_status_t amxd_action_list_funcs (amxd_object_t *const object, const amxc_var_t *args, amxc_var_t *const retval)
 
static amxd_status_t amxd_action_list_objs (amxd_object_t *const object, UNUSED const amxc_var_t *args, amxc_var_t *const retval)
 
static amxd_status_t amxd_action_list_insts (amxd_object_t *const object, UNUSED const amxc_var_t *args, amxc_var_t *const retval)
 
static amxd_status_t amxd_action_list_events (amxd_object_t *const object, UNUSED const amxc_var_t *args, amxc_var_t *const retval)
 
static amxd_status_t amxd_object_list_item (amxd_object_t *const object, amxc_var_t *const value, uint32_t flags, amxd_dm_access_t access, const char *item)
 
bool PRIVATE amxd_must_add (const amxc_var_t *const args, const char *name, amxd_object_t *object)
 
amxd_status_t amxd_action_object_list (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_list (amxd_object_t *const object, amxc_var_t *const list, uint32_t flags, amxd_dm_access_t access)
 
amxd_status_t amxd_object_list_params (amxd_object_t *const object, amxc_var_t *const list, amxd_dm_access_t access)
 
amxd_status_t amxd_object_list_functions (amxd_object_t *const object, amxc_var_t *const list, amxd_dm_access_t access)
 Builds a linked list variant containing all function names available in the object. More...
 

Function Documentation

◆ amxd_action_list_events()

static amxd_status_t amxd_action_list_events ( amxd_object_t *const  object,
UNUSED const amxc_var_t *  args,
amxc_var_t *const  retval 
)
static

Definition at line 204 of file amxd_action_object_list.c.

206  {
208  amxd_object_t* base = NULL;
209 
210  amxc_var_for_each(event, (&object->events)) {
211  const char* ename = amxc_var_key(event);
212  amxc_var_add(cstring_t, retval, ename);
213  }
214 
216  base = amxd_object_get_parent(object);
217  } else {
218  base = amxd_object_get_base(object);
219  }
220  while(base != NULL) {
221  amxc_var_for_each(event, (&base->events)) {
222  const char* ename = amxc_var_key(event);
223  amxc_var_add(cstring_t, retval, ename);
224  }
225  base = amxd_object_get_base(base);
226  }
227 
229 
230  return status;
231 }
amxd_object_t * amxd_object_get_base(const amxd_object_t *const object)
Definition: amxd_object.c:389
enum _amxd_status amxd_status_t
@ amxd_status_ok
Definition: amxd_types.h:78
@ amxd_status_unknown_error
Definition: amxd_types.h:79
@ amxd_object_instance
Definition: amxd_types.h:186
amxd_object_t * amxd_object_get_parent(const amxd_object_t *const object)
Get the parent object.
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_var_t events
Definition: amxd_types.h:256
static amxd_status_t status

◆ amxd_action_list_funcs()

static amxd_status_t amxd_action_list_funcs ( amxd_object_t *const  object,
const amxc_var_t *  args,
amxc_var_t *const  retval 
)
static

Definition at line 148 of file amxd_action_object_list.c.

150  {
152  amxd_dm_access_t access = (amxd_dm_access_t) amxc_var_dyncast(uint32_t, GET_ARG(args, "access"));
153  bool template_info = GET_BOOL(args, "template_info");
154 
156  access,
157  template_info,
158  retval,
159  object->type);
161 
162  return status;
163 }
static void amxd_object_list_functions_impl(const amxd_object_t *object, amxd_dm_access_t access, bool template_info, amxc_var_t *const funcs, const amxd_object_type_t type)
enum _amxd_dm_access amxd_dm_access_t
Access level.
amxd_object_type_t type
Definition: amxd_types.h:236

◆ amxd_action_list_insts()

static amxd_status_t amxd_action_list_insts ( amxd_object_t *const  object,
UNUSED const amxc_var_t *  args,
amxc_var_t *const  retval 
)
static

Definition at line 187 of file amxd_action_object_list.c.

189  {
191  amxc_llist_for_each(it, (&object->instances)) {
192  amxd_object_t* inst = amxc_llist_it_get_data(it, amxd_object_t, it);
193  amxc_var_t* item = amxc_var_add(amxc_htable_t, retval, NULL);
194  const char* name = amxd_object_get_name(inst, AMXD_OBJECT_NAMED);
195  uint32_t index = amxd_object_get_index(inst);
196  amxc_var_add_key(cstring_t, item, "name", name);
197  amxc_var_add_key(uint32_t, item, "index", index);
198  }
200 
201  return status;
202 }
#define AMXD_OBJECT_NAMED
Name and path format flag - default behavior, use name for instance objects.
Definition: amxd_object.h:164
uint32_t amxd_object_get_index(const amxd_object_t *const object)
Get the index of an instance object.
Definition: amxd_object.c:265
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)
Definition: amxd_object.c:239
amxc_llist_t instances
Definition: amxd_types.h:244

◆ amxd_action_list_objs()

static amxd_status_t amxd_action_list_objs ( amxd_object_t *const  object,
UNUSED const amxc_var_t *  args,
amxc_var_t *const  retval 
)
static

Definition at line 165 of file amxd_action_object_list.c.

167  {
169  amxd_dm_access_t access = (amxd_dm_access_t) amxc_var_dyncast(uint32_t, GET_ARG(args, "access"));
170  bool template_info = GET_BOOL(args, "template_info");
171 
172  if((amxd_object_get_type(object) != amxd_object_template) || template_info) {
173  amxc_llist_for_each(it, (&object->objects)) {
174  amxd_object_t* child = amxc_llist_it_get_data(it, amxd_object_t, it);
175  const char* name = amxd_object_get_name(child, AMXD_OBJECT_NAMED);
176  uint32_t attrs = amxd_object_get_attrs(child);
177  if(amxd_action_can_access_object(attrs, access)) {
178  amxc_var_add(cstring_t, retval, name);
179  }
180  }
181  }
183 
184  return status;
185 }
bool amxd_action_can_access_object(uint32_t object_attrs, amxd_dm_access_t access)
@ amxd_object_template
Definition: amxd_types.h:183
uint32_t amxd_object_get_attrs(const amxd_object_t *const object)
Gets the set attributes of an object.
Definition: amxd_object.c:334
amxc_llist_t objects
Definition: amxd_types.h:243

◆ amxd_action_list_params()

static amxd_status_t amxd_action_list_params ( amxd_object_t *const  object,
const amxc_var_t *  args,
amxc_var_t *const  retval 
)
static

Definition at line 67 of file amxd_action_object_list.c.

69  {
71  amxd_dm_access_t access = (amxd_dm_access_t) GET_UINT32(args, "access");
72  bool template_info = GET_BOOL(args, "template_info");
73 
74  amxc_llist_for_each(it, (&object->parameters)) {
75  amxd_param_t* param = amxc_llist_it_get_data(it, amxd_param_t, it);
76  const char* name = amxd_param_get_name(param);
77  uint32_t param_attrs = amxd_param_get_attrs(param);
78  if(!amxd_action_can_add_param(param_attrs, object->type, access, template_info)) {
79  continue;
80  }
81  amxc_var_add(cstring_t, retval, name);
82  }
84 
85  return status;
86 }
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)
amxc_llist_t parameters
Definition: amxd_types.h:246

◆ amxd_action_object_list()

amxd_status_t amxd_action_object_list ( 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 275 of file amxd_action_object_list.c.

280  {
283  static list_parts_t parts[5] = {
284  { "parameters", amxd_action_list_params},
285  { "functions", amxd_action_list_funcs},
286  { "objects", amxd_action_list_objs},
287  { "instances", amxd_action_list_insts},
288  { "events", amxd_action_list_events},
289  };
290 
291  when_null(object, exit);
292  when_null(retval, exit);
293  when_true_status(reason != action_object_list,
294  exit,
296 
297  when_true_status(!amxc_var_is_null(args) &&
298  amxc_var_type_of(args) != AMXC_VAR_ID_HTABLE,
299  exit,
301 
302  access = (amxd_dm_access_t) amxc_var_dyncast(uint32_t, GET_ARG(args, "access"));
303  when_true_status(!amxd_action_verify_access(object, access),
304  exit,
306 
308  amxc_var_set_type(retval, AMXC_VAR_ID_HTABLE);
309  for(uint32_t i = 0; i < 5; i++) {
310  if(amxd_must_add(args, parts[i].name, object)) {
311  amxc_var_t* list =
312  amxc_var_add_key(amxc_llist_t, retval, parts[i].name, NULL);
313  status = parts[i].fn(object, args, list);
314  when_failed(status, exit);
315  }
316  }
317 
318 exit:
319  return status;
320 }
static amxd_status_t amxd_action_list_insts(amxd_object_t *const object, UNUSED const amxc_var_t *args, amxc_var_t *const retval)
static amxd_status_t amxd_action_list_params(amxd_object_t *const object, const amxc_var_t *args, amxc_var_t *const retval)
static amxd_status_t amxd_action_list_events(amxd_object_t *const object, UNUSED const amxc_var_t *args, amxc_var_t *const retval)
static amxd_status_t amxd_action_list_funcs(amxd_object_t *const object, const amxc_var_t *args, amxc_var_t *const retval)
bool PRIVATE amxd_must_add(const amxc_var_t *const args, const char *name, amxd_object_t *object)
static amxd_status_t amxd_action_list_objs(amxd_object_t *const object, UNUSED const amxc_var_t *args, amxc_var_t *const retval)
bool amxd_action_verify_access(amxd_object_t *object, amxd_dm_access_t access)
@ action_object_list
Definition: amxd_types.h:120
@ 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
@ amxd_dm_access_public
Definition: amxd_types.h:136
list_part_fn_t fn
Definition: amxd_priv.h:73

◆ amxd_is_function_in_list()

static bool amxd_is_function_in_list ( const amxc_llist_t *  funcs,
const char *  name 
)
static

Definition at line 88 of file amxd_action_object_list.c.

89  {
90  bool retval = false;
91  amxc_llist_for_each(it, funcs) {
92  amxc_var_t* stored = amxc_var_from_llist_it(it);
93  if(strcmp(amxc_var_constcast(cstring_t, stored), name) == 0) {
94  retval = true;
95  break;
96  }
97  }
98 
99  return retval;
100 }

◆ amxd_must_add()

bool PRIVATE amxd_must_add ( const amxc_var_t *const  args,
const char *  name,
amxd_object_t object 
)

Definition at line 257 of file amxd_action_object_list.c.

259  {
260  bool retval = false;
261  amxc_var_t* arg = amxc_var_get_key(args, name, AMXC_VAR_FLAG_DEFAULT);
262 
263  if(amxc_var_is_null(arg) ||
264  ( amxc_var_dyncast(bool, arg) == true)) {
265  retval = true;
266  }
267  if((strcmp(name, "instances") == 0) &&
269  retval = false;
270  }
271 
272  return retval;
273 }

◆ amxd_object_list()

amxd_status_t amxd_object_list ( amxd_object_t *const  object,
amxc_var_t *const  list,
uint32_t  flags,
amxd_dm_access_t  access 
)

Definition at line 322 of file amxd_action_object_list.c.

325  {
327  amxc_var_t args;
328 
329  amxc_var_init(&args);
330  when_null(object, exit);
331  when_null(list, exit);
332 
333  amxc_var_set_type(&args, AMXC_VAR_ID_HTABLE);
334  amxc_var_add_key(bool, &args, "parameters", flags & AMXD_OBJECT_PARAM);
335  amxc_var_add_key(bool, &args, "functions", flags & AMXD_OBJECT_FUNC);
336  amxc_var_add_key(bool, &args, "objects", flags & AMXD_OBJECT_CHILD);
337  amxc_var_add_key(bool, &args, "instances", flags & AMXD_OBJECT_INSTANCE);
338  amxc_var_add_key(bool, &args, "template_info", flags & AMXD_TEMPLATE_INFO);
339  amxc_var_add_key(bool, &args, "events", flags & AMXD_OBJECT_EVENT);
340  amxc_var_add_key(uint32_t, &args, "access", access);
341  retval = amxd_dm_invoke_action(object,
342  NULL,
344  &args,
345  list);
346 
347  amxc_var_clean(&args);
348 
349 exit:
350  return retval;
351 }
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
#define AMXD_OBJECT_EVENT
Definition: amxd_object.h:318
#define AMXD_OBJECT_INSTANCE
List flag.
Definition: amxd_object.h:287
#define AMXD_TEMPLATE_INFO
List and describe flag.
Definition: amxd_object.h:314
#define AMXD_OBJECT_CHILD
List flag.
Definition: amxd_object.h:273
#define AMXD_OBJECT_FUNC
List and describe flag.
Definition: amxd_object.h:260
#define AMXD_OBJECT_PARAM
List and describe flag.
Definition: amxd_object.h:244

◆ amxd_object_list_functions_impl()

static void amxd_object_list_functions_impl ( const amxd_object_t object,
amxd_dm_access_t  access,
bool  template_info,
amxc_var_t *const  funcs,
const amxd_object_type_t  type 
)
static

Definition at line 102 of file amxd_action_object_list.c.

106  {
107  const amxc_llist_t* lfuncs = amxc_var_constcast(amxc_llist_t, funcs);
108 
109  if(amxd_object_is_base(object) &&
110  ( access == amxd_dm_access_public)) {
111  goto exit;
112  }
113 
114  amxc_llist_for_each(it, (&object->functions)) {
115  amxd_function_t* func = amxc_llist_it_get_data(it, amxd_function_t, it);
116  const char* func_name = amxd_function_get_name(func);
117  uint32_t func_attrs = amxd_function_get_attrs(func);
118  if(!amxd_is_function_in_list(lfuncs, func_name) &&
119  amxd_action_can_add_function(func_attrs, type, access, template_info)) {
120  amxc_var_add(cstring_t, funcs, func_name);
121  }
122  }
123 
125  amxd_object_t* super = amxd_object_get_parent(object);
127  access,
128  template_info,
129  funcs,
130  type);
131  } else {
132  if(amxc_llist_it_is_in_list(&object->derived_from)) {
133  amxd_object_t* super = amxc_container_of(object->derived_from.llist,
135  derived_objects);
137  access,
138  template_info,
139  funcs,
140  type);
141  }
142  }
143 
144 exit:
145  return;
146 }
static bool amxd_is_function_in_list(const amxc_llist_t *funcs, const char *name)
bool PRIVATE amxd_object_is_base(const amxd_object_t *const object)
Definition: amxd_dm_priv.c:504
bool amxd_action_can_add_function(uint32_t func_attrs, const amxd_object_type_t type, amxd_dm_access_t access, bool template_info)
const char * amxd_function_get_name(const amxd_function_t *const func)
Get the name of a method.
uint32_t amxd_function_get_attrs(const amxd_function_t *const func)
Gets the set attributes of a RPC method.
RPC method structure.
Definition: amxd_types.h:341
amxc_llist_it_t derived_from
Definition: amxd_types.h:249
amxc_llist_t functions
Definition: amxd_types.h:245

◆ amxd_object_list_item()

static amxd_status_t amxd_object_list_item ( amxd_object_t *const  object,
amxc_var_t *const  value,
uint32_t  flags,
amxd_dm_access_t  access,
const char *  item 
)
static

Definition at line 234 of file amxd_action_object_list.c.

238  {
240  amxc_var_t obj_data;
241 
242  amxc_var_init(&obj_data);
243 
244  when_null(value, exit);
245 
246  retval = amxd_object_list(object, &obj_data, flags, access);
247  if(retval == amxd_status_ok) {
248  amxd_fetch_item(&obj_data, item, value);
249  }
250 
251 exit:
252  amxc_var_clean(&obj_data);
253  return retval;
254 }
amxd_status_t amxd_object_list(amxd_object_t *const object, amxc_var_t *const list, uint32_t flags, amxd_dm_access_t access)
PRIVATE void amxd_fetch_item(amxc_var_t *const full_data, const char *item, amxc_var_t *const data)

◆ amxd_object_list_params()

amxd_status_t amxd_object_list_params ( amxd_object_t *const  object,
amxc_var_t *const  list,
amxd_dm_access_t  access 
)

Definition at line 353 of file amxd_action_object_list.c.

355  {
356  return amxd_object_list_item(object,
357  list,
359  access,
360  "parameters");
361 }
static amxd_status_t amxd_object_list_item(amxd_object_t *const object, amxc_var_t *const value, uint32_t flags, amxd_dm_access_t access, const char *item)