2 The oSIP library implements the Session Initiation Protocol (SIP -rfc3261-)
3 Copyright (C) 2001,2002,2003 Aymeric MOIZARD jack@atosc.org
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include <osipparser2/osip_port.h>
24 #include <osipparser2/osip_message.h>
25 #include <osipparser2/osip_parser.h>
29 osip_message_set_call_info (osip_message_t * sip, const char *hvalue)
31 osip_call_info_t *call_info;
34 if (hvalue == NULL || hvalue[0] == '\0')
37 i = osip_call_info_init (&call_info);
40 i = osip_call_info_parse (call_info, hvalue);
41 if (i != 0) /* allocation failed */
43 osip_call_info_free (call_info);
46 sip->message_property = 2;
47 osip_list_add (sip->call_infos, call_info, -1);
52 osip_message_get_call_info (const osip_message_t * sip, int pos,
53 osip_call_info_t ** dest)
55 osip_call_info_t *call_info;
58 if (osip_list_size (sip->call_infos) <= pos)
59 return -1; /* does not exist */
60 call_info = (osip_call_info_t *) osip_list_get (sip->call_infos, pos);
66 osip_call_info_init (osip_call_info_t ** call_info)
68 *call_info = (osip_call_info_t *) osip_malloc (sizeof (osip_call_info_t));
69 if (*call_info == NULL)
72 (*call_info)->element = NULL;
74 (*call_info)->gen_params =
75 (osip_list_t *) osip_malloc (sizeof (osip_list_t));
76 if ((*call_info)->gen_params == NULL)
78 osip_free (*call_info);
82 osip_list_init ((*call_info)->gen_params);
88 osip_call_info_parse (osip_call_info_t * call_info, const char *hvalue)
90 const char *osip_call_info_params;
92 osip_call_info_params = strchr (hvalue, '<');
93 if (osip_call_info_params == NULL)
96 osip_call_info_params = strchr (osip_call_info_params + 1, '>');
97 if (osip_call_info_params == NULL)
100 osip_call_info_params = strchr (osip_call_info_params + 1, ';');
102 if (osip_call_info_params != NULL)
104 if (__osip_generic_param_parseall
105 (call_info->gen_params, osip_call_info_params) == -1)
109 osip_call_info_params = hvalue + strlen (hvalue);
111 if (osip_call_info_params - hvalue + 1 < 2)
114 (char *) osip_malloc (osip_call_info_params - hvalue + 1);
115 if (call_info->element == NULL)
117 osip_strncpy (call_info->element, hvalue, osip_call_info_params - hvalue);
118 osip_clrspace (call_info->element);
123 /* returns the call_info header as a string. */
124 /* INPUT : osip_call_info_t *call_info | call_info header. */
125 /* returns null on error. */
127 osip_call_info_to_str (const osip_call_info_t * call_info, char **dest)
135 if ((call_info == NULL) || (call_info->element == NULL))
138 len = strlen (call_info->element) + 2;
139 buf = (char *) osip_malloc (len);
144 sprintf (buf, "%s", call_info->element);
148 osip_generic_param_t *u_param;
150 while (!osip_list_eol (call_info->gen_params, pos))
153 (osip_generic_param_t *) osip_list_get (call_info->gen_params, pos);
154 if (u_param->gvalue == NULL)
155 plen = strlen (u_param->gname) + 2;
157 plen = strlen (u_param->gname) + strlen (u_param->gvalue) + 3;
159 buf = (char *) realloc (buf, len);
161 tmp = tmp + strlen (tmp);
162 if (u_param->gvalue == NULL)
163 sprintf (tmp, ";%s", u_param->gname);
165 sprintf (tmp, ";%s=%s", u_param->gname, u_param->gvalue);
174 /* deallocates a osip_call_info_t structure. */
175 /* INPUT : osip_call_info_t *call_info | call_info. */
177 osip_call_info_free (osip_call_info_t * call_info)
179 if (call_info == NULL)
181 osip_free (call_info->element);
183 osip_generic_param_freelist (call_info->gen_params);
185 call_info->element = NULL;
186 call_info->gen_params = NULL;
188 osip_free (call_info);
192 osip_call_info_clone (const osip_call_info_t * ctt, osip_call_info_t ** dest)
195 osip_call_info_t *ct;
200 if (ctt->element == NULL)
203 i = osip_call_info_init (&ct);
204 if (i != 0) /* allocation failed */
206 ct->element = osip_strdup (ctt->element);
210 osip_generic_param_t *u_param;
211 osip_generic_param_t *dest_param;
213 while (!osip_list_eol (ctt->gen_params, pos))
216 (osip_generic_param_t *) osip_list_get (ctt->gen_params, pos);
217 i = osip_generic_param_clone (u_param, &dest_param);
220 osip_call_info_free (ct);
223 osip_list_add (ct->gen_params, dest_param, -1);
233 osip_call_info_get_uri (osip_call_info_t * ae)
239 osip_call_info_set_uri (osip_call_info_t * ae, char *uri)