Decompiled source of Aeron Client v1.49.0
BepInEx/core/Aeron.Client/netstandard2.0/Adaptive.Aeron.dll
Decompiled 2 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.IO; using System.IO.MemoryMappedFiles; using System.Linq; using System.Net; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Text; using System.Threading; using Adaptive.Aeron.Command; using Adaptive.Aeron.Exceptions; using Adaptive.Aeron.LogBuffer; using Adaptive.Aeron.Status; using Adaptive.Agrona; using Adaptive.Agrona.Collections; using Adaptive.Agrona.Concurrent; using Adaptive.Agrona.Concurrent.Broadcast; using Adaptive.Agrona.Concurrent.Errors; using Adaptive.Agrona.Concurrent.RingBuffer; using Adaptive.Agrona.Concurrent.Status; using Adaptive.Agrona.Util; using Microsoft.CodeAnalysis; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: InternalsVisibleTo("Adaptive.Aeron.Tests")] [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] [assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")] [assembly: AssemblyCompany("Adaptive Financial Consulting Ltd.")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCopyright("Copyright Adaptive Financial Consulting Ltd.")] [assembly: AssemblyDescription("Efficient reliable UDP unicast, UDP multicast, and IPC transport protocol.")] [assembly: AssemblyFileVersion("1.49.0.0")] [assembly: AssemblyInformationalVersion("1.49.0+9179232fd342a742df7b8c88046b0306e4a0fc2e")] [assembly: AssemblyProduct("Aeron Client")] [assembly: AssemblyTitle("Adaptive.Aeron")] [assembly: AssemblyVersion("1.49.0.0")] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class IsReadOnlyAttribute : Attribute { } } namespace Adaptive.Aeron { public class Aeron : IDisposable { public static class Configuration { private class DefaultErrorHandler : IErrorHandler { public void OnError(Exception throwable) { lock (Console.Error) { Console.Error.WriteLine(throwable); } if (throwable is DriverTimeoutException) { Console.Error.WriteLine(); Console.Error.WriteLine("***"); Console.Error.WriteLine("*** Media Driver timeout - is it running? exiting client..."); Console.Error.WriteLine("***"); Environment.Exit(-1); } } } public static readonly int IDLE_SLEEP_DEFAULT_MS = 16; public static readonly int AWAITING_IDLE_SLEEP_MS = 1; public static readonly string IDLE_SLEEP_DURATION_PROP_NAME = "aeron.client.idle.sleep.duration"; public static readonly long IDLE_SLEEP_DEFAULT_NS = NanoUtil.FromMilliseconds((long)IDLE_SLEEP_DEFAULT_MS); public static readonly long KeepaliveIntervalNs = NanoUtil.FromMilliseconds(500L); public const string RESOURCE_LINGER_DURATION_PROP_NAME = "aeron.client.resource.linger.duration"; public static readonly long RESOURCE_LINGER_DURATION_DEFAULT_NS = NanoUtil.FromSeconds(3L); public const string CLOSE_LINGER_DURATION_PROP_NAME = "aeron.client.close.linger.duration"; public const long CLOSE_LINGER_DURATION_DEFAULT_NS = 0L; public const string PRE_TOUCH_MAPPED_MEMORY_PROP_NAME = "aeron.pre.touch.mapped.memory"; public const bool PRE_TOUCH_MAPPED_MEMORY_DEFAULT = false; public static readonly string CLIENT_NAME_PROP_NAME = "aeron.client.name"; public static readonly IErrorHandler DEFAULT_ERROR_HANDLER = (IErrorHandler)(object)new DefaultErrorHandler(); public const int MAX_CLIENT_NAME_LENGTH = 100; public static long IdleSleepDurationNs() { return Config.GetDurationInNanos(IDLE_SLEEP_DURATION_PROP_NAME, IDLE_SLEEP_DEFAULT_NS); } public static long ResourceLingerDurationNs() { return Config.GetDurationInNanos("aeron.client.resource.linger.duration", RESOURCE_LINGER_DURATION_DEFAULT_NS); } public static long CloseLingerDurationNs() { return Config.GetDurationInNanos("aeron.client.close.linger.duration", 0L); } public static bool PreTouchMappedMemory() { string property = Config.GetProperty("aeron.pre.touch.mapped.memory"); if (property != null) { return bool.Parse(property); } return false; } public static string ClientName() { return Config.GetProperty(CLIENT_NAME_PROP_NAME, ""); } } public class Context : IDisposable { private class ErrorHandlerWrapper : IErrorHandler, IDisposable { private readonly LoggingErrorHandler _loggingErrorHandler; private readonly IErrorHandler _userErrorHandler; public ErrorHandlerWrapper(LoggingErrorHandler loggingErrorHandler, IErrorHandler userErrorHandler) { _loggingErrorHandler = loggingErrorHandler; _userErrorHandler = userErrorHandler; throw new NotImplementedException(); } public void OnError(Exception exception) { _loggingErrorHandler.OnError(exception); _userErrorHandler.OnError(exception); } public void Dispose() { _loggingErrorHandler.Dispose(); if (_userErrorHandler is IDisposable disposable) { CloseHelper.QuietDispose(disposable); } } } private long _clientId; private string clientName = Configuration.ClientName(); private bool _useConductorAgentInvoker; private bool _preTouchMappedMemory = Configuration.PreTouchMappedMemory(); private AgentInvoker _driverAgentInvoker; private ILock _clientLock; private IEpochClock _epochClock; private INanoClock _nanoClock; private IIdleStrategy _idleStrategy; private IIdleStrategy _awaitingIdleStrategy; private CopyBroadcastReceiver _toClientBuffer; private IRingBuffer _toDriverBuffer; private DriverProxy _driverProxy; private ILogBuffersFactory _logBuffersFactory; private IErrorHandler _errorHandler; private IErrorHandler _subscriberErrorHandler; private AvailableImageHandler _availableImageHandler; private UnavailableImageHandler _unavailableImageHandler; private AvailableCounterHandler _availableCounterHandler; private UnavailableCounterHandler _unavailableCounterHandler; private IPublicationErrorFrameHandler publicationErrorFrameHandler = new NoOpPublicationErrorFrameHandler(); private Action _closeHandler; private long _keepAliveIntervalNs = Configuration.KeepaliveIntervalNs; private long _interServiceTimeoutNs; private long idleSleepDurationNs = Configuration.IdleSleepDurationNs(); private long _resourceLingerDurationNs = Configuration.ResourceLingerDurationNs(); private long _closeLingerDurationNs = Configuration.CloseLingerDurationNs(); private int filePageSize; private int _isConcluded; private long _driverTimeoutMs = 10000L; private string _aeronDirectoryName = GetAeronDirectoryName(); private DirectoryInfo _aeronDirectory; private FileInfo _cncFile; private bool enableExperimentalFeatures = Config.GetBoolean("aeron.enable.experimental.features"); private MappedByteBuffer _cncByteBuffer; private UnsafeBuffer _cncMetaDataBuffer; private UnsafeBuffer _countersMetaDataBuffer; private UnsafeBuffer _countersValuesBuffer; private IThreadFactory _threadFactory = (IThreadFactory)new DefaultThreadFactory(); public const string AERON_DIR_PROP_NAME = "aeron.dir"; public static readonly string AERON_DIR_PROP_DEFAULT; public const string ENABLE_EXPERIMENTAL_FEATURES_PROP_NAME = "aeron.enable.experimental.features"; public const string FALLBACK_LOGGER_PROP_NAME = "aeron.fallback.logger"; public const string IPC_MEDIA = "ipc"; public const string UDP_MEDIA = "udp"; public const string IPC_CHANNEL = "aeron:ipc"; public const string UDP_CHANNEL = "aeron:udp"; public const string SPY_PREFIX = "aeron-spy:"; public const string ENDPOINT_PARAM_NAME = "endpoint"; public const string INTERFACE_PARAM_NAME = "interface"; public const string DEBUG_TIMEOUT_PROP_NAME = "aeron.debug.timeout"; public const string PRINT_CONFIGURATION_ON_START_PROP_NAME = "aeron.print.configuration"; public const long DRIVER_TIMEOUT_MS = 10000L; public const int NULL_SESSION_ID = -1; public const string INITIAL_TERM_ID_PARAM_NAME = "init-term-id"; public const string TERM_ID_PARAM_NAME = "term-id"; public const string TERM_OFFSET_PARAM_NAME = "term-offset"; public const string TERM_LENGTH_PARAM_NAME = "term-length"; public const string MTU_LENGTH_PARAM_NAME = "mtu"; public const string TTL_PARAM_NAME = "ttl"; public const string MDC_CONTROL_PARAM_NAME = "control"; public const string MDC_CONTROL_MODE_PARAM_NAME = "control-mode"; public const string MTU_LENGTH_URI_PARAM_NAME = "mtu"; public const string MDC_CONTROL_MODE = "control-mode"; public const string MDC_CONTROL_MODE_MANUAL = "manual"; public const string MDC_CONTROL_MODE_DYNAMIC = "dynamic"; public const string CONTROL_MODE_RESPONSE = "response"; public const string SESSION_ID_PARAM_NAME = "session-id"; public const string LINGER_PARAM_NAME = "linger"; public const string RELIABLE_STREAM_PARAM_NAME = "reliable"; public const string TAGS_PARAM_NAME = "tags"; public const string TAG_PREFIX = "tag:"; public const string SPARSE_PARAM_NAME = "sparse"; public const string ALIAS_PARAM_NAME = "alias"; public const string EOS_PARAM_NAME = "eos"; public const string TETHER_PARAM_NAME = "tether"; public const string GROUP_PARAM_NAME = "group"; public const string REJOIN_PARAM_NAME = "rejoin"; public const string CONGESTION_CONTROL_PARAM_NAME = "cc"; public const string FLOW_CONTROL_PARAM_NAME = "fc"; public const string GROUP_TAG_PARAM_NAME = "gtag"; public const string SPIES_SIMULATE_CONNECTION_PARAM_NAME = "ssc"; public const string SOCKET_SNDBUF_PARAM_NAME = "so-sndbuf"; public const string SOCKET_RCVBUF_PARAM_NAME = "so-rcvbuf"; public const string RECEIVER_WINDOW_LENGTH_PARAM_NAME = "rcv-wnd"; public const string MEDIA_RCV_TIMESTAMP_OFFSET_PARAM_NAME = "media-rcv-ts-offset"; public const string CHANNEL_RECEIVE_TIMESTAMP_OFFSET_PARAM_NAME = "channel-rcv-ts-offset"; public const string CHANNEL_SEND_TIMESTAMP_OFFSET_PARAM_NAME = "channel-snd-ts-offset"; public const string RESERVED_OFFSET = "reserved"; public const string RESPONSE_ENDPOINT_PARAM_NAME = "response-endpoint"; public const string RESPONSE_CORRELATION_ID_PARAM_NAME = "response-correlation-id"; public const string PROTOTYPE_CORRELATION_ID = "prototype"; public const string NAK_DELAY_PARAM_NAME = "nak-delay"; public const string UNTETHERED_WINDOW_LIMIT_TIMEOUT_PARAM_NAME = "untethered-window-limit-timeout"; public const string UNTETHERED_LINGER_TIMEOUT_PARAM_NAME = "untethered-linger-timeout"; public const string UNTETHERED_RESTING_TIMEOUT_PARAM_NAME = "untethered-resting-timeout"; public const string MAX_RESEND_PARAM_NAME = "max-resend"; public const string STREAM_ID_PARAM_NAME = "stream-id"; public const string PUBLICATION_WINDOW_LENGTH_PARAM_NAME = "pub-wnd"; private static readonly ConcurrentDictionary<string, bool> DebugFieldsSeen; public bool IsConcluded => 1 == _isConcluded; static Context() { DebugFieldsSeen = new ConcurrentDictionary<string, bool>(); string text = null; if (Environment.OSVersion.Platform == PlatformID.Unix && Directory.Exists("/dev/shm")) { text = "/dev/shm/aeron"; } if (text == null) { text = Path.Combine(Path.GetTempPath(), "aeron"); } AERON_DIR_PROP_DEFAULT = text + "-" + Environment.UserName; } public static bool ShouldPrintConfigurationOnStart() { return "true".Equals(Config.GetProperty("aeron.print.configuration")); } public static TextWriter FallbackLogger() { return Config.GetProperty("aeron.fallback.logger", "stderr") switch { "stdout" => Console.Out, "noop" => new StreamWriter(Stream.Null), _ => Console.Error, }; } public static string GetAeronDirectoryName() { return Config.GetProperty("aeron.dir", AERON_DIR_PROP_DEFAULT); } public Context ConcludeAeronDirectory() { if (_aeronDirectory == null) { _aeronDirectory = new DirectoryInfo(_aeronDirectoryName); } return this; } public Context Clone() { return (Context)MemberwiseClone(); } public Context Conclude() { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Expected O, but got Unknown //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Expected O, but got Unknown //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Expected O, but got Unknown //IL_01c9: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Expected O, but got Unknown //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_01f7: Unknown result type (might be due to invalid IL or missing references) //IL_0201: Expected O, but got Unknown //IL_0201: Expected O, but got Unknown //IL_01fc: Unknown result type (might be due to invalid IL or missing references) //IL_0206: Expected O, but got Unknown if (Interlocked.Exchange(ref _isConcluded, 1) != 0) { throw new ConcurrentConcludeException(); } ConcludeAeronDirectory(); _cncFile = new FileInfo(Path.Combine(_aeronDirectory.FullName, "cnc.dat")); if (_clientLock == null) { _clientLock = (ILock)new ReentrantLock(); } else if (_clientLock is NoOpLock && !_useConductorAgentInvoker) { throw new ConfigurationException("Must use Aeron.Context.UseConductorAgentInvoker(true) when Aeron.Context.ClientLock(...) is using a NoOpLock"); } if (_driverAgentInvoker != null && !_useConductorAgentInvoker) { throw new ConfigurationException("Must use Aeron.Context.useConductorAgentInvoker(true) when Aeron.Context.driverAgentInvoker() is set"); } if (clientName.Length > 100) { throw new ConfigurationException("clientName length must <= " + 100); } if (_epochClock == null) { _epochClock = (IEpochClock)(object)SystemEpochClock.INSTANCE; } if (_nanoClock == null) { _nanoClock = (INanoClock)(object)SystemNanoClock.INSTANCE; } if (idleSleepDurationNs < 0 || idleSleepDurationNs > 1000000000) { throw new ConfigurationException("Invalid idle sleep duration: " + idleSleepDurationNs + "ns"); } if (_idleStrategy == null) { _idleStrategy = (IIdleStrategy)new SleepingIdleStrategy((int)TimeUnit.NANOSECONDS.ToMillis(idleSleepDurationNs)); } if (_awaitingIdleStrategy == null) { _awaitingIdleStrategy = (IIdleStrategy)new SleepingIdleStrategy(Configuration.AWAITING_IDLE_SLEEP_MS); } ConnectToDriver(); filePageSize = DriverFilePageSize((IDirectBuffer)(object)_cncMetaDataBuffer); _interServiceTimeoutNs = CncFileDescriptor.ClientLivenessTimeoutNs((IDirectBuffer)(object)_cncMetaDataBuffer); if (_interServiceTimeoutNs <= _keepAliveIntervalNs) { throw new ConfigurationException("interServiceTimeoutNs=" + _interServiceTimeoutNs + " <= keepAliveIntervalNs=" + _keepAliveIntervalNs); } if (_toDriverBuffer == null) { _toDriverBuffer = (IRingBuffer)new ManyToOneRingBuffer((IAtomicBuffer)(object)CncFileDescriptor.CreateToDriverBuffer(_cncByteBuffer, (IDirectBuffer)(object)_cncMetaDataBuffer)); } if (_toClientBuffer == null) { _toClientBuffer = new CopyBroadcastReceiver(new BroadcastReceiver((IAtomicBuffer)(object)CncFileDescriptor.CreateToClientsBuffer(_cncByteBuffer, (IDirectBuffer)(object)_cncMetaDataBuffer)), (IMutableDirectBuffer)new ExpandableArrayBuffer(4096)); } if (CountersMetaDataBuffer() == null) { CountersMetaDataBuffer(CncFileDescriptor.CreateCountersMetaDataBuffer(_cncByteBuffer, (IDirectBuffer)(object)_cncMetaDataBuffer)); } if (CountersValuesBuffer() == null) { CountersValuesBuffer(CncFileDescriptor.CreateCountersValuesBuffer(_cncByteBuffer, (IDirectBuffer)(object)_cncMetaDataBuffer)); } if (_logBuffersFactory == null) { _logBuffersFactory = new MappedLogBuffersFactory(); } if (_errorHandler == null) { _errorHandler = Configuration.DEFAULT_ERROR_HANDLER; } if (_subscriberErrorHandler == null) { _subscriberErrorHandler = _errorHandler; } if (_availableImageHandler == null) { _availableImageHandler = delegate { }; } if (_unavailableImageHandler == null) { _unavailableImageHandler = delegate { }; } if (_driverProxy == null) { _clientId = _toDriverBuffer.NextCorrelationId(); _driverProxy = new DriverProxy(ToDriverBuffer(), _clientId); } return this; } public long ClientId() { return _clientId; } public Context ClientName(string clientName) { this.clientName = (string.IsNullOrEmpty(clientName) ? "" : clientName); return this; } public string ClientName() { return clientName; } public FileInfo CncFile() { return _cncFile; } public Context UseConductorAgentInvoker(bool useConductorAgentInvoker) { _useConductorAgentInvoker = useConductorAgentInvoker; return this; } public bool UseConductorAgentInvoker() { return _useConductorAgentInvoker; } public Context PreTouchMappedMemory(bool preTouchMappedMemory) { _preTouchMappedMemory = preTouchMappedMemory; return this; } public bool PreTouchMappedMemory() { return _preTouchMappedMemory; } public Context DriverAgentInvoker(AgentInvoker driverAgentInvoker) { _driverAgentInvoker = driverAgentInvoker; return this; } public AgentInvoker DriverAgentInvoker() { return _driverAgentInvoker; } public Context ClientLock(ILock @lock) { _clientLock = @lock; return this; } public ILock ClientLock() { return _clientLock; } public Context EpochClock(IEpochClock clock) { _epochClock = clock; return this; } public IEpochClock EpochClock() { return _epochClock; } public Context NanoClock(INanoClock clock) { _nanoClock = clock; return this; } public INanoClock NanoClock() { return _nanoClock; } public Context IdleStrategy(IIdleStrategy idleStrategy) { _idleStrategy = idleStrategy; return this; } public IIdleStrategy IdleStrategy() { return _idleStrategy; } public Context AwaitingIdleStrategy(IIdleStrategy idleStrategy) { _awaitingIdleStrategy = idleStrategy; return this; } public IIdleStrategy AwaitingIdleStrategy() { return _awaitingIdleStrategy; } internal Context ToClientBuffer(CopyBroadcastReceiver toClientBuffer) { _toClientBuffer = toClientBuffer; return this; } public CopyBroadcastReceiver ToClientBuffer() { return _toClientBuffer; } public IRingBuffer ToDriverBuffer() { return _toDriverBuffer; } internal Context DriverProxy(DriverProxy driverProxy) { _driverProxy = driverProxy; return this; } public DriverProxy DriverProxy() { return _driverProxy; } internal Context LogBuffersFactory(ILogBuffersFactory logBuffersFactory) { _logBuffersFactory = logBuffersFactory; return this; } internal ILogBuffersFactory LogBuffersFactory() { return _logBuffersFactory; } public Context ErrorHandler(IErrorHandler errorHandler) { _errorHandler = errorHandler; return this; } public IErrorHandler ErrorHandler() { return _errorHandler; } public Context SubscriberErrorHandler(IErrorHandler errorHandler) { _subscriberErrorHandler = errorHandler; return this; } public IErrorHandler SubscriberErrorHandler() { return _subscriberErrorHandler; } public Context AvailableImageHandler(AvailableImageHandler handler) { _availableImageHandler = handler; return this; } public AvailableImageHandler AvailableImageHandler() { return _availableImageHandler; } public Context UnavailableImageHandler(UnavailableImageHandler handler) { _unavailableImageHandler = handler; return this; } public UnavailableImageHandler UnavailableImageHandler() { return _unavailableImageHandler; } public Context AvailableCounterHandler(AvailableCounterHandler handler) { _availableCounterHandler = handler; return this; } public AvailableCounterHandler AvailableCounterHandler() { return _availableCounterHandler; } public Context UnavailableCounterHandler(UnavailableCounterHandler handler) { _unavailableCounterHandler = handler; return this; } public UnavailableCounterHandler UnavailableCounterHandler() { return _unavailableCounterHandler; } public Context CloseHandler(Action handler) { _closeHandler = handler; return this; } public Action CloseHandler() { return _closeHandler; } public UnsafeBuffer CountersMetaDataBuffer() { return _countersMetaDataBuffer; } public Context CountersMetaDataBuffer(UnsafeBuffer countersMetaDataBuffer) { _countersMetaDataBuffer = countersMetaDataBuffer; return this; } public UnsafeBuffer CountersValuesBuffer() { return _countersValuesBuffer; } public Context CountersValuesBuffer(UnsafeBuffer countersValuesBuffer) { _countersValuesBuffer = countersValuesBuffer; return this; } public Context KeepAliveIntervalNs(long value) { _keepAliveIntervalNs = value; return this; } public long KeepAliveIntervalNs() { return _keepAliveIntervalNs; } public Context DriverTimeoutMs(long driverTimeoutMs) { _driverTimeoutMs = driverTimeoutMs; return this; } public long DriverTimeoutMs() { return CheckDebugTimeout(_driverTimeoutMs, TimeUnit.MILLIS, "DriverTimeoutMs"); } public bool EnableExperimentalFeatures() { return enableExperimentalFeatures; } public Context EnableExperimentalFeatures(bool enableExperimentalFeatures) { this.enableExperimentalFeatures = enableExperimentalFeatures; return this; } public static long CheckDebugTimeout(long timeout, TimeUnit timeUnit, string debugFieldName) { return CheckDebugTimeout(timeout, timeUnit, 1.0, debugFieldName); } public static long CheckDebugTimeout(long timeout, TimeUnit timeUnit, double factor, string debugFieldName) { string property = Config.GetProperty("aeron.debug.timeout"); if (property == null || !Debugger.IsAttached) { return timeout; } try { long num = (long)(factor * (double)SystemUtil.ParseDuration("aeron.debug.timeout", property)); long result = timeUnit.Convert(num, TimeUnit.NANOSECONDS); if (DebugFieldsSeen.TryAdd(debugFieldName, value: true)) { Console.WriteLine("Using debug timeout [" + result + "] for " + debugFieldName + " replacing [" + timeout + "]"); } return result; } catch (FormatException) { return timeout; } } internal Context InterServiceTimeoutNs(long interServiceTimeout) { _interServiceTimeoutNs = interServiceTimeout; return this; } public long InterServiceTimeoutNs() { return CheckDebugTimeout(_interServiceTimeoutNs, TimeUnit.NANOSECONDS, "InterServiceTimeoutNs"); } public Context IdleSleepDurationNs(long idleSleepDurationNs) { this.idleSleepDurationNs = idleSleepDurationNs; return this; } public long IdleSleepDurationNs() { return idleSleepDurationNs; } public Context ResourceLingerDurationNs(long resourceLingerDurationNs) { _resourceLingerDurationNs = resourceLingerDurationNs; return this; } public long ResourceLingerDurationNs() { return _resourceLingerDurationNs; } public Context CloseLingerDurationNs(long closeLingerDurationNs) { _closeLingerDurationNs = closeLingerDurationNs; return this; } public long CloseLingerDurationNs() { return _closeLingerDurationNs; } public string AeronDirectoryName() { return _aeronDirectoryName; } public DirectoryInfo AeronDirectory() { return _aeronDirectory; } public Context AeronDirectoryName(string dirName) { _aeronDirectoryName = dirName; return this; } public Context ThreadFactory(IThreadFactory threadFactory) { _threadFactory = threadFactory; return this; } public IThreadFactory ThreadFactory() { return _threadFactory; } public Context PublicationErrorFrameHandler(IPublicationErrorFrameHandler publicationErrorFrameHandler) { this.publicationErrorFrameHandler = Objects.RequireNonNull<IPublicationErrorFrameHandler>(publicationErrorFrameHandler); return this; } public IPublicationErrorFrameHandler PublicationErrorFrameHandler() { return publicationErrorFrameHandler; } public int FilePageSize() { return filePageSize; } public void Dispose() { MappedByteBuffer cncByteBuffer = _cncByteBuffer; if (cncByteBuffer != null) { cncByteBuffer.Dispose(); } _cncByteBuffer = null; UnsafeBuffer cncMetaDataBuffer = _cncMetaDataBuffer; if (cncMetaDataBuffer != null) { cncMetaDataBuffer.Dispose(); } UnsafeBuffer countersMetaDataBuffer = _countersMetaDataBuffer; if (countersMetaDataBuffer != null) { countersMetaDataBuffer.Dispose(); } UnsafeBuffer countersValuesBuffer = _countersValuesBuffer; if (countersValuesBuffer != null) { countersValuesBuffer.Dispose(); } MappedByteBuffer cncByteBuffer2 = _cncByteBuffer; if (cncByteBuffer2 != null) { cncByteBuffer2.Dispose(); } } public override string ToString() { return "Aeron.Context\n{\n isConcluded=" + _isConcluded + "\n aeronDirectory=" + AeronDirectory()?.ToString() + "\n aeronDirectoryName='" + AeronDirectoryName() + "'\n cncFile=" + CncFile()?.ToString() + "\n countersMetaDataBuffer=" + ((object)CountersMetaDataBuffer())?.ToString() + "\n countersValuesBuffer=" + ((object)CountersValuesBuffer())?.ToString() + "\n driverTimeoutMs=" + DriverTimeoutMs() + "\n clientId=" + _clientId + "\n clientName=" + clientName + "\n useConductorAgentInvoker=" + _useConductorAgentInvoker + "\n preTouchMappedMemory=" + _preTouchMappedMemory + "\n driverAgentInvoker=" + ((object)_driverAgentInvoker)?.ToString() + "\n clientLock=" + ((object)_clientLock)?.ToString() + "\n epochClock=" + ((object)_epochClock)?.ToString() + "\n nanoClock=" + ((object)_nanoClock)?.ToString() + "\n idleStrategy=" + ((object)_idleStrategy)?.ToString() + "\n awaitingIdleStrategy=" + ((object)_awaitingIdleStrategy)?.ToString() + "\n toClientBuffer=" + ((object)_toClientBuffer)?.ToString() + "\n toDriverBuffer=" + ((object)_toDriverBuffer)?.ToString() + "\n driverProxy=" + _driverProxy?.ToString() + "\n cncByteBuffer=" + ((object)_cncByteBuffer)?.ToString() + "\n cncMetaDataBuffer=" + ((object)_cncMetaDataBuffer)?.ToString() + "\n logBuffersFactory=" + _logBuffersFactory?.ToString() + "\n errorHandler=" + ((object)_errorHandler)?.ToString() + "\n subscriberErrorHandler=" + ((object)_subscriberErrorHandler)?.ToString() + "\n availableImageHandler=" + _availableImageHandler?.ToString() + "\n unavailableImageHandler=" + _unavailableImageHandler?.ToString() + "\n availableCounterHandler=" + _availableCounterHandler?.ToString() + "\n unavailableCounterHandler=" + _unavailableCounterHandler?.ToString() + "\n closeHandler=" + _closeHandler?.ToString() + "\n keepAliveIntervalNs=" + _keepAliveIntervalNs + "\n interServiceTimeoutNs=" + _interServiceTimeoutNs + "\n resourceLingerDurationNs=" + _resourceLingerDurationNs + "\n closeLingerDurationNs=" + _closeLingerDurationNs + "\n threadFactory=" + ((object)_threadFactory)?.ToString() + "\n}"; } private void ConnectToDriver() { //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Expected O, but got Unknown IEpochClock epochClock = _epochClock; long num = epochClock.Time() + DriverTimeoutMs(); FileInfo fileInfo = CncFile(); while (_toDriverBuffer == null) { fileInfo.Refresh(); _cncByteBuffer = WaitForFileMapping(fileInfo, epochClock, num); _cncMetaDataBuffer = CncFileDescriptor.CreateMetaDataBuffer(_cncByteBuffer); int intVolatile; while ((intVolatile = _cncMetaDataBuffer.GetIntVolatile(CncFileDescriptor.CncVersionOffset(0))) == 0) { if (epochClock.Time() > num) { throw new DriverTimeoutException("CnC file is created but not initialised: " + fileInfo.FullName); } Sleep(Configuration.AWAITING_IDLE_SLEEP_MS); } CncFileDescriptor.CheckVersion(intVolatile); if (SemanticVersion.Minor(intVolatile) < SemanticVersion.Minor(CncFileDescriptor.CNC_VERSION)) { throw new AeronException("driverVersion=" + SemanticVersion.ToString(intVolatile) + " insufficient for clientVersion=" + SemanticVersion.ToString(CncFileDescriptor.CNC_VERSION)); } if (!CncFileDescriptor.IsCncFileLengthSufficient((IDirectBuffer)(object)_cncMetaDataBuffer, _cncByteBuffer.Capacity)) { MappedByteBuffer cncByteBuffer = _cncByteBuffer; if (cncByteBuffer != null) { cncByteBuffer.Dispose(); } _cncByteBuffer = null; _cncMetaDataBuffer = null; Sleep(Configuration.AWAITING_IDLE_SLEEP_MS); continue; } ManyToOneRingBuffer val = new ManyToOneRingBuffer((IAtomicBuffer)(object)CncFileDescriptor.CreateToDriverBuffer(_cncByteBuffer, (IDirectBuffer)(object)_cncMetaDataBuffer)); while (val.ConsumerHeartbeatTime() == 0L) { if (epochClock.Time() > num) { throw new DriverTimeoutException("no driver heartbeat detected."); } Sleep(Configuration.AWAITING_IDLE_SLEEP_MS); } long num2 = epochClock.Time(); if (val.ConsumerHeartbeatTime() < num2 - DriverTimeoutMs()) { if (num2 > num) { throw new DriverTimeoutException("no driver heartbeat detected."); } IoUtil.Unmap(_cncByteBuffer); _cncByteBuffer = null; _cncMetaDataBuffer = null; Sleep(100); } else { _toDriverBuffer = (IRingBuffer)(object)val; } } } private static MappedByteBuffer WaitForFileMapping(FileInfo cncFile, IEpochClock clock, long deadLineMs) { while (true) { if (!cncFile.Exists || cncFile.Length < CncFileDescriptor.META_DATA_LENGTH) { if (clock.Time() > deadLineMs) { break; } Sleep(Configuration.IDLE_SLEEP_DEFAULT_MS); cncFile.Refresh(); continue; } try { FileAccess access = FileAccess.ReadWrite; FileShare share = FileShare.ReadWrite | FileShare.Delete; FileStream fileStream = cncFile.Open(FileMode.Open, access, share); if (fileStream.Length < CncFileDescriptor.META_DATA_LENGTH) { if (clock.Time() > deadLineMs) { throw new DriverTimeoutException("CnC file is created but not populated: " + cncFile.FullName); } fileStream.Dispose(); Sleep(Configuration.IDLE_SLEEP_DEFAULT_MS); continue; } return IoUtil.MapExistingFile(fileStream); } catch (FileNotFoundException) { } catch (IOException) { } catch (Exception innerException) { throw new AeronException("cannot open CnC file", innerException); } } throw new DriverTimeoutException("CnC file not created: " + cncFile.FullName); } public void DeleteAeronDirectory() { IoUtil.Delete(_aeronDirectory, false); } public MappedByteBuffer MapExistingCncFile(Action<string> logProgress) { FileInfo fileInfo = new FileInfo(Path.Combine(_aeronDirectory.FullName, "cnc.dat")); if (fileInfo.Exists && fileInfo.Length > CncFileDescriptor.META_DATA_LENGTH) { logProgress?.Invoke("INFO: Aeron CnC file " + fileInfo?.ToString() + "exists"); return IoUtil.MapExistingFile(fileInfo, "cnc.dat"); } return null; } public static bool IsDriverActive(DirectoryInfo directory, long driverTimeoutMs, Action<string> logger) { FileInfo fileInfo = new FileInfo(Path.Combine(directory.FullName, "cnc.dat")); if (fileInfo.Exists && fileInfo.Length > CncFileDescriptor.META_DATA_LENGTH) { logger("INFO: Aeron CnC file " + fileInfo?.ToString() + " exists"); MappedByteBuffer val = IoUtil.MapExistingFile(fileInfo, "CnC file"); try { return IsDriverActive(driverTimeoutMs, logger, val); } finally { if (val != null) { val.Dispose(); } } } return false; } public bool IsDriverActive(long driverTimeoutMs, Action<string> logger) { MappedByteBuffer val = MapExistingCncFile(logger); try { return IsDriverActive(driverTimeoutMs, logger, val); } finally { if (val != null) { val.Dispose(); } } } public static bool IsDriverActive(long driverTimeoutMs, Action<string> logger, MappedByteBuffer cncByteBuffer) { //IL_004c: Unknown result type (might be due to invalid IL or missing references) if (cncByteBuffer == null) { return false; } UnsafeBuffer val = CncFileDescriptor.CreateMetaDataBuffer(cncByteBuffer); long num = UnixTimeConverter.CurrentUnixTimeMillis(); int intVolatile; while ((intVolatile = val.GetIntVolatile(CncFileDescriptor.CncVersionOffset(0))) == 0) { if (UnixTimeConverter.CurrentUnixTimeMillis() > num + driverTimeoutMs) { throw new DriverTimeoutException("CnC file is created but not initialised."); } Sleep(1); } CncFileDescriptor.CheckVersion(intVolatile); long num2 = new ManyToOneRingBuffer((IAtomicBuffer)(object)CncFileDescriptor.CreateToDriverBuffer(cncByteBuffer, (IDirectBuffer)(object)val)).ConsumerHeartbeatTime(); long num3 = DateTime.Now.ToFileTimeUtc() - num2; logger("INFO: Aeron toDriver consumer heartbeat age is (ms):" + num3); return num3 <= driverTimeoutMs; } public static bool RequestDriverTermination(DirectoryInfo directory, IDirectBuffer tokenBuffer, int tokenOffset, int tokenLength) { //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Expected O, but got Unknown FileInfo fileInfo = new FileInfo(Path.Combine(directory.FullName, "cnc.dat")); if (fileInfo.Exists && fileInfo.Length > CncFileDescriptor.META_DATA_LENGTH) { MappedByteBuffer val = IoUtil.MapExistingFile(fileInfo, "CnC file"); try { UnsafeBuffer val2 = CncFileDescriptor.CreateMetaDataBuffer(val); int intVolatile = val2.GetIntVolatile(CncFileDescriptor.CncVersionOffset(0)); if (intVolatile > 0) { CncFileDescriptor.CheckVersion(intVolatile); ManyToOneRingBuffer val3 = new ManyToOneRingBuffer((IAtomicBuffer)(object)CncFileDescriptor.CreateToDriverBuffer(val, (IDirectBuffer)(object)val2)); long clientId = val3.NextCorrelationId(); return new DriverProxy((IRingBuffer)val3, clientId).TerminateDriver(tokenBuffer, tokenOffset, tokenLength); } } finally { if (val != null) { val.Dispose(); } } } return false; } public int SaveErrorLog(StreamWriter writer) { MappedByteBuffer val = MapExistingCncFile(null); try { return SaveErrorLog(writer, val); } finally { if (val != null) { val.Dispose(); } } } public int SaveErrorLog(StreamWriter writer, MappedByteBuffer cncByteBuffer) { if (cncByteBuffer == null) { return 0; } return PrintErrorLog(ErrorLogBuffer(cncByteBuffer), writer); } public static int PrintErrorLog(IAtomicBuffer errorBuffer, TextWriter @out) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Expected O, but got Unknown int num = 0; if (ErrorLogReader.HasErrors(errorBuffer)) { num = ErrorLogReader.Read(errorBuffer, new ErrorConsumer(ErrorConsumer)); @out.WriteLine(); @out.WriteLine("{0} distinct errors observed.", num); } else { @out.WriteLine(); @out.WriteLine("0 distinct errors observed"); } return num; void ErrorConsumer(int count, long firstTimestamp, long lastTimestamp, string encodedException) { DateTime dateTime = new DateTime(firstTimestamp); DateTime dateTime2 = new DateTime(lastTimestamp); @out.WriteLine(); @out.WriteLine($"{count} observations from {dateTime} to {dateTime2} for:"); @out.WriteLine(encodedException); } } private static IAtomicBuffer ErrorLogBuffer(MappedByteBuffer cncByteBuffer) { UnsafeBuffer val = CncFileDescriptor.CreateMetaDataBuffer(cncByteBuffer); CncFileDescriptor.CheckVersion(val.GetInt(CncFileDescriptor.CncVersionOffset(0))); return (IAtomicBuffer)(object)CncFileDescriptor.CreateErrorLogBuffer(cncByteBuffer, (IDirectBuffer)(object)val); } public static IErrorHandler SetupErrorHandler(IErrorHandler userErrorHandler, DistinctErrorLog errorLog) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown LoggingErrorHandler val = new LoggingErrorHandler(errorLog); if (userErrorHandler == null) { return (IErrorHandler)(object)val; } return (IErrorHandler)(object)new ErrorHandlerWrapper(val, userErrorHandler); } public static int DriverFilePageSize(DirectoryInfo aeronDirectory, IEpochClock clock, long timeoutMs) { MappedByteBuffer val = null; UnsafeBuffer val2 = null; try { val = WaitForFileMapping(new FileInfo(Path.Combine(aeronDirectory.FullName, "cnc.dat")), clock, timeoutMs); val2 = CncFileDescriptor.CreateMetaDataBuffer(val); return DriverFilePageSize((IDirectBuffer)(object)val2); } finally { if (val2 != null) { val2.Dispose(); } if (val != null) { val.Dispose(); } } } internal static int DriverFilePageSize(IDirectBuffer metadata) { int num = CncFileDescriptor.FilePageSize(metadata); if (num == 0) { return 4096; } return num; } private static void Sleep(int durationMs) { try { Thread.Sleep(durationMs); } catch (ThreadInterruptedException innerException) { Thread.CurrentThread.Interrupt(); throw new AeronException("unexpected interrupt", innerException); } } } public const int NULL_VALUE = -1; private readonly AtomicBoolean _isClosed = new AtomicBoolean(false); private readonly long _clientId; private readonly ClientConductor _conductor; private readonly IRingBuffer _commandBuffer; private readonly AgentInvoker _conductorInvoker; private readonly AgentRunner _conductorRunner; private readonly Context _ctx; public bool IsClosed => _isClosed.Get(); public Context Ctx => _ctx; public long ClientId => _clientId; public AgentInvoker ConductorAgentInvoker => _conductorInvoker; public CountersReader CountersReader { get { if (_isClosed.Get()) { throw new AeronException("client is closed"); } return _conductor.CountersReader(); } } internal Aeron() { }//IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown internal Aeron(Context ctx) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Expected O, but got Unknown //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Expected O, but got Unknown try { ctx.Conclude(); _ctx = ctx; _clientId = ctx.ClientId(); _commandBuffer = ctx.ToDriverBuffer(); _conductor = new ClientConductor(ctx, this); if (ctx.UseConductorAgentInvoker()) { _conductorInvoker = new AgentInvoker(ctx.ErrorHandler(), (AtomicCounter)null, (IAgent)(object)_conductor); _conductorRunner = null; } else { _conductorInvoker = null; _conductorRunner = new AgentRunner(ctx.IdleStrategy(), ctx.ErrorHandler(), (AtomicCounter)null, (IAgent)(object)_conductor); } } catch (ConcurrentConcludeException) { throw; } catch (Exception) { CloseHelper.QuietDispose((IDisposable)ctx); throw; } } public static Aeron Connect() { return Connect(new Context()); } public static Aeron Connect(Context ctx) { try { Aeron aeron = new Aeron(ctx); if (ctx.UseConductorAgentInvoker()) { aeron.ConductorAgentInvoker.Start(); } else { AgentRunner.StartOnThread(aeron._conductorRunner, ctx.ThreadFactory()); } return aeron; } catch (ConcurrentConcludeException) { throw; } catch (Exception) { ctx.Dispose(); throw; } } public void PrintCounters(StreamWriter @out) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown CountersReader.ForEach((CounterConsumer)delegate(long value, int id, string label) { @out.WriteLine("{0,3}: {1:} - {2}", id, value, label); }); } public bool IsCommandActive(long correlationId) { return _conductor.IsCommandActive(correlationId); } public bool HasActiveCommands() { return _conductor.HasActiveCommands(); } public void Dispose() { if (_isClosed.CompareAndSet(false, true)) { IErrorHandler val = _ctx.ErrorHandler(); if (_conductorRunner != null) { CloseHelper.Dispose(val, (IDisposable)_conductorRunner); } else { CloseHelper.Dispose(val, (IDisposable)_conductorInvoker); } } } public Publication AddPublication(string channel, int streamId) { return _conductor.AddPublication(channel, streamId); } public ExclusivePublication AddExclusivePublication(string channel, int streamId) { return _conductor.AddExclusivePublication(channel, streamId); } public long AsyncAddPublication(string channel, int streamId) { return _conductor.AsyncAddPublication(channel, streamId); } public void AsyncRemovePublication(long registrationId) { _conductor.RemovePublication(registrationId); } public long AsyncAddExclusivePublication(string channel, int streamId) { return _conductor.AsyncAddExclusivePublication(channel, streamId); } public ConcurrentPublication GetPublication(long registrationId) { return _conductor.GetPublication(registrationId); } public ExclusivePublication GetExclusivePublication(long registrationId) { return _conductor.GetExclusivePublication(registrationId); } public Subscription AddSubscription(string channel, int streamId) { return _conductor.AddSubscription(channel, streamId); } public Subscription AddSubscription(string channel, int streamId, AvailableImageHandler availableImageHandler, UnavailableImageHandler unavailableImageHandler) { return _conductor.AddSubscription(channel, streamId, availableImageHandler, unavailableImageHandler); } public long AsyncAddSubscription(string channel, int streamId, AvailableImageHandler availableImageHandler, UnavailableImageHandler unavailableImageHandler) { return _conductor.AsyncAddSubscription(channel, streamId, availableImageHandler, unavailableImageHandler); } public long AsyncAddSubscription(string channel, int streamId) { return _conductor.AsyncAddSubscription(channel, streamId); } public void AsyncRemoveSubscription(long registrationId) { _conductor.RemoveSubscription(registrationId); } public Subscription GetSubscription(long registrationId) { return _conductor.GetSubscription(registrationId); } public long NextCorrelationId() { if (_isClosed.Get()) { throw new AeronException("client is closed"); } return _commandBuffer.NextCorrelationId(); } public int NextSessionId(int streamId) { if (_isClosed.Get()) { throw new AeronException("client is closed"); } return _conductor.NextSessionId(streamId); } public Counter AddCounter(int typeId, IDirectBuffer keyBuffer, int keyOffset, int keyLength, IDirectBuffer labelBuffer, int labelOffset, int labelLength) { return _conductor.AddCounter(typeId, keyBuffer, keyOffset, keyLength, labelBuffer, labelOffset, labelLength); } public Counter AddCounter(int typeId, string label) { return _conductor.AddCounter(typeId, label); } public Counter AddStaticCounter(int typeId, IDirectBuffer keyBuffer, int keyOffset, int keyLength, IDirectBuffer labelBuffer, int labelOffset, int labelLength, long registrationId) { return _conductor.AddStaticCounter(typeId, keyBuffer, keyOffset, keyLength, labelBuffer, labelOffset, labelLength, registrationId); } public Counter AddStaticCounter(int typeId, string label, long registrationId) { return _conductor.AddStaticCounter(typeId, label, registrationId); } public long AsyncAddCounter(int typeId, string label) { return _conductor.AsyncAddCounter(typeId, label); } public long AsyncAddCounter(int typeId, IDirectBuffer keyBuffer, int keyOffset, int keyLength, IDirectBuffer labelBuffer, int labelOffset, int labelLength) { return _conductor.AsyncAddCounter(typeId, keyBuffer, keyOffset, keyLength, labelBuffer, labelOffset, labelLength); } public long AsyncAddStaticCounter(int typeId, string label, long registrationId) { return _conductor.AsyncAddStaticCounter(typeId, label, registrationId); } public long AsyncAddStaticCounter(int typeId, IDirectBuffer keyBuffer, int keyOffset, int keyLength, IDirectBuffer labelBuffer, int labelOffset, int labelLength, long registrationId) { return _conductor.AsyncAddStaticCounter(typeId, keyBuffer, keyOffset, keyLength, labelBuffer, labelOffset, labelLength, registrationId); } public Counter GetCounter(long correlationId) { return _conductor.GetCounter(correlationId); } public void AsyncRemoveCounter(long registrationId) { _conductor.AsyncRemoveCounter(registrationId); } public long AddAvailableCounterHandler(AvailableCounterHandler handler) { return _conductor.AddAvailableCounterHandler(handler); } public bool RemoveAvailableCounterHandler(long registrationId) { return _conductor.RemoveAvailableCounterHandler(registrationId); } [Obsolete] public bool RemoveAvailableCounterHandler(AvailableCounterHandler handler) { return _conductor.RemoveAvailableCounterHandler(handler); } public long AddUnavailableCounterHandler(UnavailableCounterHandler handler) { return _conductor.AddUnavailableCounterHandler(handler); } public bool RemoveUnavailableCounterHandler(long registrationId) { return _conductor.RemoveUnavailableCounterHandler(registrationId); } [Obsolete] public bool RemoveUnavailableCounterHandler(UnavailableCounterHandler handler) { return _conductor.RemoveUnavailableCounterHandler(handler); } public long AddCloseHandler(Action handler) { return _conductor.AddCloseHandler(handler); } [Obsolete] public bool RemoveCloseHandler(Action handler) { return _conductor.RemoveCloseHandler(handler); } public bool RemoveCloseHandler(long registrationId) { return _conductor.RemoveCloseHandler(registrationId); } public override string ToString() { string[] obj = new string[5] { "Aeron{isClosed=", _isClosed.Get().ToString(), ", clientId=", null, null }; long clientId = _clientId; obj[3] = clientId.ToString(); obj[4] = "}"; return string.Concat(obj); } internal void InternalClose() { _isClosed.Set(true); } } public static class AeronCounters { public const int SYSTEM_COUNTER_ID_BYTES_SENT = 0; public const int SYSTEM_COUNTER_ID_BYTES_RECEIVED = 1; public const int SYSTEM_COUNTER_ID_RECEIVER_PROXY_FAILS = 2; public const int SYSTEM_COUNTER_ID_SENDER_PROXY_FAILS = 3; public const int SYSTEM_COUNTER_ID_CONDUCTOR_PROXY_FAILS = 4; public const int SYSTEM_COUNTER_ID_NAK_MESSAGES_SENT = 5; public const int SYSTEM_COUNTER_ID_NAK_MESSAGES_RECEIVED = 6; public const int SYSTEM_COUNTER_ID_STATUS_MESSAGES_SENT = 7; public const int SYSTEM_COUNTER_ID_STATUS_MESSAGES_RECEIVED = 8; public const int SYSTEM_COUNTER_ID_HEARTBEATS_SENT = 9; public const int SYSTEM_COUNTER_ID_HEARTBEATS_RECEIVED = 10; public const int SYSTEM_COUNTER_ID_RETRANSMITS_SENT = 11; public const int SYSTEM_COUNTER_ID_FLOW_CONTROL_UNDER_RUNS = 12; public const int SYSTEM_COUNTER_ID_FLOW_CONTROL_OVER_RUNS = 13; public const int SYSTEM_COUNTER_ID_INVALID_PACKETS = 14; public const int SYSTEM_COUNTER_ID_ERRORS = 15; public const int SYSTEM_COUNTER_ID_SHORT_SENDS = 16; public const int SYSTEM_COUNTER_ID_FREE_FAILS = 17; public const int SYSTEM_COUNTER_ID_SENDER_FLOW_CONTROL_LIMITS = 18; public const int SYSTEM_COUNTER_ID_UNBLOCKED_PUBLICATIONS = 19; public const int SYSTEM_COUNTER_ID_UNBLOCKED_COMMANDS = 20; public const int SYSTEM_COUNTER_ID_POSSIBLE_TTL_ASYMMETRY = 21; public const int SYSTEM_COUNTER_ID_CONTROLLABLE_IDLE_STRATEGY = 22; public const int SYSTEM_COUNTER_ID_LOSS_GAP_FILLS = 23; public const int SYSTEM_COUNTER_ID_CLIENT_TIMEOUTS = 24; public const int SYSTEM_COUNTER_ID_RESOLUTION_CHANGES = 25; public const int SYSTEM_COUNTER_ID_CONDUCTOR_MAX_CYCLE_TIME = 26; public const int SYSTEM_COUNTER_ID_CONDUCTOR_CYCLE_TIME_THRESHOLD_EXCEEDED = 27; public const int SYSTEM_COUNTER_ID_SENDER_MAX_CYCLE_TIME = 28; public const int SYSTEM_COUNTER_ID_SENDER_CYCLE_TIME_THRESHOLD_EXCEEDED = 29; public const int SYSTEM_COUNTER_ID_RECEIVER_MAX_CYCLE_TIME = 30; public const int SYSTEM_COUNTER_ID_RECEIVER_CYCLE_TIME_THRESHOLD_EXCEEDED = 31; public const int SYSTEM_COUNTER_ID_NAME_RESOLVER_MAX_TIME = 32; public const int SYSTEM_COUNTER_ID_NAME_RESOLVER_TIME_THRESHOLD_EXCEEDED = 33; public const int SYSTEM_COUNTER_ID_AERON_VERSION = 34; public const int SYSTEM_COUNTER_ID_BYTES_CURRENTLY_MAPPED = 35; public const int SYSTEM_COUNTER_ID_RETRANSMITTED_BYTES = 36; public const int SYSTEM_COUNTER_ID_RETRANSMIT_OVERFLOW = 37; public const int SYSTEM_COUNTER_ID_ERROR_FRAMES_RECEIVED = 38; public const int SYSTEM_COUNTER_ID_ERROR_FRAMES_SENT = 39; public const int SYSTEM_COUNTER_ID_PUBLICATIONS_REVOKED = 40; public const int SYSTEM_COUNTER_ID_PUBLICATION_IMAGES_REVOKED = 41; public const int SYSTEM_COUNTER_ID_IMAGES_REJECTED = 42; public const int SYSTEM_COUNTER_ID_CONTROL_PROTOCOL_VERSION = 43; public const int DRIVER_SYSTEM_COUNTER_TYPE_ID = 0; public const int DRIVER_PUBLISHER_LIMIT_TYPE_ID = 1; public const int DRIVER_SENDER_POSITION_TYPE_ID = 2; public const int DRIVER_RECEIVER_HWM_TYPE_ID = 3; public const int DRIVER_SUBSCRIBER_POSITION_TYPE_ID = 4; public const int DRIVER_RECEIVER_POS_TYPE_ID = 5; public const int DRIVER_SEND_CHANNEL_STATUS_TYPE_ID = 6; public const int DRIVER_RECEIVE_CHANNEL_STATUS_TYPE_ID = 7; public const int DRIVER_SENDER_LIMIT_TYPE_ID = 9; public const int DRIVER_PER_IMAGE_TYPE_ID = 10; public const int DRIVER_HEARTBEAT_TYPE_ID = 11; public const int DRIVER_PUBLISHER_POS_TYPE_ID = 12; public const int DRIVER_SENDER_BPE_TYPE_ID = 13; public const int NAME_RESOLVER_NEIGHBORS_COUNTER_TYPE_ID = 15; public const int NAME_RESOLVER_CACHE_ENTRIES_COUNTER_TYPE_ID = 16; public const int DRIVER_LOCAL_SOCKET_ADDRESS_STATUS_TYPE_ID = 14; public const int FLOW_CONTROL_RECEIVERS_COUNTER_TYPE_ID = 17; public const int MDC_DESTINATIONS_COUNTER_TYPE_ID = 18; public const int DRIVER_SENDER_NAKS_RECEIVED_TYPE_ID = 19; public const int DRIVER_RECEIVER_NAKS_SENT_TYPE_ID = 20; public const int ARCHIVE_RECORDING_POSITION_TYPE_ID = 100; public const int ARCHIVE_ERROR_COUNT_TYPE_ID = 101; public const int ARCHIVE_CONTROL_SESSIONS_TYPE_ID = 102; public const int ARCHIVE_MAX_CYCLE_TIME_TYPE_ID = 103; public const int ARCHIVE_CYCLE_TIME_THRESHOLD_EXCEEDED_TYPE_ID = 104; public const int ARCHIVE_RECORDER_MAX_WRITE_TIME_TYPE_ID = 105; public const int ARCHIVE_RECORDER_TOTAL_WRITE_BYTES_TYPE_ID = 106; public const int ARCHIVE_RECORDER_TOTAL_WRITE_TIME_TYPE_ID = 107; public const int ARCHIVE_REPLAYER_MAX_READ_TIME_TYPE_ID = 108; public const int ARCHIVE_REPLAYER_TOTAL_READ_BYTES_TYPE_ID = 109; public const int ARCHIVE_REPLAYER_TOTAL_READ_TIME_TYPE_ID = 110; public const int ARCHIVE_RECORDING_SESSION_COUNT_TYPE_ID = 111; public const int ARCHIVE_REPLAY_SESSION_COUNT_TYPE_ID = 112; public const int ARCHIVE_CONTROL_SESSION_TYPE_ID = 113; public const int CLUSTER_CONSENSUS_MODULE_STATE_TYPE_ID = 200; public const int CLUSTER_NODE_ROLE_TYPE_ID = 201; public const int CLUSTER_CONTROL_TOGGLE_TYPE_ID = 202; public const int CLUSTER_COMMIT_POSITION_TYPE_ID = 203; public const int CLUSTER_RECOVERY_STATE_TYPE_ID = 204; public const int CLUSTER_SNAPSHOT_COUNTER_TYPE_ID = 205; public const int CLUSTER_ELECTION_STATE_TYPE_ID = 207; public const int CLUSTER_BACKUP_STATE_TYPE_ID = 208; public const int CLUSTER_BACKUP_LIVE_LOG_POSITION_TYPE_ID = 209; public const int CLUSTER_BACKUP_QUERY_DEADLINE_TYPE_ID = 210; public const int CLUSTER_BACKUP_ERROR_COUNT_TYPE_ID = 211; public const int CLUSTER_CONSENSUS_MODULE_ERROR_COUNT_TYPE_ID = 212; public const int CLUSTER_CLIENT_TIMEOUT_COUNT_TYPE_ID = 213; public const int CLUSTER_INVALID_REQUEST_COUNT_TYPE_ID = 214; public const int CLUSTER_CLUSTERED_SERVICE_ERROR_COUNT_TYPE_ID = 215; public const int CLUSTER_MAX_CYCLE_TIME_TYPE_ID = 216; public const int CLUSTER_CYCLE_TIME_THRESHOLD_EXCEEDED_TYPE_ID = 217; public const int CLUSTER_CLUSTERED_SERVICE_MAX_CYCLE_TIME_TYPE_ID = 218; public const int CLUSTER_CLUSTERED_SERVICE_CYCLE_TIME_THRESHOLD_EXCEEDED_TYPE_ID = 219; public const int CLUSTER_STANDBY_STATE_TYPE_ID = 220; public const int CLUSTER_STANDBY_ERROR_COUNT_TYPE_ID = 221; public const int CLUSTER_STANDBY_HEARTBEAT_RESPONSE_COUNT_TYPE_ID = 222; public const int CLUSTER_STANDBY_CONTROL_TOGGLE_TYPE_ID = 223; public const int TRANSITION_MODULE_STATE_TYPE_ID = 224; public const int TRANSITION_MODULE_CONTROL_TOGGLE_TYPE_ID = 225; public const int TRANSITION_MODULE_ERROR_COUNT_TYPE_ID = 226; public const int CLUSTER_STANDBY_MAX_CYCLE_TIME_TYPE_ID = 227; public const int CLUSTER_STANDBY_CYCLE_TIME_THRESHOLD_EXCEEDED_TYPE_ID = 228; public const int TRANSITION_MODULE_MAX_CYCLE_TIME_TYPE_ID = 229; public const int TRANSITION_MODULE_CYCLE_TIME_THRESHOLD_EXCEEDED_TYPE_ID = 230; public const int CLUSTER_STANDBY_SOURCE_MEMBER_ID_TYPE_ID = 231; public const int CLUSTER_STANDBY_SNAPSHOT_COUNTER_TYPE_ID = 232; public const int NODE_CONTROL_TOGGLE_TYPE_ID = 233; public const int CLUSTER_TOTAL_MAX_SNAPSHOT_DURATION_TYPE_ID = 234; public const int CLUSTER_TOTAL_SNAPSHOT_DURATION_THRESHOLD_EXCEEDED_TYPE_ID = 235; public const int CLUSTERED_SERVICE_MAX_SNAPSHOT_DURATION_TYPE_ID = 236; public const int CLUSTERED_SERVICE_SNAPSHOT_DURATION_THRESHOLD_EXCEEDED_TYPE_ID = 237; public const int CLUSTER_ELECTION_COUNT_TYPE_ID = 238; public const int CLUSTER_LEADERSHIP_TERM_ID_TYPE_ID = 239; public const int CLUSTER_BACKUP_SNAPSHOT_RETRIEVE_COUNT_TYPE_ID = 240; public const int CLUSTER_SESSION_TYPE_ID = 241; public const int SEQUENCER_INDEX_COUNTER_TYPE_ID = 500; public const int SEQUENCER_GROUP_HWM_COUNTER_TYPE_ID = 501; public const int SEQUENCER_SESSION_GREATEST_MESSAGE_ID_COUNTER_TYPE_ID = 502; public const int SEQUENCER_SESSION_MESSAGES_COUNTER_TYPE_ID = 503; public const int SEQUENCER_SESSION_GREATEST_MESSAGE_TIMESTAMP_COUNTER_TYPE_ID = 504; public const int SEQUENCER_CLIENT_SNAPSHOT_ID_COUNTER_TYPE_ID = 505; public const int SEQUENCER_APPLICATION_SEQUENCE_INDEX_COUNTER_TYPE_ID = 507; public const int SEQUENCER_APPLICATION_STATE_COUNTER_TYPE_ID = 508; public const int SEQUENCER_APPLICATION_ERROR_COUNT_TYPE_ID = 509; public const int SEQUENCER_APPLICATION_MAX_SERVICE_TIME_TYPE_ID = 510; public const int SEQUENCER_APPLICATION_SERVICE_TIME_THRESHOLD_EXCEEDED_COUNT_TYPE_ID = 511; public const int SEQUENCER_APPLICATION_INTERVAL_SERVICE_TIME_TYPE_ID = 512; public const int SEQUENCER_APPLICATION_INTERVAL_MAX_SERVICE_TIME_TYPE_ID = 513; public const int SEQUENCER_APPLICATION_INTERVAL_TOTAL_INVOCATIONS_TYPE_ID = 514; public const int SEQUENCER_APPLICATION_SNAPSHOT_LOAD_TIME_TYPE_ID = 515; public const int SEQUENCER_APPLICATION_SNAPSHOT_STORE_TIME_TYPE_ID = 516; public const int SEQUENCER_APPLICATION_TAKE_SNAPSHOT_FAILURES_TYPE_ID = 517; public const int SEQUENCER_APPLICATION_TAKE_SNAPSHOT_COUNT_TYPE_ID = 518; public const int SEQUENCER_APPLICATION_SESSION_ID_TYPE_ID = 519; public const int SEQUENCER_REPLAY_INDEX_MIN_SEQUENCE_INDEX_COUNTER_TYPE_ID = 520; public const int SEQUENCER_REPLAY_INDEX_MIN_SEQUENCE_LOG_POSITION_COUNTER_TYPE_ID = 521; public const int SEQUENCER_REPLAY_INDEX_MAX_SEQUENCE_INDEX_COUNTER_TYPE_ID = 522; public const int SEQUENCER_REPLAY_INDEX_MAX_SEQUENCE_LOG_POSITION_COUNTER_TYPE_ID = 523; public const int SEQUENCER_REPLAY_INDEX_INITIAL_SEQUENCE_INDEX_COUNTER_TYPE_ID = 524; public const int SEQUENCER_REPLAY_INDEX_INITIAL_SEQUENCE_LOG_POSITION_COUNTER_TYPE_ID = 525; public static void ValidateCounterTypeId(CountersReader countersReader, int counterId, int expectedCounterTypeId) { int counterTypeId = countersReader.GetCounterTypeId(counterId); if (expectedCounterTypeId != counterTypeId) { throw new ConfigurationException("The type for counterId=" + counterId + ", typeId=" + counterTypeId + " does not match the expected=" + expectedCounterTypeId); } } public static void ValidateCounterTypeId(Aeron aeron, Counter counter, int expectedCounterTypeId) { ValidateCounterTypeId(aeron.CountersReader, ((AtomicCounter)counter).Id, expectedCounterTypeId); } public static int AppendVersionInfo(IMutableDirectBuffer tempBuffer, int offset, string fullVersion) { int num = tempBuffer.PutStringWithoutLengthAscii(offset, " "); return num + tempBuffer.PutStringWithoutLengthAscii(offset + num, FormatVersionInfo(fullVersion)); } public static int AppendToLabel(IAtomicBuffer metaDataBuffer, int counterId, string value) { if (metaDataBuffer == null) { throw new ArgumentNullException("metaDataBuffer"); } ValidateCounterId(metaDataBuffer, counterId); int num = CountersReader.MetaDataOffset(counterId); int intVolatile = metaDataBuffer.GetIntVolatile(num); if (1 != intVolatile) { throw new ArgumentException("counter id " + counterId + " is not allocated, state: " + intVolatile); } int @int = ((IDirectBuffer)metaDataBuffer).GetInt(num + CountersReader.LABEL_OFFSET); int num2 = CountersReader.MAX_LABEL_LENGTH - @int; int num3 = ((IMutableDirectBuffer)metaDataBuffer).PutStringWithoutLengthAscii(num + CountersReader.LABEL_OFFSET + 4 + @int, value, 0, num2); if (num3 > 0) { metaDataBuffer.PutIntRelease(num + CountersReader.LABEL_OFFSET, @int + num3); } return num3; } public static string FormatVersionInfo(string fullVersion) { return "version=" + fullVersion; } private static void ValidateCounterId(IAtomicBuffer metaDataBuffer, int counterId) { if (counterId < 0) { throw new ArgumentException("counter id " + counterId + " is negative"); } int num = ((IDirectBuffer)metaDataBuffer).Capacity / CountersReader.METADATA_LENGTH - 1; if (counterId > num) { throw new ArgumentException("counter id " + counterId + " out of range: 0 - maxCounterId=" + num); } } } public class AeronThrowHelper { [MethodImpl(MethodImplOptions.NoInlining)] public static void ThrowAeronException(string message) { throw GetAeronException(message); } [MethodImpl(MethodImplOptions.NoInlining)] private static AeronException GetAeronException(string message) { return new AeronException(message); } } public class AeronVersion { public const string VERSION = "1.43.0"; public const int MAJOR_VERSION = 1; public const int MINOR_VERSION = 43; public const int PATCH_VERSION = 0; } public delegate void AvailableCounterHandler(CountersReader countersReader, long registrationId, int counterId); public delegate void AvailableImageHandler(Image image); public sealed class BufferBuilder { internal const int MAX_CAPACITY = 2147483639; internal const int INIT_MIN_CAPACITY = 4096; private int _limit; private int _nextTermOffset = -1; private readonly UnsafeBuffer _buffer = new UnsafeBuffer(); private readonly UnsafeBuffer headerBuffer = new UnsafeBuffer(); private readonly Header completeHeader = new Header(0, 0); public BufferBuilder() : this(0) { } public BufferBuilder(int initialCapacity) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Expected O, but got Unknown if (initialCapacity < 0 || initialCapacity > 2147483639) { throw new ArgumentException("initialCapacity outside range 0 - " + 2147483639 + ": initialCapacity=" + initialCapacity); } if (initialCapacity > 0) { _buffer.Wrap(new byte[initialCapacity]); } headerBuffer.Wrap(new byte[32]); } public int Capacity() { return _buffer.Capacity; } public int Limit() { return _limit; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Limit(int limit) { if (limit < 0 || limit >= _buffer.Capacity) { ThrowHelper.ThrowArgumentException($"limit outside range: capacity={_buffer.Capacity:D} limit={limit:D}"); } _limit = limit; } public int NextTermOffset() { return _nextTermOffset; } public void NextTermOffset(int offset) { _nextTermOffset = offset; } public IMutableDirectBuffer Buffer() { return (IMutableDirectBuffer)(object)_buffer; } public BufferBuilder Reset() { _limit = 0; _nextTermOffset = -1; completeHeader.Context = null; completeHeader.FragmentedFrameLength = -1; return this; } public BufferBuilder Compact() { int num = Math.Max(4096, _limit); if (num < _buffer.Capacity) { Resize(num); } return this; } public BufferBuilder Append(IDirectBuffer srcBuffer, int srcOffset, int length) { EnsureCapacity(length); srcBuffer.GetBytes(srcOffset, (IMutableDirectBuffer)(object)_buffer, _limit, length); _limit += length; return this; } public BufferBuilder CaptureHeader(Header header) { completeHeader.InitialTermId = header.InitialTermId; completeHeader.PositionBitsToShift = header.PositionBitsToShift; completeHeader.Offset = 0; completeHeader.Buffer = (IDirectBuffer)(object)headerBuffer; headerBuffer.PutBytes(0, header.Buffer, header.Offset, 32); return this; } public Header CompleteHeader(Header header) { int @int = headerBuffer.GetInt(0, (ByteOrder)1); int fragmentedFrameLength = LogBufferDescriptor.ComputeFragmentedFrameLength(_limit, @int - 32); completeHeader.Context = header.Context; completeHeader.FragmentedFrameLength = fragmentedFrameLength; headerBuffer.PutInt(0, 32 + _limit, (ByteOrder)1); headerBuffer.PutByte(5, (byte)(headerBuffer.GetByte(5) | header.Flags)); return completeHeader; } private void EnsureCapacity(int additionalLength) { long num = (long)_limit + (long)additionalLength; int capacity = _buffer.Capacity; if (num > capacity) { if (num > 2147483639) { throw new InvalidOperationException("insufficient capacity: maxCapacity=" + 2147483639 + " limit=" + _limit + " additionalLength=" + additionalLength); } Resize(FindSuitableCapacity(capacity, num)); } } private void Resize(int newCapacity) { _buffer.Wrap(CopyOf(_buffer.ByteArray, newCapacity)); } private static T[] CopyOf<T>(T[] original, int newLength) { T[] array = new T[newLength]; Array.Copy(original, 0, array, 0, Math.Min(original.Length, newLength)); return array; } internal static int FindSuitableCapacity(int capacity, long requiredCapacity) { long num = Math.Max(capacity, 4096); while (num < requiredCapacity) { num += num >> 1; if (num > 2147483639) { num = 2147483639L; break; } } return (int)num; } } public sealed class ChannelUri { private enum State { MEDIA, PARAMS_KEY, PARAMS_VALUE } public const string AERON_SCHEME = "aeron"; public const string SPY_QUALIFIER = "aeron-spy"; public const long INVALID_TAG = -1L; public const int MAX_URI_LENGTH = 4095; private const int CHANNEL_TAG_INDEX = 0; private const int ENTITY_TAG_INDEX = 1; private static readonly string AERON_PREFIX = "aeron:"; private string _prefix; private string _media; private readonly Map<string, string> _params; private readonly string[] _tags; public bool IsUdp => "udp".Equals(_media); public bool IsIpc => "ipc".Equals(_media); public ChannelUri(string prefix, string media, Map<string, string> @params) { _prefix = prefix; _media = media; _params = @params; _tags = SplitTags(_params.Get("tags")); } public string Prefix() { return _prefix; } public ChannelUri Prefix(string prefix) { _prefix = prefix; return this; } public string Media() { return _media; } public ChannelUri Media(string media) { ValidateMedia(media); _media = media; return this; } public string Scheme() { return "aeron"; } public string Get(string key) { return _params.Get(key); } public string Get(string key, string defaultValue) { string text = _params.Get(key); if (text != null) { return text; } return defaultValue; } public string Put(string key, string value) { return _params.Put(key, value); } public string Remove(string key) { return _params.Remove(key); } public bool ContainsKey(string key) { return _params.ContainsKey(key); } public string ChannelTag() { if (_tags == null || _tags.Length == 0) { return null; } return _tags[0]; } public string EntityTag() { if (_tags.Length <= 1) { return null; } return _tags[1]; } private bool Equals(ChannelUri other) { if (_prefix == other._prefix && _media == other._media && object.Equals(_params, other._params)) { return object.Equals(_tags, other._tags); } return false; } public override bool Equals(object obj) { if (this == obj) { return true; } if (!(obj is ChannelUri channelUri)) { return false; } if (object.Equals(_prefix, channelUri._prefix) && object.Equals(_media, channelUri._media) && object.Equals(_params, channelUri._params)) { return object.Equals(_tags, channelUri._tags); } return false; } public override int GetHashCode() { return (((((((_prefix != null) ? _prefix.GetHashCode() : 0) * 397) ^ ((_media != null) ? _media.GetHashCode() : 0)) * 397) ^ ((_params != null) ? ((object)_params).GetHashCode() : 0)) * 397) ^ ((_tags != null) ? _tags.GetHashCode() : 0); } public override string ToString() { StringBuilder stringBuilder; if (_prefix == null || string.IsNullOrEmpty(_prefix)) { stringBuilder = new StringBuilder(_params.Count * 20 + 10); } else { stringBuilder = new StringBuilder(_params.Count * 20 + 20); stringBuilder.Append(_prefix); if (!_prefix.EndsWith(":")) { stringBuilder.Append(":"); } } stringBuilder.Append(AERON_PREFIX).Append(_media); if (_params.Count > 0) { stringBuilder.Append('?'); foreach (KeyValuePair<string, string> param in _params) { stringBuilder.Append(param.Key).Append('=').Append(param.Value) .Append('|'); } stringBuilder.Length--; } return stringBuilder.ToString(); } public void InitialPosition(long position, int initialTermId, int termLength) { if (position < 0 || (position & 0x1F) != 0L) { throw new ArgumentException("invalid position: " + position); } int positionBitsToShift = LogBufferDescriptor.PositionBitsToShift(termLength); int num = LogBufferDescriptor.ComputeTermIdFromPosition(position, positionBitsToShift, initialTermId); int num2 = (int)(position & (termLength - 1)); Put("init-term-id", Convert.ToString(initialTermId)); Put("term-id", Convert.ToString(num)); Put("term-offset", Convert.ToString(num2)); Put("term-length", Convert.ToString(termLength)); } public static ChannelUri Parse(string uri) { int length = uri.Length; if (length > 4095) { throw new ArgumentException("URI length (" + length + ") exceeds max supported length (" + 4095 + "): " + uri.Substring(0, 4095)); } int num = 0; string prefix; if (StartsWith(uri, 0, "aeron-spy:")) { prefix = "aeron-spy"; num = "aeron-spy:".Length; } else { prefix = ""; } if (!StartsWith(uri, num, AERON_PREFIX)) { throw new ArgumentException("Aeron URIs must start with 'aeron:', found: " + uri); } num += AERON_PREFIX.Length; StringBuilder stringBuilder = new StringBuilder(); Map<string, string> val = new Map<string, string>((string)null); string media = null; string text = null; State state = State.MEDIA; for (int i = num; i < length; i++) { char c = uri[i]; switch (state) { case State.MEDIA: switch (c) { case '?': media = stringBuilder.ToString(); stringBuilder.Length = 0; state = State.PARAMS_KEY; break; case ':': case '=': case '|': throw new ArgumentException("encountered '" + c + "' within media definition at index " + i + " in " + uri); default: stringBuilder.Append(c); break; } break; case State.PARAMS_KEY: switch (c) { case '=': if (stringBuilder.Length == 0) { throw new ArgumentException("empty key not allowed at index " + i + " in " + uri); } text = stringBuilder.ToString(); stringBuilder.Length = 0; state = State.PARAMS_VALUE; break; case '|': throw new ArgumentException("invalid end of key at index " + i + " in " + uri); default: stringBuilder.Append(c); break; } break; case State.PARAMS_VALUE: if (c == '|') { val.Put(text, stringBuilder.ToString()); stringBuilder.Length = 0; state = State.PARAMS_KEY; } else { stringBuilder.Append(c); } break; default: throw new ArgumentException("unexpected state=" + state.ToString() + " in " + uri); } } switch (state) { case State.MEDIA: media = stringBuilder.ToString(); ValidateMedia(media); break; case State.PARAMS_VALUE: val.Put(text, stringBuilder.ToString()); break; default: throw new ArgumentException("no more input found, state=" + state.ToString() + " in " + uri); } return new ChannelUri(prefix, media, val); } public static string AddSessionId(string channel, int sessionId) { ChannelUri channelUri = Parse(channel); channelUri.Put("session-id", Convert.ToString(sessionId)); return channelUri.ToString(); } public static string AddAliasIfAbsent(string uri, string alias) { if (!string.IsNullOrEmpty(alias)) { ChannelUri channelUri = Parse(uri); if (!channelUri.ContainsKey("alias")) { channelUri.Put("alias", alias); return channelUri.ToString(); } } return uri; } public static bool IsTagged(string paramValue) { return StartsWith(paramValue, 0, "tag:"); } public static long GetTag(string paramValue) { if (!IsTagged(paramValue)) { return -1L; } return long.Parse(paramValue.Substring(4, paramValue.Length - 4)); } public static string CreateDestinationUri(string channel, string endpoint) { ChannelUri channelUri = Parse(channel); string text = AERON_PREFIX + channelUri.Media() + "?endpoint=" + endpoint; string text2 = channelUri.Get("interface"); if (text2 != null) { return text + "|interface=" + text2; } return text; } public void ReplaceEndpointWildcardPort(string resolvedEndpoint) { if (resolvedEndpoint == null) { throw new ArgumentNullException("resolvedEndpoint", "resolvedEndpoint is null"); } int num = resolvedEndpoint.LastIndexOf(':'); if (-1 == num) { throw new ArgumentException("No port specified on resolvedEndpoint=" + resolvedEndpoint); } if (resolvedEndpoint.EndsWith(":0", StringComparison.Ordinal)) { throw new ArgumentException("Wildcard port specified on resolvedEndpoint=" + resolvedEndpoint); } string text = Get("endpoint"); if (text == null) { Put("endpoint", resolvedEndpoint); } else if (text.EndsWith(":0", StringComparison.Ordinal)) { string value = text.Substring(0, text.Length - 2) + resolvedEndpoint.Substring(resolvedEndpoint.LastIndexOf(':')); Put("endpoint", value); } } public void ForEachParameter(Action<string, string> consumer) { _params.ForEach(consumer); } public bool HasControlModeResponse() { return "response".Equals(Get("control-mode")); } public static bool IsControlModeResponse(string channelUri) { return Parse(channelUri).HasControlModeResponse(); } private static void ValidateMedia(string media) { if ("ipc".Equals(media) || "udp".Equals(media)) { return; } throw new ArgumentException("unknown media: " + media); } private static bool StartsWith(string input, int position, string prefix) { if (input.Length - position < prefix.Length) { return false; } for (int i = 0; i < prefix.Length; i++) { if (input[position + i] != prefix[i]) { return false; } } return true; } private static string[] SplitTags(string tagsValue) { string[] array = ArrayUtil.EMPTY_STRING_ARRAY; if (tagsValue != null) { int num = CountTags(tagsValue); if (num == 1) { array = new string[1] { tagsValue }; } else { int num2 = 0; int num3 = 0; array = new string[num]; int i = 0; for (int length = tagsValue.Length; i < length; i++) { if (tagsValue[i] == ',') { array[num3++] = tagsValue.Substring(num2, i - num2); num2 = i + 1; if (num3 >= num - 1) { array[num3] = tagsValue.Substring(num2, length - num2); } } } } } return array; } private static int CountTags(string tags) { int num = 1; int i = 0; for (int length = tags.Length; i < length; i++) { if (tags[i] == ',') { num++; } } return num; } } public sealed class ChannelUriStringBuilder { public const string TAG_PREFIX = "tag:"; private readonly StringBuilder _sb = new StringBuilder(64); private string _prefix; private string _media; private string _endpoint; private string _networkInterface; private string _controlEndpoint; private string _controlMode; private string _tags; private string _alias; private string _cc; private string _fc; private string _mediaReceiveTimestampOffset; private string _channelReceiveTimestampOffset; private string _channelSendTimestampOffset; private string _responseCorrelationId; private string _responseEndpoint; private bool? _reliable; private bool? _sparse; private bool? _eos; private bool? _tether; private bool? _group; private bool? _rejoin; private bool? _ssc; private int? _ttl; private int? _mtu; private int? _termLength; private int? _initialTermId; private int? _termId; private int? _termOffset; private int? _socketSndbufLength; private int? _socketRcvbufLength; private int? _receiverWindowLength; private int? _maxResend; private int? _streamId; private int? _publicationWindowLength; private long? _sessionId; private long? _groupTag; private long? _linger; private long? nakDelay; private long? _untetheredWindowLimitTimeoutNs; private long? _untetheredLingerTimeoutNs; private long? untetheredRestingTimeoutNs; private bool _isSessionIdTagged; public ChannelUriStringBuilder() { } public ChannelUriStringBuilder(string initialUri) : this(ChannelUri.Parse(initialUri)) { } public ChannelUriStringBuilder(ChannelUri channelUri) { _isSessionIdTagged = false; Prefix(channelUri); Media(channelUri); Endpoint(channelUri); NetworkInterface(channelUri); ControlEndpoint(channelUri); ControlMode(channelUri); Tags(channelUri); Alias(channelUri); CongestionControl(channelUri); FlowControl(channelUri); Reliable(channelUri); Ttl(channelUri); Mtu(channelUri); TermLength(channelUri); InitialTermId(channelUri); TermId(channelUri); TermOffset(channelUri); SessionId(channelUri); Group(channelUri); Linger(channelUri); Sparse(channelUri); Eos(channelUri); Tether(channelUri); GroupTag(channelUri); Rejoin(channelUri); SpiesSimulateConnection(channelUri); SocketRcvbufLength(channelUri); SocketSndbufLength(channelUri); ReceiverWindowLength(channelUri); MediaReceiveTimestampOffset(channelUri); ChannelReceiveTimestampOffset(channelUri); ChannelSendTimestampOffset(channelUri); ResponseEndpoint(channelUri); ResponseCorrelationId(channelUri); NakDelay(channelUri); UntetheredWindowLimitTimeout(channelUri); UntetheredLingerTimeout(channelUri); UntetheredRestingTimeout(channelUri); MaxResend(channelUri); StreamId(channelUri); PublicationWindowLength(channelUri); } public ChannelUriStringBuilder Clear() { _prefix = null; _media = null; _endpoint = null; _networkInterface = null; _controlEndpoint = null; _controlMode = null; _tags = null; _alias = null; _cc = null; _fc = null; _reliable = null; _ttl = null; _mtu = null; _termLength = null; _initialTermId = null; _termId = null; _termOffset = null; _sessionId = null; _groupTag = null; _linger = null; _sparse = null; _eos = null; _tether = null; _group = null; _rejoin = null; _isSessionIdTagged = false; _socketRcvbufLength = null; _socketSndbufLength = null; _receiverWindowLength = null; _mediaReceiveTimestampOffset = null; _channelReceiveTimestampOffset = null; _channelSendTimestampOffset = null; _responseEndpoint = null; _responseCorrelationId = null; _maxResend = null; _streamId = null; _publicationWindowLength = null; return this; } public ChannelUriStringBuilder Validate() { if (_media == null) { throw new ArgumentException("media type is mandatory"); } if ("udp".Equals(_media) && _endpoint == null && _controlEndpoint == null) { throw new ArgumentException("either 'endpoint' or 'control' must be specified for UDP."); } bool num = _initialTermId.HasValue || _termId.HasValue || _termOffset.HasValue; bool flag = !_initialTermId.HasValue || !_termId.HasValue || !_termOffset.HasValue; if (num) { if (flag) { throw new ArgumentException("either all or none of the parameters ['initialTermId', 'termId', 'termOffset'] must be provided"); } if (_termId - _initialTermId < 0) { int? termId = _termId; string? text = termId.ToString(); termId = _initialTermId; throw new ArgumentException("difference greater than 2^31 - 1: termId=" + text + " - initialTermId=" + termId); } if (_termLength.HasValue && _termOffset > _termLength) { int? termOffset = _termOffset; string? text2 = termOffset.ToString(); termOffset = _termLength; throw new ArgumentException("termOffset=" + text2 + " > termLength=" + termOffset); } } return this; } public ChannelUriStringBuilder Prefix(string prefix) { if (prefix != null && !string.IsNullOrEmpty(prefix) && !prefix.Equals("aeron-spy")) { throw new ArgumentException("invalid prefix: " + prefix); } _prefix = prefix; return this; } public ChannelUriStringBuilder Prefix(ChannelUri channelUri) { return Prefix(channelUri.Prefix()); } public string Prefix() { return _prefix; } public ChannelUriStringBuilder Media(string media) { if (!(media == "udp") && !(media == "ipc")) { throw new ArgumentException("invalid media: " + media); } _media = media; return this; } public ChannelUriStringBuilder Media(ChannelUri channelUri) { return Media(channelUri.Media()); } public string Media() { return _media; } public ChannelUriStringBuilder Endpoint(string endpoint) { _endpoint = endpoint; return this; } public ChannelUriStringBuilder Endpoint(ChannelUri channelUri) { return Endpoint(channelUri.Get("endpoint")); } public string Endpoint() { return _endpoint; } public ChannelUriStringBuilder NetworkInterface(string networkInterface) { _networkInterface = networkInterface; return this; } public ChannelUriStringBuilder NetworkInterface(ChannelUri channelUri) { return NetworkInterface(channelUri.Get("interface")); } public string NetworkInterface() { return _networkInterface; } public ChannelUriStringBuilder ControlEndpoint(string controlEndpoint) { _controlEndpoint = controlEndpoint; return this; } public ChannelUriStringBuilder ControlEndpoint(ChannelUri channelUri) { return ControlEndpoint(channelUri.Get("control")); } public string ControlEndpoint() { return _controlEndpoint; } public ChannelUriStringBuilder ControlMode(string controlMode) { if (controlMode != null && !controlMode.Equals("manual") && !controlMode.Equals("dynamic") && !controlMode.Equals("response")) { throw new ArgumentException("invalid control mode: " + controlMode); } _controlMode = controlMode; return this; } public ChannelUriStringBuilder ControlMode(ChannelUri channelUri) { return ControlMode(channelUri.Get("control-mode")); } public string ControlMode() { return _controlMode; } public ChannelUriStringBuilder Reliable(bool? isReliable) { _reliable = isReliable; return this; } public ChannelUriStringBuilder Reliable(ChannelUri channelUri) { string text = channelUri.Get("reliable"); if (text == null) { _reliable = null; return this; } return Reliable(Convert.ToBoolean(text)); } public bool? Reliable() { return _reliable; } public ChannelUriStringBuilder Ttl(int? ttl) { if (ttl.HasValue && (ttl < 0 || ttl > 255)) { int? num = ttl; throw new ArgumentException("TTL not in range 0-255: " + num); } _ttl = ttl; return this; } public ChannelUriStringBuilder Ttl(ChannelUri channelUri) { string text = channelUri.Get("ttl"); if (text == null) { _ttl = null; return this; } try { return Ttl(Convert.ToInt32(text)); } catch (FormatException innerException) { throw new ArgumentException("'ttl' must be a value integer", innerException); } } public int? Ttl() { return _ttl; } public ChannelUriStringBuilder Mtu(int? mtu) { if (mtu.HasValue) { if (mtu < 32 || mtu > 65504) { int? num = mtu; throw new ArgumentException("MTU not in range 32-65504: " + num); } if ((mtu & 0x1F) != 0) { int? num = mtu; throw new ArgumentException("MTU not a multiple of FRAME_ALIGNMENT: mtu=" + num); } } _mtu = mtu; return this; } public ChannelUriStringBuilder Mtu(ChannelUri channelUri) { string text = channelUri.Get("mtu"); if (text == null) { _mtu = null; return this; } long num = SystemUtil.ParseSize("mtu", text); if (num > int.MaxValue) { throw new InvalidOperationException("mtu " + num + " > " + int.MaxValue); } return Mtu((int)num); } public int? Mtu() { return _mtu; } public ChannelUriStringBuilder TermLength(int? termLength) { if (termLength.HasValue) { LogBufferDescriptor.CheckTermLength(termLength.Value); } _termLength = termLength; return this; } public ChannelUriStringBuilder TermLength(ChannelUri channelUri) { string text = channelUri.Get("term-length"); if (text == null) { _termLength = null; return this; } long num = SystemUtil.ParseSize("term-length", text); if (num > int.MaxValue) { string text2 = 1073741824.ToString(); int? termLength = _termLength; throw new ArgumentException("term length more than max length of " + text2 + ": length=" + termLength); } return TermLength((int)num); } public int? TermLength() { return _termLength; } public ChannelUriStringBuilder InitialTermId(int? initialTermId) { _initialTermId = initialTermId; return this; } public ChannelUriStringBuilder InitialTermId(ChannelUri channelUri) { string text = channelUri.Get("init-term-id"); if (text == null) { _initialTermId = null; return this; } try { return InitialTermId(Convert.ToInt32(text)); } catch (FormatException innerException) { throw new ArgumentException("'initial-term-id' must be a valid integer", innerException); } } public int? InitialTermId() { return _initialTermId; } public ChannelUriStringBuilder TermId(int? termId) { _termId = termId; return this; } public ChannelUriStringBuilder TermId(ChannelUri channelUri) { string text = channelUri.Get("term-id"); if (text == null) { _termId = null; return this; } try { return TermId(Convert.ToInt32(text)); } catch (FormatException innerException) { throw new ArgumentException("'term-id' must be a valid integer", innerException); } } public int? TermId() { return _termId; } public ChannelUriStringBuilder TermOffset(int? termOffset) { if (termOffset.HasValue) { if (termOffset < 0 || termOffset > 1073741824) { int? num = termOffset; throw new ArgumentException("term offset not in range 0-1g: " + num); } if (0 != (termOffset & 0x1F)) { int? num = termOffset; throw new ArgumentException("term offset not multiple of FRAME_ALIGNMENT: " + num); } } _termOffset = termOffset; return this; } public ChannelUriStringBuilder TermOffset(ChannelUri channelUri) { string text = channelUri.Get("term-offset"); if (text == null) { _termOffset = null; return this; } try { return TermOffset(Convert.ToInt32(text)); } catch (FormatException innerException) { throw new ArgumentException("'term-offset' must be a valid integer", innerException); } } public int? TermOffset() { return _termOffset; } public ChannelUriStringBuilder SessionId(int? sessionId) { _sessionId = sessionId; return this; } public ChannelUriStringBuilder SessionId(string sessionIdStr) { if (sessionIdStr != null) { if (ChannelUri.IsTagged(sessionIdStr)) { TaggedSessionId(ChannelUri.GetTag(sessionIdStr)); } else { IsSessionIdTagged(isSessionIdTagged: false); try { SessionId(Convert.ToInt32(sessionIdStr)); } catch (FormatException innerException) { throw new ArgumentException("'session-id' must be a valid integer", innerException); } } } else { SessionId((int?)null); } return this; } public ChannelUriStringBuilder TaggedSessionId(long? sessionId) { IsSessionIdTagged(isSessionIdTagged: true); _sessionId = sessionId; return this; } public ChannelUriStringBuilder SessionId(ChannelUri channelUri) { return SessionId(channelUri.Get("session-id")); } [Obsolete("this method will not correctly handle tagged sessionId values that are outside the range of")] public int? SessionId() { return (int?)_sessionId; } public ChannelUriStringBuilder Linger(long? lingerNs) { if (lingerNs.HasValue && lingerNs < 0) { long? num = lingerNs; throw new ArgumentException("linger value cannot be negative: " + num); } _linger = lingerNs; return this; } public ChannelUriStringBuilder Linger(ChannelUri channelUri) { string text = channelUri.Get("linger"); if (text == null) { _linger = null; return this; } return Linger(SystemUtil.ParseDuration("linger", text)); } public long? Linger() { return _linger; } public ChannelUriStringBuilder Sparse(bool? isSparse) { _sparse = isSparse; return this; } public ChannelUriStringBuilder Sparse(ChannelUri channelUri) { string text = channelUri.Get("sparse"); if (text == null) { _sparse = null; return this; } return Sparse(Convert.ToBoolean(text)); } public bool? Sparse() { return _sparse; } public ChannelUriStringBuilder Eos(bool? eos) { _eos = eos; return this; } public ChannelUriStringBuilder Eos(ChannelUri channelUri) { string text = channelUri.Get("eos"); if (text == null) { _eos = null; return this; } return Eos(Convert.ToBoolean(text)); } public bool? Eos() { return _eos; } public ChannelUriStringBuilder Tether(bool? tether) { _tether = tether; return this; } public ChannelUriStringBuilder Tether(ChannelUri channelUri) { string text = channelUri.Get("tether"); if (text == null) { _tether = null; return this; } return Tether(Convert.ToBoolean(text)); } public bool? Tether() { return _tether; } public ChannelUriStringBuilder Group(bool? group) { _group = group; return this; } public ChannelUriStringBuilder Group(ChannelUri channelUri) { string text = channelUri.Get("group"); if (text == null) { _group = null; return this; } return Group(Convert.ToBoolean(text)); } public bool? Group() { return _group; } public ChannelUriStringBuilder Tags(string tags) { _tags = tags; return this; } public ChannelUriStringBuilder Tags(ChannelUri channelUri) { return Tags(channelUri.Get("tags")); } public ChannelUriStringBuilder Tags(long? channelTag, long? pubSubTag) { if (!channelTag.HasValue && pubSubTag.HasValue) { throw new ArgumentException("null == channelTag && null != pubSubTag"); } if (!channelTag.HasValue) { return Tags((string)null); } long? num = channelTag; string? text = num.ToString(); object obj; if (!pubSubTag.HasValue) { obj = ""; } else { num = pubSubTag; obj = "," + num; } return Tags(text + (string?)obj); } public string Tags() { return _tags; } public ChannelUriStringBuilder IsSessionIdTagged(bool isSessionIdTagged) { _isSessionIdTagged = isSessionIdTagged; return this; } public bool IsSessionIdTagged() { return _isSessionIdTagged; } public ChannelUriStringBuilder Alias(string alias) { _alias = alias; return this; } public ChannelUriStringBuilder Alias(ChannelUri channelUri) { return Alias(channelUri.Get("alias")); } public string Alias() { return _alias; } public ChannelUriStringBuilder CongestionControl(string congestionControl) { _cc = congestionControl; return this; } public ChannelUriStringBuilder CongestionControl(ChannelUri channelUri) { return CongestionControl(channelUri.Get("cc")); } public string CongestionControl() { return _cc; } public ChannelUriStringBuilder FlowControl(string flowControl) { _fc = flowControl; return this; } public ChannelUriStringBuilder TaggedFlowControl(long? groupTag, int? minGroupSize, string timeout) { string text = "tagged"; if (groupTag.HasValue || minGroupSize.HasValue) { text += ",g:"; if (groupTag.HasValue) { string text2 = text; long? num = groupTag; text = text2 + num; } if (minGroupSize.HasValue) { string text3 = text; int? num2 = minGroupSize; text = text3 + "/" + num2; } } if (timeout != null) { text = text + ",t:" + timeout; } return FlowControl(text); } public ChannelUriStringBuilder MinFlowControl(int? minGroupSize, string timeout) { string text = "min"; if (minGroupSize.HasValue) { string text2 = text; int? num = minGroupSize; text = text2 + ",g:/" + num; } if (timeout != null) { text = text + ",t:" + timeout; } return FlowControl(text); } public ChannelUriStringBuilder FlowControl(ChannelUri channelUri) { return FlowControl(channelUri.Get("fc")); } public string FlowControl() { return _fc; } public ChannelUriStringBuilder GroupTag(long? groupTag) { _groupTag = groupTag; return this; } public ChannelUriStringBuilder GroupTag(ChannelUri channelUri) { string text = channelUri.Get("gtag"); if (text == null) { _groupTag = null; return this; } try { return GroupTag(Convert.ToInt64(text)); } catch (FormatException innerException) { throw new ArgumentException("'gtag# must be a valid long value", innerException); } } public long? GroupTag() { return _groupTag; } public ChannelUriStringBuilder Rejoin(bool? rejoin) { _rejoin = rejoin; return this; } public ChannelUriStringBuilder Rejoin(ChannelUri channelUri) { string text = channelUri.Get("rejoin"); if (text == null) { _rejoin = null; return this; } return Rejoin(Convert.ToBoolean(text)); } public bool? Rejoin() { return _rejoin; } public ChannelUriStringBuilder SpiesSimulateConnection(bool? spiesSimulateConnection) { _ssc = spiesSimulateConnection; return this; } public ChannelUriStringBuilder SpiesSimulateConnection(ChannelUri channelUri) { string text = channelUri.Get("ssc"); if (text == null) { _ssc = null; return this; } return SpiesSimulateConnection(Convert.ToBoolean(text)); } public bool? SpiesSimulateConnection() { return _ssc; } public ChannelUriStringBuilder InitialPosition(long position, int initialTermId, int termLength) { if (position < 0) { throw new ArgumentException("invalid position=" + position + " < 0"); } if ((position & 0x1F) != 0L) { throw new ArgumentException("invalid position=" + position + " does not have frame alignment=" + 32); } int positionBitsToShift = LogBufferDescriptor.PositionBitsToShift(termLength); _initialTermId = initialTermId; _termId = LogBufferDescriptor.ComputeTermIdFromPosition(position, positionBitsToShift, initialTermId); _termOffset = (int)(position & (termLength - 1)); _termLength = termLength; return this; } public ChannelUriStringBuilder SocketSndbufLength(int? socketSndbufLength) { _socketSndbufLength = socketSndbufLength; return this; } public ChannelUriStringBuilder SocketSndbufLength(ChannelUri channelUri) { string text = channelUri.Get("so-sndbuf"); if (text == null) { _socketSndbufLength = null; return this; } long num = SystemUtil.ParseSize("so-sndbuf", text); if (num > int.MaxValue) { throw new ArgumentException("value exceeds maximum permitted: value=" + num); } return SocketSndbufLength((int)num); } public int? SocketSndbufLength() { return _socketSndbufLength; } public ChannelUriStringBuilder SocketRcvbufLength(int? socketRcvbufLength) { _socketRcvbufLength = socketRcvbufLength; return this; } public ChannelUriStringBuilder SocketRcvbufLength(ChannelUri channelUri) { string text = channelUri.Get("so-rcvbuf"); if (text == null) { _socketRcvbufLength = null; return this; } long num = SystemUtil.ParseSize("so-rcvbuf", text); if (num > int.MaxValue) { throw new ArgumentException("value exceeds maximum permitted: value=" + num); } return SocketRcvbufLength((int)num); } public int? SocketRcvbufLength() { return _socketRcvbufLength; } public ChannelUriStringBuilder ReceiverWindowLength(int? receiverWindowLength) { _receiverWindowLength = receiverWindowLength; return this; } public ChannelUriStringBuilder ReceiverWindowLength(ChannelUri channelUri) { string text = channelUri.Get("rcv-wnd"); if (text == null) { _receiverWindowLength = null; return this; } long num = SystemUtil.ParseSize("rcv-wnd", text); if (num > int.MaxValue) { throw new ArgumentException("value exceeds maximum permitted: value=" + num); } return ReceiverWindowLength((int)num); } public int? ReceiverWindowLength() { return _receiverWindowLength; } public string MediaReceiveTimestampOffset() { return _mediaReceiveTimestampOffset; } public ChannelUriStringBuilder MediaReceiveTimestampOffset(string timestampOffset) { if (timestampOffset != null && !"reserved".Equals(timestampOffset)) { try { int.Parse(timestampOffset); } catch (FormatException) { throw new ArgumentException("mediaReceiveTimestampOffset must be a number or the value 'reserved' found: " + timestampOffset); } } _mediaReceiveTimestampOffset = timestampOffset; return this; } public ChannelUriStringBuilder MediaReceiveTimestampOffset(ChannelUri channelUri) { return MediaReceiveTimestampOffset(channelUri.Get("media-rcv-ts-offset")); } public string ChannelReceiveTimestampOffset() { return _channelReceiveTimestampOffset; } public ChannelUriStringBuilder ChannelReceiveTimestampOffset(string timestampOffset) { if (timestampOffset != null && !"reserved".Equals(timestampOffset)) { try { int.Parse(timestampOffset); } catch (FormatException) { throw new ArgumentException("channelReceiveTimestampOffset must be a number or the value 'reserved' found: " + timestampOffset); } } _channelReceiveTimestampOffset = timestampOffset; return this; } public ChannelUriStringBuilder ChannelReceiveTimestampOffset(ChannelUri channelUri) { return ChannelReceiveTimestampOffset(channelUri.Get("channel-rcv-ts-offset")); } public ChannelUriStringBuilder ChannelSendTimestampOffset(string timestampOffset) { if (timestampOffset != null && !"reserved".Equals(timestampOffset)) { try { int.Parse(timestampOffset); } catch (FormatException) { throw new ArgumentException("channelSendTimestampOffset must be a number or the value 'reserved' found: " + timestampOffset); } } _channelSendTimestampOffset = timestampOffset; return this; } public ChannelUriStringBuilder ChannelSendTimestampOffset(ChannelUri channelUri) { return ChannelSendTimestampOffset(channelUri.Get("channel-snd-ts-offset")); } public string ChannelSendTimestampOffset() { return _channelSendTimestampOffset; } public ChannelUriStringBuilder ResponseEndpoint(string responseEndpoint) { _responseEndpoint = responseEndpoint; return this; } public ChannelUriStringBuilder ResponseEndpoint(ChannelUri channelUri) { return ResponseEndpoint(channelUri.Get("response-endpoint")); } public string ResponseEndpoint() { return _responseEndpoint; } public string ResponseCorrelationId() { return _responseCorrelationId; } public ChannelUriStringBuilder ResponseCorrelationId(long? responseCorrelationId) { _responseCorrelationId = Convert.ToString(responseCorrelationId); return this; } public ChannelUriStringBuilder ResponseCorrelationId(string responseCorrelationId) { if (responseCorrelationId != null && !"prototype".Equals(responseCorrelationId)) { try { if (long.Parse(responseCorrelationId) < -1) { throw new FormatException("responseCorrelationId must be positive"); } } catch (FormatException) { throw new ArgumentException("responseCorrelationId must be a number greater than or equal to -1, or the value 'prototype' found: " + responseCorrelationId); } } _responseCorrelationId = responseCorrelationId; return this; } public ChannelUriStringBuilder ResponseCorrelationId(ChannelUri channelUri) { string text = channelUri.Get("response-correlation-id"); if (text != null) { ResponseCorrelationId(text); } return this; } public ChannelUriStringBuilder NakDelay(string nakDelay) { if (this.nakDelay.HasValue) { this.nakDelay = SystemUtil.ParseDuration("nak-delay", nakDelay); } else { this.nakDelay = null; } return this; } pu