Changeset 2858 for pjproject/trunk/pjsip/src/pjsip-ua/sip_inv.c
- Timestamp:
- Aug 11, 2009 12:42:38 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjsip/src/pjsip-ua/sip_inv.c
r2856 r2858 20 20 #include <pjsip-ua/sip_inv.h> 21 21 #include <pjsip-ua/sip_100rel.h> 22 #include <pjsip-ua/sip_timer.h> 22 23 #include <pjsip/sip_module.h> 23 24 #include <pjsip/sip_endpoint.h> … … 232 233 } 233 234 pjsip_100rel_end_session(inv); 235 pjsip_timer_end_session(inv); 234 236 pjsip_dlg_dec_session(inv->dlg, &mod_inv.mod); 235 237 } … … 482 484 pjsip_inv_session *inv; 483 485 pjsip_msg *msg = rdata->msg_info.msg; 486 pj_status_t status; 484 487 485 488 dlg = pjsip_rdata_get_dlg(rdata); … … 507 510 return PJ_TRUE; 508 511 512 } 513 514 /* Pass response to timer session module */ 515 status = pjsip_timer_process_resp(inv, rdata); 516 if (status != PJ_SUCCESS) { 517 pjsip_event e; 518 pjsip_tx_data *tdata; 519 520 PJSIP_EVENT_INIT_RX_MSG(e, rdata); 521 inv_send_ack(inv, &e); 522 523 status = pjsip_inv_end_session(inv, PJSIP_ERRNO_TO_SIP_STATUS(status), 524 NULL, &tdata); 525 if (tdata && status == PJ_SUCCESS) 526 pjsip_inv_send_msg(inv, tdata); 527 528 return PJ_TRUE; 509 529 } 510 530 … … 635 655 if (options & PJSIP_INV_REQUIRE_100REL) 636 656 options |= PJSIP_INV_SUPPORT_100REL; 637 638 657 if (options & PJSIP_INV_REQUIRE_TIMER) 639 658 options |= PJSIP_INV_SUPPORT_TIMER; … … 717 736 if (*options & PJSIP_INV_REQUIRE_100REL) 718 737 *options |= PJSIP_INV_SUPPORT_100REL; 719 720 738 if (*options & PJSIP_INV_REQUIRE_TIMER) 721 739 *options |= PJSIP_INV_SUPPORT_TIMER; … … 868 886 if (sup_hdr) { 869 887 unsigned i; 870 pj_str_t STR_100REL = { "100rel", 6};871 pj_str_t STR_TIMER = { "timer", 5};888 const pj_str_t STR_100REL = { "100rel", 6}; 889 const pj_str_t STR_TIMER = { "timer", 5}; 872 890 873 891 for (i=0; i<sup_hdr->count; ++i) { 874 892 if (pj_stricmp(&sup_hdr->values[i], &STR_100REL)==0) 875 893 rem_option |= PJSIP_INV_SUPPORT_100REL; 876 elseif (pj_stricmp(&sup_hdr->values[i], &STR_TIMER)==0)894 if (pj_stricmp(&sup_hdr->values[i], &STR_TIMER)==0) 877 895 rem_option |= PJSIP_INV_SUPPORT_TIMER; 878 896 } … … 885 903 unsigned i; 886 904 const pj_str_t STR_100REL = { "100rel", 6}; 905 const pj_str_t STR_REPLACES = { "replaces", 8 }; 887 906 const pj_str_t STR_TIMER = { "timer", 5 }; 888 const pj_str_t STR_REPLACES = { "replaces", 8 };889 907 unsigned unsupp_cnt = 0; 890 908 pj_str_t unsupp_tags[PJSIP_GENERIC_ARRAY_MAX_COUNT]; … … 896 914 rem_option |= PJSIP_INV_REQUIRE_100REL; 897 915 898 } else if ((*options & & PJSIP_INV_SUPPORT_TIMER) &&899 916 } else if ((*options & PJSIP_INV_SUPPORT_TIMER) && 917 pj_stricmp(&req_hdr->values[i], &STR_TIMER)==0) 900 918 { 901 919 rem_option |= PJSIP_INV_REQUIRE_TIMER; … … 957 975 if ( ((*options & PJSIP_INV_REQUIRE_100REL)!=0 && 958 976 (rem_option & PJSIP_INV_SUPPORT_100REL)==0) || 959 ((*options & PJSIP_INV_REQUIRE_ TIMER)!=0 &&960 (rem_option & PJSIP_INV_SUPPORT_ TIMER)==0))977 ((*options & PJSIP_INV_REQUIRE_100REL)!=0 && 978 (rem_option & PJSIP_INV_SUPPORT_100REL)==0)) 961 979 { 962 980 code = PJSIP_SC_EXTENSION_REQUIRED; … … 972 990 if (*options & PJSIP_INV_REQUIRE_100REL) 973 991 req_hdr->values[req_hdr->count++] = pj_str("100rel"); 974 975 992 if (*options & PJSIP_INV_REQUIRE_TIMER) 976 993 req_hdr->values[req_hdr->count++] = pj_str("timer"); … … 1098 1115 if (options & PJSIP_INV_REQUIRE_100REL) 1099 1116 options |= PJSIP_INV_SUPPORT_100REL; 1100 1101 1117 if (options & PJSIP_INV_REQUIRE_TIMER) 1102 1118 options |= PJSIP_INV_SUPPORT_TIMER; … … 1170 1186 /* Create 100rel handler */ 1171 1187 if (inv->options & PJSIP_INV_REQUIRE_100REL) { 1172 1188 pjsip_100rel_attach(inv); 1173 1189 } 1174 1190 … … 1395 1411 1396 1412 /* Add Require header. */ 1397 if (inv->options & PJSIP_INV_REQUIRE_100REL) { 1398 const pj_str_t HREQ = { "Require", 7 }; 1399 const pj_str_t tag_100rel = { "100rel", 6 }; 1400 pjsip_generic_string_hdr *hreq; 1401 1402 hreq = pjsip_generic_string_hdr_create(tdata->pool, &HREQ, 1403 &tag_100rel); 1404 pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr*) hreq); 1405 } 1413 if ((inv->options & PJSIP_INV_REQUIRE_100REL) || 1414 (inv->options & PJSIP_INV_REQUIRE_TIMER)) 1415 { 1416 pjsip_require_hdr *hreq; 1417 1418 hreq = pjsip_require_hdr_create(tdata->pool); 1419 1420 if (inv->options & PJSIP_INV_REQUIRE_100REL) 1421 hreq->values[hreq->count++] = pj_str("100rel"); 1422 if (inv->options & PJSIP_INV_REQUIRE_TIMER) 1423 hreq->values[hreq->count++] = pj_str("timer"); 1424 1425 pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr*) hreq); 1426 } 1427 1428 status = pjsip_timer_update_req(inv, tdata); 1429 if (status != PJ_SUCCESS) 1430 goto on_return; 1406 1431 1407 1432 /* Done. */ … … 1746 1771 goto on_return; 1747 1772 1773 /* Invoke Session Timers module */ 1774 status = pjsip_timer_process_req(inv, rdata); 1775 if (status != PJ_SUCCESS) { 1776 pj_status_t status2; 1777 1778 status2 = pjsip_dlg_modify_response(inv->dlg, tdata, 1779 PJSIP_ERRNO_TO_SIP_STATUS(status), 1780 NULL); 1781 if (status2 != PJ_SUCCESS) { 1782 pjsip_tx_data_dec_ref(tdata); 1783 goto on_return; 1784 } 1785 status2 = pjsip_timer_update_resp(inv, tdata); 1786 if (status2 == PJ_SUCCESS) 1787 *p_tdata = tdata; 1788 else 1789 pjsip_tx_data_dec_ref(tdata); 1790 1791 goto on_return; 1792 } 1793 1748 1794 /* Process SDP in answer */ 1749 1795 status = process_answer(inv, st_code, tdata, sdp); … … 1758 1804 PJ_LOG(5,(inv->dlg->obj_name, "Initial answer %s", 1759 1805 pjsip_tx_data_get_info(inv->last_answer))); 1806 1807 /* Invoke Session Timers */ 1808 pjsip_timer_update_resp(inv, tdata); 1760 1809 1761 1810 *p_tdata = tdata; … … 1809 1858 } 1810 1859 1860 /* Invoke Session Timers */ 1861 pjsip_timer_update_resp(inv, last_res); 1811 1862 1812 1863 *p_tdata = last_res; … … 1913 1964 case PJSIP_INV_STATE_CONNECTING: 1914 1965 case PJSIP_INV_STATE_CONFIRMED: 1966 /* End Session Timer */ 1967 pjsip_timer_end_session(inv); 1968 1915 1969 /* For established dialog, send BYE */ 1916 1970 status = pjsip_dlg_create_request(inv->dlg, pjsip_get_bye_method(), … … 2300 2354 /* Unlock dialog. */ 2301 2355 pjsip_dlg_dec_lock(inv->dlg); 2356 2357 status = pjsip_timer_update_req(inv, tdata); 2358 if (status != PJ_SUCCESS) 2359 goto on_error; 2302 2360 2303 2361 *p_tdata = tdata; … … 2582 2640 pjsip_tx_data *tdata = NULL; 2583 2641 2642 /* Invoke Session Timers module */ 2643 status = pjsip_timer_process_req(inv, rdata); 2644 if (status != PJ_SUCCESS) { 2645 status = pjsip_dlg_create_response(inv->dlg, rdata, 2646 PJSIP_ERRNO_TO_SIP_STATUS(status), 2647 NULL, &tdata); 2648 goto on_return; 2649 } 2650 2584 2651 neg_state = pjmedia_sdp_neg_get_state(inv->neg); 2585 2652 … … 2634 2701 } 2635 2702 } 2703 2704 on_return: 2705 /* Invoke Session Timers */ 2706 if (status == PJ_SUCCESS) 2707 status = pjsip_timer_update_resp(inv, tdata); 2636 2708 2637 2709 if (status != PJ_SUCCESS) { … … 3610 3682 inv->invite_tsx = tsx; 3611 3683 3684 /* Process session timers headers in the re-INVITE */ 3685 status = pjsip_timer_process_req(inv, rdata); 3686 if (status != PJ_SUCCESS) { 3687 status = pjsip_dlg_create_response(inv->dlg, rdata, 3688 PJSIP_ERRNO_TO_SIP_STATUS(status), 3689 NULL, &tdata); 3690 if (status != PJ_SUCCESS) 3691 return; 3692 3693 pjsip_timer_update_resp(inv, tdata); 3694 status = pjsip_dlg_send_response(dlg, tsx, tdata); 3695 return; 3696 } 3697 3612 3698 /* Process SDP in incoming message. */ 3613 3699 status = inv_check_sdp_in_incoming_msg(inv, tsx, rdata); … … 3717 3803 } 3718 3804 3805 /* Invoke Session Timers */ 3806 pjsip_timer_update_resp(inv, tdata); 3807 3719 3808 /* Send 2xx regardless of the status of negotiation */ 3720 3809 status = pjsip_inv_send_msg(inv, tdata);
Note: See TracChangeset
for help on using the changeset viewer.