kaa_error_t kaa_configuration_manager_handle_server_sync(kaa_configuration_manager_t *self , kaa_platform_message_reader_t *reader , uint32_t extension_options , size_t extension_length) { KAA_RETURN_IF_NIL2(self, reader, KAA_ERR_BADPARAM); KAA_LOG_INFO(self->logger, KAA_ERR_NONE, "Received configuration server sync: options %u, payload size %u", extension_options, extension_length); if (extension_length >= sizeof(uint32_t)) { self->status->config_seq_n = KAA_NTOHL(*((uint32_t *) reader->current)); KAA_LOG_TRACE(self->logger, KAA_ERR_NONE, "Configuration state sequence number is '%d'", self->status->config_seq_n); reader->current += sizeof(uint32_t); if (extension_options & KAA_CONFIGURATION_BODY_PRESENT) { uint32_t body_size = KAA_NTOHL(*((uint32_t *) reader->current)); reader->current += sizeof(uint32_t); KAA_LOG_INFO(self->logger, KAA_ERR_NONE, "Received configuration body, size '%u' ", body_size); const char* body = reader->current; kaa_error_t error = kaa_platform_message_skip(reader, kaa_aligned_size_get(body_size)); if (error) { KAA_LOG_ERROR(self->logger, error, "Failed to read configuration body, size %u", body_size); return error; } #if KAA_CONFIGURATION_DELTA_SUPPORT #else if (self->root_record) self->root_record->destroy(self->root_record); self->root_record = kaa_configuration_manager_deserialize(body, body_size); if (!self->root_record) { KAA_LOG_ERROR(self->logger, KAA_ERR_READ_FAILED, "Failed to deserialize configuration body, size %u", body_size); return KAA_ERR_READ_FAILED; } kaa_error_t err = ext_calculate_sha_hash(body, body_size, self->configuration_hash); if (err) { KAA_LOG_WARN(self->logger, err, "Failed to calculate configuration body hash"); return err; } ext_configuration_store(body, body_size); #endif if (self->root_receiver.on_configuration_updated) self->root_receiver.on_configuration_updated(self->root_receiver.context, self->root_record); kaa_transport_channel_interface_t *channel = kaa_channel_manager_get_transport_channel(self->channel_manager, configuration_sync_services[0]); if (channel) channel->sync_handler(channel->context, configuration_sync_services, 1); } } return KAA_ERR_NONE; }
kaa_error_t kaa_configuration_manager_create(kaa_configuration_manager_t **configuration_manager_p, kaa_channel_manager_t *channel_manager, kaa_status_t *status, kaa_logger_t *logger) { KAA_RETURN_IF_NIL3(configuration_manager_p, status, logger, KAA_ERR_BADPARAM); kaa_configuration_manager_t *manager = (kaa_configuration_manager_t *) KAA_MALLOC(sizeof(kaa_configuration_manager_t)); KAA_RETURN_IF_NIL(manager, KAA_ERR_NOMEM); manager->channel_manager = channel_manager; manager->status = status; manager->logger = logger; manager->root_receiver = (kaa_configuration_root_receiver_t) { NULL, NULL }; char *buffer = NULL; size_t buffer_size = 0; bool need_deallocation = false; if (status->is_updated) ext_configuration_read(&buffer, &buffer_size, &need_deallocation); else ext_configuration_delete(); if (!buffer || !buffer_size) { need_deallocation = false; #if KAA_CONFIGURATION_DATA_LENGTH > 0 buffer = (char *)KAA_CONFIGURATION_DATA; buffer_size = KAA_CONFIGURATION_DATA_LENGTH; #endif } if (buffer && buffer_size > 0) { ext_calculate_sha_hash(buffer, buffer_size, manager->configuration_hash); manager->root_record = kaa_configuration_manager_deserialize(buffer, buffer_size); if (!manager->root_record) { KAA_FREE(manager); if (need_deallocation && buffer) KAA_FREE(buffer); return KAA_ERR_NOMEM; } if (need_deallocation) KAA_FREE(buffer); } *configuration_manager_p = manager; return KAA_ERR_NONE; }