1 /* 2 * Copyright 2015 The Netty Project 3 * 4 * The Netty Project licenses this file to you under the Apache License, 5 * version 2.0 (the "License"); you may not use this file except in compliance 6 * with the License. You may obtain a copy of the License at: 7 * 8 * https://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 * License for the specific language governing permissions and limitations 14 * under the License. 15 */ 16 package io.netty.handler.codec.dns; 17 18 import io.netty.util.ReferenceCounted; 19 import io.netty.util.internal.UnstableApi; 20 21 /** 22 * The superclass which contains core information concerning a {@link DnsQuery} and a {@link DnsResponse}. 23 */ 24 @UnstableApi 25 public interface DnsMessage extends ReferenceCounted { 26 27 /** 28 * Returns the {@code ID} of this DNS message. 29 */ 30 int id(); 31 32 /** 33 * Sets the {@code ID} of this DNS message. 34 */ 35 DnsMessage setId(int id); 36 37 /** 38 * Returns the {@code opCode} of this DNS message. 39 */ 40 DnsOpCode opCode(); 41 42 /** 43 * Sets the {@code opCode} of this DNS message. 44 */ 45 DnsMessage setOpCode(DnsOpCode opCode); 46 47 /** 48 * Returns the {@code RD} (recursion desired} field of this DNS message. 49 */ 50 boolean isRecursionDesired(); 51 52 /** 53 * Sets the {@code RD} (recursion desired} field of this DNS message. 54 */ 55 DnsMessage setRecursionDesired(boolean recursionDesired); 56 57 /** 58 * Returns the {@code Z} (reserved for future use) field of this DNS message. 59 */ 60 int z(); 61 62 /** 63 * Sets the {@code Z} (reserved for future use) field of this DNS message. 64 */ 65 DnsMessage setZ(int z); 66 67 /** 68 * Returns the number of records in the specified {@code section} of this DNS message. 69 */ 70 int count(DnsSection section); 71 72 /** 73 * Returns the number of records in this DNS message. 74 */ 75 int count(); 76 77 /** 78 * Returns the first record in the specified {@code section} of this DNS message. 79 * When the specified {@code section} is {@link DnsSection#QUESTION}, the type of the returned record is 80 * always {@link DnsQuestion}. 81 * 82 * @return {@code null} if this message doesn't have any records in the specified {@code section} 83 */ 84 <T extends DnsRecord> T recordAt(DnsSection section); 85 86 /** 87 * Returns the record at the specified {@code index} of the specified {@code section} of this DNS message. 88 * When the specified {@code section} is {@link DnsSection#QUESTION}, the type of the returned record is 89 * always {@link DnsQuestion}. 90 * 91 * @throws IndexOutOfBoundsException if the specified {@code index} is out of bounds 92 */ 93 <T extends DnsRecord> T recordAt(DnsSection section, int index); 94 95 /** 96 * Sets the specified {@code section} of this DNS message to the specified {@code record}, 97 * making it a single-record section. When the specified {@code section} is {@link DnsSection#QUESTION}, 98 * the specified {@code record} must be a {@link DnsQuestion}. 99 */ 100 DnsMessage setRecord(DnsSection section, DnsRecord record); 101 102 /** 103 * Sets the specified {@code record} at the specified {@code index} of the specified {@code section} 104 * of this DNS message. When the specified {@code section} is {@link DnsSection#QUESTION}, 105 * the specified {@code record} must be a {@link DnsQuestion}. 106 * 107 * @return the old record 108 * @throws IndexOutOfBoundsException if the specified {@code index} is out of bounds 109 */ 110 <T extends DnsRecord> T setRecord(DnsSection section, int index, DnsRecord record); 111 112 /** 113 * Adds the specified {@code record} at the end of the specified {@code section} of this DNS message. 114 * When the specified {@code section} is {@link DnsSection#QUESTION}, the specified {@code record} 115 * must be a {@link DnsQuestion}. 116 */ 117 DnsMessage addRecord(DnsSection section, DnsRecord record); 118 119 /** 120 * Adds the specified {@code record} at the specified {@code index} of the specified {@code section} 121 * of this DNS message. When the specified {@code section} is {@link DnsSection#QUESTION}, the specified 122 * {@code record} must be a {@link DnsQuestion}. 123 * 124 * @throws IndexOutOfBoundsException if the specified {@code index} is out of bounds 125 */ 126 DnsMessage addRecord(DnsSection section, int index, DnsRecord record); 127 128 /** 129 * Removes the record at the specified {@code index} of the specified {@code section} from this DNS message. 130 * When the specified {@code section} is {@link DnsSection#QUESTION}, the type of the returned record is 131 * always {@link DnsQuestion}. 132 * 133 * @return the removed record 134 */ 135 <T extends DnsRecord> T removeRecord(DnsSection section, int index); 136 137 /** 138 * Removes all the records in the specified {@code section} of this DNS message. 139 */ 140 DnsMessage clear(DnsSection section); 141 142 /** 143 * Removes all the records in this DNS message. 144 */ 145 DnsMessage clear(); 146 147 @Override 148 DnsMessage touch(); 149 150 @Override 151 DnsMessage touch(Object hint); 152 153 @Override 154 DnsMessage retain(); 155 156 @Override 157 DnsMessage retain(int increment); 158 }