00001 /* 00002 The oSIP library implements the Session Initiation Protocol (SIP -rfc3261-) 00003 Copyright (C) 2001,2002,2003,2004 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 osip_list_t *accepts; 00066 osip_list_t *accept_encodings; 00067 osip_list_t *accept_languages; 00068 osip_list_t *alert_infos; 00069 osip_list_t *allows; 00070 osip_list_t *authentication_infos; 00071 osip_list_t *authorizations; 00072 osip_call_id_t *call_id; 00073 osip_list_t *call_infos; 00074 osip_list_t *contacts; 00075 osip_list_t *content_dispositions; 00076 osip_list_t *content_encodings; 00077 osip_content_length_t *content_length; 00078 osip_content_type_t *content_type; 00079 osip_cseq_t *cseq; 00080 osip_list_t *error_infos; 00081 osip_from_t *from; 00082 osip_mime_version_t *mime_version; 00083 osip_list_t *proxy_authenticates; 00084 osip_list_t *proxy_authentication_infos; 00085 osip_list_t *proxy_authorizations; 00086 osip_list_t *record_routes; 00087 osip_list_t *routes; 00088 osip_to_t *to; 00089 osip_list_t *vias; 00090 osip_list_t *www_authenticates; 00092 osip_list_t *headers; 00094 osip_list_t *bodies; 00096 /* 00097 1: structure and buffer "message" are identical. 00098 2: buffer "message" is not up to date with the structure info (call osip_message_to_str to update it). 00099 */ 00100 int message_property; 00101 char *message; 00102 size_t message_length; 00104 void *application_data; 00105 }; 00106 00107 #ifndef SIP_MESSAGE_MAX_LENGTH 00108 00111 #define SIP_MESSAGE_MAX_LENGTH 4000 00112 #endif 00113 00114 #ifndef BODY_MESSAGE_MAX_SIZE 00115 00118 #define BODY_MESSAGE_MAX_SIZE 1000 00119 #endif 00120 00125 int osip_message_init (osip_message_t ** sip); 00130 void osip_message_free (osip_message_t * sip); 00137 int osip_message_parse (osip_message_t * sip, const char *buf, size_t length); 00144 int osip_message_to_str (osip_message_t * sip, char **dest, size_t *message_length); 00150 int osip_message_clone (const osip_message_t * sip, osip_message_t ** dest); 00151 00157 void osip_message_set_reason_phrase (osip_message_t * sip, char *reason); 00162 char *osip_message_get_reason_phrase (const osip_message_t * sip); 00168 void osip_message_set_status_code (osip_message_t * sip, int statuscode); 00173 int osip_message_get_status_code (const osip_message_t * sip); 00179 void osip_message_set_method (osip_message_t * sip, char *method); 00184 char *osip_message_get_method (const osip_message_t * sip); 00190 void osip_message_set_version (osip_message_t * sip, char *version); 00195 char *osip_message_get_version (const osip_message_t * sip); 00201 void osip_message_set_uri (osip_message_t * sip, osip_uri_t * uri); 00206 osip_uri_t *osip_message_get_uri (const osip_message_t * sip); 00207 00208 00209 /* 00210 * These are helpfull MACROs to test messages type. 00211 */ 00216 #define MSG_IS_RESPONSE(msg) ((msg)->status_code!=0) 00217 00221 #define MSG_IS_REQUEST(msg) ((msg)->status_code==0) 00222 00227 #define MSG_IS_INVITE(msg) (MSG_IS_REQUEST(msg) && \ 00228 0==strcmp((msg)->sip_method,"INVITE")) 00229 00233 #define MSG_IS_ACK(msg) (MSG_IS_REQUEST(msg) && \ 00234 0==strcmp((msg)->sip_method,"ACK")) 00235 00239 #define MSG_IS_REGISTER(msg) (MSG_IS_REQUEST(msg) && \ 00240 0==strcmp((msg)->sip_method,"REGISTER")) 00241 00245 #define MSG_IS_BYE(msg) (MSG_IS_REQUEST(msg) && \ 00246 0==strcmp((msg)->sip_method,"BYE")) 00247 00251 #define MSG_IS_OPTIONS(msg) (MSG_IS_REQUEST(msg) && \ 00252 0==strcmp((msg)->sip_method,"OPTIONS")) 00253 00257 #define MSG_IS_INFO(msg) (MSG_IS_REQUEST(msg) && \ 00258 0==strcmp((msg)->sip_method,"INFO")) 00259 00263 #define MSG_IS_CANCEL(msg) (MSG_IS_REQUEST(msg) && \ 00264 0==strcmp((msg)->sip_method,"CANCEL")) 00265 00269 #define MSG_IS_REFER(msg) (MSG_IS_REQUEST(msg) && \ 00270 0==strcmp((msg)->sip_method,"REFER")) 00271 00275 #define MSG_IS_NOTIFY(msg) (MSG_IS_REQUEST(msg) && \ 00276 0==strcmp((msg)->sip_method,"NOTIFY")) 00277 00282 #define MSG_IS_SUBSCRIBE(msg) (MSG_IS_REQUEST(msg) && \ 00283 0==strcmp((msg)->sip_method,"SUBSCRIBE")) 00284 00288 #define MSG_IS_MESSAGE(msg) (MSG_IS_REQUEST(msg) && \ 00289 0==strcmp((msg)->sip_method,"MESSAGE")) 00290 00294 #define MSG_IS_PRACK(msg) (MSG_IS_REQUEST(msg) && \ 00295 0==strcmp((msg)->sip_method,"PRACK")) 00296 00297 00302 #define MSG_IS_UPDATE(msg) (MSG_IS_REQUEST(msg) && \ 00303 0==strcmp((msg)->sip_method,"UPDATE")) 00304 00309 #define MSG_IS_PUBLISH(msg) (MSG_IS_REQUEST(msg) && \ 00310 0==strcmp((msg)->sip_method,"PUBLISH")) 00311 00312 00317 #define MSG_IS_STATUS_1XX(msg) ((msg)->status_code >= 100 && \ 00318 (msg)->status_code < 200) 00319 00323 #define MSG_IS_STATUS_2XX(msg) ((msg)->status_code >= 200 && \ 00324 (msg)->status_code < 300) 00325 00329 #define MSG_IS_STATUS_3XX(msg) ((msg)->status_code >= 300 && \ 00330 (msg)->status_code < 400) 00331 00335 #define MSG_IS_STATUS_4XX(msg) ((msg)->status_code >= 400 && \ 00336 (msg)->status_code < 500) 00337 00341 #define MSG_IS_STATUS_5XX(msg) ((msg)->status_code >= 500 && \ 00342 (msg)->status_code < 600) 00343 00347 #define MSG_IS_STATUS_6XX(msg) ((msg)->status_code >= 600 && \ 00348 (msg)->status_code < 700) 00349 00354 #define MSG_TEST_CODE(msg,code) (MSG_IS_RESPONSE(msg) && \ 00355 (code)==(msg)->status_code) 00356 00361 #define MSG_IS_RESPONSE_FOR(msg,requestname) (MSG_IS_RESPONSE(msg) && \ 00362 0==strcmp((msg)->cseq->method,(requestname))) 00363 00364 00369 #define osip_generic_param_init(GP) osip_uri_param_init(GP) 00370 00374 #define osip_generic_param_free(GP) osip_uri_param_free(GP) 00375 00381 #define osip_generic_param_set(GP, NAME, VALUE) osip_uri_param_set(GP, NAME, VALUE) 00382 00387 #define osip_generic_param_clone(GP,DEST) osip_uri_param_clone(GP,DEST) 00388 #ifndef DOXYGEN 00389 /* 00390 * Free a list of a generic parameter element. 00391 * @param LIST The list of generic parameter element to free. 00392 */ 00393 #define osip_generic_param_freelist(LIST) osip_uri_param_freelist(LIST) 00394 #endif 00395 00401 #define osip_generic_param_add(LIST,NAME,VALUE) osip_uri_param_add(LIST,NAME,VALUE) 00402 00408 #define osip_generic_param_get_byname(LIST,NAME,DEST) osip_uri_param_get_byname(LIST,NAME,DEST) 00409 00415 void osip_generic_param_set_name (osip_generic_param_t * generic_param, 00416 char *name); 00421 char *osip_generic_param_get_name (const osip_generic_param_t * 00422 generic_param); 00428 void osip_generic_param_set_value (osip_generic_param_t * generic_param, 00429 char *value); 00434 char *osip_generic_param_get_value (const osip_generic_param_t * 00435 generic_param); 00436 00440 #ifdef __cplusplus 00441 } 00442 #endif 00443 00444 #endif