use super::super::cov_notify_context::{CovFanoutHandles, CovNotifyContext};
use super::*;
use crate::cov::CovSubscriptionKey;
impl<T: TransportPort + 'static> BACnetServer<T> {
pub(in crate::server) async fn fire_cov_revisits(
ctx: &CovNotifyContext<'_, T>,
keys: &[CovSubscriptionKey],
) {
if ctx.comm_state.initiation_restricted() {
return;
}
let (subs, counters, in_flight_tracker) = {
let table = ctx.cov_table.read().await;
(
keys.iter()
.filter_map(|key| table.get_subscription(key))
.filter(|sub| table.is_current(sub))
.cloned()
.collect::<Vec<_>>(),
Arc::clone(table.counters()),
Arc::clone(table.in_flight_tracker()),
)
};
if subs.is_empty() {
return;
}
let handles = CovFanoutHandles {
ctx,
in_flight_tracker: &in_flight_tracker,
counters: &counters,
};
let mut single_by_object: HashMap<ObjectIdentifier, Vec<CovSubscriptionSnapshot>> =
HashMap::new();
let mut multiple_by_context: HashMap<
crate::cov::MultipleContextKey,
Vec<CovSubscriptionSnapshot>,
> = HashMap::new();
for sub in subs {
match sub.key().multiple_context() {
Some(context) => multiple_by_context
.entry(context.clone())
.or_default()
.push(sub),
None => single_by_object
.entry(sub.monitored_object_identifier)
.or_default()
.push(sub),
}
}
for (oid, subs) in &single_by_object {
Self::fire_cov_notifications_for_subscriptions(
&handles,
oid,
subs,
None,
false,
&mut EventBudget::new(&ctx.config.cov_policy),
)
.await;
}
for subs in multiple_by_context.values() {
Self::fire_cov_notification_multiple_for_subscriptions(
&handles,
subs,
None,
false,
&mut EventBudget::new(&ctx.config.cov_policy),
)
.await;
}
}
}