00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef MSG_TYPES_H
00026
00027 #define MSG_TYPES_H
00028
00038 #ifndef SU_TYPES_H
00039 #include <sofia-sip/su_types.h>
00040 #endif
00041
00042 SOFIA_BEGIN_DECLS
00043
00045 typedef struct msg_mclass_s msg_mclass_t;
00046
00048 typedef struct msg_hclass_s const msg_hclass_t;
00049
00051 typedef struct msg_href_s msg_href_t;
00052
00054 typedef struct msg_s msg_t;
00055
00056 #ifndef MSG_TIME_T_DEFINED
00057 #define MSG_TIME_T_DEFINED
00058
00059 typedef unsigned long msg_time_t;
00060 #endif
00061
00062 #ifndef MSG_TIME_MAX
00063
00064 #define MSG_TIME_MAX ((msg_time_t)ULONG_MAX)
00065 #endif
00066
00067 #ifndef MSG_PUB_T
00068 #ifdef MSG_OBJ_T
00069 #define MSG_PUB_T MSG_OBJ_T
00070 #else
00071 #define MSG_PUB_T struct msg_pub_s
00072 #endif
00073 #endif
00074
00081 typedef MSG_PUB_T msg_pub_t;
00082
00083 #ifndef MSG_HDR_T
00084 #define MSG_HDR_T union msg_header_u
00085 #endif
00086
00087 typedef MSG_HDR_T msg_header_t;
00088
00089 typedef struct msg_common_s msg_common_t;
00090
00091 typedef struct msg_separator_s msg_separator_t;
00092 typedef struct msg_payload_s msg_payload_t;
00093 typedef struct msg_unknown_s msg_unknown_t;
00094 typedef struct msg_error_s msg_error_t;
00095
00096 typedef msg_common_t msg_frg_t;
00097
00098 typedef char const *msg_param_t;
00099 typedef struct msg_numeric_s msg_numeric_t;
00100 typedef struct msg_generic_s msg_generic_t;
00101 typedef struct msg_list_s msg_list_t;
00102 typedef struct msg_auth_s msg_auth_t;
00103
00104 #define MSG_HEADER_N 16377
00105
00110 struct msg_common_s {
00111 msg_header_t *h_succ;
00112 msg_header_t **h_prev;
00113 msg_hclass_t *h_class;
00114 void const *h_data;
00115 usize_t h_len;
00116 };
00117
00118
00120 struct msg_pub_s {
00121 msg_common_t msg_common[1];
00122 msg_pub_t *msg_next;
00123 void *msg_user;
00124 unsigned msg_size;
00125 unsigned msg_flags;
00126 msg_error_t *msg_error;
00127 msg_header_t *msg_request;
00128 msg_header_t *msg_status;
00129 msg_header_t *msg_headers[MSG_HEADER_N];
00130 };
00131
00132 #define msg_ident msg_common->h_class
00133
00138 struct msg_numeric_s {
00139 msg_common_t x_common[1];
00140 msg_numeric_t *x_next;
00141 unsigned long x_value;
00142 };
00143
00149 struct msg_generic_s {
00150 msg_common_t g_common[1];
00151 msg_generic_t *g_next;
00152 char const *g_string;
00153 };
00154
00159 struct msg_list_s {
00160 msg_common_t k_common[1];
00161 msg_list_t *k_next;
00162 msg_param_t *k_items;
00163 };
00164
00170 struct msg_auth_s {
00171 msg_common_t au_common[1];
00172 msg_auth_t *au_next;
00173 char const *au_scheme;
00174 msg_param_t const *au_params;
00175 };
00176
00178 struct msg_unknown_s {
00179 msg_common_t un_common[1];
00180 msg_unknown_t *un_next;
00181 char const *un_name;
00182 char const *un_value;
00183 };
00184
00186 struct msg_error_s {
00187 msg_common_t er_common[1];
00188 msg_error_t *er_next;
00189 char const *er_name;
00190 };
00191
00192
00194 struct msg_separator_s {
00195 msg_common_t sep_common[1];
00196 msg_error_t *sep_next;
00197 char sep_data[4];
00198 };
00199
00201 struct msg_payload_s {
00202 msg_common_t pl_common[1];
00203 msg_payload_t *pl_next;
00204 char *pl_data;
00205 usize_t pl_len;
00206 };
00207
00209 union msg_header_u {
00210 msg_common_t sh_common[1];
00211 struct {
00212 msg_common_t shn_common;
00213 msg_header_t *shn_next;
00214 } sh_header_next[1];
00215 #define sh_next sh_header_next->shn_next
00216 #define sh_class sh_common->h_class
00217 #define sh_succ sh_common->h_succ
00218 #define sh_prev sh_common->h_prev
00219 #define sh_data sh_common->h_data
00220 #define sh_len sh_common->h_len
00221
00222 msg_generic_t sh_generic[1];
00223 msg_numeric_t sh_numeric[1];
00224 msg_list_t sh_list[1];
00225 msg_auth_t sh_auth[1];
00226 msg_separator_t sh_separator[1];
00227 msg_payload_t sh_payload[1];
00228 msg_unknown_t sh_unknown[1];
00229 msg_error_t sh_error[1];
00230 };
00231
00232
00233
00237 typedef enum {
00238 msg_kind_single,
00239 msg_kind_append,
00240 msg_kind_list,
00242 msg_kind_apndlist,
00243 msg_kind_prepend
00244 } msg_header_kind_t;
00245
00246 struct su_home_s;
00247
00248 typedef issize_t msg_parse_f(struct su_home_s *, msg_header_t *, char *, isize_t);
00249 typedef issize_t msg_print_f(char buf[], isize_t bufsiz,
00250 msg_header_t const *, int flags);
00251 typedef char *msg_dup_f(msg_header_t *dst, msg_header_t const *src,
00252 char *buf, isize_t bufsiz);
00253 typedef isize_t msg_xtra_f(msg_header_t const *h, isize_t offset);
00254
00255 typedef int msg_update_f(msg_common_t *, char const *name, isize_t namelen,
00256 char const *value);
00257
00265 struct msg_hclass_s
00266 {
00267
00268 int hc_hash;
00269 msg_parse_f *hc_parse;
00270 msg_print_f *hc_print;
00271 msg_xtra_f *hc_dxtra;
00272 msg_dup_f *hc_dup_one;
00273 msg_update_f *hc_update;
00274 char const *hc_name;
00275 short hc_len;
00276 char hc_short[2];
00277 unsigned char hc_size;
00278 unsigned char hc_params;
00279 unsigned hc_kind:3;
00281 unsigned hc_critical:1;
00282 unsigned :0;
00283 };
00284
00285 #define HC_LEN_MAX SHRT_MAX
00286
00287 SOFIA_END_DECLS
00288
00289 #endif