Add pjsip_regc_add_headers() APi to set headers to be added 
to the REGISTER request. This solves the problem where headers
 registered in the initial REGISTER request (such as User-Agent
 header) are not sent in subsequent reregistration request.



git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@799 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjsip/src/pjsip-ua/sip_reg.c b/pjsip/src/pjsip-ua/sip_reg.c
index b777048..20bfb78 100644
--- a/pjsip/src/pjsip-ua/sip_reg.c
+++ b/pjsip/src/pjsip-ua/sip_reg.c
@@ -65,6 +65,7 @@
     pjsip_expires_hdr		*unreg_expires_hdr;
     pj_uint32_t			 expires;
     pjsip_route_hdr		 route_set;
+    pjsip_hdr			 hdr_list;
 
     /* Authorization sessions. */
     pjsip_auth_clt_sess		 auth_sess;
@@ -106,6 +107,7 @@
 	return status;
 
     pj_list_init(&regc->route_set);
+    pj_list_init(&regc->hdr_list);
 
     /* Done */
     *p_regc = regc;
@@ -307,6 +309,25 @@
     return PJ_SUCCESS;
 }
 
+PJ_DEF(pj_status_t) pjsip_regc_add_headers( pjsip_regc *regc,
+					    const pjsip_hdr *hdr_list)
+{
+    const pjsip_hdr *hdr;
+
+    PJ_ASSERT_RETURN(regc && hdr_list, PJ_EINVAL);
+
+    //This is "add" operation, so don't remove headers.
+    //pj_list_init(&regc->hdr_list);
+
+    hdr = hdr_list->next;
+    while (hdr != hdr_list) {
+	pj_list_push_back(&regc->hdr_list, pjsip_hdr_clone(regc->pool, hdr));
+	hdr = hdr->next;
+    }
+
+    return PJ_SUCCESS;
+}
+
 static pj_status_t create_request(pjsip_regc *regc, 
 				  pjsip_tx_data **p_tdata)
 {
@@ -350,6 +371,18 @@
 	}
     }
 
+    /* Add additional request headers */
+    if (!pj_list_empty(&regc->hdr_list)) {
+	const pjsip_hdr *hdr;
+
+	hdr = regc->hdr_list.next;
+	while (hdr != &regc->hdr_list) {
+	    pjsip_hdr *new_hdr = pjsip_hdr_shallow_clone(tdata->pool, hdr);
+	    pjsip_msg_add_hdr(tdata->msg, new_hdr);
+	    hdr = hdr->next;
+	}
+    }
+
     /* Done. */
     *p_tdata = tdata;
     return PJ_SUCCESS;
diff --git a/pjsip/src/pjsua-lib/pjsua_acc.c b/pjsip/src/pjsua-lib/pjsua_acc.c
index 10cc236..fd71f99 100644
--- a/pjsip/src/pjsua-lib/pjsua_acc.c
+++ b/pjsip/src/pjsua-lib/pjsua_acc.c
@@ -550,6 +550,22 @@
 	pjsip_regc_set_route_set( acc->regc, &acc->route_set );
     }
 
+    /* Add other request headers. */
+    if (pjsua_var.ua_cfg.user_agent.slen) {
+	pjsip_hdr hdr_list;
+	const pj_str_t STR_USER_AGENT = { "User-Agent", 10 };
+	pjsip_generic_string_hdr *h;
+
+	pool = pj_pool_create_on_buf(NULL, contact_buf, sizeof(contact_buf));
+	pj_list_init(&hdr_list);
+
+	h = pjsip_generic_string_hdr_create(pool, &STR_USER_AGENT, 
+					    &pjsua_var.ua_cfg.user_agent);
+	pj_list_push_back(&hdr_list, (pjsip_hdr*)h);
+
+	pjsip_regc_add_headers(acc->regc, &hdr_list);
+    }
+
     return PJ_SUCCESS;
 }
 
@@ -596,7 +612,7 @@
     }
 
     if (status == PJ_SUCCESS) {
-	pjsua_process_msg_data(tdata, NULL);
+	//pjsua_process_msg_data(tdata, NULL);
 	status = pjsip_regc_send( pjsua_var.acc[acc_id].regc, tdata );
     }