コード例 #1
0
        /// <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);
        }
コード例 #2
0
 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));
 }
コード例 #3
0
        /// <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);
        }