1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.newsclub.net.unix.tipc;
19
20 import java.io.FileDescriptor;
21 import java.io.IOException;
22 import java.math.BigInteger;
23 import java.net.Socket;
24 import java.net.SocketException;
25
26 import org.newsclub.net.unix.AFSocket;
27 import org.newsclub.net.unix.AFSocketCapability;
28 import org.newsclub.net.unix.AFSocketFactory;
29 import org.newsclub.net.unix.AFTIPCSocketAddress;
30 import org.newsclub.net.unix.AFTIPCSocketImplExtensions;
31
32 import com.kohlschutter.annotations.compiletime.SuppressFBWarnings;
33
34
35
36
37
38
39 public final class AFTIPCSocket extends AFSocket<AFTIPCSocketAddress> implements
40 AFTIPCSocketExtensions {
41 private static AFTIPCSocketImplExtensions staticExtensions = null;
42
43 AFTIPCSocket(FileDescriptor fdObj, AFSocketFactory<AFTIPCSocketAddress> factory)
44 throws SocketException {
45 super(new AFTIPCSocketImpl(fdObj), factory);
46 }
47
48 private static synchronized AFTIPCSocketImplExtensions getStaticImplExtensions()
49 throws IOException {
50 if (staticExtensions == null) {
51 try (AFTIPCSocket socket = new AFTIPCSocket(null, null)) {
52 staticExtensions = (AFTIPCSocketImplExtensions) socket.getImplExtensions();
53 }
54 }
55 return staticExtensions;
56 }
57
58
59
60
61
62
63
64
65
66
67
68
69
70 @SuppressFBWarnings("HSM_HIDING_METHOD")
71 public static boolean isSupported() {
72 return AFSocket.isSupported() && AFSocket.supports(AFSocketCapability.CAPABILITY_TIPC);
73 }
74
75 @Override
76 protected AFTIPCSocketChannel newChannel() {
77 return new AFTIPCSocketChannel(this);
78 }
79
80
81
82
83
84
85
86
87
88
89
90
91 public static AFTIPCSocket newInstance() throws IOException {
92 return (AFTIPCSocket) AFSocket.newInstance(AFTIPCSocket::new, (AFTIPCSocketFactory) null);
93 }
94
95 static AFTIPCSocket newInstance(AFTIPCSocketFactory factory) throws SocketException {
96 return (AFTIPCSocket) AFSocket.newInstance(AFTIPCSocket::new, factory);
97 }
98
99
100
101
102
103
104
105
106
107
108 public static AFTIPCSocket newStrictInstance() throws IOException {
109 return (AFTIPCSocket) AFSocket.newInstance(AFTIPCSocket::new, (AFTIPCSocketFactory) null);
110 }
111
112
113
114
115
116
117
118
119 public static AFTIPCSocket connectTo(AFTIPCSocketAddress addr) throws IOException {
120 return (AFTIPCSocket) AFSocket.connectTo(AFTIPCSocket::new, addr);
121 }
122
123 @Override
124 public AFTIPCSocketChannel getChannel() {
125 return (AFTIPCSocketChannel) super.getChannel();
126 }
127
128
129
130
131
132
133
134
135 public static void main(String[] args) {
136
137
138 System.out.print(AFTIPCSocket.class.getName() + ".isSupported(): ");
139 System.out.flush();
140 System.out.println(AFTIPCSocket.isSupported());
141 }
142
143 @Override
144 public AFTIPCErrInfo getErrInfo() {
145 return AFTIPCErrInfo.of(((AFTIPCSocketImplExtensions) getImplExtensions()).getTIPCErrInfo());
146 }
147
148 @Override
149 public AFTIPCDestName getDestName() {
150 return AFTIPCDestName.of(((AFTIPCSocketImplExtensions) getImplExtensions()).getTIPCDestName());
151 }
152
153
154
155
156
157
158
159
160 public static byte[] getNodeIdentity(int peerId) throws IOException {
161 return getStaticImplExtensions().getTIPCNodeId(peerId);
162 }
163
164
165
166
167
168
169
170
171 public byte[] getNodeIdentity(AFTIPCSocketAddress address) throws IOException {
172 return AFTIPCSocket.getNodeIdentity(address.getTIPCNodeHash());
173 }
174
175
176
177
178
179
180
181
182 public static String getNodeIdHexString(int peerId) throws IOException {
183 byte[] id = getNodeIdentity(peerId);
184 return id == null ? null : new BigInteger(1, id).toString(16);
185 }
186
187
188
189
190
191
192
193
194
195 public static String getLinkName(int peerId, int bearerId) throws IOException {
196 return getStaticImplExtensions().getTIPCLinkName(peerId, bearerId);
197 }
198 }