Ignore:
Timestamp:
Jul 18, 2006 2:39:40 PM (18 years ago)
Author:
bennylp
Message:

Small improvements: (1) pjsua now responds to incoming OPTIONS request, which means that some modules (evsub, invite) need to register their capabilities to the endpoint, (2) added command in pjsua to send arbitrary request

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_core.c

    r611 r612  
    130130 
    131131/***************************************************************************** 
     132 * Another simple module to handle incoming OPTIONS request 
     133 */ 
     134 
     135/* Notification on incoming request */ 
     136static pj_bool_t options_on_rx_request(pjsip_rx_data *rdata) 
     137{ 
     138    pjsip_tx_data *tdata; 
     139    pjsip_response_addr res_addr; 
     140    pjmedia_sdp_session *sdp; 
     141    const pjsip_hdr *cap_hdr; 
     142    pj_status_t status; 
     143 
     144    /* Only want to handle OPTIONS requests */ 
     145    if (pjsip_method_cmp(&rdata->msg_info.msg->line.req.method, 
     146                         &pjsip_options_method) != 0) 
     147    { 
     148        return PJ_FALSE; 
     149    } 
     150 
     151    /* Create basic response. */ 
     152    status = pjsip_endpt_create_response(pjsua_var.endpt, rdata, 200, NULL,  
     153                                         &tdata); 
     154    if (status != PJ_SUCCESS) { 
     155        pjsua_perror(THIS_FILE, "Unable to create OPTIONS response", status); 
     156        return PJ_TRUE; 
     157    } 
     158 
     159    /* Add Allow header */ 
     160    cap_hdr = pjsip_endpt_get_capability(pjsua_var.endpt, PJSIP_H_ALLOW, NULL); 
     161    if (cap_hdr) { 
     162        pjsip_msg_add_hdr(tdata->msg, pjsip_hdr_clone(tdata->pool, cap_hdr)); 
     163    } 
     164 
     165    /* Add Accept header */ 
     166    cap_hdr = pjsip_endpt_get_capability(pjsua_var.endpt, PJSIP_H_ACCEPT, NULL); 
     167    if (cap_hdr) { 
     168        pjsip_msg_add_hdr(tdata->msg, pjsip_hdr_clone(tdata->pool, cap_hdr)); 
     169    } 
     170 
     171    /* Add Supported header */ 
     172    cap_hdr = pjsip_endpt_get_capability(pjsua_var.endpt, PJSIP_H_SUPPORTED, NULL); 
     173    if (cap_hdr) { 
     174        pjsip_msg_add_hdr(tdata->msg, pjsip_hdr_clone(tdata->pool, cap_hdr)); 
     175    } 
     176 
     177    /* Add Allow-Events header from the evsub module */ 
     178    cap_hdr = pjsip_evsub_get_allow_events_hdr(NULL); 
     179    if (cap_hdr) { 
     180        pjsip_msg_add_hdr(tdata->msg, pjsip_hdr_clone(tdata->pool, cap_hdr)); 
     181    } 
     182 
     183    /* Add User-Agent header */ 
     184    if (pjsua_var.ua_cfg.user_agent.slen) { 
     185        const pj_str_t USER_AGENT = { "User-Agent", 10}; 
     186        pjsip_hdr *h; 
     187 
     188        h = (pjsip_hdr*) pjsip_generic_string_hdr_create(tdata->pool, 
     189                                                         &USER_AGENT, 
     190                                                         &pjsua_var.ua_cfg.user_agent); 
     191        pjsip_msg_add_hdr(tdata->msg, h); 
     192    } 
     193 
     194    /* Add SDP body, using call0's RTP address */ 
     195    status = pjmedia_endpt_create_sdp(pjsua_var.med_endpt, tdata->pool, 1, 
     196                                      &pjsua_var.calls[0].skinfo, &sdp); 
     197    if (status == PJ_SUCCESS) { 
     198        pjsip_create_sdp_body(tdata->pool, sdp, &tdata->msg->body); 
     199    } 
     200 
     201    /* Send response statelessly */ 
     202    pjsip_get_response_addr(tdata->pool, rdata, &res_addr); 
     203    status = pjsip_endpt_send_response(pjsua_var.endpt, &res_addr, tdata, NULL, NULL); 
     204    if (status != PJ_SUCCESS) 
     205        pjsip_tx_data_dec_ref(tdata); 
     206 
     207    return PJ_TRUE; 
     208} 
     209 
     210 
     211/* The module instance. */ 
     212static pjsip_module pjsua_options_handler =  
     213{ 
     214    NULL, NULL,                         /* prev, next.          */ 
     215    { "mod-pjsua-options", 17 },        /* Name.                */ 
     216    -1,                                 /* Id                   */ 
     217    PJSIP_MOD_PRIORITY_APPLICATION,     /* Priority             */ 
     218    NULL,                               /* load()               */ 
     219    NULL,                               /* start()              */ 
     220    NULL,                               /* stop()               */ 
     221    NULL,                               /* unload()             */ 
     222    &options_on_rx_request,             /* on_rx_request()      */ 
     223    NULL,                               /* on_rx_response()     */ 
     224    NULL,                               /* on_tx_request.       */ 
     225    NULL,                               /* on_tx_response()     */ 
     226    NULL,                               /* on_tsx_state()       */ 
     227 
     228}; 
     229 
     230 
     231/***************************************************************************** 
    132232 * These two functions are the main callbacks registered to PJSIP stack 
    133233 * to receive SIP request and response messages that are outside any 
     
    235335    } 
    236336 
     337    /* Unregister OPTIONS handler if it's previously registered */ 
     338    if (pjsua_options_handler.id >= 0) { 
     339        pjsip_endpt_unregister_module(pjsua_var.endpt, &pjsua_options_handler); 
     340        pjsua_options_handler.id = -1; 
     341    } 
     342 
    237343    /* Unregister msg logging if it's previously registered */ 
    238344    if (pjsua_msg_logger.id >= 0) { 
     
    245351        pjsip_endpt_register_module(pjsua_var.endpt, &pjsua_msg_logger); 
    246352 
     353    /* Register OPTIONS handler */ 
     354    pjsip_endpt_register_module(pjsua_var.endpt, &pjsua_options_handler); 
    247355 
    248356    return PJ_SUCCESS; 
     
    10251133    const pjsip_hdr *hdr; 
    10261134 
     1135    /* Always add User-Agent */ 
     1136    if (pjsua_var.ua_cfg.user_agent.slen &&  
     1137        tdata->msg->type == PJSIP_REQUEST_MSG)  
     1138    { 
     1139        const pj_str_t STR_USER_AGENT = { "User-Agent", 10 }; 
     1140        pjsip_hdr *h; 
     1141        h = (pjsip_hdr*)pjsip_generic_string_hdr_create(tdata->pool,  
     1142                                                        &STR_USER_AGENT,  
     1143                                                        &pjsua_var.ua_cfg.user_agent); 
     1144        pjsip_msg_add_hdr(tdata->msg, h); 
     1145    } 
     1146 
    10271147    if (!msg_data) 
    10281148        return; 
Note: See TracChangeset for help on using the changeset viewer.