Changeset 223 for pjproject/trunk/pjsip/src/pjsip-ua/sip_inv.c
- Timestamp:
- Feb 23, 2006 1:49:28 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjsip/src/pjsip-ua/sip_inv.c
r220 r223 880 880 PJ_EINVALIDOP); 881 881 882 /* Lock dialog. */ 883 pjsip_dlg_inc_lock(inv->dlg); 884 882 885 /* Create the INVITE request. */ 883 886 status = pjsip_dlg_create_request(inv->dlg, &pjsip_invite_method, -1, 884 887 &tdata); 885 888 if (status != PJ_SUCCESS) 886 return status; 889 goto on_return; 890 887 891 888 892 /* If this is the first INVITE, then copy the headers from inv_hdr. … … 921 925 status = pjmedia_sdp_neg_get_neg_local(inv->neg, &offer); 922 926 if (status != PJ_SUCCESS) 923 return status;927 goto on_return; 924 928 925 929 tdata->msg->body = create_sdp_body(tdata->pool, offer); … … 946 950 *p_tdata = tdata; 947 951 948 return PJ_SUCCESS; 952 953 on_return: 954 pjsip_dlg_dec_lock(inv->dlg); 955 return status; 949 956 } 950 957 … … 1105 1112 static pj_status_t process_answer( pjsip_inv_session *inv, 1106 1113 int st_code, 1107 pjsip_tx_data *tdata ) 1114 pjsip_tx_data *tdata, 1115 const pjmedia_sdp_session *local_sdp) 1108 1116 { 1109 1117 pj_status_t status; 1110 1118 pjmedia_sdp_session *sdp = NULL; 1111 1112 /* Include SDP for 18x and 2xx response.1113 * Also if SDP negotiator is ready, start negotiation.1114 */1115 if (st_code/10 == 18 || st_code/10 == 20) {1116 1117 pjmedia_sdp_neg_state neg_state;1118 1119 neg_state = inv->neg ? pjmedia_sdp_neg_get_state(inv->neg) :1120 PJMEDIA_SDP_NEG_STATE_NULL;1121 1122 if (neg_state == PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER) {1123 1124 status = pjmedia_sdp_neg_get_neg_local(inv->neg, &sdp);1125 1126 } else if (neg_state == PJMEDIA_SDP_NEG_STATE_WAIT_NEGO &&1127 pjmedia_sdp_neg_has_local_answer(inv->neg) )1128 {1129 1130 status = inv_negotiate_sdp(inv);1131 if (status != PJ_SUCCESS)1132 return status;1133 1134 status = pjmedia_sdp_neg_get_active_local(inv->neg, &sdp);1135 }1136 1137 }1138 1139 1140 1141 /* Include SDP when it's available.1142 * Subsequent response will include this SDP.1143 */1144 if (sdp) {1145 tdata->msg->body = create_sdp_body(tdata->pool, sdp);1146 }1147 1148 /* Remove message body if this is a non-2xx final response */1149 if (st_code >= 300)1150 tdata->msg->body = NULL;1151 1152 1153 return PJ_SUCCESS;1154 }1155 1156 1157 /*1158 * Answer initial INVITE1159 * Re-INVITE will be answered automatically, and will not use this function.1160 */1161 PJ_DEF(pj_status_t) pjsip_inv_answer( pjsip_inv_session *inv,1162 int st_code,1163 const pj_str_t *st_text,1164 const pjmedia_sdp_session *local_sdp,1165 pjsip_tx_data **p_tdata )1166 {1167 pjsip_tx_data *last_res;1168 pj_status_t status;1169 1170 /* Verify arguments. */1171 PJ_ASSERT_RETURN(inv && p_tdata, PJ_EINVAL);1172 1173 /* Must have INVITE transaction. */1174 PJ_ASSERT_RETURN(inv->invite_tsx, PJ_EBUG);1175 1176 /* INVITE transaction MUST have transmitted a response (e.g. 100) */1177 PJ_ASSERT_RETURN(inv->invite_tsx->last_tx, PJ_EINVALIDOP);1178 1119 1179 1120 /* If local_sdp is specified, then we MUST NOT have answered the … … 1199 1140 if (status != PJ_SUCCESS) 1200 1141 return status; 1201 } 1202 1203 1204 1142 1143 } 1144 1145 1146 /* If SDP negotiator is ready, start negotiation. */ 1147 if (st_code/100==2 || (st_code/10==18 && st_code!=180)) { 1148 1149 pjmedia_sdp_neg_state neg_state; 1150 1151 /* Start nego when appropriate. */ 1152 neg_state = inv->neg ? pjmedia_sdp_neg_get_state(inv->neg) : 1153 PJMEDIA_SDP_NEG_STATE_NULL; 1154 1155 if (neg_state == PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER) { 1156 1157 status = pjmedia_sdp_neg_get_neg_local(inv->neg, &sdp); 1158 1159 } else if (neg_state == PJMEDIA_SDP_NEG_STATE_WAIT_NEGO && 1160 pjmedia_sdp_neg_has_local_answer(inv->neg) ) 1161 { 1162 1163 status = inv_negotiate_sdp(inv); 1164 if (status != PJ_SUCCESS) 1165 return status; 1166 1167 status = pjmedia_sdp_neg_get_active_local(inv->neg, &sdp); 1168 } 1169 } 1170 1171 /* Include SDP when it's available for 2xx and 18x (but not 180) response. 1172 * Subsequent response will include this SDP. 1173 */ 1174 if (sdp) { 1175 tdata->msg->body = create_sdp_body(tdata->pool, sdp); 1176 } 1177 1178 1179 return PJ_SUCCESS; 1180 } 1181 1182 1183 /* 1184 * Create first response to INVITE 1185 */ 1186 PJ_DEF(pj_status_t) pjsip_inv_initial_answer( pjsip_inv_session *inv, 1187 pjsip_rx_data *rdata, 1188 int st_code, 1189 const pj_str_t *st_text, 1190 const pjmedia_sdp_session *sdp, 1191 pjsip_tx_data **p_tdata) 1192 { 1193 pjsip_tx_data *tdata; 1194 pj_status_t status; 1195 1196 /* Verify arguments. */ 1197 PJ_ASSERT_RETURN(inv && p_tdata, PJ_EINVAL); 1198 1199 /* Must have INVITE transaction. */ 1200 PJ_ASSERT_RETURN(inv->invite_tsx, PJ_EBUG); 1201 1202 pjsip_dlg_inc_lock(inv->dlg); 1203 1204 /* Create response */ 1205 status = pjsip_dlg_create_response(inv->dlg, rdata, st_code, st_text, 1206 &tdata); 1207 if (status != PJ_SUCCESS) 1208 goto on_return; 1209 1210 /* Process SDP in answer */ 1211 status = process_answer(inv, st_code, tdata, sdp); 1212 if (status != PJ_SUCCESS) { 1213 pjsip_tx_data_dec_ref(tdata); 1214 goto on_return; 1215 } 1216 1217 *p_tdata = tdata; 1218 1219 on_return: 1220 pjsip_dlg_dec_lock(inv->dlg); 1221 return status; 1222 } 1223 1224 1225 /* 1226 * Answer initial INVITE 1227 * Re-INVITE will be answered automatically, and will not use this function. 1228 */ 1229 PJ_DEF(pj_status_t) pjsip_inv_answer( pjsip_inv_session *inv, 1230 int st_code, 1231 const pj_str_t *st_text, 1232 const pjmedia_sdp_session *local_sdp, 1233 pjsip_tx_data **p_tdata ) 1234 { 1235 pjsip_tx_data *last_res; 1236 pj_status_t status; 1237 1238 /* Verify arguments. */ 1239 PJ_ASSERT_RETURN(inv && p_tdata, PJ_EINVAL); 1240 1241 /* Must have INVITE transaction. */ 1242 PJ_ASSERT_RETURN(inv->invite_tsx, PJ_EBUG); 1243 1244 /* INVITE transaction MUST have transmitted a response (e.g. 100) */ 1245 PJ_ASSERT_RETURN(inv->invite_tsx->last_tx, PJ_EINVALIDOP); 1246 1247 pjsip_dlg_inc_lock(inv->dlg); 1205 1248 1206 1249 /* Modify last response. */ … … 1208 1251 status = pjsip_dlg_modify_response(inv->dlg, last_res, st_code, st_text); 1209 1252 if (status != PJ_SUCCESS) 1210 return status;1253 goto on_return; 1211 1254 1212 1255 1213 1256 /* Process SDP in answer */ 1214 status = process_answer(inv, st_code, last_res); 1215 if (status != PJ_SUCCESS) 1216 return status; 1257 status = process_answer(inv, st_code, last_res, local_sdp); 1258 if (status != PJ_SUCCESS) { 1259 pjsip_tx_data_dec_ref(last_res); 1260 goto on_return; 1261 } 1217 1262 1218 1263 1219 1264 *p_tdata = last_res; 1220 1265 1221 return PJ_SUCCESS; 1266 on_return: 1267 pjsip_dlg_dec_lock(inv->dlg); 1268 return status; 1222 1269 } 1223 1270 … … 1467 1514 * request. 1468 1515 */ 1469 PJ_ASSERT_RETURN((cseq=pjsip_msg_find_hdr(tdata->msg, PJSIP_H_CSEQ, NULL)) != NULL &&1470 (cseq->cseq == inv->invite_tsx->cseq),1516 PJ_ASSERT_RETURN((cseq=pjsip_msg_find_hdr(tdata->msg, PJSIP_H_CSEQ, NULL))!=NULL 1517 && (cseq->cseq == inv->invite_tsx->cseq), 1471 1518 PJ_EINVALIDOP); 1472 1519 … … 1625 1672 if (tsx->method.id == PJSIP_INVITE_METHOD) { 1626 1673 1674 /* Keep the initial INVITE transaction. */ 1675 if (inv->invite_tsx == NULL) 1676 inv->invite_tsx = tsx; 1677 1627 1678 if (dlg->role == PJSIP_ROLE_UAC) { 1628 1629 /* Keep the initial INVITE transaction. */1630 if (inv->invite_tsx == NULL)1631 inv->invite_tsx = tsx;1632 1679 1633 1680 switch (tsx->state) { … … 1636 1683 break; 1637 1684 default: 1638 pj_assert(!"Unexpected state");1685 inv_on_state_calling(inv, e); 1639 1686 break; 1640 1687 } … … 1651 1698 break; 1652 1699 default: 1653 pj_assert(!"Unexpected state"); 1700 inv_on_state_incoming(inv, e); 1701 break; 1654 1702 } 1655 1703 } … … 1675 1723 1676 1724 switch (tsx->state) { 1725 1726 case PJSIP_TSX_STATE_CALLING: 1727 inv_set_state(inv, PJSIP_INV_STATE_CALLING, e); 1728 break; 1677 1729 1678 1730 case PJSIP_TSX_STATE_PROCEEDING: … … 1807 1859 switch (tsx->state) { 1808 1860 1861 case PJSIP_TSX_STATE_TRYING: 1862 inv_set_state(inv, PJSIP_INV_STATE_INCOMING, e); 1863 break; 1864 1809 1865 case PJSIP_TSX_STATE_PROCEEDING: 1810 1866 /* … … 2130 2186 2131 2187 /* Process SDP in the answer */ 2132 status = process_answer(inv, 200, tdata );2188 status = process_answer(inv, 200, tdata, NULL); 2133 2189 if (status != PJ_SUCCESS) 2134 2190 return;
Note: See TracChangeset
for help on using the changeset viewer.