Ignore:
Timestamp:
Feb 8, 2006 10:44:25 PM (18 years ago)
Author:
bennylp
Message:

Finished invite session UAS implementation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsip-ua/sip_inv.c

    r156 r160  
    110110 
    111111/* 
     112 * Set session state. 
     113 */ 
     114void 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/* 
    112127 * Send ACK for 2xx response. 
    113128 */ 
     
    146161{ 
    147162    pjsip_method *method; 
     163    pjsip_dialog *dlg; 
     164    pjsip_inv_session *inv; 
    148165 
    149166    /* 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) 
    151169        return PJ_FALSE; 
     170 
     171    inv = dlg->mod_data[mod_inv.mod.id]; 
    152172 
    153173    /* Report to dialog that we handle INVITE, CANCEL, BYE, ACK.  
     
    159179    if (method->id == PJSIP_INVITE_METHOD || 
    160180        method->id == PJSIP_CANCEL_METHOD || 
    161         method->id == PJSIP_ACK_METHOD || 
    162181        method->id == PJSIP_BYE_METHOD) 
    163182    { 
    164183        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); 
    165196    } 
    166197 
     
    703734    inv->pool = dlg->pool; 
    704735    inv->role = PJSIP_ROLE_UAS; 
    705     inv->state = PJSIP_INV_STATE_INCOMING; 
     736    inv->state = PJSIP_INV_STATE_NULL; 
    706737    inv->dlg = dlg; 
    707738    inv->options = options; 
     
    10671098 
    10681099 
    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  
    10821100/* 
    10831101 * Respond to incoming CANCEL request. 
     
    11641182    if (inv->state != PJSIP_INV_STATE_DISCONNECTED) 
    11651183        inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 
     1184} 
     1185 
     1186/* 
     1187 * Respond to BYE request. 
     1188 */ 
     1189static 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 
    11661230} 
    11671231 
     
    11971261            case PJSIP_TSX_STATE_TRYING: 
    11981262                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); 
    11991268                break; 
    12001269            default: 
     
    14641533 
    14651534        case PJSIP_TSX_STATE_CONFIRMED: 
     1535            if (tsx->status_code/100 == 2) 
     1536                inv_set_state(inv, PJSIP_INV_STATE_CONFIRMED, e); 
    14661537            break; 
    14671538 
     
    14961567        inv_respond_incoming_bye( inv, tsx, e->body.tsx_state.src.rdata, e ); 
    14971568 
    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 
    14991581} 
    15001582 
     
    15141596        tsx->state == PJSIP_TSX_STATE_COMPLETED) 
    15151597    { 
     1598 
    15161599        /* 
    1517          * Outgoing BYE. 
     1600         * Outgoing BYE 
    15181601         */ 
    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 
    15471606            inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 
    1548         } 
    15491607 
    15501608    } 
Note: See TracChangeset for help on using the changeset viewer.