using System; using System.Collections.Generic; namespace FishNet.Transporting.Bayou { public abstract class CommonSocket { #region Public. /// /// Current ConnectionState. /// private LocalConnectionState _connectionState = LocalConnectionState.Stopped; /// /// Returns the current ConnectionState. /// /// internal LocalConnectionState GetConnectionState() { return _connectionState; } /// /// Sets a new connection state. /// /// protected void SetConnectionState(LocalConnectionState connectionState, bool asServer) { //If state hasn't changed. if (connectionState == _connectionState) return; _connectionState = connectionState; if (asServer) Transport.HandleServerConnectionState(new ServerConnectionStateArgs(connectionState, Transport.Index)); else Transport.HandleClientConnectionState(new ClientConnectionStateArgs(connectionState, Transport.Index)); } #endregion #region Protected. /// /// Transport controlling this socket. /// protected Transport Transport = null; #endregion /// /// Sends data to connectionId. /// internal void Send(ref Queue queue, byte channelId, ArraySegment segment, int connectionId) { if (GetConnectionState() != LocalConnectionState.Started) return; //ConnectionId isn't used from client to server. Packet outgoing = new Packet(connectionId, segment, channelId); queue.Enqueue(outgoing); } /// /// Clears a queue using Packet type. /// /// internal void ClearPacketQueue(ref Queue queue) { int count = queue.Count; for (int i = 0; i < count; i++) { Packet p = queue.Dequeue(); p.Dispose(); } } /// /// Adds channel to the end of the data. /// internal void AddChannel(ref Packet packet) { int writePosition = packet.Length; packet.AddLength(1); packet.Data[writePosition] = (byte)packet.Channel; } /// /// Removes the channel, outputting it and returning a new ArraySegment. /// internal ArraySegment RemoveChannel(ArraySegment segment, out Channel channel) { byte[] array = segment.Array; int count = segment.Count; channel = (Channel)array[count - 1]; return new ArraySegment(array, 0, count - 1); } } }