summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2013-08-06 08:02:24 +0000
committerBenny Prijono <bennylp@teluu.com>2013-08-06 08:02:24 +0000
commit32e616a14deb6da49bb4557a0163b353415df1ce (patch)
treed0ded951e1d07ec13c39cab1a4a178cfe9f55e52
parent6e48a186a1d35be3701c4caa5295925b24e0cb57 (diff)
Fixed #1693: Pay attention to reg_hdr_list and sub_hdr_list in pjsua_acc_modify(), and also fixed pjsua_acc_get_config()
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4580 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjsip-apps/src/pjsua/pjsua_app.c24
-rw-r--r--pjsip-apps/src/pjsua/pjsua_app_cli.c8
-rw-r--r--pjsip-apps/src/pjsua/pjsua_app_legacy.c5
-rw-r--r--pjsip/include/pjsua-lib/pjsua.h2
-rw-r--r--pjsip/src/pjsua-lib/pjsua_acc.c77
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);