Ignore:
Timestamp:
Feb 23, 2006 1:49:28 PM (18 years ago)
Author:
bennylp
Message:

Added support for NULL frame in rtp stream, fixed bugs here and there in INVITE (e.g. dont send SDP on 180), and set version to 0.5.1.2

File:
1 edited

Legend:

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

    r220 r223  
    880880                     PJ_EINVALIDOP); 
    881881 
     882    /* Lock dialog. */ 
     883    pjsip_dlg_inc_lock(inv->dlg); 
     884 
    882885    /* Create the INVITE request. */ 
    883886    status = pjsip_dlg_create_request(inv->dlg, &pjsip_invite_method, -1, 
    884887                                      &tdata); 
    885888    if (status != PJ_SUCCESS) 
    886         return status; 
     889        goto on_return; 
     890 
    887891 
    888892    /* If this is the first INVITE, then copy the headers from inv_hdr. 
     
    921925        status = pjmedia_sdp_neg_get_neg_local(inv->neg, &offer); 
    922926        if (status != PJ_SUCCESS) 
    923             return status; 
     927            goto on_return; 
    924928 
    925929        tdata->msg->body = create_sdp_body(tdata->pool, offer); 
     
    946950    *p_tdata = tdata; 
    947951 
    948     return PJ_SUCCESS; 
     952 
     953on_return: 
     954    pjsip_dlg_dec_lock(inv->dlg); 
     955    return status; 
    949956} 
    950957 
     
    11051112static pj_status_t process_answer( pjsip_inv_session *inv, 
    11061113                                   int st_code, 
    1107                                    pjsip_tx_data *tdata ) 
     1114                                   pjsip_tx_data *tdata, 
     1115                                   const pjmedia_sdp_session *local_sdp) 
    11081116{ 
    11091117    pj_status_t status; 
    11101118    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 INVITE 
    1159  * 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); 
    11781119 
    11791120    /* If local_sdp is specified, then we MUST NOT have answered the 
     
    11991140        if (status != PJ_SUCCESS) 
    12001141            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 */ 
     1186PJ_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 
     1219on_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 */  
     1229PJ_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); 
    12051248 
    12061249    /* Modify last response. */ 
     
    12081251    status = pjsip_dlg_modify_response(inv->dlg, last_res, st_code, st_text); 
    12091252    if (status != PJ_SUCCESS) 
    1210         return status; 
     1253        goto on_return; 
    12111254 
    12121255 
    12131256    /* 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    } 
    12171262 
    12181263 
    12191264    *p_tdata = last_res; 
    12201265 
    1221     return PJ_SUCCESS; 
     1266on_return: 
     1267    pjsip_dlg_dec_lock(inv->dlg); 
     1268    return status; 
    12221269} 
    12231270 
     
    14671514         * request. 
    14681515         */ 
    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), 
    14711518                         PJ_EINVALIDOP); 
    14721519 
     
    16251672    if (tsx->method.id == PJSIP_INVITE_METHOD) { 
    16261673 
     1674        /* Keep the initial INVITE transaction. */ 
     1675        if (inv->invite_tsx == NULL) 
     1676            inv->invite_tsx = tsx; 
     1677 
    16271678        if (dlg->role == PJSIP_ROLE_UAC) { 
    1628  
    1629             /* Keep the initial INVITE transaction. */ 
    1630             if (inv->invite_tsx == NULL) 
    1631                 inv->invite_tsx = tsx; 
    16321679 
    16331680            switch (tsx->state) { 
     
    16361683                break; 
    16371684            default: 
    1638                 pj_assert(!"Unexpected state"); 
     1685                inv_on_state_calling(inv, e); 
    16391686                break; 
    16401687            } 
     
    16511698                break; 
    16521699            default: 
    1653                 pj_assert(!"Unexpected state"); 
     1700                inv_on_state_incoming(inv, e); 
     1701                break; 
    16541702            } 
    16551703        } 
     
    16751723 
    16761724        switch (tsx->state) { 
     1725 
     1726        case PJSIP_TSX_STATE_CALLING: 
     1727            inv_set_state(inv, PJSIP_INV_STATE_CALLING, e); 
     1728            break; 
    16771729 
    16781730        case PJSIP_TSX_STATE_PROCEEDING: 
     
    18071859        switch (tsx->state) { 
    18081860 
     1861        case PJSIP_TSX_STATE_TRYING: 
     1862            inv_set_state(inv, PJSIP_INV_STATE_INCOMING, e); 
     1863            break; 
     1864 
    18091865        case PJSIP_TSX_STATE_PROCEEDING: 
    18101866            /* 
     
    21302186 
    21312187            /* Process SDP in the answer */ 
    2132             status = process_answer(inv, 200, tdata); 
     2188            status = process_answer(inv, 200, tdata, NULL); 
    21332189            if (status != PJ_SUCCESS) 
    21342190                return; 
Note: See TracChangeset for help on using the changeset viewer.