Changeset 4580


Ignore:
Timestamp:
Aug 6, 2013 8:02:24 AM (11 years ago)
Author:
bennylp
Message:

Fixed #1693: Pay attention to reg_hdr_list and sub_hdr_list in pjsua_acc_modify(), and also fixed pjsua_acc_get_config()

Location:
pjproject/trunk
Files:
5 edited

Legend:

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

    r4525 r4580  
    12801280    pjsua_transport_config tcp_cfg; 
    12811281    unsigned i; 
     1282    pj_pool_t *tmp_pool; 
    12821283    pj_status_t status; 
    12831284 
     
    12891290    /* Create pool for application */ 
    12901291    app_config.pool = pjsua_pool_create("pjsua-app", 1000, 1000); 
     1292    tmp_pool = pjsua_pool_create("tmp-pjsua", 1000, 1000);; 
    12911293 
    12921294    /* Init CLI & its FE settings */ 
     
    13001302    /** Parse args **/ 
    13011303    status = load_config(app_cfg.argc, app_cfg.argv, &uri_arg); 
    1302     if (status != PJ_SUCCESS) 
     1304    if (status != PJ_SUCCESS) { 
     1305        pj_pool_release(tmp_pool); 
    13031306        return status; 
     1307    } 
    13041308 
    13051309    /* Initialize application callbacks */ 
     
    13401344    status = pjsua_init(&app_config.cfg, &app_config.log_cfg, 
    13411345                        &app_config.media_cfg); 
    1342     if (status != PJ_SUCCESS) 
     1346    if (status != PJ_SUCCESS) { 
     1347        pj_pool_release(tmp_pool); 
    13431348        return status; 
     1349    } 
    13441350 
    13451351    /* Initialize our module to handle otherwise unhandled request */ 
     
    15881594        if (PJMEDIA_HAS_VIDEO) { 
    15891595            pjsua_acc_config acc_cfg; 
    1590             pjsua_acc_get_config(aid, &acc_cfg); 
     1596            pjsua_acc_get_config(aid, tmp_pool, &acc_cfg); 
    15911597            app_config_init_video(&acc_cfg); 
    15921598            pjsua_acc_modify(aid, &acc_cfg); 
     
    16271633        if (PJMEDIA_HAS_VIDEO) { 
    16281634            pjsua_acc_config acc_cfg; 
    1629             pjsua_acc_get_config(aid, &acc_cfg); 
     1635            pjsua_acc_get_config(aid, tmp_pool, &acc_cfg); 
    16301636            app_config_init_video(&acc_cfg); 
    16311637            if (app_config.ipv6) 
     
    16611667        if (PJMEDIA_HAS_VIDEO) { 
    16621668            pjsua_acc_config acc_cfg; 
    1663             pjsua_acc_get_config(aid, &acc_cfg); 
     1669            pjsua_acc_get_config(aid, tmp_pool, &acc_cfg); 
    16641670            app_config_init_video(&acc_cfg); 
    16651671            pjsua_acc_modify(aid, &acc_cfg); 
     
    16861692        if (PJMEDIA_HAS_VIDEO) { 
    16871693            pjsua_acc_config acc_cfg; 
    1688             pjsua_acc_get_config(aid, &acc_cfg); 
     1694            pjsua_acc_get_config(aid, tmp_pool, &acc_cfg); 
    16891695            app_config_init_video(&acc_cfg); 
    16901696            if (app_config.ipv6) 
     
    17211727        if (PJMEDIA_HAS_VIDEO) { 
    17221728            pjsua_acc_config acc_cfg; 
    1723             pjsua_acc_get_config(acc_id, &acc_cfg); 
     1729            pjsua_acc_get_config(acc_id, tmp_pool, &acc_cfg); 
    17241730            app_config_init_video(&acc_cfg); 
    17251731            pjsua_acc_modify(acc_id, &acc_cfg); 
     
    17451751        if (PJMEDIA_HAS_VIDEO) { 
    17461752            pjsua_acc_config acc_cfg; 
    1747             pjsua_acc_get_config(aid, &acc_cfg); 
     1753            pjsua_acc_get_config(aid, tmp_pool, &acc_cfg); 
    17481754            app_config_init_video(&acc_cfg); 
    17491755            if (app_config.ipv6) 
     
    18301836    call_opt.vid_cnt = app_config.vid.vid_cnt; 
    18311837 
     1838    pj_pool_release(tmp_pool); 
    18321839    return PJ_SUCCESS; 
    18331840 
    18341841on_error: 
     1842    pj_pool_release(tmp_pool); 
    18351843    app_destroy(); 
    18361844    return status; 
  • pjproject/trunk/pjsip-apps/src/pjsua/pjsua_app_cli.c

    r4537 r4580  
    21092109{ 
    21102110    pjsua_acc_config acc_cfg; 
     2111    pj_pool_t *pool = pjsua_pool_create("tmp-pjsua", 1000, 1000); 
    21112112     
    2112     pjsua_acc_get_config(current_acc, &acc_cfg); 
     2113    pjsua_acc_get_config(current_acc, pool, &acc_cfg); 
    21132114    app_config_show_video(current_acc, &acc_cfg); 
     2115    pj_pool_release(pool); 
    21142116    return PJ_SUCCESS; 
    21152117} 
     
    21192121    pjsua_acc_config acc_cfg; 
    21202122    pj_cli_cmd_id cmd_id = pj_cli_get_cmd_id(cval->cmd); 
     2123    pj_pool_t *pool = pjsua_pool_create("tmp-pjsua", 1000, 1000); 
    21212124 
    21222125    CHECK_PJSUA_RUNNING(); 
    21232126 
    2124     pjsua_acc_get_config(current_acc, &acc_cfg); 
     2127    pjsua_acc_get_config(current_acc, pool, &acc_cfg); 
    21252128 
    21262129    switch(cmd_id) { 
     
    21492152    } 
    21502153    modify_video_account(&acc_cfg); 
     2154    pj_pool_release(pool); 
    21512155    return PJ_SUCCESS; 
    21522156} 
  • pjproject/trunk/pjsip-apps/src/pjsua/pjsua_app_legacy.c

    r4537 r4580  
    313313        pjsua_acc_config acc_cfg; 
    314314        pj_bool_t changed = PJ_FALSE; 
    315  
    316         pjsua_acc_get_config(current_acc, &acc_cfg); 
     315        pj_pool_t *tmp_pool = pjsua_pool_create("tmp-pjsua", 1000, 1000); 
     316 
     317        pjsua_acc_get_config(current_acc, tmp_pool, &acc_cfg); 
    317318 
    318319        if (argc == 3 && strcmp(argv[2], "show")==0) { 
     
    335336            changed = PJ_TRUE; 
    336337        } else { 
     338            pj_pool_release(tmp_pool); 
    337339            goto on_error; 
    338340        } 
     
    344346                             current_acc)); 
    345347        } 
     348        pj_pool_release(tmp_pool); 
    346349 
    347350    } else if (strcmp(argv[1], "call")==0) { 
  • pjproject/trunk/pjsip/include/pjsua-lib/pjsua.h

    r4555 r4580  
    35903590 * 
    35913591 * @param acc_id        The account ID. 
     3592 * @param pool          Pool to duplicate the config. 
    35923593 * @param acc_cfg       Structure to receive the settings. 
    35933594 * 
     
    35953596 */ 
    35963597PJ_DECL(pj_status_t) pjsua_acc_get_config(pjsua_acc_id acc_id, 
     3598                                          pj_pool_t *pool, 
    35973599                                          pjsua_acc_config *acc_cfg); 
    35983600 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_acc.c

    r4579 r4580  
    686686/* Get config */ 
    687687PJ_DEF(pj_status_t) pjsua_acc_get_config(pjsua_acc_id acc_id, 
     688                                         pj_pool_t *pool, 
    688689                                         pjsua_acc_config *acc_cfg) 
    689690{ 
    690691    PJ_ASSERT_RETURN(acc_id>=0 && acc_id<(int)PJ_ARRAY_SIZE(pjsua_var.acc) 
    691692                     && pjsua_var.acc[acc_id].valid, PJ_EINVAL); 
    692     pj_memcpy(acc_cfg, &pjsua_var.acc[acc_id].cfg, sizeof(*acc_cfg)); 
     693    //this now would not work due to corrupt header list 
     694    //pj_memcpy(acc_cfg, &pjsua_var.acc[acc_id].cfg, sizeof(*acc_cfg)); 
     695    pjsua_acc_config_dup(pool, acc_cfg, &pjsua_var.acc[acc_id].cfg); 
    693696    return PJ_SUCCESS; 
     697} 
     698 
     699/* Compare two SIP headers. Return zero if equal */ 
     700static int pjsip_hdr_cmp(const pjsip_hdr *h1, const pjsip_hdr *h2) 
     701{ 
     702    char buf1[PJSIP_MAX_URL_SIZE]; 
     703    char buf2[PJSIP_MAX_URL_SIZE]; 
     704    pj_str_t p1, p2; 
     705 
     706    p1.ptr = buf1; 
     707    p1.slen = 0; 
     708    p2.ptr = buf2; 
     709    p2.slen = 0; 
     710 
     711    p1.slen = pjsip_hdr_print_on((void*)h1, buf1, sizeof(buf1)); 
     712    if (p1.slen < 0) 
     713        p1.slen = 0; 
     714    p2.slen = pjsip_hdr_print_on((void*)h2, buf2, sizeof(buf2)); 
     715    if (p2.slen < 0) 
     716        p2.slen = 0; 
     717 
     718    return pj_strcmp(&p1, &p2); 
     719} 
     720 
     721/* Update SIP header list from another list. Return PJ_TRUE if 
     722 * the list has been updated */ 
     723static pj_bool_t update_hdr_list(pj_pool_t *pool, pjsip_hdr *dst, 
     724                                 const pjsip_hdr *src) 
     725{ 
     726    pjsip_hdr *dst_i; 
     727    const pjsip_hdr *src_i; 
     728    pj_bool_t changed = PJ_FALSE; 
     729 
     730    /* Remove header that's no longer needed */ 
     731    for (dst_i = dst->next; dst_i != dst; ) { 
     732        for (src_i = src->next; src_i != src; src_i = src_i->next) { 
     733            if (pjsip_hdr_cmp(dst_i, src_i) == 0) 
     734                break; 
     735        } 
     736        if (src_i == src) { 
     737            pjsip_hdr *next = dst_i->next; 
     738            pj_list_erase(dst_i); 
     739            changed = PJ_TRUE; 
     740            dst_i = next; 
     741        } else { 
     742            dst_i = dst_i->next; 
     743        } 
     744    } 
     745 
     746    /* Add new header */ 
     747    for (src_i = src->next; src_i != src; src_i = src_i->next) { 
     748        for (dst_i = dst->next; dst_i != dst; dst_i = dst_i->next) { 
     749            if (pjsip_hdr_cmp(dst_i, src_i) == 0) 
     750                break; 
     751        } 
     752        if (dst_i == dst) { 
     753            dst_i = pjsip_hdr_clone(pool, src_i); 
     754            pj_list_push_back(dst, dst_i); 
     755            changed = PJ_TRUE; 
     756        } 
     757    } 
     758 
     759    return changed; 
    694760} 
    695761 
     
    778844        reg_sip_uri = (pjsip_sip_uri*) pjsip_uri_get_uri(reg_uri); 
    779845    } 
     846 
     847    /* REGISTER header list */ 
     848    if (update_hdr_list(acc->pool, &acc->cfg.reg_hdr_list, &cfg->reg_hdr_list)) { 
     849        update_reg = PJ_TRUE; 
     850        unreg_first = PJ_TRUE; 
     851    } 
     852 
     853    /* SUBSCRIBE header list */ 
     854    update_hdr_list(acc->pool, &acc->cfg.sub_hdr_list, &cfg->sub_hdr_list); 
    780855 
    781856    /* Global outbound proxy */ 
Note: See TracChangeset for help on using the changeset viewer.