sofia-sip/msg_types.h

Go to the documentation of this file.
00001 /*
00002  * This file is part of the Sofia-SIP package
00003  *
00004  * Copyright (C) 2005 Nokia Corporation.
00005  *
00006  * Contact: Pekka Pessi <pekka.pessi@nokia-email.address.hidden>
00007  *
00008  * This library is free software; you can redistribute it and/or
00009  * modify it under the terms of the GNU Lesser General Public License
00010  * as published by the Free Software Foundation; either version 2.1 of
00011  * the License, or (at your option) any later version.
00012  *
00013  * This library is distributed in the hope that it will be useful, but
00014  * WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
00016  * Lesser General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU Lesser General Public
00019  * License along with this library; if not, write to the Free Software
00020  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
00021  * 02110-1301 USA
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 typedef struct msg_auth_info_s      msg_auth_info_t;
00104 
00105 #define MSG_HEADER_N 16377
00106 
00111 struct msg_common_s {
00112   msg_header_t       *h_succ;   
00113   msg_header_t      **h_prev;   
00114   msg_hclass_t       *h_class;  
00115   void const         *h_data;   
00116   usize_t             h_len;    
00117 };
00118 
00119 
00121 struct msg_pub_s {
00122   msg_common_t        msg_common[1]; 
00123   msg_pub_t          *msg_next;
00124   void               *msg_user;
00125   unsigned            msg_size;
00126   unsigned            msg_flags;
00127   msg_error_t        *msg_error;
00128   msg_header_t       *msg_request;
00129   msg_header_t       *msg_status;
00130   msg_header_t       *msg_headers[MSG_HEADER_N];
00131 };
00132 
00133 #define msg_ident msg_common->h_class
00134 
00140 struct msg_numeric_s {
00141   msg_common_t   x_common[1];       
00142   msg_numeric_t *x_next;            
00143   unsigned long  x_value;           
00144 };
00145 
00151 struct msg_generic_s {
00152   msg_common_t   g_common[1];       
00153   msg_generic_t *g_next;            
00154   char const    *g_string;          
00155 };
00156 
00161 struct msg_list_s {
00162   msg_common_t       k_common[1];   
00163   msg_list_t        *k_next;        
00164   msg_param_t       *k_items;       
00165 };
00166 
00172 struct msg_auth_s {
00173   msg_common_t       au_common[1];  
00174   msg_auth_t        *au_next;       
00175   char const        *au_scheme;     
00176   msg_param_t const *au_params;     
00177 };
00178 
00183 struct msg_auth_info_s
00184 {
00185   msg_common_t        ai_common[1]; 
00186   msg_error_t        *ai_next;      
00187   msg_param_t const  *ai_params;    
00188 };
00189 
00191 struct msg_unknown_s {
00192   msg_common_t    un_common[1];  
00193   msg_unknown_t  *un_next;       
00194   char const     *un_name;       
00195   char const     *un_value;      
00196 };
00197 
00199 struct msg_error_s {
00200   msg_common_t    er_common[1];  
00201   msg_error_t    *er_next;       
00202   char const     *er_name;       
00203 };
00204 
00205 
00207 struct msg_separator_s {
00208   msg_common_t    sep_common[1]; 
00209   msg_error_t    *sep_next;      
00210   char            sep_data[4];   
00211 };
00212 
00214 struct msg_payload_s {
00215   msg_common_t    pl_common[1];     
00216   msg_payload_t  *pl_next;          
00217   char           *pl_data;          
00218   usize_t         pl_len;           
00219 };
00220 
00222 union msg_header_u {
00223   msg_common_t    sh_common[1];     
00224   struct {
00225     msg_common_t  shn_common;
00226     msg_header_t *shn_next;
00227   }               sh_header_next[1];
00228 #define sh_next   sh_header_next->shn_next
00229 #define sh_class  sh_common->h_class
00230 #define sh_succ   sh_common->h_succ
00231 #define sh_prev   sh_common->h_prev
00232 #define sh_data   sh_common->h_data
00233 #define sh_len    sh_common->h_len
00234 
00235   msg_generic_t   sh_generic[1];
00236   msg_numeric_t   sh_numeric[1];
00237   msg_list_t      sh_list[1];
00238   msg_auth_t      sh_auth[1];
00239   msg_separator_t sh_separator[1];
00240   msg_payload_t   sh_payload[1];
00241   msg_unknown_t   sh_unknown[1];
00242   msg_error_t     sh_error[1];
00243 };
00244 
00245 /* ====================================================================== */
00246 
00250 typedef enum {
00251   msg_kind_single,              
00252   msg_kind_append,              
00253   msg_kind_list,                
00255   msg_kind_apndlist,            
00256   msg_kind_prepend              
00257 } msg_header_kind_t;
00258 
00259 struct su_home_s;
00260 
00261 typedef issize_t msg_parse_f(struct su_home_s *, msg_header_t *, char *, isize_t);
00262 typedef issize_t msg_print_f(char buf[], isize_t bufsiz, 
00263                              msg_header_t const *, int flags);
00264 typedef char *msg_dup_f(msg_header_t *dst, msg_header_t const *src, 
00265                         char *buf, isize_t bufsiz);
00266 typedef isize_t msg_xtra_f(msg_header_t const *h, isize_t offset);
00267 
00268 typedef int msg_update_f(msg_common_t *, char const *name, isize_t namelen,
00269                          char const *value);
00270 
00278 struct msg_hclass_s
00279 {
00280   /* XXX size of header class missing. Someone has saved bits in wrong place. */
00281   int               hc_hash;    
00282   msg_parse_f      *hc_parse;   
00283   msg_print_f      *hc_print;   
00284   msg_xtra_f       *hc_dxtra;   
00285   msg_dup_f        *hc_dup_one; 
00286   msg_update_f     *hc_update;  
00287   char const       *hc_name;    
00288   short             hc_len;     
00289   char              hc_short[2];
00290   unsigned char     hc_size;    
00291   unsigned char     hc_params;  
00292   unsigned          hc_kind:3;  
00294   unsigned          hc_critical:1; 
00295   unsigned          /*pad*/:0;
00296 };
00297 
00298 #define HC_LEN_MAX SHRT_MAX
00299 
00300 SOFIA_END_DECLS
00301 
00302 #endif /* !defined MSG_TYPES_H */

Sofia-SIP 1.12.7 - Copyright (C) 2006 Nokia Corporation. All rights reserved. Licensed under the terms of the GNU Lesser General Public License.