Example #1
0
        internal DatFile(IFile source, DatSpecification specification, DatFileIndex index,
                         bool lazyLoad = true)
        {
            _source = source;
            _spec   = specification;
            _idx    = index;

            if (!lazyLoad)
            {
                Load();
            }
        }
Example #2
0
        public DatValue(FieldSpecification fieldData, object fieldValue,
                        DatFileIndex datIndex)
        {
            Specification = fieldData;
            var idx = datIndex;

            if (!string.IsNullOrEmpty(fieldData.Key))
            {
                if (fieldValue is List <object> l)
                {
                    _fieldValue = new Lazy <object>(() => l
                                                    .Select(p =>
                                                            NullValues.Contains(p) ?
                                                            null : idx[fieldData.Key][Convert.ToInt32(p)])
                                                    .ToList());
                }
                else if (fieldValue is ulong || fieldValue is int || fieldValue is uint)
                {
                    _fieldValue = NullValues.Contains(fieldValue) ?
                                  new Lazy <object>(() => null) :
                                  new Lazy <object>(() => idx[fieldData.Key][Convert.ToInt32(fieldValue)]);
                }
                else
                {
                    if (NullValues.Contains(fieldValue))
                    {
                        _fieldValue = new Lazy <object>(() => null);
                    }
                    else
                    {
                        throw new Exception("Unexpected data type in conjunction with a Key field");
                    }
                }
            }
            else
            {
                _fieldValue = NullValues.Contains(fieldValue) ?
                              new Lazy <object>(() => null) :
                              new Lazy <object>(() => fieldValue);
            }
        }
Example #3
0
        public DatRow(ref Span <byte> rowData, ref Span <byte> data,
                      DatSpecification specification, DatFileIndex index)
        {
            Underlying = new Dictionary <string, DatValue>();
            var offset = 0;

            foreach (var field in specification.Fields)
            {
                var k = field.Key;
                var v = field.Value;

                object value;
                if (v.ClrType.IsReference)
                {
                    int dataOffset;

                    if (v.ClrType.IsList)
                    {
                        var elements = (int)rowData.Slice(offset, 4).To <uint>();
                        offset    += 4;
                        dataOffset = (int)rowData.Slice(offset, 4).To <uint>();
                        offset    += 4;

                        value = ReadList(v.ClrType.DefinedType, dataOffset,
                                         elements, ref data);
                    }
                    else
                    {
                        dataOffset = (int)rowData.Slice(offset, 4).To <uint>();
                        offset    += 4;

                        if (v.ClrType.DefinedType == typeof(string))
                        {
                            if (dataOffset > data.Length)
                            {
                                continue;
                            }

                            var length = data.Slice(dataOffset).IndexOf(StringNullTerminator);
                            if (length % 2 != 0)
                            {
                                length++;
                            }

                            value = data.Slice(dataOffset, length).ToUnicodeText();
                        }
                        else
                        {
                            value = data.Slice(dataOffset, SizeTable[v.ClrType.DefinedType])
                                    .To(v.ClrType.DefinedType);
                        }
                    }
                }
                else
                {
                    var size = SizeTable[v.ClrType.DefinedType];
                    value   = rowData.Slice(offset, size).To(v.ClrType.DefinedType);
                    offset += size;
                }

                var datValue = new DatValue(v, value, index);
                Underlying.Add(k, datValue);
            }
        }