feyris-tan ef86554f9a Import
2025-05-12 22:09:16 +02:00

122 lines
2.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Metadata.Ecma335;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper5.DNS.Protocol.ResourceRecords
{
internal class ResourceRecord : IResourceRecord
{
public TimeSpan TimeToLive
{
get { return ttl; }
}
public int DataLength
{
get { return data.Length; }
}
public byte[] Data
{
get { return data; }
}
public Domain Name
{
get { return domain; }
}
public RecordType Type
{
get { return type; }
}
public RecordClass Class
{
get { return klass; }
}
public int Size
{
get { return domain.Size + Tail.SIZE + data.Length; }
}
public byte[] ToArray() {
throw new NotImplementedException();
}
private Domain domain;
private RecordType type;
private RecordClass klass;
private TimeSpan ttl;
private byte[] data;
[Marshalling.Endian(Marshalling.Endianness.Big)]
[StructLayout(LayoutKind.Sequential, Pack = 2)]
private struct Tail
{
public const int SIZE = 10;
private ushort type;
private ushort klass;
private uint ttl;
private ushort dataLength;
public RecordType Type
{
get { return (RecordType)type; }
set { type = (ushort)value; }
}
public RecordClass Class
{
get { return (RecordClass)klass; }
set { klass = (ushort)value; }
}
public TimeSpan TimeToLive
{
get { return TimeSpan.FromSeconds(ttl); }
set { ttl = (uint)value.TotalSeconds; }
}
public int DataLength
{
get { return dataLength; }
set { dataLength = (ushort)value; }
}
}
public static ResourceRecord FromArray(byte[] message, int offset, out int endOffset)
{
Domain domain = Domain.FromArray(message, offset, out offset);
Tail tail = Marshalling.Struct.GetStruct<Tail>(message, offset, Tail.SIZE);
byte[] data = new byte[tail.DataLength];
offset += Tail.SIZE;
Array.Copy(message, offset, data, 0, data.Length);
endOffset = offset + data.Length;
return new ResourceRecord(domain, data, tail.Type, tail.Class, tail.TimeToLive);
}
public ResourceRecord(Domain domain, byte[] data, RecordType type,
RecordClass klass = RecordClass.IN, TimeSpan ttl = default(TimeSpan))
{
this.domain = domain;
this.type = type;
this.klass = klass;
this.ttl = ttl;
this.data = data;
}
}
}