Ejemplo n.º 1
0
        public sealed override void ReadFromBuffer(NetBuffer buffer, SyncContext context)
        {
            ReferencesPending = false;
            ushort elementCount = buffer.ReadVWidth();

            if (DeltaEncoding)
            {
                if (context.Revision > Revision)
                {
                    Revision = context.Revision;
                    if (elementCount != Elements.Count)
                    {
                        SetElementLength(elementCount);
                        Synchronised = false;
                    }
                }

                int changeCount = buffer.ReadVWidth();
                // If the change count is 0, then we want to default to the read all behavior of non delta lists.
                bool skipHeader = changeCount == elementCount;

                for (int i = 0; i < changeCount; i++)
                {
                    int index = skipHeader ? i : buffer.ReadVWidth();

                    if (index < Elements.Count)
                    {
                        Synchroniser element = Elements[index];
                        element.ReadFromBuffer(buffer, context);
                        ReferencesPending |= element.ReferencesPending;
                        Synchronised      &= element.Synchronised;
                    }
                    else
                    {
                        // Elements will be out of range if an out of date revision arrives after after the list is shrunk
                        ElementFactory.SkipFromBuffer(buffer);
                    }
                }
            }
            else
            {
                Revision = context.Revision;
                if (elementCount != Elements.Count)
                {
                    SetElementLength(elementCount);
                    Synchronised = false;
                }

                foreach (Synchroniser element in Elements)
                {
                    element.ReadFromBuffer(buffer, context);
                    ReferencesPending |= element.ReferencesPending;
                    Synchronised      &= element.Synchronised;
                }
            }
        }