/// <summary> /// Parse a DistributedResource /// </summary> /// <param name="data">Bytes array</param> /// <param name="offset">Zero-indexed offset.</param> /// <param name="connection">DistributedConnection is required.</param> /// <returns>DistributedResource</returns> public static AsyncReply <DistributedResource> ParseDistributedResource(byte[] data, uint offset, DistributedConnection connection) { //var g = data.GetGuid(offset); //offset += 16; // find the object var iid = data.GetUInt32(offset); return(connection.Fetch(iid));// Warehouse.Get(iid); }
public static unsafe AsyncReply ResourceParser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) { fixed(byte *ptr = &data[offset]) return(connection.Fetch(*(uint *)ptr, requestSequence)); }
/// <summary> /// Parse an array of bytes into array of resources /// </summary> /// <param name="data">Array of bytes.</param> /// <param name="length">Number of bytes to parse.</param> /// <param name="offset">Zero-indexed offset.</param> /// <param name="connection">DistributedConnection is required to fetch resources.</param> /// <returns>Array of resources.</returns> public static AsyncBag <IResource> ParseResourceArray(byte[] data, uint offset, uint length, DistributedConnection connection) { var reply = new AsyncBag <IResource>(); if (length == 0) { reply.Seal(); return(reply); } var end = offset + length; // var result = (ResourceComparisonResult)data[offset++]; AsyncReply previous = null; if (result == ResourceComparisonResult.Null) { previous = new AsyncReply <IResource>(null); } else if (result == ResourceComparisonResult.Local) { previous = Warehouse.Get(data.GetUInt32(offset)); offset += 4; } else if (result == ResourceComparisonResult.Distributed) { previous = connection.Fetch(data.GetUInt32(offset)); offset += 4; } reply.Add(previous); while (offset < end) { result = (ResourceComparisonResult)data[offset++]; AsyncReply current = null; if (result == ResourceComparisonResult.Null) { current = new AsyncReply <IResource>(null); } else if (result == ResourceComparisonResult.Same) { current = previous; } else if (result == ResourceComparisonResult.Local) { current = Warehouse.Get(data.GetUInt32(offset)); offset += 4; } else if (result == ResourceComparisonResult.Distributed) { current = connection.Fetch(data.GetUInt32(offset)); offset += 4; } reply.Add(current); previous = current; } reply.Seal(); return(reply); }