private void InitProtocol(ISession session, string protocolCode, int version, bool addCapabilities = false) { if (session.State < SessionState.Initialized) { throw new InvalidOperationException($"{nameof(InitProtocol)} called on {session}"); } if (session.State != SessionState.Initialized) { return; } string code = protocolCode.ToLowerInvariant(); if (!_protocolFactories.TryGetValue(code, out Func <ISession, int, IProtocolHandler> protocolFactory)) { throw new NotSupportedException($"Protocol {code} {version} is not supported"); } IProtocolHandler protocolHandler = protocolFactory(session, version); protocolHandler.SubprotocolRequested += (s, e) => InitProtocol(session, e.ProtocolCode, e.Version); session.AddProtocolHandler(protocolHandler); if (addCapabilities) { foreach (Capability capability in _capabilities) { session.AddSupportedCapability(capability); } } protocolHandler.Init(); }