315 lines
9.7 KiB
C
315 lines
9.7 KiB
C
#ifndef __DMGR_API_H
|
|
#define __DMGR_API_H
|
|
|
|
#include <stdarg.h>
|
|
|
|
typedef int dmgr_t;
|
|
struct notifier_block;
|
|
|
|
enum NOTIFY {
|
|
NOTIFY_USER_BEGIN = 0,
|
|
NOTIFY_CHECKVERSION_PREPARE,
|
|
NOTIFY_CHECKVERSION_ABORTED,
|
|
NOTIFY_CHECKVERSION_FINISHED,
|
|
NOTIFY_DOWNLOAD_PREPARE,
|
|
NOTIFY_DOWNLOAD_ABORTED,
|
|
NOTIFY_DOWNLOAD_TRANSLATING,
|
|
NOTIFY_DOWNLOAD_FINISHED,
|
|
NOTIFY_DOWNLOAD_PARTTIAL_FINISHED,
|
|
NOTIFY_SOCKET_CONNECT_PREPARE,
|
|
NOTIFY_SOCKET_CONNECT_ABORTED,
|
|
NOTIFY_SOCKET_CONNECT_FINISHED,
|
|
NOTIFY_SOCKET_CONNECT_CLOSED,
|
|
NOTIFY_SOCKET_SEND_PREPARE,
|
|
NOTIFY_SOCKET_SEND_TRANSLATING,
|
|
NOTIFY_SOCKET_SEND_ABORTED,
|
|
NOTIFY_SOCKET_SEND_FINISHED,
|
|
NOTIFY_SOCKET_RECV_PREPARE,
|
|
NOTIFY_SOCKET_RECV_TRANSLATING,
|
|
NOTIFY_SOCKET_RECV_ABORTED,
|
|
NOTIFY_SOCKET_RECV_FINISHED,
|
|
NOTIFY_USER_END
|
|
};
|
|
|
|
enum NOTIFIER_ID {
|
|
NOTIFY_ID_CHECK_VERSION = 0,
|
|
NOTIFY_ID_DOWNLOAD,
|
|
NOTIFY_ID_SOCKET,
|
|
MAX_USER_NOTIFIERS
|
|
};
|
|
|
|
enum _DMGR_ERRNO {
|
|
E_OK = 0,
|
|
E_BEGIN = 300,
|
|
E_NOMEM,
|
|
E_INVAL_PARAM,
|
|
E_INVAL_OPERATION,
|
|
E_IO_FAILED,
|
|
E_IO_TIMEDOUT,
|
|
E_VERIFIED_FAILED,
|
|
E_CANCELLED,
|
|
E_NESTING_CALLED,
|
|
E_RESERVE1 = 400,
|
|
/* Error from server */
|
|
E_INVAL_TOKEN,
|
|
E_INVAL_PLATFORM,
|
|
E_PARAM_MISSING,
|
|
E_UNCONFIGURED_VERSION,
|
|
E_INTERNAL_ERROR,
|
|
E_RESERVE2 = 500,
|
|
E_URL_MALFORMAT,
|
|
E_COULDNT_RESOLVE_HOST,
|
|
E_COULDNT_CONNECT,
|
|
E_HTTP_RETURNED_ERROR,
|
|
E_RANGE_ERROR,
|
|
E_HTTP_POST_ERROR,
|
|
E_BAD_DOWNLOAD_RESUME,
|
|
E_ABORTED,
|
|
E_AGAIN,
|
|
E_TOO_MANY_REDIRECTS,
|
|
E_GOT_NOTHING,
|
|
E_SEND_ERROR,
|
|
E_RECV_ERROR,
|
|
E_NO_CONNECTION_AVAILABLE,
|
|
E_END
|
|
};
|
|
|
|
#define DMGR_ERRNO(err) (int)(-(err))
|
|
#define SOCKET_WAIT_FOREVER ((int)-1)
|
|
|
|
#define VERINFO_FLAGS_FORCE_PACKAGE (int)(0x01 << 0)
|
|
typedef struct version_info {
|
|
char *version_name;
|
|
int file_size;
|
|
char *delta_id;
|
|
char *md5sum;
|
|
char *delta_url;
|
|
char *release_note;
|
|
int flags;
|
|
char *upgrade_from_time;
|
|
char *upgrade_to_time;
|
|
char *upgrade_gap;
|
|
char *meta_data;
|
|
char *event_id;
|
|
} version_info_t;
|
|
|
|
typedef struct download_info {
|
|
long total_bytes;
|
|
long break_bytes;
|
|
long saved_bytes;
|
|
long now_bytes;
|
|
} download_info_t;
|
|
|
|
typedef struct error_value {
|
|
int error;
|
|
} error_value_t;
|
|
|
|
typedef struct socket_sbuf {
|
|
char *data;
|
|
size_t size;
|
|
} socket_sbuf_t;
|
|
|
|
typedef struct notifier_data {
|
|
union {
|
|
struct error_value errvalue;
|
|
struct download_info dlinfo;
|
|
struct version_info verinfo;
|
|
struct socket_sbufs {
|
|
struct socket_sbuf *sock_sbufs;
|
|
size_t count;
|
|
} ssbufs;
|
|
} u;
|
|
} notifier_data_t;
|
|
|
|
typedef int (*notifier_fn_t)(struct notifier_block *nb,
|
|
unsigned long action,
|
|
void *data);
|
|
|
|
typedef struct socket_connect {
|
|
int (*create)(struct socket_connect *conn,
|
|
char *hostname,
|
|
int port,
|
|
int recv_timeout,
|
|
int send_timeout,
|
|
int connect_timeout,
|
|
int flags);
|
|
int (*destory)(struct socket_connect *conn);
|
|
int (*connect)(struct socket_connect *conn);
|
|
int (*send)(struct socket_connect *conn,
|
|
char *buf,
|
|
size_t size,
|
|
size_t *sent_size);
|
|
int (*send_sbufs)(struct socket_connect *conn,
|
|
struct socket_sbuf *sbufs,
|
|
size_t count,
|
|
size_t *sent_size);
|
|
int (*recv)(struct socket_connect *conn,
|
|
char *buf,
|
|
size_t size,
|
|
size_t *recved_size);
|
|
int (*close)(struct socket_connect *conn);
|
|
} socket_connect_t;
|
|
|
|
typedef struct notifier_block {
|
|
notifier_fn_t notifier_call;
|
|
struct notifier_block *next;
|
|
int priority;
|
|
int alloc_set;
|
|
} notifier_block_t;
|
|
|
|
#define init_notifier_block(nb, call, pri) \
|
|
do { \
|
|
(nb)->notifier_call = call; \
|
|
(nb)->next = NULL; \
|
|
(nb)->priority = pri; \
|
|
(nb)->alloc_set= 0; \
|
|
} while (0)
|
|
|
|
#define SERVER_TRANSOPT_FOTA ((0x00 << 0) & 0x0f)
|
|
#define SERVER_TRANSOPT_RELIANCE ((0x01 << 0) & 0x0f)
|
|
#define SERVER_TRANSOPT_RELIANCE_ST ((0x02 << 0) & 0x0f)
|
|
#define SERVER_TRANSOPT_VEHICLE ((0x03 << 0) & 0x0f)
|
|
#define SERVER_TRANSOPT_IOT ((0x04 << 0) & 0x0f)
|
|
#define SERVER_TRANSOPT_HTTPS ((0x01 << 4) & 0xf0)
|
|
#define SERVER_TRANSOPT_HTTP ((0x02 << 4) & 0xf0)
|
|
#define SERVER_TRANSOPT_COMPACT_HTTP ((0x03 << 4) & 0xf0)
|
|
|
|
typedef struct policy_info {
|
|
int so_transfer_timeout; /* The tcp/ip receive/send data timeout */
|
|
int so_connect_timeout; /* The tcp/ip connection timeout */
|
|
int so_recv_buffer_size; /* The max size of receive buffer */
|
|
int download_retry; /* The retry count for download failed */
|
|
int download_retry_time; /* The retry delay time(seconds) for download failed */
|
|
int server_transfer_opt; /* The type or opt of sepcific server */
|
|
char *sstate_cached_path; /* The path used for cache dmgr shared-state */
|
|
char *root_certificates; /* Root certificates are self-signed and form
|
|
the basis of an X.509-based public key
|
|
infrastructure (PKI) */
|
|
char *sub_certificates; /* The path used for cache dmgr shared-state */
|
|
int freespace_for_file_frac; /* file bavail safe proportion */
|
|
} policy_info_t;
|
|
|
|
#define POLICY_INFO_INIT(name) \
|
|
{ .so_transfer_timeout = -1, \
|
|
.so_connect_timeout = -1, \
|
|
.so_recv_buffer_size = 8192, \
|
|
.download_retry = 10, \
|
|
.download_retry_time = 5, \
|
|
.server_transfer_opt = SERVER_TRANSOPT_FOTA| \
|
|
SERVER_TRANSOPT_COMPACT_HTTP, \
|
|
.sstate_cached_path = "/var", \
|
|
.root_certificates = NULL, \
|
|
.sub_certificates = NULL, \
|
|
.freespace_for_file_frac = 90 \
|
|
}
|
|
|
|
#define POLICY_INFO(name) \
|
|
struct policy_info name = POLICY_INFO_INIT(name)
|
|
|
|
enum LOGGER {
|
|
LOGGER_STDIO = 0,
|
|
LOGGER_BUFFER,
|
|
LOGGER_FILE
|
|
};
|
|
|
|
enum LOG_LEVEL {
|
|
LOG_VERBOSE = 0,
|
|
LOG_DEBUG,
|
|
LOG_INFO,
|
|
LOG_WARNING,
|
|
LOG_ERROR,
|
|
LOG_FATAL,
|
|
LOG_OFF
|
|
};
|
|
|
|
enum LOG_TYPE {
|
|
LOG_TYPE_CHECK = 0,
|
|
LOG_TYPE_DOWNLOAD,
|
|
LOG_TYPE_HTTP,
|
|
LOG_TYPE_LAST
|
|
};
|
|
|
|
dmgr_t dmgr_alloc(struct policy_info *policy,
|
|
enum LOG_LEVEL default_log_level,
|
|
enum LOGGER logger, ...);
|
|
int dmgr_free(dmgr_t dm_id);
|
|
int dmgr_keepalive_with_server(dmgr_t dm_id);
|
|
int dmgr_register_device_to_server(dmgr_t dm_id);
|
|
int dmgr_register_socket(dmgr_t dm_id, struct socket_connect *conn);
|
|
int dmgr_alloc_notifier(dmgr_t dm_id,
|
|
enum NOTIFIER_ID nh_id,
|
|
notifier_fn_t notifier_call,
|
|
int priority,
|
|
int extra_bytes);
|
|
int dmgr_register_notifier(dmgr_t dm_id,
|
|
struct notifier_block *nb,
|
|
enum NOTIFIER_ID nh_id);
|
|
int dmgr_register_deviceinfo(dmgr_t dm_id,
|
|
const char *name,
|
|
const char *value);
|
|
int dmgr_register_salesinfo(dmgr_t dm_id,
|
|
const char *name,
|
|
const char *value);
|
|
|
|
#define SERI_KEEP_URL "KEEP_URL"
|
|
#define SERI_REG_URL "REG_URL"
|
|
#define SERI_CHK_URL "CHK_URL"
|
|
#define SERI_DL_URL "DL_URL"
|
|
#define SERI_REPORT_DLR_URL "REPORT_DLR_URL"
|
|
#define SERI_REPORT_UPGR_URL "REPORT_UPGR_URL"
|
|
#define SERI_REPORT_SALES_URL "REPORT_SALES_URL"
|
|
|
|
int dmgr_register_serverinfo(dmgr_t dm_id,
|
|
const char *name,
|
|
const char *value);
|
|
|
|
/* The public for checking version */
|
|
int dmgr_check_version(dmgr_t dm_id);
|
|
int dmgr_async_check_version(dmgr_t dm_id);
|
|
int dmgr_async_cancel_checking(dmgr_t dm_id);
|
|
|
|
/* The public interface for downloading */
|
|
#define DOWNLOAD_FILE_SEEK_BEGIN ((long)0)
|
|
#define DOWNLOAD_FILE_SEEK_END ((long)-1)
|
|
|
|
int dmgr_filmap_version(dmgr_t dm_id,
|
|
struct version_info *version,
|
|
char *file_path,
|
|
long file_seek,
|
|
long map_addr_start,
|
|
long map_size);
|
|
int dmgr_async_filmap_version(dmgr_t dm_id,
|
|
struct version_info *version,
|
|
char *file_path,
|
|
long file_seek,
|
|
long map_addr_start,
|
|
long map_size);
|
|
|
|
int dmgr_download_version(dmgr_t dm_id,
|
|
struct version_info *version,
|
|
char *file_path,
|
|
long file_seek,
|
|
long start_from,
|
|
long max_size);
|
|
int dmgr_async_download_version(dmgr_t dm_id,
|
|
struct version_info *version,
|
|
char *file_path,
|
|
long file_seek,
|
|
long start_from,
|
|
long max_size);
|
|
|
|
int dmgr_async_cancel_downloading(dmgr_t dm_id);
|
|
|
|
/* The public for reporting interface */
|
|
int dmgr_report_upgraded_version(dmgr_t dm_id,
|
|
struct version_info *version,
|
|
const char *upgraded_desc);
|
|
|
|
int dmgr_report_sales_tracker(dmgr_t dm_id);
|
|
int dmgr_set_log_level(int dm_id,
|
|
enum LOG_TYPE type,
|
|
enum LOG_LEVEL level);
|
|
int dmgr_version(char *version_buf, int size);
|
|
|
|
#endif
|