1 /*
2 * Copyright 2022 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.netty5.channel.socket;
17
18 import java.net.ProtocolFamily;
19 import java.net.StandardProtocolFamily;
20
21 /**
22 * {@link ProtocolFamily} implementation that is used by the different transport implementations.
23 */
24 public enum SocketProtocolFamily implements ProtocolFamily {
25 /**
26 * IPv4
27 */
28 INET,
29 /**
30 * IPv6
31 */
32 INET6,
33 /**
34 * Unix Domain Socket
35 */
36 UNIX;
37
38 /**
39 * Return a {@link ProtocolFamily} that is "known" by the JDK itself and represent the same as
40 * {@link SocketProtocolFamily}.
41 *
42 * @return the JDK {@link ProtocolFamily}.
43 * @throws UnsupportedOperationException if it can't be converted.
44 */
45 public ProtocolFamily toJdkFamily() {
46 switch (this) {
47 case INET:
48 return StandardProtocolFamily.INET;
49 case INET6:
50 return StandardProtocolFamily.INET6;
51 case UNIX:
52 // Just use valueOf as we compile with Java11. If the JDK does not support unix domain sockets, this
53 // will throw.
54 return StandardProtocolFamily.valueOf("UNIX");
55 default:
56 throw new UnsupportedOperationException(
57 "ProtocolFamily cant be converted to something that is known by the JDKi: " + this);
58 }
59 }
60
61 /**
62 * Return the {@link SocketProtocolFamily} for the given {@link ProtocolFamily} if possible.
63 *
64 * @param family the JDK {@link ProtocolFamily} to convert.
65 * @return the {@link SocketProtocolFamily}.
66 * @throws UnsupportedOperationException if it can't be converted.
67 */
68 public static SocketProtocolFamily of(ProtocolFamily family) {
69 if (family instanceof StandardProtocolFamily) {
70 switch ((StandardProtocolFamily) family) {
71 case INET:
72 return INET;
73 case INET6:
74 return INET6;
75 default:
76 // Just compare the name as we compile with Java11
77 if (UNIX.name().equals(family.name())) {
78 return UNIX;
79 }
80 // Fall-through
81 }
82 } else if (family instanceof SocketProtocolFamily) {
83 return (SocketProtocolFamily) family;
84 }
85 throw new UnsupportedOperationException("ProtocolFamily is not supported: " + family);
86 }
87 }