1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.channel.kqueue;
17
18 import io.netty.buffer.ByteBufAllocator;
19 import io.netty.channel.ChannelException;
20 import io.netty.channel.ChannelOption;
21 import io.netty.channel.FixedRecvByteBufAllocator;
22 import io.netty.channel.MessageSizeEstimator;
23 import io.netty.channel.RecvByteBufAllocator;
24 import io.netty.channel.WriteBufferWaterMark;
25 import io.netty.channel.unix.DomainDatagramChannelConfig;
26 import io.netty.util.internal.UnstableApi;
27
28 import java.io.IOException;
29 import java.util.Map;
30
31 import static io.netty.channel.ChannelOption.DATAGRAM_CHANNEL_ACTIVE_ON_REGISTRATION;
32 import static io.netty.channel.ChannelOption.SO_SNDBUF;
33
34 @UnstableApi
35 public final class KQueueDomainDatagramChannelConfig
36 extends KQueueChannelConfig implements DomainDatagramChannelConfig {
37
38 private static final RecvByteBufAllocator DEFAULT_RCVBUF_ALLOCATOR = new FixedRecvByteBufAllocator(2048);
39
40 private boolean activeOnOpen;
41
42 KQueueDomainDatagramChannelConfig(KQueueDomainDatagramChannel channel) {
43 super(channel);
44 setRecvByteBufAllocator(DEFAULT_RCVBUF_ALLOCATOR);
45 }
46
47 @Override
48 @SuppressWarnings("deprecation")
49 public Map<ChannelOption<?>, Object> getOptions() {
50 return getOptions(super.getOptions(),
51 DATAGRAM_CHANNEL_ACTIVE_ON_REGISTRATION, SO_SNDBUF);
52 }
53
54 @Override
55 @SuppressWarnings({"unchecked", "deprecation"})
56 public <T> T getOption(ChannelOption<T> option) {
57 if (option == DATAGRAM_CHANNEL_ACTIVE_ON_REGISTRATION) {
58 return (T) Boolean.valueOf(activeOnOpen);
59 }
60 if (option == SO_SNDBUF) {
61 return (T) Integer.valueOf(getSendBufferSize());
62 }
63 return super.getOption(option);
64 }
65
66 @Override
67 @SuppressWarnings("deprecation")
68 public <T> boolean setOption(ChannelOption<T> option, T value) {
69 validate(option, value);
70
71 if (option == DATAGRAM_CHANNEL_ACTIVE_ON_REGISTRATION) {
72 setActiveOnOpen((Boolean) value);
73 } else if (option == SO_SNDBUF) {
74 setSendBufferSize((Integer) value);
75 } else {
76 return super.setOption(option, value);
77 }
78
79 return true;
80 }
81
82 private void setActiveOnOpen(boolean activeOnOpen) {
83 if (channel.isRegistered()) {
84 throw new IllegalStateException("Can only changed before channel was registered");
85 }
86 this.activeOnOpen = activeOnOpen;
87 }
88
89 boolean getActiveOnOpen() {
90 return activeOnOpen;
91 }
92
93 @Override
94 public KQueueDomainDatagramChannelConfig setAllocator(ByteBufAllocator allocator) {
95 super.setAllocator(allocator);
96 return this;
97 }
98
99 @Override
100 public KQueueDomainDatagramChannelConfig setAutoClose(boolean autoClose) {
101 super.setAutoClose(autoClose);
102 return this;
103 }
104
105 @Override
106 public KQueueDomainDatagramChannelConfig setAutoRead(boolean autoRead) {
107 super.setAutoRead(autoRead);
108 return this;
109 }
110
111 @Override
112 public KQueueDomainDatagramChannelConfig setConnectTimeoutMillis(int connectTimeoutMillis) {
113 super.setConnectTimeoutMillis(connectTimeoutMillis);
114 return this;
115 }
116
117 @Override
118 @Deprecated
119 public KQueueDomainDatagramChannelConfig setMaxMessagesPerRead(int maxMessagesPerRead) {
120 super.setMaxMessagesPerRead(maxMessagesPerRead);
121 return this;
122 }
123
124 @Override
125 public KQueueDomainDatagramChannelConfig setMaxMessagesPerWrite(int maxMessagesPerWrite) {
126 super.setMaxMessagesPerWrite(maxMessagesPerWrite);
127 return this;
128 }
129
130 @Override
131 public KQueueDomainDatagramChannelConfig setMessageSizeEstimator(MessageSizeEstimator estimator) {
132 super.setMessageSizeEstimator(estimator);
133 return this;
134 }
135
136 @Override
137 public KQueueDomainDatagramChannelConfig setRcvAllocTransportProvidesGuess(boolean transportProvidesGuess) {
138 super.setRcvAllocTransportProvidesGuess(transportProvidesGuess);
139 return this;
140 }
141
142 @Override
143 public KQueueDomainDatagramChannelConfig setRecvByteBufAllocator(RecvByteBufAllocator allocator) {
144 super.setRecvByteBufAllocator(allocator);
145 return this;
146 }
147
148 @Override
149 public KQueueDomainDatagramChannelConfig setSendBufferSize(int sendBufferSize) {
150 try {
151 ((KQueueDomainDatagramChannel) channel).socket.setSendBufferSize(sendBufferSize);
152 return this;
153 } catch (IOException e) {
154 throw new ChannelException(e);
155 }
156 }
157
158 @Override
159 public int getSendBufferSize() {
160 try {
161 return ((KQueueDomainDatagramChannel) channel).socket.getSendBufferSize();
162 } catch (IOException e) {
163 throw new ChannelException(e);
164 }
165 }
166
167 @Override
168 public KQueueDomainDatagramChannelConfig setWriteBufferWaterMark(WriteBufferWaterMark writeBufferWaterMark) {
169 super.setWriteBufferWaterMark(writeBufferWaterMark);
170 return this;
171 }
172
173 @Override
174 public KQueueDomainDatagramChannelConfig setWriteSpinCount(int writeSpinCount) {
175 super.setWriteSpinCount(writeSpinCount);
176 return this;
177 }
178 }