libamxd  6.4.1
Data Model Manager
amxd_dm.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 <stdlib.h>
56 #include <string.h>
57 
58 #include "amxd_priv.h"
59 
60 #include <amxd/amxd_dm.h>
61 #include <amxd/amxd_action.h>
62 #include <amxd/amxd_object.h>
63 #include <amxd/amxd_path.h>
64 
65 #include "amxd_dm_priv.h"
66 #include "amxd_object_priv.h"
67 #include "amxd_assert.h"
68 
70  NULL, // action_any
71  amxd_action_param_read, // action_param_read
72  amxd_action_param_write, // action_param_write
73  amxd_action_param_validate, // action_param_validate
74  amxd_action_param_describe, // action_param_describe
75  amxd_action_param_destroy, // action_param_destroy
76  amxd_action_object_read, // action_object_read
77  amxd_action_object_write, // action_object_write
78  amxd_action_object_validate, // action_object_validate
79  amxd_action_object_list, // action_object_list
80  amxd_action_object_describe, // action_object_describe
81  NULL, // action_object_tree
82  amxd_action_object_add_inst, // action_object_add_inst
83  amxd_action_object_del_inst, // action_object_del_inst
84  amxd_action_object_destroy, // action_object_destroy
85 };
86 
87 static void amxd_dm_free_mib_object_it(amxc_llist_it_t* it) {
88  amxd_object_t* object = amxc_llist_it_get_data(it, amxd_object_t, it);
89  amxd_object_free(&object);
90 }
91 
92 static amxd_status_t amxd_dm_invoke_action_impl(amxc_llist_t* fns,
93  amxd_object_t* object,
94  amxd_param_t* param,
95  amxd_action_t reason,
96  const amxc_var_t* const args,
97  amxc_var_t* const retval) {
99  amxc_var_clean(retval);
100  amxc_llist_for_each(it, fns) {
101  amxd_dm_cb_t* cb_fn = amxc_llist_it_get_data(it, amxd_dm_cb_t, it);
102  if((cb_fn->reason != action_any) &&
103  ((cb_fn->reason != reason) ||
104  ( cb_fn->fn == NULL) ||
105  ( !cb_fn->enable))) {
106  continue;
107  }
108  status = cb_fn->fn(object, param, reason, args, retval, cb_fn->priv);
109  if((reason == action_object_destroy) ||
110  ( reason == action_param_destroy)) {
111  if(((object != NULL) && amxd_object_has_action_cb(object, reason, cb_fn->fn)) ||
112  (( param != NULL) && amxd_param_has_action_cb(param, reason, cb_fn->fn))) {
113  amxc_llist_it_take(&cb_fn->it);
114  free(it);
115  }
117  continue;
118  }
119  if((status != amxd_status_ok) &&
121  break;
122  }
123  }
124 
125  return status;
126 }
127 
129  amxd_param_t* const param,
130  amxd_action_t reason,
131  const amxc_var_t* const args,
132  amxc_var_t* const retval) {
134  amxd_object_t* super = object;
135  amxc_llist_t* cb_fns = NULL;
136 
137  while(super != NULL) {
139  super = amxd_object_get_parent(super);
140  } else {
141  super = (super->derived_from.llist == NULL) ?
142  NULL :
143  amxc_container_of(super->derived_from.llist,
145  derived_objects);
146  }
147 
148  if(param != NULL) {
149  amxd_param_t* base_param =
151  amxd_param_get_name(param));
152  cb_fns = (base_param == NULL) ? NULL : &base_param->cb_fns;
153  } else {
154  cb_fns = (super == NULL) ? NULL : &super->cb_fns;
155  }
156 
157  if(cb_fns != NULL) {
159  object,
160  param,
161  reason,
162  args,
163  retval);
165  continue;
166  }
167  break;
168  }
169  }
170 
171  return status;
172 }
173 
175  amxd_action_t reason,
176  amxd_object_t* current,
177  amxd_object_t* object) {
178  bool retval = false;
179  if(counter == 0) {
180  retval = true;
181  } else if(counter < INT32_MAX) {
182  switch(reason) {
183  case action_object_read:
184  case action_object_list:
187  case action_param_read:
190  retval = true;
191  break;
193  retval = (amxd_object_get_parent(object) == NULL ||
194  amxd_object_is_child_of(object, current));
195  if(retval) {
196  retval = !amxd_object_is_child_of(current, object);
197  }
198  break;
200  retval = amxd_object_is_child_of(object, current);
201  break;
202  default:
203  break;
204  }
205  }
206  return retval;
207 }
208 
210  amxd_param_t* const param,
211  amxd_action_t reason,
212  const amxc_var_t* const args,
213  amxc_var_t* const retval) {
215  amxd_dm_invoke_action_base(object, param, reason, args, retval);
217  ( default_actions[reason] != NULL)) {
218  status = default_actions[reason](object,
219  param,
220  reason,
221  args,
222  retval,
223  NULL);
224  }
225 
226  return status;
227 }
228 
229 static amxd_status_t amxd_dm_check_add_inst_retval(amxc_var_t* retval) {
231  amxc_var_t* tmp = NULL;
232 
233  tmp = amxc_var_get_path(retval, "index", AMXC_VAR_FLAG_DEFAULT);
234  when_true_status(amxc_var_is_null(tmp),
235  exit,
237 
238  tmp = amxc_var_get_path(retval, "name", AMXC_VAR_FLAG_DEFAULT);
239  when_true_status(amxc_var_is_null(tmp),
240  exit,
242 
243 exit:
244  return status;
245 }
246 
248  amxc_var_t* retval) {
249  uint32_t index = 0;
250  amxd_object_t* inst = NULL;
251  amxc_var_t* var_index = NULL;
252  when_true(amxc_var_is_null(retval), exit);
253 
254  var_index = amxc_var_get_path(retval, "index", AMXC_VAR_FLAG_DEFAULT);
255  index = amxc_var_dyncast(uint32_t, var_index);
256  when_true(index == 0, exit);
257 
258  inst = amxd_object_get_instance(object, NULL, index);
259  amxd_object_free(&inst);
260 
261 exit:
262  return;
263 }
264 
265 static void amxd_dm_invoke_action_start(UNUSED amxd_object_t* object,
266  UNUSED amxd_param_t* param,
267  amxd_action_t reason) {
268  switch(reason) {
271  break;
272  default:
273  break;
274  }
275 }
276 
278  amxd_param_t* param,
280  amxd_action_t reason,
281  amxc_var_t* retval) {
282  amxd_status_t new_status = status;
283  switch(reason) {
285  amxd_object_free(&object);
286  new_status = amxd_status_ok;
287  break;
289  amxd_param_free(&param);
290  new_status = amxd_status_ok;
291  break;
293  if(status == amxd_status_ok) {
294  new_status = amxd_dm_check_add_inst_retval(retval);
295  } else {
296  amxd_dm_cleanup_add_inst(object, retval);
297  }
298  break;
299  default:
300  break;
301  }
302 
303  return new_status;
304 }
305 
308 
309  when_null(dm, exit);
310  when_not_null((*dm), exit);
311 
312  *dm = (amxd_dm_t*) calloc(1, sizeof(amxd_dm_t));
313  when_null((*dm), exit);
314 
315  retval = amxd_dm_init((*dm));
316 
317 exit:
318  return retval;
319 }
320 
322  when_null(dm, exit);
323  when_null((*dm), exit);
324 
325  amxd_dm_clean((*dm));
326 
327  free((*dm));
328  *dm = NULL;
329 
330 exit:
331  return;
332 }
333 
336 
337  when_null(dm, exit);
338 
339  amxd_init_base();
340 
341  when_failed(amxd_object_init(&dm->object, amxd_object_root, NULL, NULL, NULL), exit);
342  when_failed(amxp_sigmngr_init(&dm->sigmngr), exit);
343  when_failed(amxc_llist_init(&dm->mibs), exit);
344  when_failed(amxc_llist_init(&dm->deferred), exit);
345 
346  when_failed(amxp_sigmngr_add_signal(&dm->sigmngr, "dm:root-added"), exit);
347  when_failed(amxp_sigmngr_add_signal(&dm->sigmngr, "dm:root-removed"), exit);
348  when_failed(amxp_sigmngr_add_signal(&dm->sigmngr, "dm:object-added"), exit);
349  when_failed(amxp_sigmngr_add_signal(&dm->sigmngr, "dm:object-removed"), exit);
350  when_failed(amxp_sigmngr_add_signal(&dm->sigmngr, "dm:instance-added"), exit);
351  when_failed(amxp_sigmngr_add_signal(&dm->sigmngr, "dm:instance-removed"), exit);
352  when_failed(amxp_sigmngr_add_signal(&dm->sigmngr, "dm:object-changed"), exit);
353  when_failed(amxp_sigmngr_add_signal(&dm->sigmngr, "dm:periodic-inform"), exit);
354  when_failed(amxp_sigmngr_add_signal(&dm->sigmngr, "dm:mib-added"), exit);
355  when_failed(amxp_sigmngr_add_signal(&dm->sigmngr, "dm:mib-removed"), exit);
356  when_failed(amxp_sigmngr_add_signal(&dm->sigmngr, "app:start"), exit);
357  when_failed(amxp_sigmngr_add_signal(&dm->sigmngr, "app:stop"), exit);
358 
359  retval = amxd_status_ok;
360 
361 exit:
362  return retval;
363 }
364 
366  when_null(dm, exit);
367 
371  amxp_sigmngr_clean(&dm->sigmngr);
372  amxc_llist_clean(&dm->mibs, amxd_dm_free_mib_object_it);
373 
374 exit:
375  return;
376 }
377 
379  amxd_object_t* const object) {
381  const char* mib_name = NULL;
382  when_null(dm, exit);
383  when_null(object, exit);
384  when_true(amxd_object_get_type(object) != amxd_object_mib, exit);
385  mib_name = amxd_object_get_name(object, AMXD_OBJECT_NAMED);
386  when_true_status(amxd_dm_get_mib(dm, mib_name) != NULL,
387  exit,
388  retval = amxd_status_duplicate);
389 
390  amxc_llist_append(&dm->mibs, &object->it);
391 
392  retval = amxd_status_ok;
393 exit:
394  return retval;
395 }
396 
398  const char* name) {
399  amxd_object_t* mib = NULL;
400 
401  when_null(dm, exit);
402  when_str_empty(name, exit);
403 
404  amxc_llist_for_each(it, (&dm->mibs)) {
405  const char* mib_name = NULL;
406  mib = amxc_llist_it_get_data(it, amxd_object_t, it);
407  mib_name = amxd_object_get_name(mib, AMXD_OBJECT_NAMED);
408  if((mib_name != NULL) && (strcmp(mib_name, name) == 0)) {
409  break;
410  }
411  mib = NULL;
412  }
413 
414 exit:
415  return mib;
416 }
417 
420 
421  when_null(dm, exit);
422  when_null(object, exit);
423 
424  retval = amxd_object_add_object(&dm->object, object);
425  if(retval == 0) {
426  amxd_dm_event("dm:root-added", object, NULL, false);
427  }
428 
429 exit:
430  return retval;
431 }
432 
435  amxd_object_t* object = NULL;
436  amxc_var_t data;
437 
438  amxc_var_init(&data);
439 
440  when_null(dm, exit);
441  when_str_empty_status(name, exit, retval = amxd_status_invalid_name);
442 
443  object = amxd_object_get_child(&dm->object, name);
444  when_null_status(object, exit, retval = amxd_status_object_not_found);
445 
446  amxd_dm_event("dm:root-removed", object, NULL, false);
447 
448  amxd_object_delete(&object);
449 
450  retval = amxd_status_ok;
451 exit:
452  amxc_var_clean(&data);
453  return retval;
454 }
455 
457  amxd_object_t* object = NULL;
458 
459  when_null(dm, exit);
460  object = &dm->object;
461 
462 exit:
463  return object;
464 }
465 
466 amxd_object_t* amxd_dm_get_object(amxd_dm_t* const dm, const char* name) {
467  return amxd_object_get_child(&dm->object, name);
468 }
469 
471  const char* abs_path,
472  ...) {
473  amxd_object_t* object = NULL;
474  amxd_object_t* root_obj = NULL;
476  amxd_path_t path;
477  va_list args;
478  bool key_path = false;
479 
480  amxd_path_init(&path, NULL);
481 
482  when_null(dm, exit);
483  root_obj = amxd_dm_get_root(dm);
484 
485  when_str_empty_status(abs_path, exit, object = root_obj);
486 
487  va_start(args, abs_path);
488  status = amxd_path_vsetf(&path, true, abs_path, args);
489  va_end(args);
490  dm->status = status;
491  when_failed(status, exit);
492 
493  object = amxd_object_find_internal(root_obj, &key_path, &path, &dm->status);
494 
495 exit:
496  amxd_path_clean(&path);
497  return object;
498 }
499 
501  amxc_llist_t* paths,
502  const char* abs_path,
503  ...) {
505  amxd_object_t* root_obj = NULL;
506  amxd_path_t path;
507  va_list args;
508  bool key_path = false;
509 
510  amxd_path_init(&path, NULL);
511 
512  when_null(dm, exit);
513  root_obj = amxd_dm_get_root(dm);
514 
515  when_str_empty(abs_path, exit);
516 
517  va_start(args, abs_path);
518  status = amxd_path_vsetf(&path, true, abs_path, args);
519  va_end(args);
520  when_failed(status, exit);
521 
522  status = amxd_object_resolve_internal(root_obj, &key_path, paths, &path);
523 
524 exit:
525  amxd_path_clean(&path);
526  return status;
527 }
528 
530  bool* key_path,
531  amxc_llist_t* paths,
532  const char* abs_path,
533  ...) {
535  amxd_object_t* root_obj = NULL;
536  amxd_path_t path;
537  va_list args;
538 
539  amxd_path_init(&path, NULL);
540 
541  when_null(key_path, exit);
542  when_null(dm, exit);
543  root_obj = amxd_dm_get_root(dm);
544  *key_path = false;
545 
546  when_str_empty(abs_path, exit);
547 
548  va_start(args, abs_path);
549  status = amxd_path_vsetf(&path, true, abs_path, args);
550  va_end(args);
551  when_failed(status, exit);
552 
553  status = amxd_object_resolve_internal(root_obj, key_path, paths, &path);
554 
555 exit:
556  amxd_path_clean(&path);
557  return status;
558 }
559 
561  const amxc_var_t* const signal_data) {
562  amxc_var_t* object_path = NULL;
563 
564  when_null(dm, exit);
565  when_null(signal_data, exit);
566 
567  object_path = amxc_var_get_key(signal_data, "path", 0);
568 
569 exit:
570  return amxc_var_constcast(cstring_t, object_path);
571 }
572 
574  const amxc_var_t* const signal_data) {
575  amxd_object_t* object = NULL;
576  const char* path = NULL;
577 
578  when_null(dm, exit);
579  when_null(signal_data, exit);
580 
581  path = amxd_dm_signal_get_path(dm, signal_data);
582  when_null(path, exit);
584  "%s",
585  path);
586 
587 exit:
588  return object;
589 }
590 
592  amxd_param_t* param,
593  amxd_action_t reason,
594  const amxc_var_t* const args,
595  amxc_var_t* const retval) {
596  static int in_object_action = 0;
597  static int in_param_action = 0;
598  static amxd_object_t* current = NULL;
599 
600  amxd_object_t* temp = NULL;
601  amxc_llist_t* cb_fns = NULL;
602  int* counter = NULL;
604  when_true(object == NULL && param == NULL, exit);
605  when_true_status(reason == action_any, exit, status = amxd_status_invalid_action);
606 
607  temp = current;
608  if(param != NULL) {
609  when_true_status(!amxd_dm_can_invoke_action(in_param_action, reason, current, object),
610  exit,
612  counter = &in_param_action;
613  cb_fns = &param->cb_fns;
614  } else {
615  when_true_status(!amxd_dm_can_invoke_action(in_object_action + in_param_action,
616  reason, current, object),
617  exit,
619  counter = &in_object_action;
620  cb_fns = &object->cb_fns;
621  }
622 
623  (*counter)++;
624  current = object;
625  amxd_dm_invoke_action_start(object, param, reason);
626  status = amxd_dm_invoke_action_impl(cb_fns, object, param, reason, args, retval);
628  status = amxd_dm_invoke_default(object, param, reason, args, retval);
629  }
630  (*counter)--;
631  status = amxd_dm_invoke_action_end(object, param, status, reason, retval);
632 
633  current = temp;
634 
635 exit:
636  return status;
637 }
Ambiorix Data Model Default actions header file.
amxd_status_t amxd_action_object_read(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)
amxd_status_t amxd_action_object_del_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)
amxd_status_t amxd_action_object_write(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)
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)
static amxd_action_fn_t default_actions[]
Definition: amxd_dm.c:69
amxd_status_t amxd_dm_store_mib(amxd_dm_t *const dm, amxd_object_t *const object)
Definition: amxd_dm.c:378
static amxd_status_t amxd_dm_invoke_action_end(amxd_object_t *object, amxd_param_t *param, amxd_status_t status, amxd_action_t reason, amxc_var_t *retval)
Definition: amxd_dm.c:277
static amxd_status_t amxd_dm_check_add_inst_retval(amxc_var_t *retval)
Definition: amxd_dm.c:229
amxd_object_t * amxd_dm_get_mib(amxd_dm_t *const dm, const char *name)
Definition: amxd_dm.c:397
static void amxd_dm_free_mib_object_it(amxc_llist_it_t *it)
Definition: amxd_dm.c:87
static amxd_status_t amxd_dm_invoke_action_base(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)
Definition: amxd_dm.c:128
amxd_object_t * amxd_dm_findf(amxd_dm_t *const dm, const char *abs_path,...)
Definition: amxd_dm.c:470
amxd_status_t amxd_dm_resolve_pathf_ext(amxd_dm_t *const dm, bool *key_path, amxc_llist_t *paths, const char *abs_path,...)
Definition: amxd_dm.c:529
static void amxd_dm_invoke_action_start(UNUSED amxd_object_t *object, UNUSED amxd_param_t *param, amxd_action_t reason)
Definition: amxd_dm.c:265
static amxd_status_t amxd_dm_invoke_action_impl(amxc_llist_t *fns, 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:92
amxd_status_t amxd_dm_resolve_pathf(amxd_dm_t *const dm, amxc_llist_t *paths, const char *abs_path,...)
Definition: amxd_dm.c:500
static void amxd_dm_cleanup_add_inst(amxd_object_t *object, amxc_var_t *retval)
Definition: amxd_dm.c:247
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
static bool amxd_dm_can_invoke_action(int counter, amxd_action_t reason, amxd_object_t *current, amxd_object_t *object)
Definition: amxd_dm.c:174
static amxd_status_t amxd_dm_invoke_default(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)
Definition: amxd_dm.c:209
amxd_object_t * amxd_dm_get_object(amxd_dm_t *const dm, const char *name)
Definition: amxd_dm.c:466
Ambiorix Data Model API header file.
void PRIVATE amxd_dm_event(const char *signal, const amxd_object_t *const object, amxc_var_t *const data, bool trigger)
Definition: amxd_dm_priv.c:550
void PRIVATE amxd_dm_cancel_deferred(amxd_dm_t *dm)
void PRIVATE amxd_init_base(void)
Definition: amxd_dm_priv.c:665
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)
PRIVATE void amxd_object_destroy_handlers(amxd_object_t *const object)
PRIVATE amxd_object_t * amxd_object_find_internal(amxd_object_t *const object, bool *key_path, amxd_path_t *path, amxd_status_t *status)
PRIVATE void amxd_object_clean(amxd_object_t *const object)
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_resolve_internal(amxd_object_t *const object, bool *key_path, amxc_llist_t *paths, amxd_path_t *path)
const char * amxd_param_get_name(const amxd_param_t *const param)
bool amxd_param_has_action_cb(amxd_param_t *const param, const amxd_action_t reason, amxd_action_fn_t fn)
Ambiorix path API header file.
void PRIVATE amxd_param_free(amxd_param_t **param)
@ action_object_add_inst
Definition: amxd_types.h:123
@ action_param_destroy
Definition: amxd_types.h:116
@ action_object_del_inst
Definition: amxd_types.h:124
@ action_object_describe
Definition: amxd_types.h:121
@ action_object_read
Definition: amxd_types.h:117
@ action_object_list
Definition: amxd_types.h:120
@ action_any
Definition: amxd_types.h:111
@ action_object_validate
Definition: amxd_types.h:119
@ action_object_destroy
Definition: amxd_types.h:125
@ action_param_read
Definition: amxd_types.h:112
@ action_param_validate
Definition: amxd_types.h:114
@ action_param_describe
Definition: amxd_types.h:115
amxd_status_t(* amxd_action_fn_t)(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)
Definition: amxd_types.h:150
enum _amxd_action amxd_action_t
enum _amxd_status amxd_status_t
@ amxd_status_invalid_name
Definition: amxd_types.h:86
@ amxd_status_function_not_implemented
Definition: amxd_types.h:83
@ amxd_status_object_not_found
Definition: amxd_types.h:80
@ amxd_status_ok
Definition: amxd_types.h:78
@ amxd_status_unknown_error
Definition: amxd_types.h:79
@ amxd_status_invalid_action
Definition: amxd_types.h:89
@ amxd_status_duplicate
Definition: amxd_types.h:91
#define AMXD_OBJECT_NAMED
Name and path format flag - default behavior, use name for instance objects.
Definition: amxd_object.h:164
@ amxd_object_root
Definition: amxd_types.h:178
@ amxd_object_mib
Definition: amxd_types.h:188
@ amxd_object_instance
Definition: amxd_types.h:186
amxd_object_t * amxd_dm_get_root(amxd_dm_t *const dm)
Fetches the root object of the data model.
Definition: amxd_dm.c:456
amxd_status_t amxd_dm_new(amxd_dm_t **dm)
Instantiate a new data model.
Definition: amxd_dm.c:306
amxd_status_t amxd_dm_remove_root_object(amxd_dm_t *dm, const char *name)
Removes an object from the root of the data model.
Definition: amxd_dm.c:433
const char * amxd_dm_signal_get_path(amxd_dm_t *const dm, const amxc_var_t *const signal_data)
Get the object path from a data model signal.
Definition: amxd_dm.c:560
void amxd_dm_delete(amxd_dm_t **dm)
Deletes a data model structure.
Definition: amxd_dm.c:321
amxd_status_t amxd_dm_add_root_object(amxd_dm_t *dm, amxd_object_t *object)
Adds an object to the root of the data model.
Definition: amxd_dm.c:418
amxd_object_t * amxd_dm_signal_get_object(amxd_dm_t *const dm, const amxc_var_t *const signal_data)
Get the object from a data model using the path in the recieved signal.
Definition: amxd_dm.c:573
amxd_status_t amxd_dm_init(amxd_dm_t *dm)
Initializes a data model structure.
Definition: amxd_dm.c:334
void amxd_dm_clean(amxd_dm_t *dm)
Cleans a data model structure.
Definition: amxd_dm.c:365
amxd_status_t amxd_action_object_validate(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)
Default object validate action implementation.
amxd_status_t amxd_action_object_list(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)
Default object list action implementation.
amxd_status_t amxd_action_object_describe(amxd_object_t *object, amxd_param_t *param, amxd_action_t reason, const amxc_var_t *const args, amxc_var_t *const retval, void *priv)
Default object describe action implementation.
amxd_status_t amxd_action_object_destroy(amxd_object_t *object, amxd_param_t *const param, amxd_action_t reason, const amxc_var_t *const args, amxc_var_t *const retval, void *priv)
Default object destroy action implementation.
bool amxd_object_is_child_of(const amxd_object_t *const child, const amxd_object_t *const parent)
Checks if the child object is in the hierarchical tree of the parent object.
amxd_object_t * amxd_object_get_parent(const amxd_object_t *const object)
Get the parent object.
amxd_object_t * amxd_object_get_child(const amxd_object_t *object, const char *name)
Get a child of the object.
amxd_object_t * amxd_object_findf(amxd_object_t *object, const char *rel_path,...) __attribute__((format(printf
Find an object in the data model tree, starting from an object.
amxd_status_t amxd_object_add_object(amxd_object_t *const parent, amxd_object_t *const child)
Adds an object in the data model tree.
Definition: amxd_object.c:207
amxd_object_t * amxd_object_get_instance(const amxd_object_t *object, const char *name, uint32_t index)
Get an instance of the template object.
amxd_param_t * amxd_object_get_param_def(const amxd_object_t *const object, const char *name)
Gets a parameter definition from an object.
void amxd_object_delete(amxd_object_t **object)
Invokes the destroy handler(s) of the 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
void amxd_object_free(amxd_object_t **object)
Data model object destructor function.
Definition: amxd_object.c:153
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
amxd_status_t amxd_action_param_write(amxd_object_t *object, amxd_param_t *param, amxd_action_t reason, const amxc_var_t *const args, amxc_var_t *const retval, void *priv)
Default parameter write action implementation.
amxd_status_t amxd_action_param_describe(amxd_object_t *object, amxd_param_t *param, amxd_action_t reason, const amxc_var_t *const args, amxc_var_t *const retval, void *priv)
Default parameter describe action implementation.
amxd_status_t amxd_action_param_validate(amxd_object_t *object, amxd_param_t *param, amxd_action_t reason, const amxc_var_t *const args, amxc_var_t *const retval, void *priv)
Default parameter validate action implementation.
amxd_status_t amxd_action_param_read(amxd_object_t *object, amxd_param_t *param, amxd_action_t reason, const amxc_var_t *const args, amxc_var_t *const retval, void *priv)
Default parameter read action implementation.
amxd_status_t amxd_action_param_destroy(amxd_object_t *object, amxd_param_t *param, amxd_action_t reason, const amxc_var_t *const args, amxc_var_t *const retval, void *priv)
Default parameter destroy action implementation.
amxd_status_t amxd_path_init(amxd_path_t *path, const char *object_path)
Initializes an amxd_path_t structure.
Definition: amxd_path.c:328
void amxd_path_clean(amxd_path_t *path)
Cleans an amxd_path_t structure.
Definition: amxd_path.c:351
amxd_status_t amxd_path_vsetf(amxd_path_t *path, bool add_dot, const char *obj_path, va_list args)
Sets or replaces the path contained in the amxd_path_t structure.
Definition: amxd_path.c:403
amxc_llist_t mibs
Definition: amxd_types.h:262
amxd_status_t status
Definition: amxd_types.h:263
amxd_object_t object
Definition: amxd_types.h:260
amxc_llist_t deferred
Definition: amxd_types.h:264
amxp_signal_mngr_t sigmngr
Definition: amxd_types.h:261
amxc_llist_it_t derived_from
Definition: amxd_types.h:249
amxc_llist_t cb_fns
Definition: amxd_types.h:253
amxc_llist_it_t it
Definition: amxd_types.h:230
amxc_llist_t cb_fns
Definition: amxd_types.h:391
static amxd_dm_t dm
static int counter
static int cb_fn(amxd_object_t *start_object, amxd_object_t *matching_object, UNUSED void *priv)
static amxd_status_t status