/libosip2-3.6.0/src/osipparser2/sdp_accessor.c

# · C · 743 lines · 628 code · 96 blank · 19 comment · 230 complexity · 9098333917ca133e23babc9a8a974d41 MD5 · raw file

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