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);
}
}
}