configulator/src/configulator.c

115 lines
2.9 KiB
C

#include "string.h"
#include "configulator.h"
#include "cfglr_log.h"
#define TAG "CFGLR"
cfglr_handle_t *configulator;
uint8_t cfglr_add_element(cfglr_handle_t *handle, cfglr_element_t *element) {
cfglr_signaler_t *signaler;
CFGLR_LOGI(TAG, "Initializing element: %s", element->key);
CFGLR_LOGI(TAG, "size: %d", element->datatype_size);
element->handle = handle;
if(element->data == NULL) {
element->data = (void*)malloc(element->datatype_size);
bzero(element->data, 0);
CFGLR_LOGD(TAG, "malloc: %d @ %p", element->datatype_size, element->data);
}
CFGLR_LOGD(TAG, "Initializing %d Signalers", element->signaler_count);
while((signaler = &element->signalers[element->signaler_count])) {
if(signaler->init == NULL && signaler->dispatch == NULL) break;
if(signaler->init != NULL) {
signaler->init(signaler, element, handle);
}
element->signaler_count++;
}
cfglr_signal_e signal;
if(handle->backend.get(&handle->backend, element, handle) == 0) {
signal = CFGLR_SIGNAL_LOADED;
} else {
CFGLR_LOGI(TAG, "failed to load %s, setting default", element->key);
memcpy((void*)&element->data, (void*)&element->default_data, element->default_size);
signal = CFGLR_SIGNAL_INIT;
if(handle->backend.set(&handle->backend, element, handle) != 0) {
signal = CFGLR_SIGNAL_FAILED;
}
}
for(uint8_t i = 0; i < element->signaler_count; i++) {
element->signalers[i].dispatch(&element->signalers[i], element, signal);
}
return ++handle->element_count;
}
uint8_t cfglr_init(cfglr_handle_t *handle) {
cfglr_backend_t *backend = &handle->backend;
cfglr_element_t *element;
handle->element_count = 0;
CFGLR_LOGI(TAG, "initializing backend");
if(backend->open != NULL) {
CFGLR_LOGI(TAG, "opening backend");
backend->open(backend, handle);
}
CFGLR_LOGI(TAG, "initializing elements");
while((element = &handle->elements[handle->element_count])) {
if(element->key == NULL) break;
cfglr_add_element(handle, element);
}
return 0;
}
uint16_t cfglr_commit(cfglr_element_t *element) {
cfglr_handle_t *handle = element->handle;
cfglr_commit_data(&handle->backend, element, handle);
return 0;
}
uint16_t cfglr_commit_data(cfglr_backend_t *backend, cfglr_element_t *element, cfglr_handle_t *handle) {
uint16_t ret = backend->set(backend, element, handle);
CFGLR_LOGI(TAG, "commit: %s->%s", handle->namespace, element->key);
if(ret == 0) {
for(uint8_t i = 0; i < element->signaler_count; i++) {
element->signalers[i].dispatch(&element->signalers[i], element, CFGLR_SIGNAL_CHANGE);
}
}
return ret;
}
cfglr_element_t * cfglr_get_element(cfglr_handle_t *handle, const char *name) {
cfglr_element_t *element;
uint8_t i = 0;
for(; i < handle->element_count; i++) {
element = &handle->elements[i];
CFGLR_LOGI(TAG, "element: %s @ %p", element->key, element);
if(strcmp(element->key, name) == 0) return element;
}
return NULL;
}