Exemplo n.º 1
0
        public void GetFields <T>(FieldCache <T>[] fields, T entry)
        {
            int indexFieldOffSet = 0;

            Data.Position = m_dataPosition;
            Data.Offset   = m_dataOffset;

            for (int i = 0; i < fields.Length; i++)
            {
                FieldCache <T> info = fields[i];
                if (i == m_reader.IdFieldIndex)
                {
                    if (Id != -1)
                    {
                        indexFieldOffSet++;
                    }
                    else
                    {
                        Id = GetFieldValue <int>(0, Data, m_fieldMeta[i], m_columnMeta[i], m_palletData[i], m_commonData[i]);
                    }

                    info.Setter(entry, Convert.ChangeType(Id, info.Field.FieldType));
                    continue;
                }

                object value      = null;
                int    fieldIndex = i - indexFieldOffSet;

                if (fieldIndex >= m_reader.Meta.Length)
                {
                    info.Setter(entry, Convert.ChangeType(m_refID, info.Field.FieldType));
                    continue;
                }

                if (info.IsArray)
                {
                    if (arrayReaders.TryGetValue(info.Field.FieldType, out var reader))
                    {
                        value = reader(Data, m_fieldMeta[fieldIndex], m_columnMeta[fieldIndex], m_palletData[fieldIndex], m_commonData[fieldIndex], m_reader.StringTable);
                    }
                    else
                    {
                        throw new Exception("Unhandled array type: " + typeof(T).Name);
                    }
                }
                else
                {
                    if (simpleReaders.TryGetValue(info.Field.FieldType, out var reader))
                    {
                        value = reader(Id, Data, m_fieldMeta[fieldIndex], m_columnMeta[fieldIndex], m_palletData[fieldIndex], m_commonData[fieldIndex], m_reader.StringTable, m_reader);
                    }
                    else
                    {
                        throw new Exception("Unhandled field type: " + typeof(T).Name);
                    }
                }

                info.Setter(entry, value);
            }
        }
Exemplo n.º 2
0
        public void GetFields <T>(FieldCache <T>[] fields, T entry)
        {
            for (int i = 0; i < fields.Length; i++)
            {
                FieldCache <T> info = fields[i];
                if (info.IndexMapField)
                {
                    Id = GetFieldValue <int>(Data);
                    info.Setter(entry, Convert.ChangeType(Id, info.Field.FieldType));
                    continue;
                }

                object value = null;

                if (info.IsArray)
                {
                    if (arrayReaders.TryGetValue(info.Field.FieldType, out var reader))
                    {
                        value = reader(Data, m_reader.StringTable, info.Cardinality);
                    }
                    else
                    {
                        throw new Exception("Unhandled array type: " + typeof(T).Name);
                    }
                }
                else if (info.IsLocalisedString)
                {
                    Data.Position += 32 * info.LocaleInfo.Locale;
                    value          = simpleReaders[typeof(string)](Data, m_reader.StringTable, m_reader);
                    Data.Position += 32 * (info.LocaleInfo.LocaleCount - info.LocaleInfo.Locale);
                }
                else
                {
                    if (simpleReaders.TryGetValue(info.Field.FieldType, out var reader))
                    {
                        value = reader(Data, m_reader.StringTable, m_reader);
                    }
                    else
                    {
                        throw new Exception("Unhandled field type: " + typeof(T).Name);
                    }
                }

                info.Setter(entry, value);
            }
        }
Exemplo n.º 3
0
        public void GetFields <T>(FieldCache <T>[] fields, T entry)
        {
            Data.Position = 0;

            for (int i = 0; i < fields.Length; i++)
            {
                FieldCache <T> info = fields[i];
                if (info.IndexMapField)
                {
                    info.Setter(entry, Convert.ChangeType(Id, info.Field.FieldType));
                    continue;
                }

                object value = null;

                if (info.IsArray)
                {
                    if (arrayReaders.TryGetValue(info.Field.FieldType, out var reader))
                    {
                        value = reader(Data, info.Cardinality);
                    }
                    else
                    {
                        throw new Exception("Unhandled array type: " + typeof(T).Name);
                    }
                }
                else
                {
                    if (simpleReaders.TryGetValue(info.Field.FieldType, out var reader))
                    {
                        value = reader(Data);
                    }
                    else
                    {
                        throw new Exception("Unhandled field type: " + typeof(T).Name);
                    }
                }

                info.Setter(entry, value);
            }
        }
Exemplo n.º 4
0
        public void GetFields <T>(FieldCache <T>[] fields, T entry)
        {
            int indexFieldOffSet = 0;

            Data.Position = m_dataPosition;
            Data.Offset   = m_dataOffset;

            for (int i = 0; i < fields.Length; i++)
            {
                FieldCache <T> info = fields[i];
                if (info.IndexMapField)
                {
                    if (Id != -1)
                    {
                        indexFieldOffSet++;
                    }
                    else
                    {
                        Id = GetFieldValue <int>(Data, m_fieldMeta[i]);
                    }

                    info.Setter(entry, Convert.ChangeType(Id, info.Field.FieldType));
                    continue;
                }

                object value      = null;
                int    fieldIndex = i - indexFieldOffSet;

                // 0x2 SecondaryKey
                if (fieldIndex >= m_reader.field_structure_data.Length)
                {
                    info.Setter(entry, Convert.ChangeType(m_reader.ForeignKeyData[Id - m_reader.MinIndex], info.Field.FieldType));
                    continue;
                }

                if (info.IsArray)
                {
                    if (info.Cardinality <= 1)
                    {
                        SetCardinality(info, fieldIndex);
                    }

                    if (arrayReaders.TryGetValue(info.Field.FieldType, out var reader))
                    {
                        value = reader(Data, m_fieldMeta[fieldIndex], m_reader.StringTable, info.Cardinality);
                    }
                    else
                    {
                        throw new Exception("Unhandled array type: " + typeof(T).Name);
                    }
                }
                else
                {
                    if (simpleReaders.TryGetValue(info.Field.FieldType, out var reader))
                    {
                        value = reader(Data, m_fieldMeta[fieldIndex], m_reader.StringTable, m_reader);
                    }
                    else
                    {
                        throw new Exception("Unhandled field type: " + typeof(T).Name);
                    }
                }

                info.Setter(entry, value);
            }
        }