/* Read the header */
while(count != header.length)
{
int ret = conn.read(header, count, header.length - count);
if(ret == -1)
throw new IllegalArgumentException("Stream closed without enough data");
count += ret;
}
/* header starts with 'YMSG' */
if(header[0] != 'Y' || header[1] != 'M' || header[2] != 'S' || header[3] != 'G')
throw new IllegalArgumentException("Invalid yahoo packet header (No YMSG found)");
/* get the version */
version = ((long)toUnsigned(header[4]) << 24) +
((long)toUnsigned(header[5]) << 16) +
((long)toUnsigned(header[6]) << 8) +
toUnsigned(header[7]);
/* get the length of the data portion */
int dataLength = (toUnsigned(header[8]) << 8) + toUnsigned(header[9]);
/* get the service type */
service = (toUnsigned(header[10]) << 8) + toUnsigned(header[11]);
/* get the status */
status = ((long)toUnsigned(header[12]) << 24) +
((long)toUnsigned(header[13]) << 16) +
((long)toUnsigned(header[14]) << 8) +
toUnsigned(header[15]);
/* get the status */
sessionID = ((long)toUnsigned(header[16]) << 24) +
((long)toUnsigned(header[17]) << 16) +
((long)toUnsigned(header[18]) << 8) +
toUnsigned(header[19]);
/* now load the data portion */
byte[] dataArray = new byte[dataLength];
count = 0;
while(count != dataArray.length)
{
count += conn.read(dataArray, count, dataArray.length - count);
}
/* create the hashtable */
boolean gettingKey = true;
int key = 0, valueStart = 0;
String value;
int i = 0;
while(i < count - 1)
{
int data = toUnsigned(dataArray[i]);
int dataNext = toUnsigned(dataArray[i + 1]);
if(gettingKey)
{
// check for a key
if(data != 0xc0)
key = key * 10 + data - '0';
else if(dataNext == 0x80)
{
gettingKey = false;
valueStart = i + 2;
i++;
}
else
throw new IllegalArgumentException("Invalid packet (No end signature found)");
}
else
{
// get value
if(data == 0xc0 && dataNext == 0x80)