dtn7/core/
application_agent.rs1use bp7::{Bundle, EndpointID};
2use enum_dispatch::enum_dispatch;
3use log::{debug, trace};
4use std::collections::VecDeque;
5use std::fmt::Debug;
6use tokio::sync::mpsc::Sender;
7
8use crate::dtnd::ws::BundleDelivery;
9use crate::store_remove_if_singleton_bundle;
10#[enum_dispatch]
13#[derive(Debug)]
14pub enum ApplicationAgentEnum {
15 SimpleApplicationAgent,
16}
17
18#[enum_dispatch(ApplicationAgentEnum)]
19pub trait ApplicationAgent: Debug {
20 fn eid(&self) -> &EndpointID;
21 fn push(&mut self, bundle: &Bundle);
22 fn pop(&mut self) -> Option<Bundle>;
23 fn set_delivery_addr(&mut self, addr: Sender<BundleDelivery>);
24 fn clear_delivery_addr(&mut self);
25 fn delivery_addr(&self) -> Option<Sender<BundleDelivery>>;
26}
27
28#[derive(Debug, Clone)]
29pub struct SimpleApplicationAgent {
30 eid: EndpointID,
31 bundles: VecDeque<Bundle>,
32 delivery: Option<Sender<BundleDelivery>>,
33}
34
35impl ApplicationAgent for SimpleApplicationAgent {
36 fn eid(&self) -> &EndpointID {
37 &self.eid
38 }
39 fn push(&mut self, bundle: &Bundle) {
40 debug!("Received {:?} | {:?}", bundle.id(), bp7::dtn_time_now());
41 trace!("Received raw: {:?}", bundle);
42
43 if let Some(addr) = self.delivery_addr() {
45 if addr.try_send(BundleDelivery(bundle.clone())).is_err() {
48 self.bundles.push_back(bundle.clone());
49 } else {
50 store_remove_if_singleton_bundle(bundle);
51 }
52 } else {
53 self.bundles.push_back(bundle.clone());
55 }
56 }
57 fn pop(&mut self) -> Option<Bundle> {
58 let bundle = self.bundles.pop_front();
59 if let Some(bndl) = bundle.as_ref() {
60 store_remove_if_singleton_bundle(bndl);
61 };
62 bundle
63 }
64
65 fn set_delivery_addr(&mut self, addr: Sender<BundleDelivery>) {
66 self.delivery = Some(addr);
67 }
68
69 fn clear_delivery_addr(&mut self) {
70 self.delivery = None;
71 }
72
73 fn delivery_addr(&self) -> Option<Sender<BundleDelivery>> {
74 self.delivery.clone()
75 }
76}
77
78impl SimpleApplicationAgent {
79 pub fn with(eid: EndpointID) -> SimpleApplicationAgent {
80 SimpleApplicationAgent {
81 eid,
82 bundles: VecDeque::new(),
83 delivery: None,
84 }
85 }
86}