Changeset 612 for pjproject/trunk


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

Location:
pjproject/trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip-apps/src/pjsua/pjsua_app.c

    r597 r612  
    138138static void default_config(struct app_config *cfg) 
    139139{ 
     140    char tmp[80]; 
     141 
    140142    pjsua_config_default(&cfg->cfg); 
     143    pj_ansi_sprintf(tmp, "PJSUA v%s/%s", PJ_VERSION, PJ_OS_NAME); 
     144    pj_strdup2_with_null(app_config.pool, &cfg->cfg.user_agent, tmp); 
     145 
    141146    pjsua_logging_config_default(&cfg->log_cfg); 
    142147    pjsua_media_config_default(&cfg->media_cfg); 
     
    473478        case OPT_NEXT_ACCOUNT: /* Add more account. */ 
    474479            cfg->acc_cnt++; 
    475             cur_acc = &cfg->acc_cfg[cfg->acc_cnt - 1]; 
     480            cur_acc = &cfg->acc_cfg[cfg->acc_cnt]; 
    476481            break; 
    477482 
     
    665670    } 
    666671 
    667     if (cfg->acc_cfg[0].id.slen && cfg->acc_cnt==0) 
    668         cfg->acc_cnt = 1; 
     672    if (cfg->acc_cfg[cfg->acc_cnt].id.slen) 
     673        cfg->acc_cnt++; 
    669674 
    670675    for (i=0; i<cfg->acc_cnt; ++i) { 
     
    13071312    puts("|                              | cc  Connect port         | dd  Dump detailed |"); 
    13081313    puts("|                              | cd  Disconnect port      | dc  Dump config   |"); 
    1309     puts("|                              |                          |  f  Save config   |"); 
     1314    puts("|  S  Send arbitrary REQUEST   |                          |  f  Save config   |"); 
    13101315    puts("+------------------------------+--------------------------+-------------------+"); 
    13111316    puts("|  q  QUIT                                                                    |"); 
     
    14601465    } 
    14611466    puts(""); 
     1467} 
     1468 
     1469 
     1470/* 
     1471 * Send arbitrary request to remote host 
     1472 */ 
     1473static void send_request(char *cstr_method, const pj_str_t *dst_uri) 
     1474{ 
     1475    pj_str_t str_method; 
     1476    pjsip_method method; 
     1477    pjsip_tx_data *tdata; 
     1478    pjsua_acc_info acc_info; 
     1479    pjsip_endpoint *endpt; 
     1480    pj_status_t status; 
     1481 
     1482    endpt = pjsua_get_pjsip_endpt(); 
     1483 
     1484    str_method = pj_str(cstr_method); 
     1485    pjsip_method_init_np(&method, &str_method); 
     1486 
     1487    pjsua_acc_get_info(current_acc, &acc_info); 
     1488 
     1489    status = pjsip_endpt_create_request(endpt, &method, dst_uri,  
     1490                                        &acc_info.acc_uri, dst_uri, 
     1491                                        NULL, NULL, -1, NULL, &tdata); 
     1492    if (status != PJ_SUCCESS) { 
     1493        pjsua_perror(THIS_FILE, "Unable to create request", status); 
     1494        return; 
     1495    } 
     1496 
     1497    status = pjsip_endpt_send_request(endpt, tdata, -1, NULL, NULL); 
     1498    if (status != PJ_SUCCESS) { 
     1499        pjsua_perror(THIS_FILE, "Unable to send request", status); 
     1500        pjsip_tx_data_dec_ref(tdata); 
     1501        return; 
     1502    } 
    14621503} 
    14631504 
     
    18921933                } 
    18931934            } 
     1935            break; 
     1936 
     1937        case 'S': 
     1938            /* 
     1939             * Send arbitrary request 
     1940             */ 
     1941            if (pjsua_acc_get_count() == 0) { 
     1942                puts("Sorry, need at least one account configured"); 
     1943                break; 
     1944            } 
     1945 
     1946            puts("Send arbitrary request to remote host"); 
     1947 
     1948            /* Input METHOD */ 
     1949            if (!simple_input("Request method:",text,sizeof(text))) 
     1950                break; 
     1951 
     1952            /* Input destination URI */ 
     1953            uri = NULL; 
     1954            ui_input_url("Destination URI", buf, sizeof(buf), &result); 
     1955            if (result.nb_result != NO_NB) { 
     1956 
     1957                if (result.nb_result == -1 || result.nb_result == 0) { 
     1958                    puts("Sorry you can't do that!"); 
     1959                    continue; 
     1960                } else { 
     1961                    pjsua_buddy_info binfo; 
     1962                    pjsua_buddy_get_info(result.nb_result-1, &binfo); 
     1963                    uri = binfo.uri.ptr; 
     1964                } 
     1965 
     1966            } else if (result.uri_result) { 
     1967                uri = result.uri_result; 
     1968            } 
     1969             
     1970            tmp = pj_str(uri); 
     1971 
     1972            send_request(text, &tmp); 
    18941973            break; 
    18951974 
  • pjproject/trunk/pjsip/include/pjsip-simple/evsub.h

    r515 r612  
    253253                                               const pj_str_t accept[]); 
    254254 
     255/** 
     256 * Get the Allow-Events header. This header is built based on the packages 
     257 * that are registered to the evsub module. 
     258 * 
     259 * @param m             Pointer to event subscription module instance, or 
     260 *                      NULL to use default instance (equal to  
     261 *                      #pjsip_evsub_instance()). 
     262 * 
     263 * @return              The Allow-Events header. 
     264 */ 
     265PJ_DECL(const pjsip_hdr*) pjsip_evsub_get_allow_events_hdr(pjsip_module *m); 
     266 
    255267 
    256268/** 
  • pjproject/trunk/pjsip/include/pjsip-ua/sip_inv.h

    r515 r612  
    616616 
    617617 
     618/** 
     619 * This is a utility function to create SIP body for SDP content. 
     620 * 
     621 * @param pool          Pool to allocate memory. 
     622 * @param sdp           SDP session to be put in the SIP message body. 
     623 * @param p_body        Pointer to receive SIP message body containing 
     624 *                      the SDP session. 
     625 * 
     626 * @return              PJ_SUCCESS on success. 
     627 */ 
     628PJ_DECL(pj_status_t) pjsip_create_sdp_body(pj_pool_t *pool, 
     629                                           pjmedia_sdp_session *sdp, 
     630                                           pjsip_msg_body **p_body); 
     631 
     632 
    618633PJ_END_DECL 
    619634 
  • pjproject/trunk/pjsip/include/pjsua-lib/pjsua.h

    r611 r612  
    418418    pjsua_callback  cb; 
    419419 
     420    /** 
     421     * User agent string (default empty) 
     422     */ 
     423    pj_str_t        user_agent; 
     424 
    420425} pjsua_config; 
    421426 
     
    469474        pjsip_cred_dup(pool, &dst->cred_info[i], &src->cred_info[i]); 
    470475    } 
     476 
     477    pj_strdup_with_null(pool, &dst->user_agent, &src->user_agent); 
    471478} 
    472479 
     
    20812088     * number. 
    20822089     * 
    2083      * Default: 3. 
     2090     * Default: 5. 
    20842091     */ 
    20852092    unsigned            quality; 
     
    21002107    cfg->has_ioqueue = PJ_TRUE; 
    21012108    cfg->thread_cnt = 1; 
    2102     cfg->quality = 3; 
     2109    cfg->quality = 5; 
    21032110} 
    21042111 
  • pjproject/trunk/pjsip/src/pjsip-simple/evsub.c

    r424 r612  
    421421    } 
    422422     
     423    /* Add to endpoint's Accept header */ 
     424    pjsip_endpt_add_capability(mod_evsub.endpt, &mod_evsub.mod, 
     425                               PJSIP_H_ACCEPT, NULL, 
     426                               pkg->pkg_accept->count, 
     427                               pkg->pkg_accept->values); 
     428 
    423429 
    424430    /* Done */ 
     
    431437} 
    432438 
     439 
     440/* 
     441 * Retrieve Allow-Events header 
     442 */ 
     443PJ_DEF(const pjsip_hdr*) pjsip_evsub_get_allow_events_hdr(pjsip_module *m) 
     444{ 
     445    struct mod_evsub *mod; 
     446 
     447    if (m == NULL) 
     448        m = pjsip_evsub_instance(); 
     449 
     450    mod = (struct mod_evsub*)m; 
     451 
     452    return (pjsip_hdr*) mod->allow_events_hdr; 
     453} 
    433454 
    434455 
  • pjproject/trunk/pjsip/src/pjsip-ua/sip_inv.c

    r576 r612  
    113113{ 
    114114    pj_str_t allowed[] = {{"INVITE", 6}, {"ACK",3}, {"BYE",3}, {"CANCEL",6}}; 
     115    pj_str_t accepted = { "application/sdp", 15 }; 
    115116 
    116117    /* Register supported methods: INVITE, ACK, BYE, CANCEL */ 
    117118    pjsip_endpt_add_capability(endpt, &mod_inv.mod, PJSIP_H_ALLOW, NULL, 
    118119                               PJ_ARRAY_SIZE(allowed), allowed); 
     120 
     121    /* Register "application/sdp" in Accept header */ 
     122    pjsip_endpt_add_capability(endpt, &mod_inv.mod, PJSIP_H_ACCEPT, NULL, 
     123                               1, &accepted); 
    119124 
    120125    return PJ_SUCCESS; 
     
    960965} 
    961966 
    962 static pjsip_msg_body *create_sdp_body(pj_pool_t *pool, 
    963                                        const pjmedia_sdp_session *c_sdp) 
    964 { 
     967 
     968PJ_DEF(pj_status_t) pjsip_create_sdp_body( pj_pool_t *pool, 
     969                                           pjmedia_sdp_session *sdp, 
     970                                           pjsip_msg_body **p_body) 
     971{ 
     972    const pj_str_t STR_APPLICATION = { "application", 11}; 
     973    const pj_str_t STR_SDP = { "sdp", 3 }; 
    965974    pjsip_msg_body *body; 
    966975 
    967  
    968976    body = pj_pool_zalloc(pool, sizeof(pjsip_msg_body)); 
    969     PJ_ASSERT_RETURN(body != NULL, NULL); 
    970  
    971     body->content_type.type = pj_str("application"); 
    972     body->content_type.subtype = pj_str("sdp"); 
    973     body->data = pjmedia_sdp_session_clone(pool, c_sdp); 
     977    PJ_ASSERT_RETURN(body != NULL, PJ_ENOMEM); 
     978 
     979    body->content_type.type = STR_APPLICATION; 
     980    body->content_type.subtype = STR_SDP; 
     981    body->data = sdp; 
    974982    body->len = 0; 
    975983    body->clone_data = &clone_sdp; 
    976984    body->print_body = &print_sdp; 
     985 
     986    *p_body = body; 
     987 
     988    return PJ_SUCCESS; 
     989} 
     990 
     991static pjsip_msg_body *create_sdp_body(pj_pool_t *pool, 
     992                                       const pjmedia_sdp_session *c_sdp) 
     993{ 
     994    pjsip_msg_body *body; 
     995    pj_status_t status; 
     996 
     997    status = pjsip_create_sdp_body(pool,  
     998                                   pjmedia_sdp_session_clone(pool, c_sdp), 
     999                                   &body); 
     1000 
     1001    if (status != PJ_SUCCESS) 
     1002        return NULL; 
    9771003 
    9781004    return body; 
  • pjproject/trunk/pjsip/src/pjsip/sip_dialog.c

    r576 r612  
    13451345        const pj_str_t reason = { "No session found", 16}; 
    13461346 
    1347         PJ_LOG(4,(tsx->obj_name, "Incoming request was unhandled by " 
    1348                                  "dialog usages, sending 500 response")); 
     1347        PJ_LOG(4,(tsx->obj_name, "%s was unhandled by " 
     1348                                 "dialog usages, sending 500 response", 
     1349                                 pjsip_rx_data_get_info(rdata))); 
    13491350 
    13501351        status = pjsip_dlg_create_response(dlg, rdata, 500, &reason, &tdata); 
     
    14581459    } 
    14591460 
     1461    /* Unhandled response does not necessarily mean error because 
     1462       dialog usages may choose to process the transaction state instead. 
    14601463    if (i==dlg->usage_cnt) { 
    1461         PJ_LOG(4,(dlg->obj_name, "%s is unhandled by dialog usages", 
     1464        PJ_LOG(4,(dlg->obj_name, "%s was not claimed by any dialog usages", 
    14621465                  pjsip_rx_data_get_info(rdata))); 
    14631466    } 
     1467    */ 
    14641468 
    14651469    /* Unlock dialog and dec session, may destroy dialog. */ 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_acc.c

    r611 r612  
    539539    } 
    540540 
    541     if (status == PJ_SUCCESS) 
     541    if (status == PJ_SUCCESS) { 
     542        pjsua_process_msg_data(tdata, NULL); 
    542543        status = pjsip_regc_send( pjsua_var.acc[acc_id].regc, tdata ); 
     544    } 
    543545 
    544546    if (status != PJ_SUCCESS) { 
  • 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.