View Javadoc
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     interface ExtendedHandle extends Handle {
112         /**
113          * Same as {@link Handle#continueReading()} except "more data" is determined by the supplier parameter.
114          * @param maybeMoreDataSupplier A supplier that determines if there maybe more data to read.
115          */
116         boolean continueReading(UncheckedBooleanSupplier maybeMoreDataSupplier);
117     }
118 
119     /**
120      * A {@link Handle} which delegates all call to some other {@link Handle}.
121      */
122     class DelegatingHandle implements Handle {
123         private final Handle delegate;
124 
125         public DelegatingHandle(Handle delegate) {
126             this.delegate = checkNotNull(delegate, "delegate");
127         }
128 
129         /**
130          * Get the {@link Handle} which all methods will be delegated to.
131          * @return the {@link Handle} which all methods will be delegated to.
132          */
133         protected final Handle delegate() {
134             return delegate;
135         }
136 
137         @Override
138         public ByteBuf allocate(ByteBufAllocator alloc) {
139             return delegate.allocate(alloc);
140         }
141 
142         @Override
143         public int guess() {
144             return delegate.guess();
145         }
146 
147         @Override
148         public void reset(ChannelConfig config) {
149             delegate.reset(config);
150         }
151 
152         @Override
153         public void incMessagesRead(int numMessages) {
154             delegate.incMessagesRead(numMessages);
155         }
156 
157         @Override
158         public void lastBytesRead(int bytes) {
159             delegate.lastBytesRead(bytes);
160         }
161 
162         @Override
163         public int lastBytesRead() {
164             return delegate.lastBytesRead();
165         }
166 
167         @Override
168         public boolean continueReading() {
169             return delegate.continueReading();
170         }
171 
172         @Override
173         public int attemptedBytesRead() {
174             return delegate.attemptedBytesRead();
175         }
176 
177         @Override
178         public void attemptedBytesRead(int bytes) {
179             delegate.attemptedBytesRead(bytes);
180         }
181 
182         @Override
183         public void readComplete() {
184             delegate.readComplete();
185         }
186     }
187 }