From ede3d25f1e1be8315d5f990798992e525029ab3c Mon Sep 17 00:00:00 2001 From: Boris Grozev <boris@jitsi.org> Date: Tue, 12 Aug 2014 15:44:32 +0300 Subject: [PATCH] Adds a registerUser() method to SrtpControl. Needed for allowing multiple MediaStream-s to share an SrtpControl. --- .../jitsi/impl/neomedia/MediaStreamImpl.java | 4 +- .../transform/dtls/DtlsControlImpl.java | 41 ++++++++++++++++--- .../transform/zrtp/ZrtpControlImpl.java | 5 ++- .../service/neomedia/AbstractSrtpControl.java | 10 ++++- .../jitsi/service/neomedia/SrtpControl.java | 10 ++++- 5 files changed, 60 insertions(+), 10 deletions(-) diff --git a/src/org/jitsi/impl/neomedia/MediaStreamImpl.java b/src/org/jitsi/impl/neomedia/MediaStreamImpl.java index 89a61339..83597e67 100644 --- a/src/org/jitsi/impl/neomedia/MediaStreamImpl.java +++ b/src/org/jitsi/impl/neomedia/MediaStreamImpl.java @@ -315,6 +315,8 @@ public MediaStreamImpl( .createSrtpControl(SrtpControlType.ZRTP) : srtpControl; + this.srtpControl.registerUser(this); + if (connector != null) setConnector(connector); @@ -610,7 +612,7 @@ public void close() stop(); closeSendStreams(); - srtpControl.cleanup(); + srtpControl.cleanup(this); if (csrcEngine != null) { diff --git a/src/org/jitsi/impl/neomedia/transform/dtls/DtlsControlImpl.java b/src/org/jitsi/impl/neomedia/transform/dtls/DtlsControlImpl.java index ef0bf06a..c9cc03b4 100644 --- a/src/org/jitsi/impl/neomedia/transform/dtls/DtlsControlImpl.java +++ b/src/org/jitsi/impl/neomedia/transform/dtls/DtlsControlImpl.java @@ -391,7 +391,7 @@ private static String toHex(byte[] fingerprint) /** * The indicator which determines whether this instance has been disposed - * i.e. prepared for garbage collection by {@link #cleanup()}. + * i.e. prepared for garbage collection by {@link #doCleanup()}. */ private boolean disposed = false; @@ -430,6 +430,12 @@ private static String toHex(byte[] fingerprint) */ private Setup setup; + /** + * The instances currently registered as users of this <tt>SrtpControl</tt> + * (through {@link #registerUser(Object)}). + */ + private final Set<Object> users = new HashSet<Object>(); + /** * Initializes a new <tt>DtlsControlImpl</tt> instance. */ @@ -469,12 +475,11 @@ public DtlsControlImpl(boolean disableSRTP) } /** - * {@inheritDoc} + * Prepares this <tt>DtlsControlImpl</tt> for garbage collection. */ - @Override - public void cleanup() + private void doCleanup() { - super.cleanup(); + super.cleanup(null); setConnector(null); @@ -485,6 +490,19 @@ public void cleanup() } } + /** + * {@inheritDoc} + */ + @Override + public void cleanup(Object user) + { + synchronized (users) + { + if (users.remove(user) && users.isEmpty()) + doCleanup(); + } + } + /** * Initializes a new <tt>DtlsTransformEngine</tt> instance to be associated * with and used by this <tt>DtlsControlImpl</tt> instance. @@ -786,4 +804,17 @@ public void setRtcpmux(boolean rtcpmux) transformEngine.setRtcpmux(rtcpmux); } } + + /** + * {@inheritDoc} + */ + @Override + public void registerUser(Object user) + { + synchronized (users) + { + users.add(user); + } + } + } diff --git a/src/org/jitsi/impl/neomedia/transform/zrtp/ZrtpControlImpl.java b/src/org/jitsi/impl/neomedia/transform/zrtp/ZrtpControlImpl.java index 79f7414b..b048a596 100644 --- a/src/org/jitsi/impl/neomedia/transform/zrtp/ZrtpControlImpl.java +++ b/src/org/jitsi/impl/neomedia/transform/zrtp/ZrtpControlImpl.java @@ -58,9 +58,10 @@ public ZrtpControlImpl() /** * Cleans up the current zrtp control and its engine. */ - public void cleanup() + @Override + public void cleanup(Object user) { - super.cleanup(); + super.cleanup(user); zrtpConnector = null; } diff --git a/src/org/jitsi/service/neomedia/AbstractSrtpControl.java b/src/org/jitsi/service/neomedia/AbstractSrtpControl.java index 4f248c72..f25e520d 100644 --- a/src/org/jitsi/service/neomedia/AbstractSrtpControl.java +++ b/src/org/jitsi/service/neomedia/AbstractSrtpControl.java @@ -47,7 +47,8 @@ protected AbstractSrtpControl(SrtpControlType srtpControlType) * The implementation of <tt>AbstractSrtpControl</tt> cleans up its * associated <tt>TransformEngine</tt> (if any). */ - public void cleanup() + @Override + public void cleanup(Object user) { if (transformEngine != null) { @@ -118,4 +119,11 @@ public void setSrtpListener(SrtpListener srtpListener) { this.srtpListener = srtpListener; } + + /** + * {@inheritDoc} + */ + public void registerUser(Object user) + { + } } diff --git a/src/org/jitsi/service/neomedia/SrtpControl.java b/src/org/jitsi/service/neomedia/SrtpControl.java index 86e34d1a..48184646 100644 --- a/src/org/jitsi/service/neomedia/SrtpControl.java +++ b/src/org/jitsi/service/neomedia/SrtpControl.java @@ -39,8 +39,9 @@ public interface TransformEngine /** * Cleans up this <tt>SrtpControl</tt> and its <tt>TransformEngine</tt>. + * @param user the instance which requests the clean up. */ - public void cleanup(); + public void cleanup(Object user); /** * Gets the default secure/insecure communication status for the supported @@ -119,4 +120,11 @@ public interface TransformEngine * @param mediaType the media type of the stream this control controls. */ public void start(MediaType mediaType); + + /** + * Registers <tt>user</tt> as an instance which is currently using this + * <tt>SrtpControl</tt>. + * @param user + */ + public void registerUser(Object user); } -- GitLab