public void TestConnectionCanOnlyAttachSingleUDP() { AvatarConnection conn = new AvatarConnection(new AgentCircuitData(), EstablishedBy.Login); conn.AttachUdpCircuit(new MockClientAPI()); Assert.Throws<AttachUdpCircuitException>(() => conn.AttachUdpCircuit(new MockClientAPI())); }
/// <summary> /// Handler for connection termination /// </summary> /// <param name="conn"></param> private void conn_OnConnectionTerminated(AvatarConnection conn) { lock (_connectionsByUserId) { _connectionsByUserId.Remove(conn.CircuitData.AgentID); if (conn.UdpCircuit != null) { _connectionsByEndpoint.Remove(conn.UdpCircuit.RemoteEndPoint); } } }
/// <summary> /// Creates a new connection for the given circuit. If a connection already exists for the user, /// an exception is thrown /// </summary> /// <param name="circuitData">Circuit data describing the inbound connection</param> /// <returns>A new connection object</returns> /// <exception cref="ConnectionAlreadyEstablishedException">If the user is already connected</exception> public AvatarConnection NewConnection(AgentCircuitData circuitData, EstablishedBy reason) { AvatarConnection conn; lock (_connectionsByUserId) { if (_connectionsByUserId.TryGetValue(circuitData.AgentID, out conn)) { throw new ConnectionAlreadyEstablishedException(String.Format("Connection for user {0} is already established", circuitData.AgentID), conn); } else { conn = new AvatarConnection(circuitData, reason); conn.OnConnectionTerminated += conn_OnConnectionTerminated; _connectionsByUserId[circuitData.AgentID] = conn; } } ICapsControl capsControl = _capsModule.CreateCaps(circuitData.AgentID, circuitData.CapsPath); conn.SetCapsControl(capsControl); return(conn); }
public ConnectionAlreadyEstablishedException(string message, Exception innerException, AvatarConnection conn) : base(message, innerException) { _connection = conn; }