Ignore:
Timestamp:
Oct 3, 2011 2:04:36 AM (9 years ago)
Author:
ming
Message:

Closed #1266:
Handle incoming calls when media transport is created asynchronously.

File:
1 edited

Legend:

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

    r3753 r3777  
    812812 * Verify incoming INVITE request. 
    813813 */ 
    814 PJ_DEF(pj_status_t) pjsip_inv_verify_request2(pjsip_rx_data *rdata, 
     814PJ_DEF(pj_status_t) pjsip_inv_verify_request3(pjsip_rx_data *rdata, 
     815                                              pj_pool_t *tmp_pool, 
    815816                                              unsigned *options, 
    816817                                              const pjmedia_sdp_session *r_sdp, 
     
    820821                                              pjsip_tx_data **p_tdata) 
    821822{ 
    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; 
    827828    int code = 200; 
    828829    unsigned rem_option = 0; 
     
    835836 
    836837    /* Verify arguments. */ 
    837     PJ_ASSERT_RETURN(rdata != NULL && options != NULL, PJ_EINVAL); 
     838    PJ_ASSERT_RETURN(tmp_pool != NULL && options != NULL, PJ_EINVAL); 
    838839 
    839840    /* Normalize options */ 
     
    845846        *options |= PJSIP_INV_SUPPORT_ICE; 
    846847 
    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    } 
    854857 
    855858    /* If tdata is specified, then either dlg or endpt must be specified */ 
     
    863866 
    864867    /* 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 "*" */ 
    869874        pjsip_warning_hdr *w; 
    870875        pj_str_t warn_text; 
    871876 
    872877        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, 
    874879                                     pjsip_endpt_name(endpt), 
    875880                                     &warn_text); 
     
    886891     * only when the body hasn't been parsed before. 
    887892     */ 
    888     if (r_sdp == NULL) { 
     893    if (r_sdp == NULL && rdata) { 
    889894        sdp_info = pjsip_rdata_get_sdp_info(rdata); 
    890895    } else { 
     
    892897    } 
    893898 
    894     if (r_sdp==NULL && msg->body) { 
     899    if (r_sdp==NULL && msg && msg->body) { 
    895900 
    896901        /* Check if body really contains SDP. */ 
     
    904909                pjsip_accept_hdr *acc; 
    905910 
    906                 acc = pjsip_accept_hdr_create(rdata->tp_info.pool); 
     911                acc = pjsip_accept_hdr_create(tmp_pool); 
    907912                PJ_ASSERT_RETURN(acc, PJ_ENOMEM); 
    908913                acc->values[acc->count++] = pj_str("application/sdp"); 
     
    921926                pjsip_warning_hdr *w; 
    922927 
    923                 w = pjsip_warning_hdr_create_from_status(rdata->tp_info.pool, 
     928                w = pjsip_warning_hdr_create_from_status(tmp_pool, 
    924929                                                         pjsip_endpt_name(endpt), 
    925930                                                         sdp_info->sdp_err); 
     
    946951            /* Create SDP negotiator */ 
    947952            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); 
    949954            PJ_ASSERT_RETURN(status == PJ_SUCCESS, status); 
    950955 
    951956            /* Negotiate SDP */ 
    952             status = pjmedia_sdp_neg_negotiate(rdata->tp_info.pool, neg, 0); 
     957            status = pjmedia_sdp_neg_negotiate(tmp_pool, neg, 0); 
    953958            if (status != PJ_SUCCESS) { 
    954959 
     
    962967                    /* Add Warning header. */ 
    963968                    w = pjsip_warning_hdr_create_from_status( 
    964                                             rdata->tp_info.pool,  
     969                                            tmp_pool,  
    965970                                            pjsip_endpt_name(endpt), status); 
    966971                    PJ_ASSERT_RETURN(w, PJ_ENOMEM); 
     
    969974 
    970975                    /* Add Accept header to response */ 
    971                     acc = pjsip_accept_hdr_create(rdata->tp_info.pool); 
     976                    acc = pjsip_accept_hdr_create(tmp_pool); 
    972977                    PJ_ASSERT_RETURN(acc, PJ_ENOMEM); 
    973978                    acc->values[acc->count++] = pj_str("application/sdp"); 
     
    985990     * implicitly by sending this INVITE. 
    986991     */ 
    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    } 
    988996    if (allow) { 
    989997        unsigned i; 
     
    10031011 
    10041012    /* 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    } 
    10071017    if (sup_hdr) { 
    10081018        unsigned i; 
     
    10221032 
    10231033    /* 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    } 
    10261038    if (req_hdr) { 
    10271039        unsigned i; 
     
    10751087 
    10761088                /* Add Unsupported header. */ 
    1077                 unsupp_hdr = pjsip_unsupported_hdr_create(rdata->tp_info.pool); 
     1089                unsupp_hdr = pjsip_unsupported_hdr_create(tmp_pool); 
    10781090                PJ_ASSERT_RETURN(unsupp_hdr != NULL, PJ_ENOMEM); 
    10791091 
     
    10901102                if (h) { 
    10911103                    sup_hdr = (pjsip_supported_hdr*) 
    1092                               pjsip_hdr_clone(rdata->tp_info.pool, h); 
     1104                              pjsip_hdr_clone(tmp_pool, h); 
    10931105                    pj_list_push_back(&res_hdr_list, sup_hdr); 
    10941106                } 
     
    11021114     * by peer. 
    11031115     */ 
    1104     if ( ((*options & PJSIP_INV_REQUIRE_100REL)!=0 &&  
     1116    if ( msg && (((*options & PJSIP_INV_REQUIRE_100REL)!=0 &&  
    11051117          (rem_option & PJSIP_INV_SUPPORT_100REL)==0) || 
    11061118         ((*options & PJSIP_INV_REQUIRE_TIMER)!=0 &&  
    1107           (rem_option & PJSIP_INV_SUPPORT_TIMER)==0)) 
     1119          (rem_option & PJSIP_INV_SUPPORT_TIMER)==0))) 
    11081120    { 
    11091121        code = PJSIP_SC_EXTENSION_REQUIRED; 
     
    11141126 
    11151127            /* Add Require header. */ 
    1116             req_hdr = pjsip_require_hdr_create(rdata->tp_info.pool); 
     1128            req_hdr = pjsip_require_hdr_create(tmp_pool); 
    11171129            PJ_ASSERT_RETURN(req_hdr != NULL, PJ_ENOMEM); 
    11181130 
     
    11301142            if (h) { 
    11311143                sup_hdr = (pjsip_supported_hdr*) 
    1132                           pjsip_hdr_clone(rdata->tp_info.pool, h); 
     1144                          pjsip_hdr_clone(tmp_pool, h); 
    11331145                pj_list_push_back(&res_hdr_list, sup_hdr); 
    11341146            } 
     
    11581170        const pjsip_hdr *h; 
    11591171 
     1172        if (!rdata) { 
     1173            return PJSIP_ERRNO_FROM_SIP_STATUS(code); 
     1174        } 
     1175 
    11601176        if (dlg) { 
    11611177            status = pjsip_dlg_create_response(dlg, rdata, code, NULL,  
     
    11991215 * Verify incoming INVITE request. 
    12001216 */ 
     1217PJ_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 */ 
    12011234PJ_DEF(pj_status_t) pjsip_inv_verify_request( pjsip_rx_data *rdata, 
    12021235                                              unsigned *options, 
     
    12061239                                              pjsip_tx_data **p_tdata) 
    12071240{ 
    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,  
    12091243                                     endpt, p_tdata); 
    12101244} 
     
    20232057    pjsip_dlg_dec_lock(inv->dlg); 
    20242058    pj_log_pop_indent(); 
     2059    return status; 
     2060} 
     2061 
     2062 
     2063/* 
     2064 * Set local SDP offer/answer. 
     2065 */ 
     2066PJ_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 
    20252096    return status; 
    20262097} 
Note: See TracChangeset for help on using the changeset viewer.