Ticket #544: Fixed SRTP on hold+reinvite scenario

git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@2064 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjsip/include/pjsua-lib/pjsua_internal.h b/pjsip/include/pjsua-lib/pjsua_internal.h
index 02ba597..6865344 100644
--- a/pjsip/include/pjsua-lib/pjsua_internal.h
+++ b/pjsip/include/pjsua-lib/pjsua_internal.h
@@ -74,6 +74,7 @@
     pj_timer_entry	 refresh_tm;/**< Timer to send re-INVITE.	    */
     pj_timer_entry	 hangup_tm; /**< Timer to hangup call.		    */
     pj_stun_nat_type	 rem_nat_type; /**< NAT type of remote endpoint.    */
+    pjmedia_srtp_use	 rem_srtp_use; /**< Remote's SRTP usage policy.	    */
 
     char    last_text_buf_[128];    /**< Buffer for last_text.		    */
 
diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c
index b548295..d12ea9d 100644
--- a/pjsip/src/pjsua-lib/pjsua_call.c
+++ b/pjsip/src/pjsua-lib/pjsua_call.c
@@ -115,6 +115,7 @@
     call->res_time.sec = 0;
     call->res_time.msec = 0;
     call->rem_nat_type = PJ_STUN_NAT_TYPE_UNKNOWN;
+    call->rem_srtp_use = PJMEDIA_SRTP_DISABLED;
 }
 
 
diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c
index 7d2742f..84b8510 100644
--- a/pjsip/src/pjsua-lib/pjsua_media.c
+++ b/pjsip/src/pjsua-lib/pjsua_media.c
@@ -888,7 +888,14 @@
 	/* Always create SRTP adapter */
 	pjmedia_srtp_setting_default(&srtp_opt);
 	srtp_opt.close_member_tp = PJ_FALSE;
-	srtp_opt.use = acc->cfg.use_srtp;
+	/* If media session has been ever established, let's use remote's 
+	 * preference in SRTP usage policy, especially when it is stricter.
+	 */
+	if (call->rem_srtp_use > acc->cfg.use_srtp)
+	    srtp_opt.use = call->rem_srtp_use;
+	else
+	    srtp_opt.use = acc->cfg.use_srtp;
+
 	status = pjmedia_transport_srtp_create(pjsua_var.med_endpt, 
 					       call->med_tp,
 					       &srtp_opt, &srtp);
@@ -1143,6 +1150,9 @@
 	}
 
     } else {
+	pjmedia_srtp_info srtp_info;
+	pjmedia_transport_info tp_info;
+
 	/* Start/restart media transport */
 	status = pjmedia_transport_media_start(call->med_tp, 
 					       call->inv->pool,
@@ -1152,6 +1162,23 @@
 
 	call->med_tp_st = PJSUA_MED_TP_RUNNING;
 
+	/* Get remote SRTP usage policy */
+	pjmedia_transport_info_init(&tp_info);
+	pjmedia_transport_get_info(call->med_tp, &tp_info);
+	if (tp_info.specific_info_cnt > 0) {
+	    int i;
+	    for (i = 0; i < tp_info.specific_info_cnt; ++i) {
+		if (tp_info.spc_info[i].type == PJMEDIA_TRANSPORT_TYPE_SRTP) 
+		{
+		    pjmedia_srtp_info *srtp_info = 
+				(pjmedia_srtp_info*) tp_info.spc_info[i].buffer;
+
+		    call->rem_srtp_use = srtp_info->peer_use;
+		    break;
+		}
+	    }
+	}
+
 	/* Override ptime, if this option is specified. */
 	if (pjsua_var.media_cfg.ptime != 0) {
 	    si->param->setting.frm_per_pkt = (pj_uint8_t)