use crate::{
ADBTransport, Result,
models::{ADBCommand, ADBHostCommand},
server::TCPServerTransport,
};
use std::net::SocketAddrV4;
#[derive(Debug)]
pub struct ADBServerDevice {
pub identifier: Option<String>,
pub(crate) transport: TCPServerTransport,
}
impl ADBServerDevice {
#[must_use]
pub fn new(identifier: String, server_addr: Option<SocketAddrV4>) -> Self {
let transport = TCPServerTransport::new_or_default(server_addr);
Self {
identifier: Some(identifier),
transport,
}
}
#[must_use]
pub fn autodetect(server_addr: Option<SocketAddrV4>) -> Self {
let transport = TCPServerTransport::new_or_default(server_addr);
Self {
identifier: None,
transport,
}
}
pub(crate) fn connect(&mut self) -> Result<&mut TCPServerTransport> {
self.transport.connect()?;
Ok(&mut self.transport)
}
pub(crate) fn set_serial_transport(&mut self) -> Result<()> {
let identifier = self.identifier.clone();
let transport = self.connect()?;
if let Some(serial) = identifier {
transport
.send_adb_request(&ADBCommand::Host(ADBHostCommand::TransportSerial(serial)))?;
} else {
transport.send_adb_request(&ADBCommand::Host(ADBHostCommand::TransportAny))?;
}
Ok(())
}
}
impl Drop for ADBServerDevice {
fn drop(&mut self) {
let _ = self.transport.disconnect();
}
}