UnrealScript library and basis for all Acedia Framework mods
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
2.0 KiB

class AvariceClient extends AcediaObject;
enum AvariceClientState
{
ACS_Waiting,
ACS_ReadingID,
ACS_ReadingLength,
ACS_ReadingPayload,
ACS_Invalid
};
var private int currentID;
var private int currentMessageLength;
var private array<byte> currentPayload;
var private AvariceClientState currentState;
var private int bytesLeftToRead;
var private byte buffer[255];
var private array<byte> longBuffer;
var private int pendingBytes;
public final function PushByte(byte nextByte)
{
if (nextByte == 0)
{
if (bytesLeftToRead > 0)
{
// ACK for short message (with id)
}
currentState = ACS_Waiting;
ResetBuffer();
return;
}
else if (currentState == ACS_Invalid)
{
// ACK of invalid message's end
return;
}
else if (currentState == ACS_Waiting)
{
currentID = nextByte;
currentID = currentID << 8;
currentState = ACS_ReadingID;
}
else if (currentState == ACS_ReadingID)
{
currentID += nextByte;
currentState = ACS_ReadingLength;
bytesLeftToRead = 2;
}
else if (currentState == ACS_ReadingLength)
{
bytesLeftToRead -= 1;
if (bytesLeftToRead > 0)
{
currentMessageLength = nextByte;
currentMessageLength = currentMessageLength << 8;
}
else
{
currentMessageLength += nextByte;
currentState = ACS_ReadingPayload;
bytesLeftToRead = currentMessageLength;
}
}
else if (currentState == ACS_ReadingPayload)
{
currentPayload[currentPayload.length] = nextByte;
// Decode payload into `AvariceMessage`
// Send messages via Acedia's signals
bytesLeftToRead -= 1;
if (bytesLeftToRead == 0)
{
currentState = ACS_Waiting;
// ACK into buffer
}
}
}
private final function ResetBuffer()
{
pendingBytes = 0;
longBuffer.length = 0;
}
defaultproperties
{
}