Changeset 3777 for pjproject/trunk/pjsip/src/pjsip-ua/sip_inv.c
- Timestamp:
- Oct 3, 2011 2:04:36 AM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjsip/src/pjsip-ua/sip_inv.c
r3753 r3777 812 812 * Verify incoming INVITE request. 813 813 */ 814 PJ_DEF(pj_status_t) pjsip_inv_verify_request2(pjsip_rx_data *rdata, 814 PJ_DEF(pj_status_t) pjsip_inv_verify_request3(pjsip_rx_data *rdata, 815 pj_pool_t *tmp_pool, 815 816 unsigned *options, 816 817 const pjmedia_sdp_session *r_sdp, … … 820 821 pjsip_tx_data **p_tdata) 821 822 { 822 pjsip_msg *msg ;823 pjsip_allow_hdr *allow ;824 pjsip_supported_hdr *sup_hdr ;825 pjsip_require_hdr *req_hdr ;826 pjsip_contact_hdr *c_hdr ;823 pjsip_msg *msg = NULL; 824 pjsip_allow_hdr *allow = NULL; 825 pjsip_supported_hdr *sup_hdr = NULL; 826 pjsip_require_hdr *req_hdr = NULL; 827 pjsip_contact_hdr *c_hdr = NULL; 827 828 int code = 200; 828 829 unsigned rem_option = 0; … … 835 836 836 837 /* Verify arguments. */ 837 PJ_ASSERT_RETURN( rdata!= NULL && options != NULL, PJ_EINVAL);838 PJ_ASSERT_RETURN(tmp_pool != NULL && options != NULL, PJ_EINVAL); 838 839 839 840 /* Normalize options */ … … 845 846 *options |= PJSIP_INV_SUPPORT_ICE; 846 847 847 /* Get the message in rdata */ 848 msg = rdata->msg_info.msg; 849 850 /* Must be INVITE request. */ 851 PJ_ASSERT_RETURN(msg->type == PJSIP_REQUEST_MSG && 852 msg->line.req.method.id == PJSIP_INVITE_METHOD, 853 PJ_EINVAL); 848 if (rdata) { 849 /* Get the message in rdata */ 850 msg = rdata->msg_info.msg; 851 852 /* Must be INVITE request. */ 853 PJ_ASSERT_RETURN(msg && msg->type == PJSIP_REQUEST_MSG && 854 msg->line.req.method.id == PJSIP_INVITE_METHOD, 855 PJ_EINVAL); 856 } 854 857 855 858 /* If tdata is specified, then either dlg or endpt must be specified */ … … 863 866 864 867 /* Check the Contact header */ 865 c_hdr = (pjsip_contact_hdr*) 866 pjsip_msg_find_hdr(msg, PJSIP_H_CONTACT, NULL); 867 if (!c_hdr || !c_hdr->uri) { 868 /* Missing Contact header or Contact contains "*" */ 868 if (msg) { 869 c_hdr = (pjsip_contact_hdr*) 870 pjsip_msg_find_hdr(msg, PJSIP_H_CONTACT, NULL); 871 } 872 if (msg && (!c_hdr || !c_hdr->uri)) { 873 /* Missing Contact header or Contact contains "*" */ 869 874 pjsip_warning_hdr *w; 870 875 pj_str_t warn_text; 871 876 872 877 warn_text = pj_str("Bad/missing Contact header"); 873 w = pjsip_warning_hdr_create( rdata->tp_info.pool, 399,878 w = pjsip_warning_hdr_create(tmp_pool, 399, 874 879 pjsip_endpt_name(endpt), 875 880 &warn_text); … … 886 891 * only when the body hasn't been parsed before. 887 892 */ 888 if (r_sdp == NULL ) {893 if (r_sdp == NULL && rdata) { 889 894 sdp_info = pjsip_rdata_get_sdp_info(rdata); 890 895 } else { … … 892 897 } 893 898 894 if (r_sdp==NULL && msg ->body) {899 if (r_sdp==NULL && msg && msg->body) { 895 900 896 901 /* Check if body really contains SDP. */ … … 904 909 pjsip_accept_hdr *acc; 905 910 906 acc = pjsip_accept_hdr_create( rdata->tp_info.pool);911 acc = pjsip_accept_hdr_create(tmp_pool); 907 912 PJ_ASSERT_RETURN(acc, PJ_ENOMEM); 908 913 acc->values[acc->count++] = pj_str("application/sdp"); … … 921 926 pjsip_warning_hdr *w; 922 927 923 w = pjsip_warning_hdr_create_from_status( rdata->tp_info.pool,928 w = pjsip_warning_hdr_create_from_status(tmp_pool, 924 929 pjsip_endpt_name(endpt), 925 930 sdp_info->sdp_err); … … 946 951 /* Create SDP negotiator */ 947 952 status = pjmedia_sdp_neg_create_w_remote_offer( 948 rdata->tp_info.pool, l_sdp, r_sdp, &neg);953 tmp_pool, l_sdp, r_sdp, &neg); 949 954 PJ_ASSERT_RETURN(status == PJ_SUCCESS, status); 950 955 951 956 /* Negotiate SDP */ 952 status = pjmedia_sdp_neg_negotiate( rdata->tp_info.pool, neg, 0);957 status = pjmedia_sdp_neg_negotiate(tmp_pool, neg, 0); 953 958 if (status != PJ_SUCCESS) { 954 959 … … 962 967 /* Add Warning header. */ 963 968 w = pjsip_warning_hdr_create_from_status( 964 rdata->tp_info.pool,969 tmp_pool, 965 970 pjsip_endpt_name(endpt), status); 966 971 PJ_ASSERT_RETURN(w, PJ_ENOMEM); … … 969 974 970 975 /* Add Accept header to response */ 971 acc = pjsip_accept_hdr_create( rdata->tp_info.pool);976 acc = pjsip_accept_hdr_create(tmp_pool); 972 977 PJ_ASSERT_RETURN(acc, PJ_ENOMEM); 973 978 acc->values[acc->count++] = pj_str("application/sdp"); … … 985 990 * implicitly by sending this INVITE. 986 991 */ 987 allow = (pjsip_allow_hdr*) pjsip_msg_find_hdr(msg, PJSIP_H_ALLOW, NULL); 992 if (msg) { 993 allow = (pjsip_allow_hdr*) pjsip_msg_find_hdr(msg, PJSIP_H_ALLOW, 994 NULL); 995 } 988 996 if (allow) { 989 997 unsigned i; … … 1003 1011 1004 1012 /* Check Supported header */ 1005 sup_hdr = (pjsip_supported_hdr*) 1006 pjsip_msg_find_hdr(msg, PJSIP_H_SUPPORTED, NULL); 1013 if (msg) { 1014 sup_hdr = (pjsip_supported_hdr*) 1015 pjsip_msg_find_hdr(msg, PJSIP_H_SUPPORTED, NULL); 1016 } 1007 1017 if (sup_hdr) { 1008 1018 unsigned i; … … 1022 1032 1023 1033 /* Check Require header */ 1024 req_hdr = (pjsip_require_hdr*) 1025 pjsip_msg_find_hdr(msg, PJSIP_H_REQUIRE, NULL); 1034 if (msg) { 1035 req_hdr = (pjsip_require_hdr*) 1036 pjsip_msg_find_hdr(msg, PJSIP_H_REQUIRE, NULL); 1037 } 1026 1038 if (req_hdr) { 1027 1039 unsigned i; … … 1075 1087 1076 1088 /* Add Unsupported header. */ 1077 unsupp_hdr = pjsip_unsupported_hdr_create( rdata->tp_info.pool);1089 unsupp_hdr = pjsip_unsupported_hdr_create(tmp_pool); 1078 1090 PJ_ASSERT_RETURN(unsupp_hdr != NULL, PJ_ENOMEM); 1079 1091 … … 1090 1102 if (h) { 1091 1103 sup_hdr = (pjsip_supported_hdr*) 1092 pjsip_hdr_clone( rdata->tp_info.pool, h);1104 pjsip_hdr_clone(tmp_pool, h); 1093 1105 pj_list_push_back(&res_hdr_list, sup_hdr); 1094 1106 } … … 1102 1114 * by peer. 1103 1115 */ 1104 if ( ((*options & PJSIP_INV_REQUIRE_100REL)!=0 &&1116 if ( msg && (((*options & PJSIP_INV_REQUIRE_100REL)!=0 && 1105 1117 (rem_option & PJSIP_INV_SUPPORT_100REL)==0) || 1106 1118 ((*options & PJSIP_INV_REQUIRE_TIMER)!=0 && 1107 (rem_option & PJSIP_INV_SUPPORT_TIMER)==0)) 1119 (rem_option & PJSIP_INV_SUPPORT_TIMER)==0))) 1108 1120 { 1109 1121 code = PJSIP_SC_EXTENSION_REQUIRED; … … 1114 1126 1115 1127 /* Add Require header. */ 1116 req_hdr = pjsip_require_hdr_create( rdata->tp_info.pool);1128 req_hdr = pjsip_require_hdr_create(tmp_pool); 1117 1129 PJ_ASSERT_RETURN(req_hdr != NULL, PJ_ENOMEM); 1118 1130 … … 1130 1142 if (h) { 1131 1143 sup_hdr = (pjsip_supported_hdr*) 1132 pjsip_hdr_clone( rdata->tp_info.pool, h);1144 pjsip_hdr_clone(tmp_pool, h); 1133 1145 pj_list_push_back(&res_hdr_list, sup_hdr); 1134 1146 } … … 1158 1170 const pjsip_hdr *h; 1159 1171 1172 if (!rdata) { 1173 return PJSIP_ERRNO_FROM_SIP_STATUS(code); 1174 } 1175 1160 1176 if (dlg) { 1161 1177 status = pjsip_dlg_create_response(dlg, rdata, code, NULL, … … 1199 1215 * Verify incoming INVITE request. 1200 1216 */ 1217 PJ_DEF(pj_status_t) pjsip_inv_verify_request2(pjsip_rx_data *rdata, 1218 unsigned *options, 1219 const pjmedia_sdp_session *r_sdp, 1220 const pjmedia_sdp_session *l_sdp, 1221 pjsip_dialog *dlg, 1222 pjsip_endpoint *endpt, 1223 pjsip_tx_data **p_tdata) 1224 { 1225 return pjsip_inv_verify_request3(rdata, rdata->tp_info.pool, 1226 options, r_sdp, l_sdp, dlg, 1227 endpt, p_tdata); 1228 } 1229 1230 1231 /* 1232 * Verify incoming INVITE request. 1233 */ 1201 1234 PJ_DEF(pj_status_t) pjsip_inv_verify_request( pjsip_rx_data *rdata, 1202 1235 unsigned *options, … … 1206 1239 pjsip_tx_data **p_tdata) 1207 1240 { 1208 return pjsip_inv_verify_request2(rdata, options, NULL, l_sdp, dlg, 1241 return pjsip_inv_verify_request3(rdata, rdata->tp_info.pool, 1242 options, NULL, l_sdp, dlg, 1209 1243 endpt, p_tdata); 1210 1244 } … … 2023 2057 pjsip_dlg_dec_lock(inv->dlg); 2024 2058 pj_log_pop_indent(); 2059 return status; 2060 } 2061 2062 2063 /* 2064 * Set local SDP offer/answer. 2065 */ 2066 PJ_DEF(pj_status_t) pjsip_inv_set_local_sdp(pjsip_inv_session *inv, 2067 const pjmedia_sdp_session *sdp ) 2068 { 2069 const pjmedia_sdp_session *offer; 2070 pj_status_t status; 2071 2072 PJ_ASSERT_RETURN(inv && sdp, PJ_EINVAL); 2073 2074 /* If we have remote SDP offer, set local answer to respond to the offer, 2075 * otherwise we set/modify our local offer (and create an SDP negotiator 2076 * if we don't have one yet). 2077 */ 2078 if (inv->neg) { 2079 pjmedia_sdp_neg_state neg_state = pjmedia_sdp_neg_get_state(inv->neg); 2080 2081 if ((neg_state == PJMEDIA_SDP_NEG_STATE_REMOTE_OFFER || 2082 neg_state == PJMEDIA_SDP_NEG_STATE_WAIT_NEGO) && 2083 pjmedia_sdp_neg_get_neg_remote(inv->neg, &offer) == PJ_SUCCESS) 2084 { 2085 status = pjsip_inv_set_sdp_answer(inv, sdp); 2086 } else if (neg_state == PJMEDIA_SDP_NEG_STATE_DONE) { 2087 status = pjmedia_sdp_neg_modify_local_offer(inv->pool, 2088 inv->neg, sdp); 2089 } else 2090 return PJMEDIA_SDPNEG_EINSTATE; 2091 } else { 2092 status = pjmedia_sdp_neg_create_w_local_offer(inv->pool, 2093 sdp, &inv->neg); 2094 } 2095 2025 2096 return status; 2026 2097 }
Note: See TracChangeset
for help on using the changeset viewer.