diff options
author | Benny Prijono <bennylp@teluu.com> | 2006-07-10 14:40:21 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2006-07-10 14:40:21 +0000 |
commit | 91a8d6213aac28b042683ddd185cac3ed0567655 (patch) | |
tree | e6c266cc51e8daced4fcde32f4aa3428e2e7c29a | |
parent | 62fdf849ffac4d68091e7f42f51011fb6d415285 (diff) |
Fixed bug in PJSUA API re: account selection and Contact header for accounts
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@597 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r-- | pjlib/src/pj/config.c | 2 | ||||
-rw-r--r-- | pjsip-apps/src/pjsua/pjsua_app.c | 8 | ||||
-rw-r--r-- | pjsip/include/pjsua-lib/pjsua.h | 2 | ||||
-rw-r--r-- | pjsip/include/pjsua-lib/pjsua_internal.h | 4 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_acc.c | 66 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_call.c | 4 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_core.c | 12 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_im.c | 4 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_pres.c | 7 |
9 files changed, 81 insertions, 28 deletions
diff --git a/pjlib/src/pj/config.c b/pjlib/src/pj/config.c index 9da6c4b3..54960e4c 100644 --- a/pjlib/src/pj/config.c +++ b/pjlib/src/pj/config.c @@ -21,7 +21,7 @@ #include <pj/ioqueue.h> static const char *id = "config.c"; -const char *PJ_VERSION = "0.5.6.1"; +const char *PJ_VERSION = "0.5.6.5"; PJ_DEF(void) pj_dump_config(void) { diff --git a/pjsip-apps/src/pjsua/pjsua_app.c b/pjsip-apps/src/pjsua/pjsua_app.c index 85f983e4..e4fd5e85 100644 --- a/pjsip-apps/src/pjsua/pjsua_app.c +++ b/pjsip-apps/src/pjsua/pjsua_app.c @@ -467,7 +467,7 @@ static pj_status_t parse_args(int argc, char *argv[], "in contact argument", pj_optarg)); return PJ_EINVAL; } - cur_acc->contact = pj_str(pj_optarg); + cur_acc->force_contact = pj_str(pj_optarg); break; case OPT_NEXT_ACCOUNT: /* Add more account. */ @@ -714,10 +714,10 @@ static void write_account_settings(int acc_index, pj_str_t *result) } /* Contact */ - if (acc_cfg->contact.slen) { + if (acc_cfg->force_contact.slen) { pj_ansi_sprintf(line, "--contact %.*s\n", - (int)acc_cfg->contact.slen, - acc_cfg->contact.ptr); + (int)acc_cfg->force_contact.slen, + acc_cfg->force_contact.ptr); pj_strcat2(result, line); } diff --git a/pjsip/include/pjsua-lib/pjsua.h b/pjsip/include/pjsua-lib/pjsua.h index 771268ab..f8a9aff1 100644 --- a/pjsip/include/pjsua-lib/pjsua.h +++ b/pjsip/include/pjsua-lib/pjsua.h @@ -1022,7 +1022,7 @@ typedef struct pjsua_acc_config * that this field is left empty, so that the value will be calculated * automatically based on the transport address. */ - pj_str_t contact; + pj_str_t force_contact; /** * Number of proxies in the proxy array below. diff --git a/pjsip/include/pjsua-lib/pjsua_internal.h b/pjsip/include/pjsua-lib/pjsua_internal.h index 004a41a0..a0f52189 100644 --- a/pjsip/include/pjsua-lib/pjsua_internal.h +++ b/pjsip/include/pjsua-lib/pjsua_internal.h @@ -80,9 +80,11 @@ typedef struct pjsua_acc int index; /**< Index in accounts array. */ pj_str_t user_part; /**< User part of local URI. */ - pj_str_t host_part; /**< Host part of local URI. */ pj_str_t real_contact; /**< Real contact address. */ + pj_str_t srv_domain; /**< Host part of reg server. */ + int srv_port; /**< Port number of reg server. */ + pjsip_regc *regc; /**< Client registration session. */ pj_timer_entry reg_timer; /**< Registration timer. */ pj_status_t reg_last_err; /**< Last registration error. */ diff --git a/pjsip/src/pjsua-lib/pjsua_acc.c b/pjsip/src/pjsua-lib/pjsua_acc.c index feb3bebd..65288f10 100644 --- a/pjsip/src/pjsua-lib/pjsua_acc.c +++ b/pjsip/src/pjsua-lib/pjsua_acc.c @@ -55,7 +55,7 @@ static void copy_acc_config(pj_pool_t *pool, pj_strdup_with_null(pool, &dst->id, &src->id); pj_strdup_with_null(pool, &dst->reg_uri, &src->reg_uri); - pj_strdup_with_null(pool, &dst->contact, &src->contact); + pj_strdup_with_null(pool, &dst->force_contact, &src->force_contact); dst->proxy_cnt = src->proxy_cnt; for (i=0; i<src->proxy_cnt; ++i) @@ -103,7 +103,7 @@ static pj_status_t initialize_acc(unsigned acc_id) pjsua_acc_config *acc_cfg = &pjsua_var.acc[acc_id].cfg; pjsua_acc *acc = &pjsua_var.acc[acc_id]; pjsip_uri *uri; - pjsip_sip_uri *sip_uri; + pjsip_sip_uri *sip_uri, *sip_reg_uri; unsigned i; /* Need to parse local_uri to get the elements: */ @@ -128,20 +128,52 @@ static pj_status_t initialize_acc(unsigned acc_id) /* Get the SIP URI object: */ - sip_uri = (pjsip_sip_uri*) pjsip_uri_get_uri(uri); + + /* Parse registrar URI, if any */ + if (acc_cfg->reg_uri.slen) { + pjsip_uri *reg_uri; + + reg_uri = pjsip_parse_uri(pjsua_var.pool, acc_cfg->reg_uri.ptr, + acc_cfg->reg_uri.slen, 0); + if (reg_uri == NULL) { + pjsua_perror(THIS_FILE, "Invalid registrar URI", + PJSIP_EINVALIDURI); + return PJSIP_EINVALIDURI; + } + + /* Registrar URI MUST be a SIP or SIPS: */ + if (!PJSIP_URI_SCHEME_IS_SIP(reg_uri) && + !PJSIP_URI_SCHEME_IS_SIPS(reg_uri)) + { + pjsua_perror(THIS_FILE, "Invalid registar URI", + PJSIP_EINVALIDSCHEME); + return PJSIP_EINVALIDSCHEME; + } + + sip_reg_uri = (pjsip_sip_uri*) pjsip_uri_get_uri(reg_uri); + + } else { + sip_reg_uri = NULL; + } + + /* Save the user and domain part. These will be used when finding an * account for incoming requests. */ acc->user_part = sip_uri->user; - acc->host_part = sip_uri->host; + acc->srv_domain = sip_uri->host; + acc->srv_port = 0; + if (sip_reg_uri) { + acc->srv_port = sip_reg_uri->port; + } /* Create Contact header if not present. */ - if (acc_cfg->contact.slen == 0) { - acc_cfg->contact = acc_cfg->id; - } + //if (acc_cfg->contact.slen == 0) { + // acc_cfg->contact = acc_cfg->id; + //} PJ_TODO(attach_account_to_transport); if (pjsua_var.tpdata[0].data.ptr) @@ -703,14 +735,26 @@ PJ_DEF(pjsua_acc_id) pjsua_acc_find_for_outgoing(const pj_str_t *url) sip_uri = pjsip_uri_get_uri(uri); - /* Find matching domain */ + /* Find matching domain AND port */ for (acc_id=0; acc_id<PJ_ARRAY_SIZE(pjsua_var.acc); ++acc_id) { if (!pjsua_var.acc[acc_id].valid) continue; - if (pj_stricmp(&pjsua_var.acc[acc_id].host_part, &sip_uri->host)==0) + if (pj_stricmp(&pjsua_var.acc[acc_id].srv_domain, &sip_uri->host)==0 && + pjsua_var.acc[acc_id].srv_port == sip_uri->port) break; } + /* If no match, try to match the domain part only */ + if (acc_id == PJ_ARRAY_SIZE(pjsua_var.acc)) { + /* Just use default account */ + for (acc_id=0; acc_id<PJ_ARRAY_SIZE(pjsua_var.acc); ++acc_id) { + if (!pjsua_var.acc[acc_id].valid) + continue; + if (pj_stricmp(&pjsua_var.acc[acc_id].srv_domain, &sip_uri->host)==0) + break; + } + } + if (acc_id == PJ_ARRAY_SIZE(pjsua_var.acc)) { /* Just use default account */ acc_id = pjsua_var.default_acc; @@ -753,7 +797,7 @@ PJ_DEF(pjsua_acc_id) pjsua_acc_find_for_incoming(pjsip_rx_data *rdata) pjsua_acc *acc = &pjsua_var.acc[acc_id]; if (pj_stricmp(&acc->user_part, &sip_uri->user)==0 && - pj_stricmp(&acc->host_part, &sip_uri->host)==0) + pj_stricmp(&acc->srv_domain, &sip_uri->host)==0) { /* Match ! */ PJSUA_UNLOCK(); @@ -766,7 +810,7 @@ PJ_DEF(pjsua_acc_id) pjsua_acc_find_for_incoming(pjsip_rx_data *rdata) pjsua_acc *acc = &pjsua_var.acc[acc_id]; - if (pj_stricmp(&acc->host_part, &sip_uri->host)==0) { + if (pj_stricmp(&acc->srv_domain, &sip_uri->host)==0) { /* Match ! */ PJSUA_UNLOCK(); return acc_id; diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c index cf1aa2b7..affe787b 100644 --- a/pjsip/src/pjsua-lib/pjsua_call.c +++ b/pjsip/src/pjsua-lib/pjsua_call.c @@ -234,7 +234,7 @@ PJ_DEF(pj_status_t) pjsua_call_make_call( pjsua_acc_id acc_id, /* Create outgoing dialog: */ status = pjsip_dlg_create_uac( pjsip_ua_instance(), - &acc->cfg.id, &acc->cfg.contact, + &acc->cfg.id, &acc->real_contact, dest_uri, dest_uri, &dlg); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Dialog creation failed", status); @@ -441,7 +441,7 @@ pj_bool_t pjsua_call_on_incoming(pjsip_rx_data *rdata) /* Create dialog: */ status = pjsip_dlg_create_uas( pjsip_ua_instance(), rdata, - &pjsua_var.acc[acc_id].cfg.contact, + &pjsua_var.acc[acc_id].real_contact, &dlg); if (status != PJ_SUCCESS) { pjsip_endpt_respond_stateless(pjsua_var.endpt, rdata, 500, NULL, diff --git a/pjsip/src/pjsua-lib/pjsua_core.c b/pjsip/src/pjsua-lib/pjsua_core.c index 09624311..f8b32fae 100644 --- a/pjsip/src/pjsua-lib/pjsua_core.c +++ b/pjsip/src/pjsua-lib/pjsua_core.c @@ -68,13 +68,15 @@ static void init_data() /* Notification on incoming messages */ static pj_bool_t logging_on_rx_msg(pjsip_rx_data *rdata) { - PJ_LOG(4,(THIS_FILE, "RX %d bytes %s from %s:%d:\n" - "%s\n" + PJ_LOG(4,(THIS_FILE, "RX %d bytes %s from %s %s:%d:\n" + "%.*s\n" "--end msg--", rdata->msg_info.len, pjsip_rx_data_get_info(rdata), + rdata->tp_info.transport->type_name, rdata->pkt_info.src_name, rdata->pkt_info.src_port, + (int)rdata->msg_info.len, rdata->msg_info.msg_buf)); /* Always return false, otherwise messages will not get processed! */ @@ -91,13 +93,15 @@ static pj_status_t logging_on_tx_msg(pjsip_tx_data *tdata) * has lower priority than transport layer. */ - PJ_LOG(4,(THIS_FILE, "TX %d bytes %s to %s:%d:\n" - "%s\n" + PJ_LOG(4,(THIS_FILE, "TX %d bytes %s to %s %s:%d:\n" + "%.*s\n" "--end msg--", (tdata->buf.cur - tdata->buf.start), pjsip_tx_data_get_info(tdata), + tdata->tp_info.transport->type_name, tdata->tp_info.dst_name, tdata->tp_info.dst_port, + (int)(tdata->buf.cur - tdata->buf.start), tdata->buf.start)); /* Always return success, otherwise message will not get sent! */ diff --git a/pjsip/src/pjsua-lib/pjsua_im.c b/pjsip/src/pjsua-lib/pjsua_im.c index 9ef58a06..ae35e9f4 100644 --- a/pjsip/src/pjsua-lib/pjsua_im.c +++ b/pjsip/src/pjsua-lib/pjsua_im.c @@ -440,7 +440,7 @@ PJ_DEF(pj_status_t) pjsua_im_send( pjsua_acc_id acc_id, pjsip_msg_add_hdr( tdata->msg, (pjsip_hdr*) pjsip_generic_string_hdr_create(tdata->pool, &STR_CONTACT, - &pjsua_var.acc[acc_id].cfg.contact)); + &pjsua_var.acc[acc_id].real_contact)); /* Create IM data to keep message details and give it back to * application on the callback @@ -521,7 +521,7 @@ PJ_DEF(pj_status_t) pjsua_im_typing( pjsua_acc_id acc_id, pjsip_msg_add_hdr( tdata->msg, (pjsip_hdr*) pjsip_generic_string_hdr_create(tdata->pool, &STR_CONTACT, - &pjsua_var.acc[acc_id].cfg.contact)); + &pjsua_var.acc[acc_id].real_contact)); /* Create "application/im-iscomposing+xml" msg body. */ diff --git a/pjsip/src/pjsua-lib/pjsua_pres.c b/pjsip/src/pjsua-lib/pjsua_pres.c index 8ef87661..4af2b6e0 100644 --- a/pjsip/src/pjsua-lib/pjsua_pres.c +++ b/pjsip/src/pjsua-lib/pjsua_pres.c @@ -465,7 +465,7 @@ static pj_bool_t pres_on_rx_request(pjsip_rx_data *rdata) /* Create UAS dialog: */ status = pjsip_dlg_create_uas(pjsip_ua_instance(), rdata, - &acc->cfg.contact, + &acc->real_contact, &dlg); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, @@ -770,10 +770,13 @@ static void subscribe_buddy_presence(unsigned index) acc = &pjsua_var.acc[acc_id]; + PJ_LOG(4,(THIS_FILE, "Using account %d for buddy %d subscription", + acc_id, index)); + /* Create UAC dialog */ status = pjsip_dlg_create_uac( pjsip_ua_instance(), &acc->cfg.id, - &acc->cfg.contact, + &acc->real_contact, &buddy->uri, NULL, &dlg); if (status != PJ_SUCCESS) { |