1 /*
2  * Copyright (C) 2015-2018 Alibaba Group Holding Limited
3  */
4 
5 #ifndef IOT_EXPORT_HTTP2_STREAM_H
6 #define IOT_EXPORT_HTTP2_STREAM_H
7 
8 #include "linkkit/infra/infra_types.h"
9 #include "linkkit/infra/infra_defs.h"
10 
11 #ifdef __cplusplus
12 extern "C" {
13 #endif
14 
15 #define IOT_HTTP2_RES_OVERTIME_MS (10000)
16 #define IOT_HTTP2_KEEP_ALIVE_CNT  (2)
17 #define IOT_HTTP2_KEEP_ALIVE_TIME (30 * 1000) /* in seconds */
18 
19 #define MAKE_HEADER(NAME, VALUE)                                         \
20     {                                                                    \
21         (char *)NAME, (char *)VALUE, sizeof(NAME) - 1, sizeof(VALUE) - 1 \
22     }
23 
24 #define MAKE_HEADER_CS(NAME, VALUE)                              \
25     {                                                            \
26         (char *)NAME, (char *)VALUE, strlen(NAME), strlen(VALUE) \
27     }
28 
29 typedef struct {
30     char *product_key;
31     char *device_name;
32     char *device_secret;
33     char *url;
34     int port;
35 } device_conn_info_t;
36 
37 typedef struct http2_header_struct {
38     char *name;   /* header name */
39     char *value;  /* the value of name */
40     int namelen;  /* the length of header name */
41     int valuelen; /* the length of value */
42 } http2_header;
43 
44 typedef struct {
45     http2_header *nva;
46     int num;
47 } header_ext_info_t;
48 
49 typedef enum {
50     STREAM_TYPE_DOWNLOAD,
51     STREAM_TYPE_UPLOAD,
52     STREAM_TYPE_AUXILIARY,
53     STREAM_TYPE_NUM
54 } stream_type_t;
55 
56 typedef void (*on_stream_header_callback)(uint32_t stream_id, char *channel_id,
57                                           int cat, const uint8_t *name,
58                                           uint32_t namelen,
59                                           const uint8_t *value,
60                                           uint32_t valuelen, uint8_t flags,
61                                           void *user_data);
62 
63 typedef void (*on_stream_chunk_recv_callback)(uint32_t stream_id,
64                                               char *channel_id,
65                                               const uint8_t *data, uint32_t len,
66                                               uint8_t flags, void *user_data);
67 
68 typedef void (*on_stream_close_callback)(uint32_t stream_id, char *channel_id,
69                                          uint32_t error_code, void *user_data);
70 
71 typedef void (*on_stream_frame_send_callback)(uint32_t stream_id,
72                                               char *channel_id, int type,
73                                               uint8_t flags, void *user_data);
74 
75 typedef void (*on_stream_frame_recv_callback)(uint32_t stream_id,
76                                               char *channel_id, int type,
77                                               uint8_t flags, void *user_data);
78 
79 typedef void (*on_reconnect_callback)();
80 typedef void (*on_disconnect_callback)();
81 
82 typedef struct {
83     on_stream_header_callback on_stream_header_cb;
84     on_stream_chunk_recv_callback on_stream_chunk_recv_cb;
85     on_stream_close_callback on_stream_close_cb;
86     on_stream_frame_send_callback on_stream_frame_send_cb;
87     on_stream_frame_recv_callback on_stream_frame_recv_cb;
88     on_reconnect_callback on_reconnect_cb;
89     on_disconnect_callback on_disconnect_cb;
90 } http2_stream_cb_t;
91 
92 typedef struct {
93     char *stream;         /* point to stream data buffer */
94     uint32_t stream_len;  /* file content length */
95     uint32_t send_len;    /* data had sent length */
96     uint32_t packet_len;  /* one packet length */
97     const char *identify; /* path string to identify a stream service */
98     int h2_stream_id; /* stream identifier which is a field in HTTP2 frame */
99     char *
100         channel_id;  /* string return by server to identify a specific stream
101                      channel,  different from stream identifier which is a field
102                      in HTTP2 frame */
103     void *user_data; /* user data brought in at stream open */
104 } stream_data_info_t;
105 
106 void *IOT_HTTP2_Connect(device_conn_info_t *conn_info,
107                         http2_stream_cb_t *user_cb);
108 int IOT_HTTP2_Stream_Open(void *handle, stream_data_info_t *info,
109                           header_ext_info_t *header);
110 int IOT_HTTP2_Stream_Send(void *handle, stream_data_info_t *info,
111                           header_ext_info_t *header);
112 int IOT_HTTP2_Stream_Query(void *handle, stream_data_info_t *info,
113                            header_ext_info_t *header);
114 int IOT_HTTP2_Stream_Close(void *handle, stream_data_info_t *info);
115 int IOT_HTTP2_Stream_Send_Message(void *handle, const char *identify,
116                                   char *channel_id, char *data,
117                                   uint32_t data_len, header_ext_info_t *header);
118 int IOT_HTTP2_Disconnect(void *handle);
119 
120 #ifdef __cplusplus
121 }
122 #endif
123 
124 #endif /* IOT_EXPORT_FILE_UPLOADER_H */
125