use futures::SinkExt;
use obex_core::client::ObexClient;
use tokio::io::{AsyncRead, AsyncWrite};
use super::MapClient;
use crate::{folders::Folder, MapError};
impl<T: AsyncRead + AsyncWrite + Unpin> MapClient<T> {
pub(crate) async fn setpath(&mut self, segment: &str) -> Result<(), MapError> {
let req = self.obex.setpath_request(segment)?;
self.transport.send(req).await?;
let rsp_bytes = Self::recv(&mut self.transport).await?;
let rsp = ObexClient::parse_response(&rsp_bytes)?;
if !rsp.opcode.is_ok() {
return Err(MapError::ServerError(rsp.opcode.to_byte()));
}
self.depth = self.depth.saturating_add(1);
Ok(())
}
pub(crate) async fn setpath_up(&mut self) -> Result<(), MapError> {
debug_assert!(self.depth > 0, "setpath_up called at root");
let req = self.obex.setpath_backup_request()?;
self.transport.send(req).await?;
let rsp_bytes = Self::recv(&mut self.transport).await?;
let rsp = ObexClient::parse_response(&rsp_bytes)?;
if !rsp.opcode.is_ok() {
return Err(MapError::ServerError(rsp.opcode.to_byte()));
}
self.depth = self.depth.saturating_sub(1);
Ok(())
}
pub(crate) async fn reset_to_root(&mut self) -> Result<(), MapError> {
for _ in 0..self.depth {
self.setpath_up().await?;
}
Ok(())
}
pub async fn set_folder(&mut self, folder: Folder) -> Result<(), MapError> {
self.reset_to_root().await?;
for segment in ["telecom", "msg", folder.as_str()] {
self.setpath(segment).await?;
}
Ok(())
}
}