Revert "Revert "and added files""
[bcm963xx.git] / userapps / opensource / libosip2 / src / osipparser2 / sdp_accessor.c
1 /*
2   The oSIP library implements the Session Initiation Protocol (SIP -rfc3261-)
3   Copyright (C) 2001,2002,2003  Aymeric MOIZARD jack@atosc.org
4   
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.
9   
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.
14   
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
18 */
19
20
21 #include <osipparser2/osip_const.h>
22 #include <osipparser2/osip_port.h>
23 #include <osipparser2/sdp_message.h>
24
25 #include <stdio.h>
26 #include <stdlib.h>
27
28 int
29 sdp_message_v_version_set (sdp_message_t * sdp, char *v_version)
30 {
31   if (sdp == NULL)
32     return -1;
33   sdp->v_version = v_version;
34   return 0;
35 }
36
37 char *
38 sdp_message_v_version_get (sdp_message_t * sdp)
39 {
40   if (sdp == NULL)
41     return NULL;
42   return sdp->v_version;
43 }
44
45 int
46 sdp_message_o_origin_set (sdp_message_t * sdp, char *username, char *sess_id,
47                           char *sess_version, char *nettype, char *addrtype,
48                           char *addr)
49 {
50   if (sdp == NULL)
51     return -1;
52   sdp->o_username = username;
53   sdp->o_sess_id = sess_id;
54   sdp->o_sess_version = sess_version;
55   sdp->o_nettype = nettype;
56   sdp->o_addrtype = addrtype;
57   sdp->o_addr = addr;
58   return 0;
59 }
60
61 char *
62 sdp_message_o_username_get (sdp_message_t * sdp)
63 {
64   if (sdp == NULL)
65     return NULL;
66   return sdp->o_username;
67 }
68
69 char *
70 sdp_message_o_sess_id_get (sdp_message_t * sdp)
71 {
72   if (sdp == NULL)
73     return NULL;
74   return sdp->o_sess_id;
75 }
76
77 char *
78 sdp_message_o_sess_version_get (sdp_message_t * sdp)
79 {
80   if (sdp == NULL)
81     return NULL;
82   return sdp->o_sess_version;
83 }
84
85 char *
86 sdp_message_o_nettype_get (sdp_message_t * sdp)
87 {
88   if (sdp == NULL)
89     return NULL;
90   return sdp->o_nettype;
91 }
92
93 char *
94 sdp_message_o_addrtype_get (sdp_message_t * sdp)
95 {
96   if (sdp == NULL)
97     return NULL;
98   return sdp->o_addrtype;
99 }
100
101 char *
102 sdp_message_o_addr_get (sdp_message_t * sdp)
103 {
104   if (sdp == NULL)
105     return NULL;
106   return sdp->o_addr;
107 }
108
109 int
110 sdp_message_s_name_set (sdp_message_t * sdp, char *name)
111 {
112   if (sdp == NULL)
113     return -1;
114   sdp->s_name = name;
115   return 0;
116 }
117
118 char *
119 sdp_message_s_name_get (sdp_message_t * sdp)
120 {
121   if (sdp == NULL)
122     return NULL;
123   return sdp->s_name;
124 }
125
126 int
127 sdp_message_i_info_set (sdp_message_t * sdp, int pos_media, char *info)
128 {
129   sdp_media_t *med;
130
131   if (sdp == NULL)
132     return -1;
133   if (pos_media == -1)
134     {
135       sdp->i_info = info;
136       return 0;
137     }
138   med = osip_list_get (sdp->m_medias, pos_media);
139   if (med == NULL)
140     return -1;
141   med->i_info = info;
142   return 0;
143 }
144
145 char *
146 sdp_message_i_info_get (sdp_message_t * sdp, int pos_media)
147 {
148   sdp_media_t *med;
149
150   if (sdp == NULL)
151     return NULL;
152   if (pos_media == -1)
153     {
154       return sdp->i_info;
155     }
156   med = osip_list_get (sdp->m_medias, pos_media);
157   if (med == NULL)
158     return NULL;
159   return med->i_info;
160 }
161
162 int
163 sdp_message_u_uri_set (sdp_message_t * sdp, char *uri)
164 {
165   if (sdp == NULL)
166     return -1;
167   sdp->u_uri = uri;
168   return 0;
169 }
170
171 char *
172 sdp_message_u_uri_get (sdp_message_t * sdp)
173 {
174   if (sdp == NULL)
175     return NULL;
176   return sdp->u_uri;
177 }
178
179 int
180 sdp_message_e_email_add (sdp_message_t * sdp, char *email)
181 {
182   if (sdp == NULL)
183     return -1;
184   osip_list_add (sdp->e_emails, email, -1);
185   return 0;
186 }
187
188 char *
189 sdp_message_e_email_get (sdp_message_t * sdp, int pos)
190 {
191   if (sdp == NULL)
192     return NULL;
193   if (osip_list_size (sdp->e_emails) > pos)
194     return (char *) osip_list_get (sdp->e_emails, pos);
195   return NULL;
196 }
197
198 int
199 sdp_message_p_phone_add (sdp_message_t * sdp, char *phone)
200 {
201   if (sdp == NULL)
202     return -1;
203   osip_list_add (sdp->p_phones, phone, -1);
204   return 0;
205 }
206
207 char *
208 sdp_message_p_phone_get (sdp_message_t * sdp, int pos)
209 {
210   if (sdp == NULL)
211     return NULL;
212   if (osip_list_size (sdp->p_phones) > pos)
213     return (char *) osip_list_get (sdp->p_phones, pos);
214   return NULL;
215 }
216
217 int
218 sdp_message_c_connection_add (sdp_message_t * sdp, int pos_media,
219                               char *nettype, char *addrtype,
220                               char *addr, char *addr_multicast_ttl,
221                               char *addr_multicast_int)
222 {
223   int i;
224   sdp_media_t *med;
225   sdp_connection_t *conn;
226
227   if (sdp == NULL)
228     return -1;
229   if ((pos_media != -1) && (osip_list_size (sdp->m_medias) < pos_media + 1))
230     return -1;
231   i = sdp_connection_init (&conn);
232   if (i != 0)
233     return -1;
234   conn->c_nettype = nettype;
235   conn->c_addrtype = addrtype;
236   conn->c_addr = addr;
237   conn->c_addr_multicast_ttl = addr_multicast_ttl;
238   conn->c_addr_multicast_int = addr_multicast_int;
239   if (pos_media == -1)
240     {
241       sdp->c_connection = conn;
242       return 0;
243     }
244   med = (sdp_media_t *) osip_list_get (sdp->m_medias, pos_media);
245   osip_list_add (med->c_connections, conn, -1);
246   return 0;
247 }
248
249 /* this method should be internal only... */
250 sdp_connection_t *
251 sdp_message_connection_get (sdp_message_t * sdp, int pos_media, int pos)
252 {
253   sdp_media_t *med;
254
255   if (sdp == NULL)
256     return NULL;
257   if (pos_media == -1)          /* pos is useless in this case: 1 global "c=" is allowed */
258     return sdp->c_connection;
259   med = (sdp_media_t *) osip_list_get (sdp->m_medias, pos_media);
260   if (med == NULL)
261     return NULL;
262   return (sdp_connection_t *) osip_list_get (med->c_connections, pos);
263 }
264
265 char *
266 sdp_message_c_nettype_get (sdp_message_t * sdp, int pos_media, int pos)
267 {
268   sdp_connection_t *conn = sdp_message_connection_get (sdp, pos_media, pos);
269
270   if (conn == NULL)
271     return NULL;
272   return conn->c_nettype;
273 }
274
275 char *
276 sdp_message_c_addrtype_get (sdp_message_t * sdp, int pos_media, int pos)
277 {
278   sdp_connection_t *conn = sdp_message_connection_get (sdp, pos_media, pos);
279
280   if (conn == NULL)
281     return NULL;
282   return conn->c_addrtype;
283 }
284
285 char *
286 sdp_message_c_addr_get (sdp_message_t * sdp, int pos_media, int pos)
287 {
288   sdp_connection_t *conn = sdp_message_connection_get (sdp, pos_media, pos);
289
290   if (conn == NULL)
291     return NULL;
292   return conn->c_addr;
293 }
294
295 char *
296 sdp_message_c_addr_multicast_ttl_get (sdp_message_t * sdp, int pos_media,
297                                       int pos)
298 {
299   sdp_connection_t *conn = sdp_message_connection_get (sdp, pos_media, pos);
300
301   if (conn == NULL)
302     return NULL;
303   return conn->c_addr_multicast_ttl;
304 }
305
306 char *
307 sdp_message_c_addr_multicast_int_get (sdp_message_t * sdp, int pos_media,
308                                       int pos)
309 {
310   sdp_connection_t *conn = sdp_message_connection_get (sdp, pos_media, pos);
311
312   if (conn == NULL)
313     return NULL;
314   return conn->c_addr_multicast_int;
315 }
316
317 int
318 sdp_message_b_bandwidth_add (sdp_message_t * sdp, int pos_media, char *bwtype,
319                              char *bandwidth)
320 {
321   int i;
322   sdp_media_t *med;
323   sdp_bandwidth_t *band;
324
325   if (sdp == NULL)
326     return -1;
327   if ((pos_media != -1) && (osip_list_size (sdp->m_medias) < pos_media + 1))
328     return -1;
329   i = sdp_bandwidth_init (&band);
330   if (i != 0)
331     return -1;
332   band->b_bwtype = bwtype;
333   band->b_bandwidth = bandwidth;
334   if (pos_media == -1)
335     {
336       osip_list_add (sdp->b_bandwidths, band, -1);
337       return 0;
338     }
339   med = (sdp_media_t *) osip_list_get (sdp->m_medias, pos_media);
340   osip_list_add (med->b_bandwidths, band, -1);
341   return 0;
342 }
343
344 sdp_bandwidth_t *
345 sdp_message_bandwidth_get (sdp_message_t * sdp, int pos_media, int pos)
346 {
347   sdp_media_t *med;
348
349   if (sdp == NULL)
350     return NULL;
351   if (pos_media == -1)
352     return (sdp_bandwidth_t *) osip_list_get (sdp->b_bandwidths, pos);
353   med = (sdp_media_t *) osip_list_get (sdp->m_medias, pos_media);
354   if (med == NULL)
355     return NULL;
356   return (sdp_bandwidth_t *) osip_list_get (med->b_bandwidths, pos);
357 }
358
359 char *
360 sdp_message_b_bwtype_get (sdp_message_t * sdp, int pos_media, int pos)
361 {
362   sdp_bandwidth_t *band = sdp_message_bandwidth_get (sdp, pos_media, pos);
363
364   if (band == NULL)
365     return NULL;
366   return band->b_bwtype;
367 }
368
369 char *
370 sdp_message_b_bandwidth_get (sdp_message_t * sdp, int pos_media, int pos)
371 {
372   sdp_bandwidth_t *band = sdp_message_bandwidth_get (sdp, pos_media, pos);
373
374   if (band == NULL)
375     return NULL;
376   return band->b_bandwidth;
377 }
378
379 int
380 sdp_message_t_time_descr_add (sdp_message_t * sdp, char *start, char *stop)
381 {
382   int i;
383   sdp_time_descr_t *td;
384
385   if (sdp == NULL)
386     return -1;
387   i = sdp_time_descr_init (&td);
388   if (i != 0)
389     return -1;
390   td->t_start_time = start;
391   td->t_stop_time = stop;
392   osip_list_add (sdp->t_descrs, td, -1);
393   return 0;
394 }
395
396 char *
397 sdp_message_t_start_time_get (sdp_message_t * sdp, int pos_td)
398 {
399   sdp_time_descr_t *td;
400
401   if (sdp == NULL)
402     return NULL;
403   td = (sdp_time_descr_t *) osip_list_get (sdp->t_descrs, pos_td);
404   if (td == NULL)
405     return NULL;
406   return td->t_start_time;
407 }
408
409 char *
410 sdp_message_t_stop_time_get (sdp_message_t * sdp, int pos_td)
411 {
412   sdp_time_descr_t *td;
413
414   if (sdp == NULL)
415     return NULL;
416   td = (sdp_time_descr_t *) osip_list_get (sdp->t_descrs, pos_td);
417   if (td == NULL)
418     return NULL;
419   return td->t_stop_time;
420 }
421
422 int
423 sdp_message_r_repeat_add (sdp_message_t * sdp, int pos_time_descr,
424                           char *field)
425 {
426   sdp_time_descr_t *td;
427
428   if (sdp == NULL)
429     return -1;
430   td = (sdp_time_descr_t *) osip_list_get (sdp->t_descrs, pos_time_descr);
431   if (td == NULL)
432     return -1;
433   osip_list_add (td->r_repeats, field, -1);
434   return 0;
435 }
436
437 char *
438 sdp_message_r_repeat_get (sdp_message_t * sdp, int pos_time_descr,
439                           int pos_repeat)
440 {
441   sdp_time_descr_t *td;
442
443   if (sdp == NULL)
444     return NULL;
445   td = (sdp_time_descr_t *) osip_list_get (sdp->t_descrs, pos_time_descr);
446   if (td == NULL)
447     return NULL;
448   return (char *) osip_list_get (td->r_repeats, pos_repeat);
449 }
450
451 int
452 sdp_message_z_adjustments_set (sdp_message_t * sdp, char *field)
453 {
454   if (sdp == NULL)
455     return -1;
456   sdp->z_adjustments = field;
457   return 0;
458 }
459
460 char *
461 sdp_message_z_adjustments_get (sdp_message_t * sdp)
462 {
463   if (sdp == NULL)
464     return NULL;
465   return sdp->z_adjustments;
466 }
467
468 int
469 sdp_message_k_key_set (sdp_message_t * sdp, int pos_media, char *keytype,
470                        char *keydata)
471 {
472   sdp_key_t *key;
473   sdp_media_t *med;
474
475   if (sdp == NULL)
476     return -1;
477   if ((pos_media != -1) && (osip_list_size (sdp->m_medias) < pos_media + 1))
478     return -1;
479   sdp_key_init (&key);
480   key->k_keytype = keytype;
481   key->k_keydata = keydata;
482   if (pos_media == -1)
483     {
484       sdp->k_key = key;
485       return 0;
486     }
487   med = (sdp_media_t *) osip_list_get (sdp->m_medias, pos_media);
488   med->k_key = key;
489   return 0;
490 }
491
492 char *
493 sdp_message_k_keytype_get (sdp_message_t * sdp, int pos_media)
494 {
495   sdp_media_t *med;
496
497   if (sdp == NULL)
498     return NULL;
499   if (pos_media == -1)
500     {
501       if (sdp->k_key == NULL)
502         return NULL;
503       return sdp->k_key->k_keytype;
504     }
505   if ((pos_media != -1) && (osip_list_size (sdp->m_medias) < pos_media + 1))
506     return NULL;
507   med = (sdp_media_t *) osip_list_get (sdp->m_medias, pos_media);
508   if (med->k_key == NULL)
509     return NULL;
510   return med->k_key->k_keytype;
511 }
512
513 char *
514 sdp_message_k_keydata_get (sdp_message_t * sdp, int pos_media)
515 {
516   sdp_media_t *med;
517
518   if (sdp == NULL)
519     return NULL;
520   if (pos_media == -1)
521     {
522       if (sdp->k_key == NULL)
523         return NULL;
524       return sdp->k_key->k_keydata;
525     }
526   if ((pos_media != -1) && (osip_list_size (sdp->m_medias) < pos_media + 1))
527     return NULL;
528   med = (sdp_media_t *) osip_list_get (sdp->m_medias, pos_media);
529   if (med->k_key == NULL)
530     return NULL;
531   return med->k_key->k_keydata;
532 }
533
534 int
535 sdp_message_a_attribute_add (sdp_message_t * sdp, int pos_media,
536                              char *att_field, char *att_value)
537 {
538   int i;
539   sdp_media_t *med;
540   sdp_attribute_t *attr;
541
542   if (sdp == NULL)
543     return -1;
544   if ((pos_media != -1) && (osip_list_size (sdp->m_medias) < pos_media + 1))
545     return -1;
546   i = sdp_attribute_init (&attr);
547   if (i != 0)
548     return -1;
549   attr->a_att_field = att_field;
550   attr->a_att_value = att_value;
551   if (pos_media == -1)
552     {
553       osip_list_add (sdp->a_attributes, attr, -1);
554       return 0;
555     }
556   med = (sdp_media_t *) osip_list_get (sdp->m_medias, pos_media);
557   osip_list_add (med->a_attributes, attr, -1);
558   return 0;
559 }
560
561 int
562 sdp_message_a_attribute_del (sdp_message_t * sdp, int pos_media, char *att_field)
563 {
564   int i;
565   sdp_media_t *med;
566   sdp_attribute_t* attr;
567   
568   if (sdp == NULL)
569     return -1;
570   if ((pos_media != -1) && (osip_list_size (sdp->m_medias) < pos_media + 1))
571     return -1;
572   if (pos_media==-1)
573     {
574       for (i=0;i<osip_list_size(sdp->a_attributes);)
575         {
576           attr = osip_list_get(sdp->a_attributes,i);
577           if (strcmp(attr->a_att_field,att_field)==0)
578             {
579               osip_list_remove(sdp->a_attributes,i);
580               sdp_attribute_free(attr);
581             }
582           else
583             i++;
584         }
585       return 0;
586     }
587   med = (sdp_media_t *) osip_list_get (sdp->m_medias, pos_media);
588   if (med == NULL)
589     return -1;
590   for (i=0;i<osip_list_size(med->a_attributes);)
591     {
592       attr = osip_list_get(med->a_attributes,i);
593       if (strcmp(attr->a_att_field,att_field)==0)
594         {
595           osip_list_remove(med->a_attributes,i);
596           sdp_attribute_free(attr);
597         }
598       else
599         i++;
600     }
601   return 0;
602 }
603  
604
605 sdp_attribute_t *
606 sdp_message_attribute_get (sdp_message_t * sdp, int pos_media, int pos)
607 {
608   sdp_media_t *med;
609
610   if (sdp == NULL)
611     return NULL;
612   if (pos_media == -1)
613     return (sdp_attribute_t *) osip_list_get (sdp->a_attributes, pos);
614   med = (sdp_media_t *) osip_list_get (sdp->m_medias, pos_media);
615   if (med == NULL)
616     return NULL;
617   return (sdp_attribute_t *) osip_list_get (med->a_attributes, pos);
618 }
619
620 char *
621 sdp_message_a_att_field_get (sdp_message_t * sdp, int pos_media, int pos)
622 {
623   sdp_attribute_t *attr = sdp_message_attribute_get (sdp, pos_media, pos);
624
625   if (attr == NULL)
626     return NULL;
627   return attr->a_att_field;
628 }
629
630 char *
631 sdp_message_a_att_value_get (sdp_message_t * sdp, int pos_media, int pos)
632 {
633   sdp_attribute_t *attr = sdp_message_attribute_get (sdp, pos_media, pos);
634
635   if (attr == NULL)
636     return NULL;
637   return attr->a_att_value;
638 }
639
640 int
641 sdp_message_endof_media (sdp_message_t * sdp, int i)
642 {
643   if (sdp == NULL)
644     return -1;
645   if (i == -1)
646     return 0;
647   if (!osip_list_eol (sdp->m_medias, i))
648     return 0;                   /* not end of list */
649   return -1;                    /* end of list */
650 }
651
652 int
653 sdp_message_m_media_add (sdp_message_t * sdp, char *media,
654                          char *port, char *number_of_port, char *proto)
655 {
656   int i;
657   sdp_media_t *med;
658
659   i = sdp_media_init (&med);
660   if (i != 0)
661     return -1;
662   med->m_media = media;
663   med->m_port = port;
664   med->m_number_of_port = number_of_port;
665   med->m_proto = proto;
666   osip_list_add (sdp->m_medias, med, -1);
667   return 0;
668 }
669
670 char *
671 sdp_message_m_media_get (sdp_message_t * sdp, int pos_media)
672 {
673   sdp_media_t *med = osip_list_get (sdp->m_medias, pos_media);
674
675   if (med == NULL)
676     return NULL;
677   return med->m_media;
678 }
679
680 char *
681 sdp_message_m_port_get (sdp_message_t * sdp, int pos_media)
682 {
683   sdp_media_t *med = osip_list_get (sdp->m_medias, pos_media);
684
685   if (med == NULL)
686     return NULL;
687   return med->m_port;
688 }
689
690 char *
691 sdp_message_m_number_of_port_get (sdp_message_t * sdp, int pos_media)
692 {
693   sdp_media_t *med = osip_list_get (sdp->m_medias, pos_media);
694
695   if (med == NULL)
696     return NULL;
697   return med->m_number_of_port;
698 }
699
700 char *
701 sdp_message_m_proto_get (sdp_message_t * sdp, int pos_media)
702 {
703   sdp_media_t *med = osip_list_get (sdp->m_medias, pos_media);
704
705   if (med == NULL)
706     return NULL;
707   return med->m_proto;
708 }
709
710 int
711 sdp_message_m_payload_add (sdp_message_t * sdp, int pos_media, char *payload)
712 {
713   sdp_media_t *med = osip_list_get (sdp->m_medias, pos_media);
714
715   if (med == NULL)
716     return -1;
717   osip_list_add (med->m_payloads, payload, -1);
718   return 0;
719 }
720
721 char *
722 sdp_message_m_payload_get (sdp_message_t * sdp, int pos_media, int pos)
723 {
724   sdp_media_t *med = osip_list_get (sdp->m_medias, pos_media);
725
726   if (med == NULL)
727     return NULL;
728   return (char *) osip_list_get (med->m_payloads, pos);
729 }