private TS_FP_UPDATE[] ParseTsFpUpdates(byte[] data, ref int currentIndex)
{
List<TS_FP_UPDATE> listUpdate = new List<TS_FP_UPDATE>();
// One by one parse TS_FP_UPDATE
while (currentIndex < data.Length)
{
TS_FP_UPDATE update = null;
// Update header
byte updateHeader = ParseByte(data, ref currentIndex);
// Get infomation from updateHeader
updateCode_Values updateCode;
fragmentation_Value fragmentation;
compression_Values compression;
GetFpUpdateHeaderInfo(updateHeader, out updateCode, out fragmentation, out compression);
// Get compressionFlags (optional)
compressedType_Values compressionFlags = 0;
if (compression_Values.FASTPATH_OUTPUT_COMPRESSION_USED == compression)
{
compressionFlags = (compressedType_Values)ParseByte(data, ref currentIndex);
}
// Get size and update data
UInt16 updateDataSize = ParseUInt16(data, ref currentIndex, false);
byte[] updateData = GetBytes(data, ref currentIndex, updateDataSize);
// Decompress update data (according to compressionFlags)
byte[] decompressedUpdateData = clientContext.Decompress(updateData, compressionFlags);
// Parse fast-path updates by updateCode
switch (updateCode)
{
// Fast-Path Orders Update
case updateCode_Values.FASTPATH_UPDATETYPE_ORDERS:
update = ParseTsFpUpdateOrders(updateHeader, compressionFlags,
updateDataSize, decompressedUpdateData);
break;
// Fast-Path Bitmap Update
case updateCode_Values.FASTPATH_UPDATETYPE_BITMAP:
update = ParseTsFpUpdateBitmap(updateHeader, compressionFlags,
updateDataSize, decompressedUpdateData);
break;
// Fast-Path Palette Update
case updateCode_Values.FASTPATH_UPDATETYPE_PALETTE:
update = ParseTsFpUpdatePalette(updateHeader, compressionFlags,
updateDataSize, decompressedUpdateData);
break;
// Fast-Path Synchronize Update
case updateCode_Values.FASTPATH_UPDATETYPE_SYNCHRONIZE:
update = ParseTsFpUpdateSynchronize(
updateHeader, compressionFlags, updateDataSize);
break;
// Fast-Path Surface commands Update
case updateCode_Values.FASTPATH_UPDATETYPE_SURFCMDS:
update = ParseTsFpSurfCmds(updateHeader, compressionFlags,
updateDataSize, decompressedUpdateData);
break;
// Fast-Path System Pointer Hidden Update
case updateCode_Values.FASTPATH_UPDATETYPE_PTR_NULL:
update = ParseTsFpSystemPointerHiddenAttribute(
updateHeader, compressionFlags, updateDataSize);
break;
// Fast-Path System Pointer Default Update
case updateCode_Values.FASTPATH_UPDATETYPE_PTR_DEFAULT:
update = ParseTsFpSystemPointerDefaultAttribute(
updateHeader, compressionFlags, updateDataSize);
break;
// Fast-Path Pointer Position Update
case updateCode_Values.FASTPATH_UPDATETYPE_PTR_POSITION:
update = ParseTsFpPointerPosAttribute(updateHeader, compressionFlags,
updateDataSize, decompressedUpdateData);
break;
// Fast-Path Color Pointer Update
case updateCode_Values.FASTPATH_UPDATETYPE_COLOR:
update = ParseTsFpColorPointerAttribute(updateHeader, compressionFlags,
updateDataSize, decompressedUpdateData);
break;
// Fast-Path Cached Pointer Update
case updateCode_Values.FASTPATH_UPDATETYPE_CACHED:
update = ParseTsFpCachedPointerAttribute(updateHeader, compressionFlags,
updateDataSize, decompressedUpdateData);
break;
// Fast-Path New Pointer Update
case updateCode_Values.FASTPATH_UPDATETYPE_POINTER:
update = ParseTsFpPointerAttribute(updateHeader, compressionFlags,
updateDataSize, decompressedUpdateData);
break;
default:
throw new FormatException(ConstValue.ERROR_MESSAGE_ENUM_UNRECOGNIZED);
}
listUpdate.Add(update);
}
// Copy list to array
TS_FP_UPDATE[] updates = new TS_FP_UPDATE[listUpdate.Count];
for (int i = 0; i < updates.Length; i++)
{
updates[i] = listUpdate[i];
}
return updates;
}