Skip to content

Commit 15fd214

Browse files
committed
Implement TCP mux connections
1 parent 3a23670 commit 15fd214

File tree

2 files changed

+87
-3
lines changed

2 files changed

+87
-3
lines changed

src/devices.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ impl SharedDevices {
109109
self.devices.insert(udid, dev);
110110
}
111111

112+
pub fn get_device_by_id(&self, id: u64) -> Option<&MuxerDevice> {
113+
self.devices.values().find(|x| x.device_id == id)
114+
}
115+
112116
#[cfg(feature = "usb")]
113117
pub fn add_usb_device(&mut self, udid: String, _data: Arc<Mutex<Self>>) {
114118
self.last_index += 1;

src/main.rs

Lines changed: 83 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,6 @@ async fn main() {
185185

186186
enum Directions {
187187
None,
188-
Connect,
189188
Listen,
190189
}
191190

@@ -242,6 +241,7 @@ async fn handle_stream(
242241
return;
243242
}
244243
};
244+
trace!("Recv'd plist: {parsed:?}");
245245

246246
match current_directions {
247247
Directions::None => {
@@ -381,14 +381,94 @@ async fn handle_stream(
381381
return;
382382
}
383383
"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+
}
385466
}
386467
_ => {
387468
warn!("Unknown packet type");
388469
}
389470
}
390471
}
391-
Directions::Connect => todo!(),
392472
Directions::Listen => {
393473
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
394474
}

0 commit comments

Comments
 (0)