use crate::error::Result;
use crate::org_freedesktop_dbus::{self, NameFlag};
use crate::{BodyBuf, RecvBuf, SendBuf, Serial};
#[non_exhaustive]
pub struct Buffers {
pub recv: RecvBuf,
pub send: SendBuf,
pub body: BodyBuf,
}
impl Buffers {
pub fn new() -> Self {
Self {
recv: RecvBuf::new(),
send: SendBuf::new(),
body: BodyBuf::new(),
}
}
pub fn hello(&mut self) -> Result<Serial> {
let m = self
.send
.method_call(org_freedesktop_dbus::PATH, "Hello")
.with_destination(org_freedesktop_dbus::DESTINATION);
let serial = m.serial();
self.send.write_message(m)?;
Ok(serial)
}
pub fn request_name(&mut self, name: &str, flags: NameFlag) -> Result<Serial> {
self.body.clear();
self.body.store(name)?;
self.body.store(flags)?;
let m = self
.send
.method_call(org_freedesktop_dbus::PATH, "RequestName")
.with_destination(org_freedesktop_dbus::DESTINATION)
.with_body(&self.body);
let serial = m.serial();
self.send.write_message(m)?;
Ok(serial)
}
pub fn release_name(&mut self, name: &str) -> Result<Serial> {
self.body.clear();
self.body.store(name)?;
let m = self
.send
.method_call(org_freedesktop_dbus::PATH, "ReleaseName")
.with_destination(org_freedesktop_dbus::DESTINATION)
.with_body(&self.body);
let serial = m.serial();
self.send.write_message(m)?;
Ok(serial)
}
pub fn add_match(&mut self, rule: &str) -> Result<Serial> {
self.match_rule("AddMatch", rule)
}
pub fn remove_match(&mut self, rule: &str) -> Result<Serial> {
self.match_rule("RemoveMatch", rule)
}
fn match_rule(&mut self, member: &str, rule: &str) -> Result<Serial> {
self.body.clear();
self.body.store(rule)?;
let m = self
.send
.method_call(org_freedesktop_dbus::PATH, member)
.with_destination(org_freedesktop_dbus::DESTINATION)
.with_body(&self.body);
let serial = m.serial();
self.send.write_message(m)?;
Ok(serial)
}
}
impl Default for Buffers {
#[inline]
fn default() -> Self {
Self::new()
}
}