You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2020/12/17 15:11:04 UTC

[openmeetings] branch master updated: [OPENMEETINGS-2239] sip session is correctly terminated

This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/master by this push:
     new 6142d3c  [OPENMEETINGS-2239] sip session is correctly terminated
6142d3c is described below

commit 6142d3c049ef8f966537861aaa3e000717b22b19
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Thu Dec 17 21:55:52 2020 +0700

    [OPENMEETINGS-2239] sip session is correctly terminated
---
 .../apache/openmeetings/core/remote/KStream.java   | 29 ++++++++++++++--------
 .../openmeetings/core/sip/SipStackProcessor.java   | 24 +++++++++++++++++-
 2 files changed, 42 insertions(+), 11 deletions(-)

diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KStream.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KStream.java
index d3394c7..20b2bb5 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KStream.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KStream.java
@@ -51,6 +51,7 @@ import org.apache.openmeetings.db.entity.basic.Client.StreamType;
 import org.apache.openmeetings.db.entity.record.RecordingChunk.Type;
 import org.apache.openmeetings.db.util.ws.RoomMessage;
 import org.apache.openmeetings.db.util.ws.TextRoomMessage;
+import org.apache.openmeetings.util.OmFileHelper;
 import org.kurento.client.Continuation;
 import org.kurento.client.IceCandidate;
 import org.kurento.client.ListenerSubscription;
@@ -89,6 +90,7 @@ public class KStream extends AbstractStream implements ISipCallbacks {
 	private boolean hasAudio;
 	private boolean hasVideo;
 	private boolean hasScreen;
+	private boolean sipClient;
 
 	public KStream(final StreamDesc sd, KRoom kRoom, KurentoHandler kHandler) {
 		super(sd.getSid(), sd.getUid());
@@ -107,6 +109,7 @@ public class KStream extends AbstractStream implements ISipCallbacks {
 		hasAudio = sd.hasActivity(Activity.AUDIO);
 		hasVideo = sd.hasActivity(Activity.VIDEO);
 		hasScreen = sd.hasActivity(Activity.SCREEN);
+		sipClient = OmFileHelper.SIP_USER_ID.equals(sd.getClient().getUserId());
 		if ((sdpOffer.indexOf("m=audio") > -1 && !hasAudio)
 				|| (sdpOffer.indexOf("m=video") > -1 && !hasVideo && StreamType.SCREEN != streamType))
 		{
@@ -570,20 +573,26 @@ public class KStream extends AbstractStream implements ISipCallbacks {
 
 	@Override
 	public void onRegisterOk() {
-		//TODO code for `SIP master` stream
-		rtpEndpoint = getRtpEndpoint(pipeline);
-		if (hasAudio) {
-			outgoingMedia.connect(rtpEndpoint, MediaType.AUDIO);
-		}
-		if (hasVideo) {
-			outgoingMedia.connect(rtpEndpoint, MediaType.VIDEO);
+		if (sipClient) {
+
+		} else {
+			rtpEndpoint = getRtpEndpoint(pipeline);
+			if (hasAudio) {
+				outgoingMedia.connect(rtpEndpoint, MediaType.AUDIO);
+			}
+			if (hasVideo) {
+				outgoingMedia.connect(rtpEndpoint, MediaType.VIDEO);
+			}
+			sipProcessor.get().invite(kRoom.getRoom(), rtpEndpoint.generateOffer());
 		}
-		sipProcessor.get().invite(kRoom.getRoom(), rtpEndpoint.generateOffer());
 	}
 
 	@Override
 	public void onInviteOk(String sdp) {
-		//TODO code for `SIP master` stream
-		rtpEndpoint.processAnswer(sdp);
+		if (sipClient) {
+
+		} else {
+			rtpEndpoint.processAnswer(sdp);
+		}
 	}
 }
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/sip/SipStackProcessor.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/sip/SipStackProcessor.java
index cb69f20..31a1941 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/sip/SipStackProcessor.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/sip/SipStackProcessor.java
@@ -18,6 +18,7 @@
  */
 package org.apache.openmeetings.core.sip;
 
+import static javax.sip.message.Request.BYE;
 import static javax.sip.message.Request.INVITE;
 import static javax.sip.message.Request.REGISTER;
 import static javax.sip.message.Response.OK;
@@ -93,6 +94,7 @@ public class SipStackProcessor implements SipListenerExt {
 	private final ContactHeader contactHeader;
 	private final AtomicLong cseq = new AtomicLong();
 	private final Random rnd = new Random();
+	private Dialog dialog;
 
 	SipStackProcessor(SipManager manager, String name, int localWsPort, ISipCallbacks callbacks) throws Exception {
 		this.manager = manager;
@@ -195,14 +197,16 @@ public class SipStackProcessor implements SipListenerExt {
 				if (REGISTER.equals(prevReq.getMethod())) {
 					callbacks.onRegisterOk();
 				} else if (INVITE.equals(prevReq.getMethod())) {
+					dialog = evt.getDialog();
 					ack(evt);
 					callbacks.onInviteOk(new String((byte[])resp.getContent()));
+				} else if (BYE.equals(prevReq.getMethod())) {
+					doDestroy();
 				}
 				break;
 			case TRYING:
 			case RINGING:
 				break;
-			// FIXME TODO other codes: 404
 			default:
 				log.debug("No handler for response: \n\n{}", resp);
 		}
@@ -220,6 +224,16 @@ public class SipStackProcessor implements SipListenerExt {
 		}
 	}
 
+	private void sayBye() {
+		try {
+			Request req = dialog.createRequest(BYE);
+			ClientTransaction ct = sipProvider.getNewClientTransaction(req);
+			dialog.sendRequest(ct);
+		} catch (SipException e) {
+			log.error("bye ", e);
+		}
+	}
+
 	private String getRnd(int count) {
 		return rnd.ints('0', 'z' + 1)
 				.filter(ch -> (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z'))
@@ -346,6 +360,14 @@ public class SipStackProcessor implements SipListenerExt {
 	}
 
 	public void destroy() {
+		if (dialog != null) {
+			sayBye();
+		} else {
+			doDestroy();
+		}
+	}
+
+	private void doDestroy() {
 		sipStack.stop();
 		manager.freePort(localWsPort);
 	}