@@ -185,7 +185,6 @@ async fn main() {
185
185
186
186
enum Directions {
187
187
None ,
188
- Connect ,
189
188
Listen ,
190
189
}
191
190
@@ -242,6 +241,7 @@ async fn handle_stream(
242
241
return ;
243
242
}
244
243
} ;
244
+ trace ! ( "Recv'd plist: {parsed:?}" ) ;
245
245
246
246
match current_directions {
247
247
Directions :: None => {
@@ -381,14 +381,94 @@ async fn handle_stream(
381
381
return ;
382
382
}
383
383
"Connect" => {
384
- current_directions = Directions :: Connect ;
384
+ let connection_port = parsed
385
+ . plist
386
+ . dict_get_item ( "PortNumber" )
387
+ . unwrap ( )
388
+ . get_uint_val ( )
389
+ . unwrap ( ) ;
390
+ let device_id = parsed
391
+ . plist
392
+ . dict_get_item ( "DeviceID" )
393
+ . unwrap ( )
394
+ . get_uint_val ( )
395
+ . unwrap ( ) ;
396
+
397
+ let connection_port = connection_port as u16 ;
398
+ let connection_port = connection_port. to_be ( ) ;
399
+
400
+ info ! ( "Client is establishing connection to port {connection_port}" ) ;
401
+ let mut central_data = data. lock ( ) . await ;
402
+ if let Some ( device) = central_data. get_device_by_id ( device_id) {
403
+ let network_address = device. network_address . clone ( ) ;
404
+ let device_id = device. device_id . clone ( ) ;
405
+ std:: mem:: drop ( central_data) ;
406
+
407
+ info ! ( "Connecting to device {}" , device_id) ;
408
+
409
+ match network_address {
410
+ Some ( ip) => {
411
+ match tokio:: net:: TcpStream :: connect ( ( ip, connection_port) )
412
+ . await
413
+ {
414
+ Ok ( mut stream) => {
415
+ let mut p = Plist :: new_dict ( ) ;
416
+ p. dict_set_item ( "MessageType" , "Result" . into ( ) )
417
+ . unwrap ( ) ;
418
+ p. dict_set_item ( "Number" , Plist :: new_uint ( 0 ) )
419
+ . unwrap ( ) ;
420
+
421
+ let res = RawPacket :: new ( p, 1 , 8 , parsed. tag ) ;
422
+ let res: Vec < u8 > = res. into ( ) ;
423
+ socket. write_all ( & res) . await . unwrap ( ) ;
424
+
425
+ if let Err ( e) = tokio:: io:: copy_bidirectional (
426
+ & mut stream,
427
+ & mut socket,
428
+ )
429
+ . await
430
+ {
431
+ info ! ( "Bidirectional stream stopped: {e:?}" ) ;
432
+ }
433
+ return ;
434
+ }
435
+ Err ( e) => {
436
+ error ! ( "Unable to connect to device {device_id} port {connection_port}: {e:?}" ) ;
437
+ let mut p = Plist :: new_dict ( ) ;
438
+ p. dict_set_item ( "MessageType" , "Result" . into ( ) )
439
+ . unwrap ( ) ;
440
+ p. dict_set_item ( "Number" , Plist :: new_uint ( 1 ) )
441
+ . unwrap ( ) ;
442
+
443
+ let res = RawPacket :: new ( p, 1 , 8 , parsed. tag ) ;
444
+ let res: Vec < u8 > = res. into ( ) ;
445
+ socket. write_all ( & res) . await . unwrap ( ) ;
446
+
447
+ return ;
448
+ }
449
+ }
450
+ }
451
+ None => {
452
+ unimplemented ! ( )
453
+ }
454
+ }
455
+ } else {
456
+ let mut p = Plist :: new_dict ( ) ;
457
+ p. dict_set_item ( "MessageType" , "Result" . into ( ) ) . unwrap ( ) ;
458
+ p. dict_set_item ( "Number" , Plist :: new_uint ( 1 ) ) . unwrap ( ) ;
459
+
460
+ let res = RawPacket :: new ( p, 1 , 8 , parsed. tag ) ;
461
+ let res: Vec < u8 > = res. into ( ) ;
462
+ socket. write_all ( & res) . await . unwrap ( ) ;
463
+
464
+ return ;
465
+ }
385
466
}
386
467
_ => {
387
468
warn ! ( "Unknown packet type" ) ;
388
469
}
389
470
}
390
471
}
391
- Directions :: Connect => todo ! ( ) ,
392
472
Directions :: Listen => {
393
473
tokio:: time:: sleep ( std:: time:: Duration :: from_secs ( 1 ) ) . await ;
394
474
}
0 commit comments