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);
}