1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package example.mediaserver;
16
17 import org.fourthline.cling.binding.annotations.AnnotationLocalServiceBinder;
18 import org.fourthline.cling.controlpoint.ControlPoint;
19 import org.fourthline.cling.model.DefaultServiceManager;
20 import org.fourthline.cling.model.ServiceReference;
21 import org.fourthline.cling.model.ValidationException;
22 import org.fourthline.cling.model.action.ActionException;
23 import org.fourthline.cling.model.action.ActionInvocation;
24 import org.fourthline.cling.model.message.UpnpResponse;
25 import org.fourthline.cling.model.meta.DeviceDetails;
26 import org.fourthline.cling.model.meta.DeviceIdentity;
27 import org.fourthline.cling.model.meta.LocalDevice;
28 import org.fourthline.cling.model.meta.LocalService;
29 import org.fourthline.cling.model.types.UDADeviceType;
30 import org.fourthline.cling.model.types.UDN;
31 import org.fourthline.cling.support.connectionmanager.AbstractPeeringConnectionManagerService;
32 import org.fourthline.cling.support.model.ConnectionInfo;
33 import org.fourthline.cling.support.model.ProtocolInfo;
34 import org.fourthline.cling.support.model.ProtocolInfos;
35 import org.testng.annotations.Test;
36
37 import java.beans.PropertyChangeEvent;
38 import java.beans.PropertyChangeListener;
39
40 import static org.testng.Assert.assertEquals;
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119 public class ConnectionManagerPeerTest {
120
121 @Test
122 public void createDestroyConnections() throws Exception {
123
124
125 ControlPoint controlPoint = null;
126
127 CountingListener listener = new CountingListener();
128
129 PeeringConnectionManager peerOne =
130 new PeeringConnectionManager(
131 new ProtocolInfos("http-get:*:video/mpeg:*,http-get:*:audio/mpeg:*"),
132 null
133 );
134 LocalService<PeeringConnectionManager> peerOneService = createService(peerOne);
135
136 peerOne.getPropertyChangeSupport().addPropertyChangeListener(listener);
137 createDevice("MEDIASERVER-AAA-AAA-AAA", "MediaServer", peerOneService);
138
139 PeeringConnectionManager peerTwo =
140 new PeeringConnectionManager(
141 null,
142 new ProtocolInfos("http-get:*:video/mpeg:*")
143 );
144 LocalService<PeeringConnectionManager> peerTwoService = createService(peerTwo);
145
146 peerTwo.getPropertyChangeSupport().addPropertyChangeListener(listener);
147 createDevice("MEDIARENDERER-BBB-BBB-BBB", "MediaRenderer", peerTwoService);
148
149 int peerOneConnectionID = peerOne.createConnectionWithPeer(
150 peerOneService.getReference(),
151 controlPoint,
152 peerTwoService,
153 new ProtocolInfo("http-get:*:video/mpeg:*"),
154 ConnectionInfo.Direction.Input
155 );
156
157 if (peerOneConnectionID == -1) {
158
159
160
161 }
162
163 int peerTwoConnectionID =
164 peerOne.getCurrentConnectionInfo(peerOneConnectionID) .getPeerConnectionID();
165
166 int peerTwoAVTransportID =
167 peerOne.getCurrentConnectionInfo(peerOneConnectionID).getAvTransportID();
168
169 assertEquals(peerOne.getCurrentConnectionIDs().size(), 1);
170 assertEquals(peerTwo.getCurrentConnectionIDs().size(), 1);
171
172 assertEquals(peerOne.getCurrentConnectionInfo(peerOneConnectionID).getDirection(), ConnectionInfo.Direction.Output);
173 assertEquals(peerTwo.getCurrentConnectionInfo(peerTwoConnectionID).getDirection(), ConnectionInfo.Direction.Input);
174
175 assertEquals(peerOne.getCurrentConnectionInfo(peerOneConnectionID).getRcsID(), 111);
176 assertEquals(peerTwo.getCurrentConnectionInfo(peerTwoConnectionID).getRcsID(), 111);
177 assertEquals(peerOne.getCurrentConnectionInfo(peerOneConnectionID).getAvTransportID(), 333);
178 assertEquals(peerTwo.getCurrentConnectionInfo(peerTwoConnectionID).getAvTransportID(), 333);
179
180 assertEquals(peerOne.getCurrentConnectionInfo(peerOneConnectionID).getConnectionStatus(), ConnectionInfo.Status.OK);
181 assertEquals(peerTwo.getCurrentConnectionInfo(peerTwoConnectionID).getConnectionStatus(), ConnectionInfo.Status.OK);
182
183
184 int anotherID = peerOne.createConnectionWithPeer(
185 peerOneService.getReference(),
186 controlPoint,
187 peerTwoService,
188 new ProtocolInfo("http-get:*:video/mpeg:*"),
189 ConnectionInfo.Direction.Input
190 );
191 int anotherPeerID = peerOne.getCurrentConnectionInfo(anotherID).getPeerConnectionID();
192
193 assertEquals(peerOne.getCurrentConnectionIDs().size(), 2);
194 assertEquals(peerTwo.getCurrentConnectionIDs().size(), 2);
195
196 assertEquals(peerOne.getCurrentConnectionInfo(anotherID).getRcsID(), 222);
197 assertEquals(peerTwo.getCurrentConnectionInfo(anotherPeerID).getRcsID(), 222);
198 assertEquals(peerOne.getCurrentConnectionInfo(anotherID).getAvTransportID(), 444);
199 assertEquals(peerTwo.getCurrentConnectionInfo(anotherPeerID).getAvTransportID(), 444);
200
201
202 peerOne.closeConnectionWithPeer(
203 controlPoint,
204 peerTwoService,
205 peerOneConnectionID
206 );
207
208 assertEquals(peerOne.getCurrentConnectionIDs().size(), 1);
209 assertEquals(peerTwo.getCurrentConnectionIDs().size(), 1);
210
211
212 assertEquals(peerOne.getCurrentConnectionInfo(anotherID).getPeerConnectionID(), 1);
213
214
215 assertEquals(listener.count, 6);
216 }
217
218 public LocalDevice createDevice(String udn, String type, LocalService service) throws ValidationException {
219 return new LocalDevice(
220 new DeviceIdentity(new UDN(udn)),
221 new UDADeviceType(type),
222 new DeviceDetails(type),
223 service
224 );
225 }
226
227 public LocalService<PeeringConnectionManager> createService(final PeeringConnectionManager peer) {
228
229 LocalService<PeeringConnectionManager> service =
230 new AnnotationLocalServiceBinder().read(
231 AbstractPeeringConnectionManagerService.class
232 );
233
234 service.setManager(
235 new DefaultServiceManager<PeeringConnectionManager>(service, null) {
236 @Override
237 protected PeeringConnectionManager createServiceInstance() throws Exception {
238 return peer;
239 }
240 }
241 );
242 return service;
243 }
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262 public class PeeringConnectionManager extends AbstractPeeringConnectionManagerService {
263
264 PeeringConnectionManager(ProtocolInfos sourceProtocolInfo,
265 ProtocolInfos sinkProtocolInfo) {
266 super(sourceProtocolInfo, sinkProtocolInfo);
267 }
268
269 @Override
270 protected ConnectionInfo createConnection(int connectionID,
271 int peerConnectionId,
272 ServiceReference peerConnectionManager,
273 ConnectionInfo.Direction direction,
274 ProtocolInfo protocolInfo)
275 throws ActionException {
276
277
278 ConnectionInfo con = new ConnectionInfo(
279 connectionID,
280 123,
281 456,
282 protocolInfo,
283 peerConnectionManager,
284 peerConnectionId,
285 direction,
286 ConnectionInfo.Status.OK
287 );
288
289
290 con = new ConnectionInfo(
291 connectionID,
292 connectionID == 0 ? 111 : 222,
293 connectionID == 0 ? 333 : 444,
294 protocolInfo,
295 peerConnectionManager,
296 peerConnectionId,
297 direction,
298 ConnectionInfo.Status.OK
299 );
300
301 return con;
302 }
303
304 @Override
305 protected void closeConnection(ConnectionInfo connectionInfo) {
306
307 }
308
309 @Override
310 protected void peerFailure(ActionInvocation invocation,
311 UpnpResponse operation,
312 String defaultFailureMessage) {
313 System.err.println("Error managing connection with peer: " + defaultFailureMessage);
314 }
315 }
316
317 class CountingListener implements PropertyChangeListener {
318 int count = 0;
319
320 public void propertyChange(PropertyChangeEvent e) {
321 if (e.getPropertyName().equals("CurrentConnectionIDs")) {
322 count++;
323 }
324 }
325 }
326
327 }