blob: b00f39e13c9628f224c9be95c12e02ebbf79ffb9 [file] [log] [blame]
#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_NONE 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 = 0, \
.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