osip_message.h

Go to the documentation of this file.
00001 /*
00002   The oSIP library implements the Session Initiation Protocol (SIP -rfc3261-)
00003   Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Aymeric MOIZARD jack@atosc.org
00004   
00005   This library is free software; you can redistribute it and/or
00006   modify it under the terms of the GNU Lesser General Public
00007   License as published by the Free Software Foundation; either
00008   version 2.1 of the License, or (at your option) any later version.
00009   
00010   This library is distributed in the hope that it will be useful,
00011   but WITHOUT ANY WARRANTY; without even the implied warranty of
00012   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013   Lesser General Public License for more details.
00014   
00015   You should have received a copy of the GNU Lesser General Public
00016   License along with this library; if not, write to the Free Software
00017   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00018 */
00019 
00020 
00021 #ifndef _OSIP_MESSAGE_H_
00022 #define _OSIP_MESSAGE_H_
00023 
00024 #include <osipparser2/osip_const.h>
00025 #include <osipparser2/osip_headers.h>
00026 #include <osipparser2/osip_body.h>
00027 
00041 #ifdef __cplusplus
00042 extern "C"
00043 {
00044 #endif
00045 
00050   typedef struct osip_message osip_message_t;
00051 
00056   struct osip_message
00057   {
00058     char *sip_version;                
00059     osip_uri_t *req_uri;              
00060     char *sip_method;                 
00062     int status_code;                  
00063     char *reason_phrase;              
00065 #ifndef MINISIZE
00066     osip_list_t accepts;             
00067     osip_list_t accept_encodings;    
00068     osip_list_t accept_languages;    
00069     osip_list_t alert_infos;         
00070     osip_list_t allows;              
00071     osip_list_t authentication_infos;
00072 #endif
00073     osip_list_t authorizations;      
00074     osip_call_id_t *call_id;          
00075 #ifndef MINISIZE
00076     osip_list_t call_infos;          
00077 #endif
00078     osip_list_t contacts;            
00079 #ifndef MINISIZE
00080     osip_list_t content_encodings;   
00081 #endif
00082     osip_content_length_t *content_length;   
00083     osip_content_type_t *content_type;       
00084     osip_cseq_t *cseq;                
00085 #ifndef MINISIZE
00086     osip_list_t error_infos;         
00087 #endif
00088     osip_from_t *from;                
00089     osip_mime_version_t *mime_version;
00090     osip_list_t proxy_authenticates; 
00091 #ifndef MINISIZE
00092     osip_list_t proxy_authentication_infos; 
00093 #endif
00094     osip_list_t proxy_authorizations;
00095     osip_list_t record_routes;       
00096     osip_list_t routes;              
00097     osip_to_t *to;                    
00098     osip_list_t vias;                
00099     osip_list_t www_authenticates;   
00101     osip_list_t headers;             
00103     osip_list_t bodies;              
00105     /*
00106        1: structure and buffer "message" are identical.
00107        2: buffer "message" is not up to date with the structure info (call osip_message_to_str to update it).
00108      */
00109     int message_property;             
00110     char *message;                    
00111     size_t message_length;            
00113     void *application_data;           
00114   };
00115 
00116 #ifndef SIP_MESSAGE_MAX_LENGTH
00117 
00120 #define SIP_MESSAGE_MAX_LENGTH 4000
00121 #endif
00122 
00123 #ifndef BODY_MESSAGE_MAX_SIZE
00124 
00127 #define BODY_MESSAGE_MAX_SIZE  4000
00128 #endif
00129 
00134   int osip_message_init (osip_message_t ** sip);
00139   void osip_message_free (osip_message_t * sip);
00146   int osip_message_parse (osip_message_t * sip, const char *buf, size_t length);
00153   int osip_message_parse_sipfrag (osip_message_t * sip, const char *buf,
00154                                   size_t length);
00161   int osip_message_to_str (osip_message_t * sip, char **dest,
00162                            size_t * message_length);
00170   int osip_message_to_str_sipfrag (osip_message_t * sip, char **dest,
00171                                    size_t * message_length);
00177   int osip_message_clone (const osip_message_t * sip, osip_message_t ** dest);
00178 
00184   void osip_message_set_reason_phrase (osip_message_t * sip, char *reason);
00189   char *osip_message_get_reason_phrase (const osip_message_t * sip);
00195   void osip_message_set_status_code (osip_message_t * sip, int statuscode);
00200   int osip_message_get_status_code (const osip_message_t * sip);
00206   void osip_message_set_method (osip_message_t * sip, char *method);
00211   char *osip_message_get_method (const osip_message_t * sip);
00217   void osip_message_set_version (osip_message_t * sip, char *version);
00222   char *osip_message_get_version (const osip_message_t * sip);
00228   void osip_message_set_uri (osip_message_t * sip, osip_uri_t * uri);
00233   osip_uri_t *osip_message_get_uri (const osip_message_t * sip);
00234 
00235 
00236 /*
00237  *  These are helpfull MACROs to test messages type.
00238  */
00243 #define MSG_IS_RESPONSE(msg) ((msg)->status_code!=0)
00244 
00248 #define MSG_IS_REQUEST(msg)  ((msg)->status_code==0)
00249 
00254 #define MSG_IS_INVITE(msg)   (MSG_IS_REQUEST(msg) && \
00255                               0==strcmp((msg)->sip_method,"INVITE"))
00256 
00260 #define MSG_IS_ACK(msg)      (MSG_IS_REQUEST(msg) && \
00261                               0==strcmp((msg)->sip_method,"ACK"))
00262 
00266 #define MSG_IS_REGISTER(msg) (MSG_IS_REQUEST(msg) && \
00267                               0==strcmp((msg)->sip_method,"REGISTER"))
00268 
00272 #define MSG_IS_BYE(msg)      (MSG_IS_REQUEST(msg) && \
00273                               0==strcmp((msg)->sip_method,"BYE"))
00274 
00278 #define MSG_IS_OPTIONS(msg)  (MSG_IS_REQUEST(msg) && \
00279                               0==strcmp((msg)->sip_method,"OPTIONS"))
00280 
00284 #define MSG_IS_INFO(msg)     (MSG_IS_REQUEST(msg) && \
00285                               0==strcmp((msg)->sip_method,"INFO"))
00286 
00290 #define MSG_IS_CANCEL(msg)   (MSG_IS_REQUEST(msg) && \
00291                               0==strcmp((msg)->sip_method,"CANCEL"))
00292 
00296 #define MSG_IS_REFER(msg)   (MSG_IS_REQUEST(msg) && \
00297                               0==strcmp((msg)->sip_method,"REFER"))
00298 
00302 #define MSG_IS_NOTIFY(msg)   (MSG_IS_REQUEST(msg) && \
00303                               0==strcmp((msg)->sip_method,"NOTIFY"))
00304 
00309 #define MSG_IS_SUBSCRIBE(msg)  (MSG_IS_REQUEST(msg) && \
00310                               0==strcmp((msg)->sip_method,"SUBSCRIBE"))
00311 
00315 #define MSG_IS_MESSAGE(msg)  (MSG_IS_REQUEST(msg) && \
00316                               0==strcmp((msg)->sip_method,"MESSAGE"))
00317 
00321 #define MSG_IS_PRACK(msg)    (MSG_IS_REQUEST(msg) && \
00322                               0==strcmp((msg)->sip_method,"PRACK"))
00323 
00324 
00329 #define MSG_IS_UPDATE(msg)    (MSG_IS_REQUEST(msg) && \
00330                               0==strcmp((msg)->sip_method,"UPDATE"))
00331 
00336 #define MSG_IS_PUBLISH(msg)    (MSG_IS_REQUEST(msg) && \
00337                               0==strcmp((msg)->sip_method,"PUBLISH"))
00338 
00339 
00344 #define MSG_IS_STATUS_1XX(msg) ((msg)->status_code >= 100 && \
00345                                 (msg)->status_code < 200)
00346 
00350 #define MSG_IS_STATUS_2XX(msg) ((msg)->status_code >= 200 && \
00351                                 (msg)->status_code < 300)
00352 
00356 #define MSG_IS_STATUS_3XX(msg) ((msg)->status_code >= 300 && \
00357                                 (msg)->status_code < 400)
00358 
00362 #define MSG_IS_STATUS_4XX(msg) ((msg)->status_code >= 400 && \
00363                                 (msg)->status_code < 500)
00364 
00368 #define MSG_IS_STATUS_5XX(msg) ((msg)->status_code >= 500 && \
00369                                 (msg)->status_code < 600)
00370 
00374 #define MSG_IS_STATUS_6XX(msg) ((msg)->status_code >= 600 && \
00375                                 (msg)->status_code < 700)
00376 
00381 #define MSG_TEST_CODE(msg,code) (MSG_IS_RESPONSE(msg) && \
00382                                  (code)==(msg)->status_code)
00383 
00388 #define MSG_IS_RESPONSE_FOR(msg,requestname)  (MSG_IS_RESPONSE(msg) && \
00389                                  0==strcmp((msg)->cseq->method,(requestname)))
00390 
00391 
00396 #define osip_generic_param_init(GP) osip_uri_param_init(GP)
00397 
00401 #define osip_generic_param_free(GP) osip_uri_param_free(GP)
00402 
00408 #define osip_generic_param_set(GP, NAME, VALUE)  osip_uri_param_set(GP, NAME, VALUE)
00409 
00414 #define osip_generic_param_clone      osip_uri_param_clone
00415 #ifndef DOXYGEN
00416 /*
00417  * Free a list of a generic parameter element.
00418  * @param LIST The list of generic parameter element to free.
00419  */
00420 #define osip_generic_param_freelist(LIST)       osip_uri_param_freelist(LIST)
00421 #endif
00422 
00428 #define osip_generic_param_add(LIST,NAME,VALUE)        osip_uri_param_add(LIST,NAME,VALUE)
00429 
00435 #define osip_generic_param_get_byname(LIST,NAME,DEST) osip_uri_param_get_byname(LIST,NAME,DEST)
00436 
00442   void osip_generic_param_set_name (osip_generic_param_t * generic_param,
00443                                     char *name);
00448   char *osip_generic_param_get_name (const osip_generic_param_t * generic_param);
00454   void osip_generic_param_set_value (osip_generic_param_t * generic_param,
00455                                      char *value);
00460   char *osip_generic_param_get_value (const osip_generic_param_t * generic_param);
00461 
00462 
00469   int osip_message_get_knownheaderlist (osip_list_t *header_list,
00470                                         int pos,
00471                                         void **dest);
00472 
00476 #ifdef __cplusplus
00477 }
00478 #endif
00479 
00480 #endif

Generated on Wed Feb 13 01:03:29 2008 for libosip by  doxygen 1.5.4