ezyang@1739: #ifndef URWEB_TYPES_H ezyang@1739: #define URWEB_TYPES_H ezyang@1739: ezyang@1739: #include ezyang@1739: #include ezyang@1739: #include ezyang@1739: ezyang@1739: typedef long long uw_Basis_int; ezyang@1739: typedef double uw_Basis_float; ezyang@1739: typedef char* uw_Basis_string; ezyang@1739: typedef char uw_Basis_char; ezyang@1739: typedef struct { ezyang@1739: time_t seconds; ezyang@1739: unsigned microseconds; ezyang@1739: } uw_Basis_time; ezyang@1739: typedef struct { ezyang@1739: size_t size; ezyang@1739: char *data; ezyang@1739: } uw_Basis_blob; ezyang@1739: ezyang@1739: typedef int uw_unit; ezyang@1739: typedef uw_unit uw_Basis_unit; ezyang@1739: ezyang@1739: typedef enum uw_Basis_bool { uw_Basis_False, uw_Basis_True } uw_Basis_bool; ezyang@1739: ezyang@1739: typedef struct uw_context *uw_context; ezyang@1739: ezyang@1739: typedef uw_Basis_string uw_Basis_xhtml; ezyang@1739: typedef uw_Basis_string uw_Basis_page; ezyang@1739: typedef uw_Basis_string uw_Basis_xbody; ezyang@1739: typedef uw_Basis_string uw_Basis_css_class; ezyang@1739: ezyang@1739: typedef unsigned uw_Basis_client; ezyang@1739: typedef struct { ezyang@1739: unsigned cli, chn; ezyang@1739: } uw_Basis_channel; ezyang@1739: ezyang@1739: typedef struct { ezyang@1739: int context; ezyang@1739: unsigned long long source; ezyang@1739: } uw_Basis_source; ezyang@1739: ezyang@1739: typedef struct uw_Basis_file { ezyang@1739: uw_Basis_string name, type; ezyang@1739: uw_Basis_blob data; ezyang@1739: } uw_Basis_file; ezyang@1739: ezyang@1739: typedef struct uw_Basis_postBody { ezyang@1739: uw_Basis_string type, data; adam@1788: size_t len; ezyang@1739: } uw_Basis_postBody; ezyang@1739: ezyang@1739: typedef uw_Basis_string uw_Basis_queryString; ezyang@1739: adam@1787: typedef struct { adam@1787: uw_Basis_string name, value, remaining; adam@1787: } uw_Basis_postField; adam@1787: ezyang@1739: typedef enum { SUCCESS, FATAL, BOUNDED_RETRY, UNLIMITED_RETRY, RETURN_INDIRECTLY } failure_kind; ezyang@1739: ezyang@1739: typedef enum { SERVED, KEEP_OPEN, FAILED } request_result; ezyang@1739: ezyang@1739: typedef struct input *uw_input; ezyang@1739: ezyang@1739: #define INTS_MAX 50 ezyang@1739: #define FLOATS_MAX 100 ezyang@1739: #define TIMES_MAX 100 ezyang@1739: ezyang@1739: typedef void (*uw_callback)(void *); ezyang@1739: typedef void (*uw_callback_with_retry)(void *, int will_retry); ezyang@1739: typedef void (*uw_logger)(void*, const char *fmt, ...); ezyang@1739: ezyang@1739: typedef struct { ezyang@1739: void (*callback)(uw_context); ezyang@1739: unsigned int period; ezyang@1739: } uw_periodic; ezyang@1739: ezyang@1739: typedef struct { ezyang@1739: int inputs_len, timeout; ezyang@1739: char *url_prefix; ezyang@1739: ezyang@1739: void (*client_init)(); ezyang@1739: void (*initializer)(uw_context); ezyang@1739: void (*expunger)(uw_context, uw_Basis_client); ezyang@1739: ezyang@1739: void (*db_init)(uw_context); ezyang@1739: int (*db_begin)(uw_context); ezyang@1739: int (*db_commit)(uw_context); ezyang@1739: int (*db_rollback)(uw_context); ezyang@1739: void (*db_close)(uw_context); ezyang@1739: ezyang@1739: void (*handle)(uw_context, char *); ezyang@1739: ezyang@1739: int (*input_num)(const char*); ezyang@1739: uw_Basis_string (*cookie_sig)(uw_context); ezyang@1739: int (*check_url)(const char *); ezyang@1739: int (*check_mime)(const char *); ezyang@1739: int (*check_requestHeader)(const char *); ezyang@1739: int (*check_responseHeader)(const char *); adam@1799: int (*check_envVar)(const char *); ezyang@1739: ezyang@1739: void (*on_error)(uw_context, char *); ezyang@1739: ezyang@1739: uw_periodic *periodics; // 0-terminated array ezyang@1739: ezyang@1739: uw_Basis_string time_format; ezyang@1739: } uw_app; ezyang@1739: ezyang@1739: #define ERROR_BUF_LEN 1024 ezyang@1739: ezyang@1739: typedef struct { ezyang@1739: size_t max; ezyang@1739: char *start, *front, *back; ezyang@1739: } uw_buffer; ezyang@1739: ezyang@1739: #endif