diff options
-rw-r--r-- | pjsip-apps/src/pjsua/pjsua_app.c | 24 | ||||
-rw-r--r-- | pjsip-apps/src/pjsua/pjsua_app_cli.c | 8 | ||||
-rw-r--r-- | pjsip-apps/src/pjsua/pjsua_app_legacy.c | 5 | ||||
-rw-r--r-- | pjsip/include/pjsua-lib/pjsua.h | 2 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_acc.c | 77 |
5 files changed, 104 insertions, 12 deletions
diff --git a/pjsip-apps/src/pjsua/pjsua_app.c b/pjsip-apps/src/pjsua/pjsua_app.c index eb04c717..25211935 100644 --- a/pjsip-apps/src/pjsua/pjsua_app.c +++ b/pjsip-apps/src/pjsua/pjsua_app.c @@ -1279,6 +1279,7 @@ static pj_status_t app_init() pjsua_transport_id transport_id = -1; pjsua_transport_config tcp_cfg; unsigned i; + pj_pool_t *tmp_pool; pj_status_t status; /** Create pjsua **/ @@ -1288,6 +1289,7 @@ static pj_status_t app_init() /* Create pool for application */ app_config.pool = pjsua_pool_create("pjsua-app", 1000, 1000); + tmp_pool = pjsua_pool_create("tmp-pjsua", 1000, 1000);; /* Init CLI & its FE settings */ if (!app_running) { @@ -1299,8 +1301,10 @@ static pj_status_t app_init() /** Parse args **/ status = load_config(app_cfg.argc, app_cfg.argv, &uri_arg); - if (status != PJ_SUCCESS) + if (status != PJ_SUCCESS) { + pj_pool_release(tmp_pool); return status; + } /* Initialize application callbacks */ app_config.cfg.cb.on_call_state = &on_call_state; @@ -1339,8 +1343,10 @@ static pj_status_t app_init() /* Initialize pjsua */ status = pjsua_init(&app_config.cfg, &app_config.log_cfg, &app_config.media_cfg); - if (status != PJ_SUCCESS) + if (status != PJ_SUCCESS) { + pj_pool_release(tmp_pool); return status; + } /* Initialize our module to handle otherwise unhandled request */ status = pjsip_endpt_register_module(pjsua_get_pjsip_endpt(), @@ -1587,7 +1593,7 @@ static pj_status_t app_init() pjsua_acc_add_local(transport_id, PJ_TRUE, &aid); if (PJMEDIA_HAS_VIDEO) { pjsua_acc_config acc_cfg; - pjsua_acc_get_config(aid, &acc_cfg); + pjsua_acc_get_config(aid, tmp_pool, &acc_cfg); app_config_init_video(&acc_cfg); pjsua_acc_modify(aid, &acc_cfg); } @@ -1626,7 +1632,7 @@ static pj_status_t app_init() pjsua_acc_add_local(transport_id, PJ_TRUE, &aid); if (PJMEDIA_HAS_VIDEO) { pjsua_acc_config acc_cfg; - pjsua_acc_get_config(aid, &acc_cfg); + pjsua_acc_get_config(aid, tmp_pool, &acc_cfg); app_config_init_video(&acc_cfg); if (app_config.ipv6) acc_cfg.ipv6_media_use = PJSUA_IPV6_ENABLED; @@ -1660,7 +1666,7 @@ static pj_status_t app_init() pjsua_acc_add_local(transport_id, PJ_TRUE, &aid); if (PJMEDIA_HAS_VIDEO) { pjsua_acc_config acc_cfg; - pjsua_acc_get_config(aid, &acc_cfg); + pjsua_acc_get_config(aid, tmp_pool, &acc_cfg); app_config_init_video(&acc_cfg); pjsua_acc_modify(aid, &acc_cfg); } @@ -1685,7 +1691,7 @@ static pj_status_t app_init() pjsua_acc_add_local(transport_id, PJ_TRUE, &aid); if (PJMEDIA_HAS_VIDEO) { pjsua_acc_config acc_cfg; - pjsua_acc_get_config(aid, &acc_cfg); + pjsua_acc_get_config(aid, tmp_pool, &acc_cfg); app_config_init_video(&acc_cfg); if (app_config.ipv6) acc_cfg.ipv6_media_use = PJSUA_IPV6_ENABLED; @@ -1720,7 +1726,7 @@ static pj_status_t app_init() pjsua_acc_add_local(transport_id, PJ_FALSE, &acc_id); if (PJMEDIA_HAS_VIDEO) { pjsua_acc_config acc_cfg; - pjsua_acc_get_config(acc_id, &acc_cfg); + pjsua_acc_get_config(acc_id, tmp_pool, &acc_cfg); app_config_init_video(&acc_cfg); pjsua_acc_modify(acc_id, &acc_cfg); } @@ -1744,7 +1750,7 @@ static pj_status_t app_init() pjsua_acc_add_local(transport_id, PJ_TRUE, &aid); if (PJMEDIA_HAS_VIDEO) { pjsua_acc_config acc_cfg; - pjsua_acc_get_config(aid, &acc_cfg); + pjsua_acc_get_config(aid, tmp_pool, &acc_cfg); app_config_init_video(&acc_cfg); if (app_config.ipv6) acc_cfg.ipv6_media_use = PJSUA_IPV6_ENABLED; @@ -1829,9 +1835,11 @@ static pj_status_t app_init() call_opt.aud_cnt = app_config.aud_cnt; call_opt.vid_cnt = app_config.vid.vid_cnt; + pj_pool_release(tmp_pool); return PJ_SUCCESS; on_error: + pj_pool_release(tmp_pool); app_destroy(); return status; } diff --git a/pjsip-apps/src/pjsua/pjsua_app_cli.c b/pjsip-apps/src/pjsua/pjsua_app_cli.c index 771539a8..4247de08 100644 --- a/pjsip-apps/src/pjsua/pjsua_app_cli.c +++ b/pjsip-apps/src/pjsua/pjsua_app_cli.c @@ -2108,9 +2108,11 @@ static pj_status_t modify_video_account(pjsua_acc_config *acc_cfg) static pj_status_t cmd_show_account_video() { pjsua_acc_config acc_cfg; + pj_pool_t *pool = pjsua_pool_create("tmp-pjsua", 1000, 1000); - pjsua_acc_get_config(current_acc, &acc_cfg); + pjsua_acc_get_config(current_acc, pool, &acc_cfg); app_config_show_video(current_acc, &acc_cfg); + pj_pool_release(pool); return PJ_SUCCESS; } @@ -2118,10 +2120,11 @@ static pj_status_t cmd_video_acc_handler(pj_cli_cmd_val *cval) { pjsua_acc_config acc_cfg; pj_cli_cmd_id cmd_id = pj_cli_get_cmd_id(cval->cmd); + pj_pool_t *pool = pjsua_pool_create("tmp-pjsua", 1000, 1000); CHECK_PJSUA_RUNNING(); - pjsua_acc_get_config(current_acc, &acc_cfg); + pjsua_acc_get_config(current_acc, pool, &acc_cfg); switch(cmd_id) { case CMD_VIDEO_ACC_AUTORX: @@ -2148,6 +2151,7 @@ static pj_status_t cmd_video_acc_handler(pj_cli_cmd_val *cval) break; } modify_video_account(&acc_cfg); + pj_pool_release(pool); return PJ_SUCCESS; } diff --git a/pjsip-apps/src/pjsua/pjsua_app_legacy.c b/pjsip-apps/src/pjsua/pjsua_app_legacy.c index e49490b0..30725b51 100644 --- a/pjsip-apps/src/pjsua/pjsua_app_legacy.c +++ b/pjsip-apps/src/pjsua/pjsua_app_legacy.c @@ -312,8 +312,9 @@ static void vid_handle_menu(char *menuin) } else if (strcmp(argv[1], "acc")==0) { pjsua_acc_config acc_cfg; pj_bool_t changed = PJ_FALSE; + pj_pool_t *tmp_pool = pjsua_pool_create("tmp-pjsua", 1000, 1000); - pjsua_acc_get_config(current_acc, &acc_cfg); + pjsua_acc_get_config(current_acc, tmp_pool, &acc_cfg); if (argc == 3 && strcmp(argv[2], "show")==0) { app_config_show_video(current_acc, &acc_cfg); @@ -334,6 +335,7 @@ static void vid_handle_menu(char *menuin) acc_cfg.vid_rend_dev = dev; changed = PJ_TRUE; } else { + pj_pool_release(tmp_pool); goto on_error; } @@ -343,6 +345,7 @@ static void vid_handle_menu(char *menuin) PJ_PERROR(1,(THIS_FILE, status, "Error modifying account %d", current_acc)); } + pj_pool_release(tmp_pool); } else if (strcmp(argv[1], "call")==0) { pjsua_call_vid_strm_op_param param; diff --git a/pjsip/include/pjsua-lib/pjsua.h b/pjsip/include/pjsua-lib/pjsua.h index e6698b72..ad261561 100644 --- a/pjsip/include/pjsua-lib/pjsua.h +++ b/pjsip/include/pjsua-lib/pjsua.h @@ -3589,11 +3589,13 @@ PJ_DECL(pj_status_t) pjsua_acc_del(pjsua_acc_id acc_id); * data is only valid until the account is destroyed. * * @param acc_id The account ID. + * @param pool Pool to duplicate the config. * @param acc_cfg Structure to receive the settings. * * @return PJ_SUCCESS on success, or the appropriate error code. */ PJ_DECL(pj_status_t) pjsua_acc_get_config(pjsua_acc_id acc_id, + pj_pool_t *pool, pjsua_acc_config *acc_cfg); diff --git a/pjsip/src/pjsua-lib/pjsua_acc.c b/pjsip/src/pjsua-lib/pjsua_acc.c index fd102ee8..e501791d 100644 --- a/pjsip/src/pjsua-lib/pjsua_acc.c +++ b/pjsip/src/pjsua-lib/pjsua_acc.c @@ -685,14 +685,80 @@ PJ_DEF(pj_status_t) pjsua_acc_del(pjsua_acc_id acc_id) /* Get config */ PJ_DEF(pj_status_t) pjsua_acc_get_config(pjsua_acc_id acc_id, + pj_pool_t *pool, pjsua_acc_config *acc_cfg) { PJ_ASSERT_RETURN(acc_id>=0 && acc_id<(int)PJ_ARRAY_SIZE(pjsua_var.acc) && pjsua_var.acc[acc_id].valid, PJ_EINVAL); - pj_memcpy(acc_cfg, &pjsua_var.acc[acc_id].cfg, sizeof(*acc_cfg)); + //this now would not work due to corrupt header list + //pj_memcpy(acc_cfg, &pjsua_var.acc[acc_id].cfg, sizeof(*acc_cfg)); + pjsua_acc_config_dup(pool, acc_cfg, &pjsua_var.acc[acc_id].cfg); return PJ_SUCCESS; } +/* Compare two SIP headers. Return zero if equal */ +static int pjsip_hdr_cmp(const pjsip_hdr *h1, const pjsip_hdr *h2) +{ + char buf1[PJSIP_MAX_URL_SIZE]; + char buf2[PJSIP_MAX_URL_SIZE]; + pj_str_t p1, p2; + + p1.ptr = buf1; + p1.slen = 0; + p2.ptr = buf2; + p2.slen = 0; + + p1.slen = pjsip_hdr_print_on((void*)h1, buf1, sizeof(buf1)); + if (p1.slen < 0) + p1.slen = 0; + p2.slen = pjsip_hdr_print_on((void*)h2, buf2, sizeof(buf2)); + if (p2.slen < 0) + p2.slen = 0; + + return pj_strcmp(&p1, &p2); +} + +/* Update SIP header list from another list. Return PJ_TRUE if + * the list has been updated */ +static pj_bool_t update_hdr_list(pj_pool_t *pool, pjsip_hdr *dst, + const pjsip_hdr *src) +{ + pjsip_hdr *dst_i; + const pjsip_hdr *src_i; + pj_bool_t changed = PJ_FALSE; + + /* Remove header that's no longer needed */ + for (dst_i = dst->next; dst_i != dst; ) { + for (src_i = src->next; src_i != src; src_i = src_i->next) { + if (pjsip_hdr_cmp(dst_i, src_i) == 0) + break; + } + if (src_i == src) { + pjsip_hdr *next = dst_i->next; + pj_list_erase(dst_i); + changed = PJ_TRUE; + dst_i = next; + } else { + dst_i = dst_i->next; + } + } + + /* Add new header */ + for (src_i = src->next; src_i != src; src_i = src_i->next) { + for (dst_i = dst->next; dst_i != dst; dst_i = dst_i->next) { + if (pjsip_hdr_cmp(dst_i, src_i) == 0) + break; + } + if (dst_i == dst) { + dst_i = pjsip_hdr_clone(pool, src_i); + pj_list_push_back(dst, dst_i); + changed = PJ_TRUE; + } + } + + return changed; +} + /* * Modify account information. */ @@ -778,6 +844,15 @@ PJ_DEF(pj_status_t) pjsua_acc_modify( pjsua_acc_id acc_id, reg_sip_uri = (pjsip_sip_uri*) pjsip_uri_get_uri(reg_uri); } + /* REGISTER header list */ + if (update_hdr_list(acc->pool, &acc->cfg.reg_hdr_list, &cfg->reg_hdr_list)) { + update_reg = PJ_TRUE; + unreg_first = PJ_TRUE; + } + + /* SUBSCRIBE header list */ + update_hdr_list(acc->pool, &acc->cfg.sub_hdr_list, &cfg->sub_hdr_list); + /* Global outbound proxy */ global_route_crc = calc_proxy_crc(pjsua_var.ua_cfg.outbound_proxy, pjsua_var.ua_cfg.outbound_proxy_cnt); |