private void _HandleMessages(object client)
{
try
{
var c = client as TcpClient;
var stream = c.GetStream();
while (true)
{
//Get message prefixed with 4-byte length field
var length = new byte[4];
int bytesRead = stream.Read(length, 0, 4);
if (bytesRead <= 0)
break; //Fall over and die if we get something weird
ulong l = (ulong)((ulong)length[0] | (ulong)((ulong)(length[1] << 8) & 0xFF00) |
(ulong)((ulong)(length[2] << 16) & 0xFF0000) | (ulong)((length[3] << 24) & 0xFF000000));
var buffer = new byte[l];
stream.Read(buffer, 0, (int)l);
//Handle message
switch (buffer[0])
{
case (byte)'I':
{
//Incoming ACL data from the other PC/device received
Logger.WriteLine("Network: Received ACL data: " + BitConverter.ToString(buffer, 1, buffer.Length - 1));
//Change the connection handle to our adapter's
buffer[1] = (byte)(_currentConnectionHandle & 0xFF);
byte temp = (byte)(buffer[2] & 0xF0);
buffer[2] = (byte)((byte)((_currentConnectionHandle >> 8) & 0xFF) | (byte)temp);
//Send it on
Logger.WriteLine("Sending ACL data: " + BitConverter.ToString(buffer, 1, buffer.Length - 1));
Properties.Adapter.SendACLData(buffer, 1, buffer.Length - 1);
break;
}
case (byte)'C':
{
//The other PC/device completed connecting
ushort connectionHandle = (ushort)(buffer[4] | (buffer[5] << 8));
ulong bdAddr = Utilities.GetLEULong(buffer, 6, 6);
//We only care if the device we're emulating has completed connecting
if (bdAddr == Properties.EmulatedConfiguration.BDAddr)
{
Logger.WriteLine("Network: Received connection complete");
//Accept this connection request
Properties.Adapter.AcceptConnectionRequest(Properties.RealConfiguration.BDAddr, 0x01);
}
break;
}
case (byte)'R':
{
//The other PC/device received a connection request
Logger.WriteLine("Network: Received connection request");
//We must now establish the connection on our end
Properties.Adapter.Connect(Properties.RealConfiguration.BDAddr,
Properties.RealConfiguration.PageScanRepetitionMode, Properties.RealConfiguration.ClockOffset);
break;
}
default:
{
Logger.WriteLine("Network: Unknown command received: " + ((char)buffer[0]).ToString());
break;
}
}
Thread.Sleep(100);
}
}
catch
{
//Whatever...
}
}