libamxd  6.4.1
Data Model Manager
amxd_action_object_read.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 #include <string.h>
55 #include <stdio.h>
56 
57 #include <amxc/amxc.h>
58 #include <amxp/amxp.h>
59 
60 #include <amxd/amxd_types.h>
61 #include <amxd/amxd_common.h>
62 #include <amxd/amxd_dm.h>
63 #include <amxd/amxd_action.h>
64 #include <amxd/amxd_object.h>
65 
66 #include "amxd_priv.h"
67 #include "amxd_assert.h"
68 
69 static void filter_add_params(amxc_string_t* filter, const amxc_llist_t* names) {
70  const char* sep = "";
71 
72  when_true(amxc_llist_is_empty(names), exit);
73 
74  if(amxc_string_is_empty(filter)) {
75  amxc_string_appendf(filter, "name in [ ");
76  } else {
77  amxc_string_appendf(filter, " && name in [");
78  }
79 
80  amxc_llist_iterate(it, names) {
81  amxc_var_t* var_name = amxc_var_from_llist_it(it);
82  const char* str_name = amxc_var_constcast(cstring_t, var_name);
83  amxc_string_appendf(filter, "%s'%s' ", sep, str_name);
84  sep = ",";
85  }
86 
87  amxc_string_appendf(filter, "]");
88 
89 exit:
90  return;
91 }
92 
93 static bool amxd_action_parameter_is_in(const char* name, amxc_var_t* params) {
94  bool retval = false;
95 
96  when_str_empty(name, exit)
97 
98  amxc_var_for_each(param, params) {
99  const char* param_name = GET_CHAR(param, NULL);
100  if((param_name != NULL) && (strcmp(name, param_name) == 0)) {
101  retval = true;
102  break;
103  }
104  }
105 
106 exit:
107  return retval;
108 }
109 
111  const amxc_llist_t* names) {
113  amxc_var_t obj_params;
114 
115  amxc_var_init(&obj_params);
116  when_true(amxc_llist_is_empty(names), exit);
117 
118  amxd_object_list_params(object, &obj_params, amxd_dm_access_private);
119  amxc_llist_iterate(it, names) {
120  amxc_var_t* var_name = amxc_var_from_llist_it(it);
121  const char* str_name = amxc_var_constcast(cstring_t, var_name);
122  if(!amxd_action_parameter_is_in(str_name, &obj_params)) {
124  break;
125  }
126  }
127 
128 exit:
129  amxc_var_clean(&obj_params);
130  return status;
131 }
132 
133 static void filter_add_attributes(amxc_string_t* filter, uint32_t attrs) {
134  static const char* attr_name[] = {
135  "template",
136  "instance",
137  "private",
138  "read-only",
139  "persistent",
140  "volatile",
141  "counter",
142  "key",
143  "unique",
144  "protected"
145  };
146 
147  const char* sep = "";
148  if(!amxc_string_is_empty(filter)) {
149  sep = " && ";
150  }
151 
152  for(uint32_t i = amxd_pattr_template; i < amxd_pattr_max; i++) {
153  if(IS_BIT_SET(attrs, i)) {
154  amxc_string_appendf(filter, "%sattributes.%s == true", sep, attr_name[i]);
155  sep = " && ";
156  }
157  }
158 }
159 
161  amxd_dm_access_t access,
162  uint32_t attributes,
163  amxc_var_t* params,
164  const char* expression,
165  amxc_var_t* const retval) {
167  amxp_expr_t expr;
168  amxc_var_t description;
169  amxc_var_t args;
170  amxp_expr_status_t expr_status = amxp_expr_status_ok;
171 
172  amxc_var_init(&description);
173  amxc_var_set_type(retval, AMXC_VAR_ID_HTABLE);
174  amxc_var_init(&args);
175  amxc_var_set_type(&args, AMXC_VAR_ID_HTABLE);
176 
177  if(expression != NULL) {
178  when_failed(amxp_expr_init(&expr, expression), exit);
179  }
180 
181  amxc_var_add_key(uint32_t, &args, "access", access);
182  amxc_var_add_key(bool, &args, "no-param-value", true);
183 
184  amxc_llist_for_each(it, (&object->parameters)) {
185  amxd_param_t* param = amxc_llist_it_get_data(it, amxd_param_t, it);
186  const char* name = amxd_param_get_name(param);
187  uint32_t param_attrs = amxd_param_get_attrs(param);
188  amxc_var_t* value = NULL;
189  bool in_filter_list = amxd_action_parameter_is_in(name, params);
190  if(!amxd_action_can_add_param(param_attrs,
191  amxd_object_get_type(object),
192  access,
193  true)) {
194  if(in_filter_list) {
196  goto exit;
197  }
198  continue;
199  }
200  if(((attributes & param_attrs) == 0) && (param_attrs != 0)) {
201  continue;
202  }
203  if(params && !in_filter_list) {
204  continue;
205  }
206  if(expression != NULL) {
207  amxd_dm_invoke_action(object, param, action_param_describe, &args, &description);
208  if(amxp_expr_eval_var(&expr, &description, &expr_status)) {
209  value = amxc_var_add_new_key(retval, name);
210  amxd_dm_invoke_action(object, param, action_param_read, &args, value);
211  }
212  if(expr_status != amxp_expr_status_ok) {
214  goto exit;
215  }
216  } else {
217  value = amxc_var_add_new_key(retval, name);
218  amxd_dm_invoke_action(object, param, action_param_read, &args, value);
219  }
220  }
221 
223 
224 exit:
225  if(expression != NULL) {
226  amxp_expr_clean(&expr);
227  }
228  amxc_var_clean(&description);
229  amxc_var_clean(&args);
230  return status;
231 }
232 
234  const amxc_var_t* args) {
236  amxc_var_t* temp = NULL;
237  const char* f = GET_CHAR(args, "filter");
238 
239  if((f != NULL) && (*f != 0)) {
240  amxc_string_setf(filter, "%s", f);
241  goto exit;
242  }
243 
244  temp = GET_ARG(args, "parameters");
245  when_true_status(!amxc_var_is_null(temp) && amxc_var_type_of(temp) != AMXC_VAR_ID_LIST,
246  exit,
248  if(temp != NULL) {
249  filter_add_params(filter, amxc_var_constcast(amxc_llist_t, temp));
250  }
251 
252  temp = GET_ARG(args, "attributes");
253  if(temp != NULL) {
254  filter_add_attributes(filter, amxc_var_dyncast(uint32_t, temp));
255  }
256 
257 exit:
258  return status;
259 }
260 
262  UNUSED amxd_param_t* const p,
263  amxd_action_t reason,
264  const amxc_var_t* const args,
265  amxc_var_t* const retval,
266  UNUSED void* priv) {
269  const char* f = GET_CHAR(args, "filter");
270  amxc_var_t* params = NULL;
271  uint32_t attributes = 0;
272  amxc_var_t* temp = NULL;
273 
274  when_null(object, exit);
275  when_null(retval, exit);
276  when_true_status(reason != action_object_read,
277  exit,
279 
280  when_true_status(!amxc_var_is_null(args) &&
281  amxc_var_type_of(args) != AMXC_VAR_ID_HTABLE,
282  exit,
284 
285  access = (amxd_dm_access_t) GET_UINT32(args, "access");
286  when_true_status(!amxd_action_verify_access(object, access),
287  exit,
289 
290  params = GET_ARG(args, "parameters");
291  when_true_status(!amxc_var_is_null(params) && amxc_var_type_of(params) != AMXC_VAR_ID_LIST,
292  exit,
294  if(amxc_llist_is_empty(amxc_var_constcast(amxc_llist_t, params))) {
295  params = NULL;
296  } else {
298  amxc_var_constcast(amxc_llist_t, params));
299  when_failed(status, exit);
300  }
301 
302  temp = GET_ARG(args, "attributes");
303  attributes = temp == NULL? 0xFFFFFFFF : GET_UINT32(temp, NULL);
304 
305  status = amxd_action_get_values(object, access, attributes, params, f, retval);
306 
307 exit:
308  if(status != amxd_status_ok) {
309  amxc_var_clean(retval);
310  }
311  return status;
312 }
313 
315  amxc_var_t* const params,
316  amxd_dm_access_t access) {
318  amxc_var_t args;
319 
320  amxc_var_init(&args);
321  when_null(object, exit);
322  when_null(params, exit);
323 
324  amxc_var_set_type(&args, AMXC_VAR_ID_HTABLE);
325  amxc_var_add_key(uint32_t, &args, "access", access);
326  retval = amxd_dm_invoke_action(object,
327  NULL,
329  &args,
330  params);
331 
332 exit:
333  amxc_var_clean(&args);
334  return retval;
335 }
336 
338  amxc_var_t* const params,
339  uint32_t attrs,
340  amxd_dm_access_t access) {
342  amxc_var_t args;
343 
344  amxc_var_init(&args);
345  when_null(object, exit);
346  when_null(params, exit);
347 
348  amxc_var_set_type(&args, AMXC_VAR_ID_HTABLE);
349  amxc_var_add_key(uint32_t, &args, "access", access);
350  amxc_var_add_key(uint32_t, &args, "attributes", attrs);
351  retval = amxd_dm_invoke_action(object,
352  NULL,
354  &args,
355  params);
356 
357 exit:
358  amxc_var_clean(&args);
359  return retval;
360 }
361 
363  amxc_var_t* const params,
364  const char* filter,
365  amxd_dm_access_t access) {
367  amxc_var_t args;
368 
369  amxc_var_init(&args);
370  when_null(object, exit);
371 
372  amxc_var_set_type(&args, AMXC_VAR_ID_HTABLE);
373  amxc_var_add_key(uint32_t, &args, "access", access);
374  if(filter != NULL) {
375  amxc_var_add_key(cstring_t, &args, "filter", filter);
376  }
377  retval = amxd_dm_invoke_action(object,
378  NULL,
380  &args,
381  params);
382 
383 exit:
384  amxc_var_clean(&args);
385  return retval;
386 }
387 
389  amxc_var_t* const params,
390  amxd_dm_access_t access) {
391  return amxd_object_get_params_with_attr(object,
392  params,
394  access);
395 }
Ambiorix Data Model Default actions header file.
static amxd_status_t amxd_action_object_read_check_params(amxd_object_t *object, const amxc_llist_t *names)
static bool amxd_action_parameter_is_in(const char *name, amxc_var_t *params)
amxd_status_t amxd_object_get_params_filtered(amxd_object_t *const object, amxc_var_t *const params, const char *filter, amxd_dm_access_t access)
amxd_status_t amxd_object_get_params_with_attr(amxd_object_t *const object, amxc_var_t *const params, uint32_t attrs, amxd_dm_access_t access)
static amxd_status_t amxd_action_get_values(amxd_object_t *const object, amxd_dm_access_t access, uint32_t attributes, amxc_var_t *params, const char *expression, amxc_var_t *const retval)
amxd_status_t amxd_action_object_read(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_action_object_read_filter(amxc_string_t *filter, const amxc_var_t *args)
amxd_status_t amxd_object_get_key_params(amxd_object_t *const object, amxc_var_t *const params, amxd_dm_access_t access)
static void filter_add_attributes(amxc_string_t *filter, uint32_t attrs)
static void filter_add_params(amxc_string_t *filter, const amxc_llist_t *names)
#define IS_BIT_SET(b, f)
Definition: amxd_common.h:66
#define SET_BIT(x)
Definition: amxd_common.h:65
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
Ambiorix Data Model API header file.
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)
amxd_status_t amxd_object_list_params(amxd_object_t *const object, amxc_var_t *const list, amxd_dm_access_t access)
const char * amxd_param_get_name(const amxd_param_t *const param)
uint32_t amxd_param_get_attrs(const amxd_param_t *const param)
@ amxd_pattr_template
Definition: amxd_types.h:355
@ amxd_pattr_key
Definition: amxd_types.h:362
@ amxd_pattr_max
Definition: amxd_types.h:366
@ action_object_read
Definition: amxd_types.h:117
@ action_param_read
Definition: amxd_types.h:112
@ action_param_describe
Definition: amxd_types.h:115
enum _amxd_action amxd_action_t
enum _amxd_status amxd_status_t
@ amxd_status_parameter_not_found
Definition: amxd_types.h:82
@ 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
enum _amxd_dm_access amxd_dm_access_t
Access level.
@ amxd_dm_access_private
Definition: amxd_types.h:141
@ amxd_dm_access_public
Definition: amxd_types.h:136
amxd_status_t amxd_object_get_params(amxd_object_t *const object, amxc_var_t *const params, amxd_dm_access_t access)
Gets all parameter values of an 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_llist_t parameters
Definition: amxd_types.h:246
static amxd_status_t status