/// <summary> /// Initializes a new instance of the <see cref="DnsQueryResult"/> class. /// </summary> /// <param name="response">The response.</param> internal DnsQueryResult(DnsClient.IDnsResponse response) : this() { Id = response.Id; IsAuthoritativeServer = response.IsAuthorativeServer; IsRecursionAvailable = response.IsRecursionAvailable; IsTruncated = response.IsTruncated; OperationCode = response.OperationCode; ResponseCode = response.ResponseCode; if (response.AnswerRecords != null) { foreach (var record in response.AnswerRecords) { AnswerRecords.Add(new DnsRecord(record)); } } if (response.AuthorityRecords != null) { foreach (var record in response.AuthorityRecords) { AuthorityRecords.Add(new DnsRecord(record)); } } if (response.AdditionalRecords != null) { foreach (var record in response.AdditionalRecords) { AdditionalRecords.Add(new DnsRecord(record)); } } }
protected override void FinishParsing() { Prequisites = AnswerRecords.ConvertAll <PrequisiteBase>( record => { if ((record.RecordClass == RecordClass.Any) && (record.RecordDataLength == 0)) { return(new RecordExistsPrequisite(record.Name, record.RecordType)); } else if (record.RecordClass == RecordClass.Any) { return(new RecordExistsPrequisite(record)); } else if ((record.RecordClass == RecordClass.None) && (record.RecordDataLength == 0)) { return(new RecordNotExistsPrequisite(record.Name, record.RecordType)); } else if ((record.RecordClass == RecordClass.Any) && (record.RecordType == RecordType.Any)) { return(new NameIsInUsePrequisite(record.Name)); } else if ((record.RecordClass == RecordClass.None) && (record.RecordType == RecordType.Any)) { return(new NameIsNotInUsePrequisite(record.Name)); } else { return(null); } }).Where(prequisite => (prequisite != null)).ToList(); Updates = AuthorityRecords.ConvertAll <UpdateBase>( record => { if (record.TimeToLive != 0) { return(new AddRecordUpdate(record)); } else if ((record.RecordType == RecordType.Any) && (record.RecordClass == RecordClass.Any) && (record.RecordDataLength == 0)) { return(new DeleteAllRecordsUpdate(record.Name)); } else if ((record.RecordClass == RecordClass.Any) && (record.RecordDataLength == 0)) { return(new DeleteRecordUpdate(record.Name, record.RecordType)); } else if (record.RecordClass == RecordClass.None) { return(new DeleteRecordUpdate(record)); } else { return(null); } }).Where(update => (update != null)).ToList(); }
/// <inheritdoc /> public override IWireSerialiser Read(WireReader reader) { Id = reader.ReadUInt16(); var flags = reader.ReadUInt16(); QR = (flags & 0x8000) == 0x8000; AA = (flags & 0x0400) == 0x0400; TC = (flags & 0x0200) == 0x0200; RD = (flags & 0x0100) == 0x0100; RA = (flags & 0x0080) == 0x0080; opcode4 = (byte)((flags & 0x7800) >> 11); Z = (flags & 0x0040) >> 6; AD = (flags & 0x0020) == 0x0020; CD = (flags & 0x0010) == 0x0010; Status = (MessageStatus)(flags & 0x000F); var qdcount = reader.ReadUInt16(); var ancount = reader.ReadUInt16(); var nscount = reader.ReadUInt16(); var arcount = reader.ReadUInt16(); for (var i = 0; i < qdcount; ++i) { var question = (Question) new Question().Read(reader); Questions.Add(question); } for (var i = 0; i < ancount; ++i) { var rr = (ResourceRecord) new ResourceRecord().Read(reader); Answers.Add(rr); } for (var i = 0; i < nscount; ++i) { var rr = (ResourceRecord) new ResourceRecord().Read(reader); AuthorityRecords.Add(rr); } for (var i = 0; i < arcount; ++i) { var rr = (ResourceRecord) new ResourceRecord().Read(reader); AdditionalRecords.Add(rr); } return(this); }
/// <summary> /// Make the message not exceed the specified length. /// </summary> /// <param name="length"> /// The maximum number bytes for the message. /// </param> /// <remarks> /// If the message does not fit into <paramref name="length"/> bytes, then <see cref="AdditionalRecords"/> /// are removed and then <see cref="AuthorityRecords"/> are removed. /// <para> /// If it is still too big, then the <see cref="TC"/> bit is set. /// </para> /// </remarks> public void Truncate(int length) { while (Length() > length) { // Remove records. if (AdditionalRecords.Count > 0) { AdditionalRecords.RemoveAt(AdditionalRecords.Count - 1); } else if (AuthorityRecords.Count > 0) { AuthorityRecords.RemoveAt(AuthorityRecords.Count - 1); } else { // Nothing more can be done to reduce the message length. TC = true; return; } } }