59 #include "amxo_parser.tab.h"
62 #define MSG_CREATION_FAILED \
63 "Creation failed for %s and %s (direction = %d, status = %d)"
64 #define MSG_SET_DM_FAILED \
65 "Set datamodel for %s and %s failed (direction = %d, status = %d)"
66 #define MSG_MUST_CONTAIN_SYNC_ENTRIES \
67 "Object synchronisation must contain sub-entries"
68 #define MSG_BATCH_PARAM_WITH_CB \
69 "Batch parameter synchronisation with callbacks have no effect"
78 amxs_sync_object_t* child);
83 amxc_llist_it_t* it = amxc_llist_get_last(pctx->
sync_contexts);
93 amxs_status_t status = amxs_status_unknown_error;
97 when_null(parent, exit);
98 when_null(parent->
entry, exit);
100 switch(parent->
entry->type) {
101 case amxs_sync_type_ctx:
104 case amxs_sync_type_object:
105 status = object_add(parent->
entry, data->
entry);
111 if(status == amxs_status_ok) {
121 amxd_dm_t* dm = amxd_object_get_dm(pctx->
object);
122 dm = amxd_dm_findf(dm,
"%s", path) == NULL? NULL:dm;
129 pctx->
status = amxd_status_ok;
131 case amxs_status_duplicate:
132 pctx->
status = amxd_status_duplicate;
134 case amxs_status_invalid_attr:
135 pctx->
status = amxd_status_invalid_attr;
137 case amxs_status_invalid_arg:
138 pctx->
status = amxd_status_invalid_arg;
140 case amxs_status_empty_context:
141 pctx->
status = amxd_status_invalid_value;
143 case amxs_status_invalid_type:
144 pctx->
status = amxd_status_invalid_type;
146 case amxs_status_object_not_found:
147 pctx->
status = amxd_status_object_not_found;
149 case amxs_status_subscription_failed:
150 pctx->
status = amxd_status_function_not_found;
153 pctx->
status = amxd_status_unknown_error;
159 amxs_sync_entry_type_t type = amxs_sync_type_invalid;
161 when_null(sync_data, exit);
162 when_null(sync_data->
entry, exit);
164 type = sync_data->
entry->type;
172 return (type == amxs_sync_type_object || type == amxs_sync_type_param);
176 if((direction & AMXS_SYNC_ONLY_B_TO_A) == AMXS_SYNC_ONLY_B_TO_A) {
177 direction |= AMXS_SYNC_INIT_B;
185 when_null(data, exit);
187 amxc_llist_it_take(it);
188 amxc_htable_it_clean(&data->
hit, NULL);
190 when_null(data->
entry, exit);
192 switch(data->
entry->type) {
193 case amxs_sync_type_ctx:
194 amxs_sync_ctx_delete(&data->
entry);
196 case amxs_sync_type_object:
197 amxs_sync_object_delete(&data->
entry);
199 case amxs_sync_type_param:
200 amxs_sync_param_delete(&data->
entry);
215 amxc_llist_it_take(&data->
it);
226 amxs_status_t status = amxs_status_unknown_error;
227 amxc_string_t res_path_a;
228 amxc_string_t res_path_b;
229 amxd_dm_t* dm_a = NULL;
230 amxd_dm_t* dm_b = NULL;
234 amxc_string_init(&res_path_a, 0);
235 amxc_string_init(&res_path_b, 0);
236 when_null(data, exit);
238 if(amxc_string_set_resolved(&res_path_a, path_a, &pctx->
config) > 0) {
239 path_a = amxc_string_get(&res_path_a, 0);
241 if(amxc_string_set_resolved(&res_path_b, path_b, &pctx->
config) > 0) {
242 path_b = amxc_string_get(&res_path_b, 0);
245 status = amxs_sync_ctx_new(&data->
entry, path_a, path_b, direction);
248 path_a, path_b, direction, status);
254 if((direction & AMXS_SYNC_ONLY_A_TO_B) == 0) {
257 if((direction & AMXS_SYNC_ONLY_B_TO_A) == 0) {
261 status = amxs_sync_ctx_set_local_dm(data->
entry, dm_a, dm_b);
264 path_a, path_b, direction, status);
280 amxc_string_clean(&res_path_a);
281 amxc_string_clean(&res_path_b);
290 int status = amxs_status_unknown_error;
293 amxd_path_init(&path, NULL);
296 when_failed(status, exit);
299 status = amxs_status_invalid_type;
300 amxd_path_setf(&path,
false,
"%s", data->
entry->a);
301 when_true(amxd_path_is_instance_path(&path), exit);
302 when_false(amxd_path_is_supported_path(&path) || amxd_path_is_object_path(&path), exit);
303 amxd_path_setf(&path,
false,
"%s", data->
entry->b);
304 when_true(amxd_path_is_instance_path(&path), exit);
305 when_false(amxd_path_is_supported_path(&path) || amxd_path_is_object_path(&path), exit);
306 status = amxs_status_ok;
316 amxd_path_clean(&path);
324 amxs_status_t status = amxs_status_unknown_error;
329 amxc_string_init(&res_a, 0);
330 amxc_string_init(&res_b, 0);
333 when_null(data, exit);
335 if(amxc_string_set_resolved(&res_a, path_a, &pctx->
config) > 0) {
336 path_a = amxc_string_get(&res_a, 0);
338 if(amxc_string_set_resolved(&res_b, path_b, &pctx->
config) > 0) {
339 path_b = amxc_string_get(&res_b, 0);
342 status = amxs_sync_object_new_copy(&data->
entry, path_a, path_b, direction);
343 when_failed_status(status, exit, data->
entry = NULL);
346 amxs_sync_ctx_add_object,
347 amxs_sync_object_add_object);
352 path_a, path_b, direction, status);
355 amxs_sync_object_delete(&data->
entry);
359 amxc_string_clean(&res_a);
360 amxc_string_clean(&res_b);
368 amxs_status_t status = amxs_status_unknown_error;
373 amxc_string_init(&res_a, 0);
374 amxc_string_init(&res_b, 0);
377 when_null(data, exit);
379 if(amxc_string_set_resolved(&res_a, param_a, &pctx->
config) > 0) {
380 param_a = amxc_string_get(&res_a, 0);
382 if(amxc_string_set_resolved(&res_b, param_b, &pctx->
config) > 0) {
383 param_b = amxc_string_get(&res_b, 0);
386 status = amxs_sync_param_new_copy(&data->
entry, param_a, param_b, direction);
387 when_failed_status(status, exit, data->
entry = NULL);
391 amxs_sync_ctx_add_param,
392 amxs_sync_object_add_param);
397 param_a, param_b, direction, status);
400 amxs_sync_param_delete(&data->
entry);
404 amxc_string_clean(&res_a);
405 amxc_string_clean(&res_b);
410 amxs_translation_cb_t cb) {
411 amxd_status_t status = amxd_status_unknown_error;
413 when_null(sync_data, exit);
414 when_null(sync_data->
entry, exit);
416 if(amxs_sync_entry_is_batch_param(sync_data->
entry)) {
418 pctx->
status = amxd_status_invalid_action;
420 sync_data->
entry->translation_cb = cb;
421 status = amxd_status_ok;
429 amxs_action_cb_t cb) {
430 amxd_status_t status = amxd_status_unknown_error;
432 when_null(sync_data, exit);
433 when_null(sync_data->
entry, exit);
435 if(amxs_sync_entry_is_batch_param(sync_data->
entry)) {
437 pctx->
status = amxd_status_invalid_action;
439 sync_data->
entry->action_cb = cb;
440 status = amxd_status_ok;
450 when_null(sync_data, exit);
451 when_null(sync_data->
entry, exit);
454 if(amxc_llist_is_empty(&sync_data->
entry->entries)) {
456 pctx->
status = amxd_status_invalid_action;
467 when_null(data, exit);
468 when_null(data->
entry, exit);
469 when_false(data->
entry->type == amxs_sync_type_ctx, exit);
471 if(amxc_htable_it_get_key(&data->
hit) == NULL) {
472 if(!amxs_sync_ctx_is_started(data->
entry)) {
473 status = amxs_sync_ctx_start_sync(data->
entry);
485 when_null(data, exit);
486 when_null(data->
entry, exit);
487 when_false(data->
entry->type == amxs_sync_type_ctx, exit);
489 if(amxc_htable_it_get_key(&data->
hit) == NULL) {
490 amxs_sync_ctx_stop_sync(data->
entry);
498 when_null(pctx, exit);
503 switch(data->
entry->type) {
504 case amxs_sync_type_param:
505 case amxs_sync_type_object:
508 case amxs_sync_type_ctx:
509 if(amxc_llist_is_empty(&data->
entry->entries)) {
527 amxs_sync_ctx_t* ctx = NULL;
529 amxc_htable_it_t* hit = amxc_htable_get(&
sync_templates, sync_template);
531 when_null(hit, exit);
534 ctx = sync_data->
entry;
amxs_sync_entry_type_t amxo_parser_get_sync_type(amxo_parser_t *pctx)
#define MSG_MUST_CONTAIN_SYNC_ENTRIES
static amxc_htable_t sync_templates
static amxd_dm_t * amxo_parser_get_sync_dm(amxo_parser_t *pctx, const char *path)
struct _amxo_sync_data amxo_sync_data_t
amxd_status_t amxo_parser_sync_set_translator(amxo_parser_t *pctx, amxs_translation_cb_t cb)
int amxo_parser_push_sync_ctx(amxo_parser_t *pctx, const char *path_a, const char *path_b, int direction)
int amxo_parser_start_sync(amxc_llist_it_t *it)
static amxs_status_t amxo_parser_sync_add_item(amxo_parser_t *pctx, amxo_sync_data_t *data, amxo_sync_add_item_fn_t ctx_add, amxo_sync_add_item_fn_t object_add)
amxd_status_t amxo_parser_sync_set_action(amxo_parser_t *pctx, amxs_action_cb_t cb)
amxs_sync_ctx_t * amxo_parser_sync_get(const char *sync_template)
int amxo_parser_push_sync_object(amxo_parser_t *pctx, const char *path_a, const char *path_b, int direction)
bool amxo_parser_is_sync_item(amxo_parser_t *pctx)
static void amxo_parser_sync_set_status(amxo_parser_t *pctx, amxs_status_t status)
void amxo_parser_sync_remove_invalid(amxo_parser_t *pctx)
#define MSG_SET_DM_FAILED
int amxo_parser_push_sync_parameter(amxo_parser_t *pctx, const char *param_a, const char *param_b, int direction)
#define MSG_CREATION_FAILED
void amxo_parser_pop_sync_item(amxo_parser_t *pctx)
#define MSG_BATCH_PARAM_WITH_CB
amxs_status_t(* amxo_sync_add_item_fn_t)(amxs_sync_object_t *parent, amxs_sync_object_t *child)
int amxo_parser_push_sync_template(amxo_parser_t *pctx, const char *path_a, const char *path_b, int direction, const char *name)
void amxo_parser_del_sync_data(amxc_llist_it_t *it)
int amxo_parser_sync_update_flags(int direction)
static amxo_sync_data_t * amxo_parser_get_sync_data(amxo_parser_t *pctx)
void amxo_parser_stop_sync(amxc_llist_it_t *it)
bool amxo_parser_sync_item_contains_entries(amxo_parser_t *pctx)
PRIVATE void amxo_parser_msg(amxo_parser_t *parser, const char *format,...) __attribute__((format(printf
The ODL parser structure.
amxc_llist_t * sync_contexts
amxs_sync_entry_t * entry