namespace ScreenConnect; public class SingleCaptureStreamManager : CaptureStreamManager where TStreamState : class, new() { private int streamID; private TStreamState streamState; private int pendingStreamID; private TStreamState pendingStreamState; public SingleCaptureStreamManager(Proc streamStateDisposer = null) : base(streamStateDisposer) { streamID = -1; } public override TStreamState GetStreamState(CaptureStreamMessage message) { if (message == null) { return null; } bool flag = IsBoundaryMessage(message); if ((message.StreamID == streamID) & flag) { if (streamState != null) { base.StreamStateDisposer.SafeDo(delegate(Proc _) { _(streamState); }); } streamID = -1; streamState = null; return null; } if (message.StreamID == streamID) { return streamState; } if (flag) { if (pendingStreamState != null) { base.StreamStateDisposer.SafeDo(delegate(Proc _) { _(pendingStreamState); }); } pendingStreamID = message.StreamID; pendingStreamState = new TStreamState(); return pendingStreamState; } if (message.StreamID == pendingStreamID) { if (streamState != null) { base.StreamStateDisposer.SafeDo(delegate(Proc _) { _(streamState); }); } streamID = pendingStreamID; streamState = pendingStreamState; pendingStreamID = -1; pendingStreamState = null; return streamState; } return null; } public override void Dispose() { if (streamState != null) { if (base.StreamStateDisposer != null) { base.StreamStateDisposer(streamState); } streamID = -1; streamState = null; } } }