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()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.