Skip to main content

freeswitch_types/sofia/
event_subclass.rs

1//! Typed Sofia event subclass names (`Event-Subclass` header values).
2
3wire_enum! {
4    /// Sofia event subclass values from `mod_sofia.h` `MY_EVENT_*` defines.
5    ///
6    /// These appear as the `Event-Subclass` header on `CUSTOM` events fired by
7    /// mod_sofia. Use with [`EventSubscription::sofia_event()`](crate::EventSubscription::sofia_event)
8    /// for typed subscriptions, or parse from received events via
9    /// [`HeaderLookup::sofia_event_subclass()`](crate::HeaderLookup::sofia_event_subclass).
10    #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
11    pub enum SofiaEventSubclass {
12        Register => "sofia::register",
13        PreRegister => "sofia::pre_register",
14        RegisterAttempt => "sofia::register_attempt",
15        RegisterFailure => "sofia::register_failure",
16        Unregister => "sofia::unregister",
17        Expire => "sofia::expire",
18        GatewayState => "sofia::gateway_state",
19        SipUserState => "sofia::sip_user_state",
20        NotifyRefer => "sofia::notify_refer",
21        Reinvite => "sofia::reinvite",
22        GatewayAdd => "sofia::gateway_add",
23        GatewayDelete => "sofia::gateway_delete",
24        GatewayInvalidDigestReq => "sofia::gateway_invalid_digest_req",
25        RecoveryRecv => "sofia::recovery_recv",
26        RecoverySend => "sofia::recovery_send",
27        RecoveryRecovered => "sofia::recovery_recovered",
28        Error => "sofia::error",
29        ProfileStart => "sofia::profile_start",
30        NotifyWatchedHeader => "sofia::notify_watched_header",
31        WrongCallState => "sofia::wrong_call_state",
32        Transferor => "sofia::transferor",
33        Transferee => "sofia::transferee",
34        Replaced => "sofia::replaced",
35        Intercepted => "sofia::intercepted",
36        ByeResponse => "sofia::bye_response",
37    }
38    error ParseSofiaEventSubclassError("sofia event subclass");
39    tests: sofia_event_subclass_wire_tests;
40}
41
42impl SofiaEventSubclass {
43    /// All Sofia event subclass variants.
44    pub const ALL: &[SofiaEventSubclass] = &[
45        Self::Register,
46        Self::PreRegister,
47        Self::RegisterAttempt,
48        Self::RegisterFailure,
49        Self::Unregister,
50        Self::Expire,
51        Self::GatewayState,
52        Self::SipUserState,
53        Self::NotifyRefer,
54        Self::Reinvite,
55        Self::GatewayAdd,
56        Self::GatewayDelete,
57        Self::GatewayInvalidDigestReq,
58        Self::RecoveryRecv,
59        Self::RecoverySend,
60        Self::RecoveryRecovered,
61        Self::Error,
62        Self::ProfileStart,
63        Self::NotifyWatchedHeader,
64        Self::WrongCallState,
65        Self::Transferor,
66        Self::Transferee,
67        Self::Replaced,
68        Self::Intercepted,
69        Self::ByeResponse,
70    ];
71
72    /// Registration-related subclasses.
73    pub const REGISTRATION_EVENTS: &[SofiaEventSubclass] = &[
74        Self::Register,
75        Self::PreRegister,
76        Self::RegisterAttempt,
77        Self::RegisterFailure,
78        Self::Unregister,
79        Self::Expire,
80    ];
81
82    /// Gateway lifecycle and state subclasses.
83    pub const GATEWAY_EVENTS: &[SofiaEventSubclass] = &[
84        Self::GatewayState,
85        Self::GatewayAdd,
86        Self::GatewayDelete,
87        Self::GatewayInvalidDigestReq,
88    ];
89}
90
91#[cfg(test)]
92mod tests {
93    use super::*;
94
95    #[test]
96    fn registration_events_subset() {
97        for &ev in SofiaEventSubclass::REGISTRATION_EVENTS {
98            assert!(SofiaEventSubclass::ALL.contains(&ev), "{ev} not in ALL");
99        }
100    }
101
102    #[test]
103    fn gateway_events_subset() {
104        for &ev in SofiaEventSubclass::GATEWAY_EVENTS {
105            assert!(SofiaEventSubclass::ALL.contains(&ev), "{ev} not in ALL");
106        }
107    }
108}