internal DatFile(IFile source, DatSpecification specification, DatFileIndex index, bool lazyLoad = true) { _source = source; _spec = specification; _idx = index; if (!lazyLoad) { Load(); } }
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); } }
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); } }