use std::sync::Arc;
use zenoh_protocol::core::ZenohIdProto;
use zenoh_result::ZResult;
use zenoh_transport::{
TransportEventHandler, TransportMulticastEventHandler, TransportPeer, TransportPeerEventHandler,
};
use crate::{api::session::WeakSession, sample::SampleKind};
pub(crate) struct ConnectivityHandler {
session: WeakSession,
}
impl ConnectivityHandler {
pub(crate) fn new(session: WeakSession) -> Self {
Self { session }
}
}
impl TransportEventHandler for ConnectivityHandler {
fn new_unicast(
&self,
peer: TransportPeer,
_transport: zenoh_transport::unicast::TransportUnicast,
) -> ZResult<Arc<dyn TransportPeerEventHandler>> {
self.session
.broadcast_transport_event(SampleKind::Put, &peer, false);
Ok(Arc::new(ConnectivityPeerHandler {
session: self.session.clone(),
peer_zid: peer.zid,
peer,
is_multicast: false,
}))
}
fn new_multicast(
&self,
_transport: zenoh_transport::multicast::TransportMulticast,
) -> ZResult<Arc<dyn TransportMulticastEventHandler>> {
Ok(Arc::new(ConnectivityMulticastHandler {
session: self.session.clone(),
}))
}
}
pub(crate) struct ConnectivityPeerHandler {
session: WeakSession,
peer_zid: ZenohIdProto,
peer: TransportPeer,
is_multicast: bool,
}
impl TransportPeerEventHandler for ConnectivityPeerHandler {
fn handle_message(&self, _msg: zenoh_protocol::network::NetworkMessageMut) -> ZResult<()> {
Ok(())
}
fn new_link(&self, link: zenoh_link::Link) {
self.session.broadcast_link_event(
SampleKind::Put,
self.peer_zid,
&link,
self.is_multicast,
self.peer.is_qos,
);
}
fn del_link(&self, link: zenoh_link::Link) {
self.session.broadcast_link_event(
SampleKind::Delete,
self.peer_zid,
&link,
self.is_multicast,
self.peer.is_qos,
);
}
fn closed(&self) {
self.session
.broadcast_transport_event(SampleKind::Delete, &self.peer, self.is_multicast);
}
fn as_any(&self) -> &dyn std::any::Any {
self
}
}
pub(crate) struct ConnectivityMulticastHandler {
session: WeakSession,
}
impl TransportMulticastEventHandler for ConnectivityMulticastHandler {
fn new_peer(&self, peer: TransportPeer) -> ZResult<Arc<dyn TransportPeerEventHandler>> {
self.session
.broadcast_transport_event(SampleKind::Put, &peer, true);
Ok(Arc::new(ConnectivityPeerHandler {
session: self.session.clone(),
peer_zid: peer.zid,
peer,
is_multicast: true,
}))
}
fn closed(&self) {
}
fn as_any(&self) -> &dyn std::any::Any {
self
}
}