Fixed bug in PJSUA API re: account selection and Contact header for accounts

git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@597 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjsip/src/pjsua-lib/pjsua_acc.c b/pjsip/src/pjsua-lib/pjsua_acc.c
index feb3beb..65288f1 100644
--- a/pjsip/src/pjsua-lib/pjsua_acc.c
+++ b/pjsip/src/pjsua-lib/pjsua_acc.c
@@ -55,7 +55,7 @@
 
     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 @@
     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 @@
 
 
     /* 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 @@
 
     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 @@
 	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 @@
 
 	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;