Changeset 160 for pjproject/trunk/pjsip/src/pjsip-ua/sip_inv.c
- Timestamp:
- Feb 8, 2006 10:44:25 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjsip/src/pjsip-ua/sip_inv.c
r156 r160 110 110 111 111 /* 112 * Set session state. 113 */ 114 void inv_set_state(pjsip_inv_session *inv, pjsip_inv_state state, 115 pjsip_event *e) 116 { 117 inv->state = state; 118 if (mod_inv.cb.on_state_changed) 119 (*mod_inv.cb.on_state_changed)(inv, e); 120 121 if (inv->state == PJSIP_INV_STATE_DISCONNECTED) 122 pjsip_dlg_dec_session(inv->dlg); 123 } 124 125 126 /* 112 127 * Send ACK for 2xx response. 113 128 */ … … 146 161 { 147 162 pjsip_method *method; 163 pjsip_dialog *dlg; 164 pjsip_inv_session *inv; 148 165 149 166 /* Only wants to receive request from a dialog. */ 150 if (pjsip_rdata_get_dlg(rdata) == NULL) 167 dlg = pjsip_rdata_get_dlg(rdata); 168 if (dlg == NULL) 151 169 return PJ_FALSE; 170 171 inv = dlg->mod_data[mod_inv.mod.id]; 152 172 153 173 /* Report to dialog that we handle INVITE, CANCEL, BYE, ACK. … … 159 179 if (method->id == PJSIP_INVITE_METHOD || 160 180 method->id == PJSIP_CANCEL_METHOD || 161 method->id == PJSIP_ACK_METHOD ||162 181 method->id == PJSIP_BYE_METHOD) 163 182 { 164 183 return PJ_TRUE; 184 } 185 186 /* On receipt ACK request, when state is CONNECTING, 187 * move state to CONFIRMED. 188 */ 189 if (method->id == PJSIP_ACK_METHOD && inv && 190 inv->state == PJSIP_INV_STATE_CONFIRMED) 191 { 192 pjsip_event event; 193 194 PJSIP_EVENT_INIT_RX_MSG(event, rdata); 195 inv_set_state(inv, PJSIP_INV_STATE_CONFIRMED, &event); 165 196 } 166 197 … … 703 734 inv->pool = dlg->pool; 704 735 inv->role = PJSIP_ROLE_UAS; 705 inv->state = PJSIP_INV_STATE_ INCOMING;736 inv->state = PJSIP_INV_STATE_NULL; 706 737 inv->dlg = dlg; 707 738 inv->options = options; … … 1067 1098 1068 1099 1069 void inv_set_state(pjsip_inv_session *inv, pjsip_inv_state state,1070 pjsip_event *e)1071 {1072 inv->state = state;1073 if (mod_inv.cb.on_state_changed)1074 (*mod_inv.cb.on_state_changed)(inv, e);1075 1076 if (inv->state == PJSIP_INV_STATE_DISCONNECTED)1077 pjsip_dlg_dec_session(inv->dlg);1078 }1079 1080 1081 1082 1100 /* 1083 1101 * Respond to incoming CANCEL request. … … 1164 1182 if (inv->state != PJSIP_INV_STATE_DISCONNECTED) 1165 1183 inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 1184 } 1185 1186 /* 1187 * Respond to BYE request. 1188 */ 1189 static void inv_handle_bye_response( pjsip_inv_session *inv, 1190 pjsip_transaction *tsx, 1191 pjsip_rx_data *rdata, 1192 pjsip_event *e ) 1193 { 1194 pj_status_t status; 1195 1196 if (e->body.tsx_state.type != PJSIP_EVENT_RX_MSG) { 1197 inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 1198 return; 1199 } 1200 1201 /* Handle 401/407 challenge. */ 1202 if (tsx->status_code == 401 || tsx->status_code == 407) { 1203 1204 pjsip_tx_data *tdata; 1205 1206 status = pjsip_auth_clt_reinit_req( &inv->dlg->auth_sess, 1207 rdata, 1208 tsx->last_tx, 1209 &tdata); 1210 1211 if (status != PJ_SUCCESS) { 1212 1213 /* Does not have proper credentials. 1214 * End the session anyway. 1215 */ 1216 inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 1217 1218 } else { 1219 /* Re-send BYE. */ 1220 status = pjsip_inv_send_msg(inv, tdata, NULL ); 1221 } 1222 1223 } else { 1224 1225 /* End the session. */ 1226 1227 inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 1228 } 1229 1166 1230 } 1167 1231 … … 1197 1261 case PJSIP_TSX_STATE_TRYING: 1198 1262 inv_set_state(inv, PJSIP_INV_STATE_INCOMING, e); 1263 break; 1264 case PJSIP_TSX_STATE_PROCEEDING: 1265 inv_set_state(inv, PJSIP_INV_STATE_INCOMING, e); 1266 if (tsx->status_code > 100) 1267 inv_set_state(inv, PJSIP_INV_STATE_EARLY, e); 1199 1268 break; 1200 1269 default: … … 1464 1533 1465 1534 case PJSIP_TSX_STATE_CONFIRMED: 1535 if (tsx->status_code/100 == 2) 1536 inv_set_state(inv, PJSIP_INV_STATE_CONFIRMED, e); 1466 1537 break; 1467 1538 … … 1496 1567 inv_respond_incoming_bye( inv, tsx, e->body.tsx_state.src.rdata, e ); 1497 1568 1498 } 1569 } else if (tsx->method.id == PJSIP_BYE_METHOD && 1570 tsx->role == PJSIP_ROLE_UAC && 1571 tsx->state == PJSIP_TSX_STATE_COMPLETED) 1572 { 1573 1574 /* 1575 * Outgoing BYE 1576 */ 1577 inv_handle_bye_response( inv, tsx, e->body.tsx_state.src.rdata, e); 1578 1579 } 1580 1499 1581 } 1500 1582 … … 1514 1596 tsx->state == PJSIP_TSX_STATE_COMPLETED) 1515 1597 { 1598 1516 1599 /* 1517 * Outgoing BYE .1600 * Outgoing BYE 1518 1601 */ 1519 pj_status_t status; 1520 1521 /* Handle 401/407 challenge. */ 1522 if (tsx->status_code == 401 || tsx->status_code == 407) { 1523 1524 pjsip_tx_data *tdata; 1525 1526 status = pjsip_auth_clt_reinit_req( &inv->dlg->auth_sess, 1527 e->body.tsx_state.src.rdata, 1528 tsx->last_tx, 1529 &tdata); 1530 1531 if (status != PJ_SUCCESS) { 1532 1533 /* Does not have proper credentials. 1534 * End the session anyway. 1535 */ 1536 inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 1537 1538 } else { 1539 /* Re-send BYE. */ 1540 status = pjsip_inv_send_msg(inv, tdata, NULL ); 1541 } 1542 1543 } else { 1544 1545 /* End the session. */ 1546 1602 1603 if (e->body.tsx_state.type == PJSIP_EVENT_RX_MSG) 1604 inv_handle_bye_response( inv, tsx, e->body.tsx_state.src.rdata, e); 1605 else 1547 1606 inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 1548 }1549 1607 1550 1608 }
Note: See TracChangeset
for help on using the changeset viewer.