libamxd  6.4.1
Data Model Manager
amxd_action_object_list.c
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** SPDX-License-Identifier: BSD-2-Clause-Patent
4 **
5 ** SPDX-FileCopyrightText: Copyright (c) 2023 SoftAtHome
6 **
7 ** Redistribution and use in source and binary forms, with or without modification,
8 ** are permitted provided that the following conditions are met:
9 **
10 ** 1. Redistributions of source code must retain the above copyright notice,
11 ** this list of conditions and the following disclaimer.
12 **
13 ** 2. Redistributions in binary form must reproduce the above copyright notice,
14 ** this list of conditions and the following disclaimer in the documentation
15 ** and/or other materials provided with the distribution.
16 **
17 ** Subject to the terms and conditions of this license, each copyright holder
18 ** and contributor hereby grants to those receiving rights under this license
19 ** a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable
20 ** (except for failure to satisfy the conditions of this license) patent license
21 ** to make, have made, use, offer to sell, sell, import, and otherwise transfer
22 ** this software, where such license applies only to those patent claims, already
23 ** acquired or hereafter acquired, licensable by such copyright holder or contributor
24 ** that are necessarily infringed by:
25 **
26 ** (a) their Contribution(s) (the licensed copyrights of copyright holders and
27 ** non-copyrightable additions of contributors, in source or binary form) alone;
28 ** or
29 **
30 ** (b) combination of their Contribution(s) with the work of authorship to which
31 ** such Contribution(s) was added by such copyright holder or contributor, if,
32 ** at the time the Contribution is added, such addition causes such combination
33 ** to be necessarily infringed. The patent license shall not apply to any other
34 ** combinations which include the Contribution.
35 **
36 ** Except as expressly stated above, no rights or licenses from any copyright
37 ** holder or contributor is granted under this license, whether expressly, by
38 ** implication, estoppel or otherwise.
39 **
40 ** DISCLAIMER
41 **
42 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
43 ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44 ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45 ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
46 ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47 ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
48 ** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
49 ** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
50 ** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
51 ** USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
52 **
53 ****************************************************************************/
54 
55 #include <string.h>
56 
57 #include "amxd_priv.h"
58 
59 #include <amxd/amxd_dm.h>
60 #include <amxd/amxd_action.h>
61 #include <amxd/amxd_object.h>
62 
63 #include "amxd_object_priv.h"
64 #include "amxd_dm_priv.h"
65 #include "amxd_assert.h"
66 
68  const amxc_var_t* args,
69  amxc_var_t* const retval) {
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 }
87 
88 static bool amxd_is_function_in_list(const amxc_llist_t* funcs,
89  const char* name) {
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 }
101 
103  amxd_dm_access_t access,
104  bool template_info,
105  amxc_var_t* const funcs,
106  const amxd_object_type_t type) {
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 }
147 
149  const amxc_var_t* args,
150  amxc_var_t* const retval) {
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 }
164 
166  UNUSED const amxc_var_t* args,
167  amxc_var_t* const retval) {
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 }
186 
188  UNUSED const amxc_var_t* args,
189  amxc_var_t* const retval) {
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 }
203 
205  UNUSED const amxc_var_t* args,
206  amxc_var_t* const retval) {
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 }
232 
233 
235  amxc_var_t* const value,
236  uint32_t flags,
237  amxd_dm_access_t access,
238  const char* item) {
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 }
255 
256 
257 bool PRIVATE amxd_must_add(const amxc_var_t* const args,
258  const char* name,
259  amxd_object_t* object) {
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 }
274 
276  UNUSED amxd_param_t* const p,
277  amxd_action_t reason,
278  const amxc_var_t* const args,
279  amxc_var_t* const retval,
280  UNUSED void* priv) {
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 }
321 
323  amxc_var_t* const list,
324  uint32_t flags,
325  amxd_dm_access_t access) {
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 }
352 
354  amxc_var_t* const list,
355  amxd_dm_access_t access) {
356  return amxd_object_list_item(object,
357  list,
359  access,
360  "parameters");
361 }
362 
364  amxc_var_t* const list,
365  amxd_dm_access_t access) {
366  return amxd_object_list_item(object,
367  list,
369  access,
370  "functions");
371 }
Ambiorix Data Model Default actions header file.
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)
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_object_list_item(amxd_object_t *const object, amxc_var_t *const value, uint32_t flags, amxd_dm_access_t access, const char *item)
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)
static bool amxd_is_function_in_list(const amxc_llist_t *funcs, const char *name)
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)
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)
Ambiorix Data Model API header file.
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 PRIVATE amxd_object_is_base(const amxd_object_t *const object)
Definition: amxd_dm_priv.c:504
Ambiorix Data Model API header file.
#define AMXD_OBJECT_EVENT
Definition: amxd_object.h:318
amxd_object_t * amxd_object_get_base(const amxd_object_t *const object)
Definition: amxd_object.c:389
bool amxd_action_can_add_function(uint32_t func_attrs, const amxd_object_type_t type, amxd_dm_access_t access, bool template_info)
bool amxd_action_can_access_object(uint32_t object_attrs, amxd_dm_access_t access)
bool amxd_action_verify_access(amxd_object_t *object, amxd_dm_access_t access)
bool amxd_action_can_add_param(uint32_t param_attrs, const amxd_object_type_t type, amxd_dm_access_t access, bool template_info)
PRIVATE void amxd_fetch_item(amxc_var_t *const full_data, const char *item, amxc_var_t *const data)
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_object_list
Definition: amxd_types.h:120
enum _amxd_action amxd_action_t
enum _amxd_status amxd_status_t
@ 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_status_ok
Definition: amxd_types.h:78
@ amxd_status_unknown_error
Definition: amxd_types.h:79
#define AMXD_OBJECT_INSTANCE
List flag.
Definition: amxd_object.h:287
enum _amxd_object_type amxd_object_type_t
The different object types.
#define AMXD_TEMPLATE_INFO
List and describe flag.
Definition: amxd_object.h:314
#define AMXD_OBJECT_NAMED
Name and path format flag - default behavior, use name for instance objects.
Definition: amxd_object.h:164
#define AMXD_OBJECT_CHILD
List flag.
Definition: amxd_object.h:273
#define AMXD_OBJECT_FUNC
List and describe flag.
Definition: amxd_object.h:260
enum _amxd_dm_access amxd_dm_access_t
Access level.
#define AMXD_OBJECT_PARAM
List and describe flag.
Definition: amxd_object.h:244
@ amxd_dm_access_public
Definition: amxd_types.h:136
@ amxd_object_template
Definition: amxd_types.h:183
@ 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.
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.
uint32_t amxd_object_get_index(const amxd_object_t *const object)
Get the index of an instance object.
Definition: amxd_object.c:265
static amxd_object_type_t amxd_object_get_type(const amxd_object_t *const object)
Returns the object type.
Definition: amxd_object.h:586
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
uint32_t amxd_object_get_attrs(const amxd_object_t *const object)
Gets the set attributes of an object.
Definition: amxd_object.c:334
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
amxd_object_type_t type
Definition: amxd_types.h:236
amxc_llist_t functions
Definition: amxd_types.h:245
amxc_llist_t objects
Definition: amxd_types.h:243
amxc_llist_t instances
Definition: amxd_types.h:244
amxc_var_t events
Definition: amxd_types.h:256
amxc_llist_t parameters
Definition: amxd_types.h:246
list_part_fn_t fn
Definition: amxd_priv.h:73
static amxd_status_t status