1 /*
2 * Copyright 2012 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.channel;
17
18 import io.netty.buffer.ByteBuf;
19 import io.netty.buffer.ByteBufAllocator;
20 import io.netty.util.UncheckedBooleanSupplier;
21 import io.netty.util.internal.UnstableApi;
22
23 import static io.netty.util.internal.ObjectUtil.checkNotNull;
24
25 /**
26 * Allocates a new receive buffer whose capacity is probably large enough to read all inbound data and small enough
27 * not to waste its space.
28 */
29 public interface RecvByteBufAllocator {
30 /**
31 * Creates a new handle. The handle provides the actual operations and keeps the internal information which is
32 * required for predicting an optimal buffer capacity.
33 */
34 Handle newHandle();
35
36 /**
37 * @deprecated Use {@link ExtendedHandle}.
38 */
39 @Deprecated
40 interface Handle {
41 /**
42 * Creates a new receive buffer whose capacity is probably large enough to read all inbound data and small
43 * enough not to waste its space.
44 */
45 ByteBuf allocate(ByteBufAllocator alloc);
46
47 /**
48 * Similar to {@link #allocate(ByteBufAllocator)} except that it does not allocate anything but just tells the
49 * capacity.
50 */
51 int guess();
52
53 /**
54 * Reset any counters that have accumulated and recommend how many messages/bytes should be read for the next
55 * read loop.
56 * <p>
57 * This may be used by {@link #continueReading()} to determine if the read operation should complete.
58 * </p>
59 * This is only ever a hint and may be ignored by the implementation.
60 * @param config The channel configuration which may impact this object's behavior.
61 */
62 void reset(ChannelConfig config);
63
64 /**
65 * Increment the number of messages that have been read for the current read loop.
66 * @param numMessages The amount to increment by.
67 */
68 void incMessagesRead(int numMessages);
69
70 /**
71 * Set the bytes that have been read for the last read operation.
72 * This may be used to increment the number of bytes that have been read.
73 * @param bytes The number of bytes from the previous read operation. This may be negative if an read error
74 * occurs. If a negative value is seen it is expected to be return on the next call to
75 * {@link #lastBytesRead()}. A negative value will signal a termination condition enforced externally
76 * to this class and is not required to be enforced in {@link #continueReading()}.
77 */
78 void lastBytesRead(int bytes);
79
80 /**
81 * Get the amount of bytes for the previous read operation.
82 * @return The amount of bytes for the previous read operation.
83 */
84 int lastBytesRead();
85
86 /**
87 * Set how many bytes the read operation will (or did) attempt to read.
88 * @param bytes How many bytes the read operation will (or did) attempt to read.
89 */
90 void attemptedBytesRead(int bytes);
91
92 /**
93 * Get how many bytes the read operation will (or did) attempt to read.
94 * @return How many bytes the read operation will (or did) attempt to read.
95 */
96 int attemptedBytesRead();
97
98 /**
99 * Determine if the current read loop should continue.
100 * @return {@code true} if the read loop should continue reading. {@code false} if the read loop is complete.
101 */
102 boolean continueReading();
103
104 /**
105 * The read has completed.
106 */
107 void readComplete();
108 }
109
110 @SuppressWarnings("deprecation")
111 @UnstableApi
112 interface ExtendedHandle extends Handle {
113 /**
114 * Same as {@link Handle#continueReading()} except "more data" is determined by the supplier parameter.
115 * @param maybeMoreDataSupplier A supplier that determines if there maybe more data to read.
116 */
117 boolean continueReading(UncheckedBooleanSupplier maybeMoreDataSupplier);
118 }
119
120 /**
121 * A {@link Handle} which delegates all call to some other {@link Handle}.
122 */
123 class DelegatingHandle implements Handle {
124 private final Handle delegate;
125
126 public DelegatingHandle(Handle delegate) {
127 this.delegate = checkNotNull(delegate, "delegate");
128 }
129
130 /**
131 * Get the {@link Handle} which all methods will be delegated to.
132 * @return the {@link Handle} which all methods will be delegated to.
133 */
134 protected final Handle delegate() {
135 return delegate;
136 }
137
138 @Override
139 public ByteBuf allocate(ByteBufAllocator alloc) {
140 return delegate.allocate(alloc);
141 }
142
143 @Override
144 public int guess() {
145 return delegate.guess();
146 }
147
148 @Override
149 public void reset(ChannelConfig config) {
150 delegate.reset(config);
151 }
152
153 @Override
154 public void incMessagesRead(int numMessages) {
155 delegate.incMessagesRead(numMessages);
156 }
157
158 @Override
159 public void lastBytesRead(int bytes) {
160 delegate.lastBytesRead(bytes);
161 }
162
163 @Override
164 public int lastBytesRead() {
165 return delegate.lastBytesRead();
166 }
167
168 @Override
169 public boolean continueReading() {
170 return delegate.continueReading();
171 }
172
173 @Override
174 public int attemptedBytesRead() {
175 return delegate.attemptedBytesRead();
176 }
177
178 @Override
179 public void attemptedBytesRead(int bytes) {
180 delegate.attemptedBytesRead(bytes);
181 }
182
183 @Override
184 public void readComplete() {
185 delegate.readComplete();
186 }
187 }
188 }