use bytes::Bytes;
use formats::xml::FolderListing;
use futures::{SinkExt, StreamExt};
use obex_core::{client::ObexClient, headers::Header};
use tokio::io::{AsyncRead, AsyncWrite};
use super::MapClient;
use crate::{params::set_notification_registration_params, MapError};
impl<T: AsyncRead + AsyncWrite + Unpin> MapClient<T> {
pub async fn get_folder_listing(&mut self) -> Result<FolderListing, MapError> {
let req = self.obex.get_request(b"x-obex/folder-listing\x00", None, None)?;
self.transport.send(req).await?;
let body = self.collect_body().await?;
Ok(FolderListing::parse(&body)?)
}
pub async fn set_notification_registration(&mut self, enable: bool) -> Result<(), MapError> {
let req = self.obex.put_final_request(
b"x-bt/MAP-NotificationRegistration\x00",
vec![
Header::AppParams(set_notification_registration_params(enable)),
Header::EndOfBody(Bytes::new()),
],
)?;
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()));
}
Ok(())
}
pub async fn hold(&mut self) -> Result<(), MapError> {
loop {
match self.transport.next().await {
None => return Ok(()),
Some(Ok(_)) => {}
Some(Err(e)) => return Err(MapError::Transport(e)),
}
}
}
pub async fn disconnect(mut self) -> Result<(), MapError> {
let req = self.obex.disconnect_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()));
}
Ok(())
}
}