Struct zbus::ObjectServer[][src]

pub struct ObjectServer { /* fields omitted */ }
Expand description

An object server, holding server-side D-Bus objects & interfaces.

Object servers hold interfaces on various object paths, and expose them over D-Bus.

All object paths will have the standard interfaces implemented on your behalf, such as org.freedesktop.DBus.Introspectable or org.freedesktop.DBus.Properties.

Example

This example exposes the org.myiface.Example.Quit method on the /org/zbus/path path.

use zbus::{Connection, ObjectServer, dbus_interface};
use std::sync::Arc;
use event_listener::Event;

struct Example {
    // Interfaces are owned by the ObjectServer. They can have
    // `&mut self` methods.
    quit_event: Event,
}

impl Example {
    fn new(quit_event: Event) -> Self {
        Self { quit_event }
    }
}

#[dbus_interface(name = "org.myiface.Example")]
impl Example {
    // This will be the "Quit" D-Bus method.
    async fn quit(&mut self) {
        self.quit_event.notify(1);
    }

    // See `dbus_interface` documentation to learn
    // how to expose properties & signals as well.
}

let connection = Connection::session().await?;

let quit_event = Event::new();
let quit_listener = quit_event.listen();
let interface = Example::new(quit_event);
connection
    .object_server_mut()
    .await
    .at("/org/zbus/path", interface)?;

quit_listener.await;

Implementations

Register a D-Bus Interface at a given path. (see the example above)

If the interface already exists at this path, returns false.

Unregister a D-Bus Interface at a given path.

If there are no more interfaces left at that path, destroys the object as well. Returns whether the object was destroyed.

Run func with the given path & interface.

Errors

If the interface is not registered at the given path, Error::InterfaceNotFound error is returned.

Examples

The typical use of this is to emit signals outside of a dispatched handler:

struct MyIface;
#[dbus_interface(name = "org.myiface.MyIface")]
impl MyIface {
    #[dbus_interface(signal)]
    async fn emit_signal(ctxt: &SignalContext<'_>) -> zbus::Result<()>;
}

connection
    .object_server()
    .await
    .with(path, |_iface: InterfaceDeref<'_, MyIface>, signal_ctxt| async move {
        MyIface::emit_signal(&signal_ctxt).await
    })
    .await?;

Run func with the given path & interface.

Same as ObjectServer::with, except func gets a mutable reference.

Examples

The typical use of this is property changes outside of a dispatched handler:

struct MyIface(u32);

#[dbus_interface(name = "org.myiface.MyIface")]
impl MyIface {
     #[dbus_interface(property)]
     async fn count(&self) -> u32 {
         self.0
     }
}

connection
    .object_server()
    .await
    .with_mut(path, |mut iface: InterfaceDerefMut<'_, MyIface>, signal_ctxt| async move {
        iface.0 = 42;
        iface.count_changed(&signal_ctxt).await
    })
    .await?;

Get a reference to the interface at the given path.

Get a reference to the interface at the given path.

WARNINGS: Since self will not be able to access the interface in question until the return value of this method is dropped, it is highly recommended to prefer ObjectServer::with or ObjectServer::with_mut over this method. They are also more convenient to use for emitting signals and changing properties.

Errors

If the interface is not registered at the given path, Error::InterfaceNotFound error is returned.

Examples


struct MyIface(u32);

#[dbus_interface(name = "org.myiface.MyIface")]
impl MyIface {
   #[dbus_interface(property)]
   async fn count(&self) -> u32 {
       self.0
   }
}

// Setup connection and object_server etc here and then in another part of the code:
let mut object_server = connection.object_server().await;
let mut iface = object_server.get_interface_mut::<_, MyIface>(path).await?;
// Note: This will not be needed when using `ObjectServer::with_mut`
let ctxt = SignalContext::new(&connection, path)?;
iface.0 = 42;
iface.count_changed(&ctxt).await?;

Start listening to incoming method messages and dispatch them to appropriate interfaces.

This is implicit when creating a bus connection (the default) and doesn’t do anything if self is already dispatching. You only need to explicitly call it when using peer-to-peer connections (see zbus::ConnectionBuilder::p2p).

Trait Implementations

Formats the value using the given formatter. Read more

Performs the conversion.

Performs the conversion.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Performs the conversion.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.