blob: 707e2db6c6dfb2fe1e354bede80498c596627309 [file] [log] [blame]
/*
* 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 initialize 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_objects_array_array {
struct resp_probe_objects_array objects[4];
size_t objects_len;
};
struct resp_probe_any_boards {
struct resp_probe_objects_array_array objects[2];
size_t objects_len;
const char *product;
const char *supported_hardware;
};
struct resp_probe_some_boards {
struct resp_probe_objects_array_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_objects_descr_array_array[] = {
JSON_OBJ_DESCR_ARRAY_ARRAY(struct resp_probe_objects_array_array,
objects, 4, objects_len,
recv_probe_objects_descr_array,
ARRAY_SIZE(recv_probe_objects_descr_array)),
};
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,
ARRAY_SIZE(recv_probe_objects_descr_array_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,
ARRAY_SIZE(recv_probe_objects_descr_array_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__ */