/* * Copyright (c) 2018 O.S.Systems * * SPDX-License-Identifier: Apache-2.0 */ /** @file * * @brief This file contains structures representing JSON messages * exchanged with a UpdateHub */ #ifndef __UPDATEHUB_PRIV_H__ #define __UPDATEHUB_PRIV_H__ #define UPDATEHUB_API_HEADER \ "Api-Content-Type: application/vnd.updatehub-v1+json" enum updatehub_uri_path { UPDATEHUB_PROBE = 0, UPDATEHUB_REPORT, UPDATEHUB_DOWNLOAD, }; enum updatehub_state { UPDATEHUB_STATE_DOWNLOADING = 0, UPDATEHUB_STATE_DOWNLOADED, UPDATEHUB_STATE_INSTALLING, UPDATEHUB_STATE_INSTALLED, UPDATEHUB_STATE_REBOOTING, UPDATEHUB_STATE_ERROR, }; static char *updatehub_response(enum updatehub_response response) { switch (response) { case UPDATEHUB_NETWORKING_ERROR: return "Fail to connect to the UpdateHub server"; case UPDATEHUB_INCOMPATIBLE_HARDWARE: return "Incompatible hardware"; case UPDATEHUB_METADATA_ERROR: return "Fail to parse or to encode the metadata"; case UPDATEHUB_DOWNLOAD_ERROR: return "Fail while downloading the update package"; case UPDATEHUB_INSTALL_ERROR: return "Fail while installing the update package"; case UPDATEHUB_FLASH_INIT_ERROR: return "Fail to initilialize the flash"; case UPDATEHUB_NO_UPDATE: return "No update available"; default: return NULL; } } static const char *uri_path(enum updatehub_uri_path type) { switch (type) { case UPDATEHUB_PROBE: return "upgrades"; case UPDATEHUB_REPORT: return "report"; case UPDATEHUB_DOWNLOAD: return "products"; default: return NULL; } } static const char *state_name(enum updatehub_state state) { switch (state) { case UPDATEHUB_STATE_DOWNLOADING: return "downloading"; case UPDATEHUB_STATE_DOWNLOADED: return "downloaded"; case UPDATEHUB_STATE_INSTALLING: return "installing"; case UPDATEHUB_STATE_INSTALLED: return "installed"; case UPDATEHUB_STATE_REBOOTING: return "rebooting"; case UPDATEHUB_STATE_ERROR: return "error"; default: return NULL; } } struct resp_probe_objects { const char *mode; const char *sha256sum; int size; }; struct resp_probe_objects_array { struct resp_probe_objects objects; }; struct resp_probe_any_boards { struct resp_probe_objects_array objects[2]; size_t objects_len; const char *product; const char *supported_hardware; }; struct resp_probe_some_boards { struct resp_probe_objects_array objects[2]; size_t objects_len; const char *product; const char *supported_hardware[CONFIG_UPDATEHUB_SUPPORTED_HARDWARE_MAX]; size_t supported_hardware_len; }; struct updatehub_config_device_identity { const char *id; }; struct report { const char *product_uid; const char *hardware; const char *version; struct updatehub_config_device_identity device_identity; const char *status; const char *package_uid; const char *error_message; const char *previous_state; }; struct probe { const char *product_uid; const char *hardware; const char *version; struct updatehub_config_device_identity device_identity; }; static const struct json_obj_descr recv_probe_objects_descr[] = { JSON_OBJ_DESCR_PRIM(struct resp_probe_objects, mode, JSON_TOK_STRING), JSON_OBJ_DESCR_PRIM(struct resp_probe_objects, sha256sum, JSON_TOK_STRING), JSON_OBJ_DESCR_PRIM(struct resp_probe_objects, size, JSON_TOK_NUMBER), }; static const struct json_obj_descr recv_probe_objects_descr_array[] = { JSON_OBJ_DESCR_OBJECT(struct resp_probe_objects_array, objects, recv_probe_objects_descr), }; static const struct json_obj_descr recv_probe_sh_string_descr[] = { JSON_OBJ_DESCR_PRIM(struct resp_probe_any_boards, product, JSON_TOK_STRING), JSON_OBJ_DESCR_PRIM_NAMED(struct resp_probe_any_boards, "supported-hardware", supported_hardware, JSON_TOK_STRING), JSON_OBJ_DESCR_ARRAY_ARRAY(struct resp_probe_any_boards, objects, 2, objects_len, recv_probe_objects_descr_array, ARRAY_SIZE(recv_probe_objects_descr_array)), }; static const struct json_obj_descr recv_probe_sh_array_descr[] = { JSON_OBJ_DESCR_PRIM(struct resp_probe_some_boards, product, JSON_TOK_STRING), JSON_OBJ_DESCR_ARRAY_NAMED(struct resp_probe_some_boards, "supported-hardware", supported_hardware, CONFIG_UPDATEHUB_SUPPORTED_HARDWARE_MAX, supported_hardware_len, JSON_TOK_STRING), JSON_OBJ_DESCR_ARRAY_ARRAY(struct resp_probe_some_boards, objects, 2, objects_len, recv_probe_objects_descr_array, ARRAY_SIZE(recv_probe_objects_descr_array)), }; static const struct json_obj_descr device_identity_descr[] = { JSON_OBJ_DESCR_PRIM(struct updatehub_config_device_identity, id, JSON_TOK_STRING), }; static const struct json_obj_descr send_report_descr[] = { JSON_OBJ_DESCR_PRIM_NAMED(struct report, "product-uid", product_uid, JSON_TOK_STRING), JSON_OBJ_DESCR_OBJECT_NAMED(struct report, "device-identity", device_identity, device_identity_descr), JSON_OBJ_DESCR_PRIM_NAMED(struct report, "error-message", error_message, JSON_TOK_STRING), JSON_OBJ_DESCR_PRIM_NAMED(struct report, "previous-state", previous_state, JSON_TOK_STRING), JSON_OBJ_DESCR_PRIM(struct report, version, JSON_TOK_STRING), JSON_OBJ_DESCR_PRIM(struct report, hardware, JSON_TOK_STRING), JSON_OBJ_DESCR_PRIM_NAMED(struct report, "package-uid", package_uid, JSON_TOK_STRING), JSON_OBJ_DESCR_PRIM(struct report, status, JSON_TOK_STRING), }; static const struct json_obj_descr send_probe_descr[] = { JSON_OBJ_DESCR_PRIM_NAMED(struct probe, "product-uid", product_uid, JSON_TOK_STRING), JSON_OBJ_DESCR_OBJECT_NAMED(struct probe, "device-identity", device_identity, device_identity_descr), JSON_OBJ_DESCR_PRIM(struct probe, version, JSON_TOK_STRING), JSON_OBJ_DESCR_PRIM(struct probe, hardware, JSON_TOK_STRING), }; /** * @} */ #endif /* __UPDATEHUB_PRIV_H__ */