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 }