Skip to main content

freeswitch_types/variables/
sofia.rs

1//! Typed mod_sofia / SIP channel variable names.
2
3sip_header::define_header_enum! {
4    tests_mod: sofia_variable_generated_tests,
5    error_type: ParseSofiaVariableError => "unknown sofia variable",
6    /// mod_sofia / SIP channel variable names (the part after the `variable_` prefix).
7    ///
8    /// Use with [`HeaderLookup::variable()`](crate::HeaderLookup::variable) for type-safe lookups.
9    /// Core FreeSWITCH variables belong in [`ChannelVariable`](super::ChannelVariable).
10    pub enum SofiaVariable {
11        // --- SIP From ---
12        SipFromUser => "sip_from_user",
13        SipFromHost => "sip_from_host",
14        SipFromPort => "sip_from_port",
15        SipFromUri => "sip_from_uri",
16        SipFromDisplay => "sip_from_display",
17        SipFromTag => "sip_from_tag",
18        SipFromComment => "sip_from_comment",
19        SipFromUserStripped => "sip_from_user_stripped",
20        SipFullFrom => "sip_full_from",
21
22        // --- SIP To ---
23        SipToUser => "sip_to_user",
24        SipToHost => "sip_to_host",
25        SipToPort => "sip_to_port",
26        SipToUri => "sip_to_uri",
27        SipToDisplay => "sip_to_display",
28        SipToTag => "sip_to_tag",
29        SipToComment => "sip_to_comment",
30        SipFullTo => "sip_full_to",
31
32        // --- SIP Contact ---
33        SipContactUser => "sip_contact_user",
34        SipContactHost => "sip_contact_host",
35        SipContactPort => "sip_contact_port",
36        SipContactUri => "sip_contact_uri",
37        SipContactParams => "sip_contact_params",
38
39        // --- SIP Request ---
40        SipReqUser => "sip_req_user",
41        SipReqHost => "sip_req_host",
42        SipReqPort => "sip_req_port",
43        SipReqUri => "sip_req_uri",
44
45        // --- SIP Via ---
46        SipViaHost => "sip_via_host",
47        SipViaPort => "sip_via_port",
48        SipViaRport => "sip_via_rport",
49        SipViaProtocol => "sip_via_protocol",
50        SipFullVia => "sip_full_via",
51        SipFullRoute => "sip_full_route",
52
53        // --- SIP Session ---
54        SipCallId => "sip_call_id",
55        SipCseq => "sip_cseq",
56        SipUserAgent => "sip_user_agent",
57        SipSubject => "sip_subject",
58        SipAllow => "sip_allow",
59        SipAcceptLanguage => "sip_accept_language",
60        SipCallInfo => "sip_call_info",
61        SipDateEpochTime => "sip_date_epoch_time",
62
63        // --- SIP Network ---
64        SipReceivedIp => "sip_received_ip",
65        SipReceivedPort => "sip_received_port",
66        SipNetworkIp => "sip_network_ip",
67        SipNetworkPort => "sip_network_port",
68        SipNatDetected => "sip_nat_detected",
69        SipTransport => "sip_transport",
70        SipReplyHost => "sip_reply_host",
71
72        // --- SIP Auth ---
73        SipAuthUsername => "sip_auth_username",
74        SipAuthPassword => "sip_auth_password",
75        SipAuthorized => "sip_authorized",
76        SipAclAuthedBy => "sip_acl_authed_by",
77        SipAclToken => "sip_acl_token",
78        SipChallengeRealm => "sip_challenge_realm",
79
80        // --- SIP Failure / Hangup ---
81        SipInviteFailureStatus => "sip_invite_failure_status",
82        SipInviteFailurePhrase => "sip_invite_failure_phrase",
83        SipHangupDisposition => "sip_hangup_disposition",
84        SipTermStatus => "sip_term_status",
85        SipTermCause => "sip_term_cause",
86        SipReason => "sip_reason",
87
88        // --- SIP Identity / Privacy ---
89        SipPAssertedIdentity => "sip_P-Asserted-Identity",
90        SipPPreferredIdentity => "sip_P-Preferred-Identity",
91        SipPrivacy => "sip_Privacy",
92        SipRemotePartyId => "sip_Remote-Party-ID",
93        SipStirShakenAttest => "sip_stir_shaken_attest",
94        SipVerstat => "sip_verstat",
95        SipVerstatDetailed => "sip_verstat_detailed",
96
97        // --- SIP Invite Details ---
98        SipInviteCallId => "sip_invite_call_id",
99        SipInviteCseq => "sip_invite_cseq",
100        SipInviteFullFrom => "sip_invite_full_from",
101        SipInviteFullTo => "sip_invite_full_to",
102        SipInviteFullVia => "sip_invite_full_via",
103        SipInviteFromUri => "sip_invite_from_uri",
104        SipInviteToUri => "sip_invite_to_uri",
105        SipInviteReqUri => "sip_invite_req_uri",
106        SipInviteRecordRoute => "sip_invite_record_route",
107        SipInviteRouteUri => "sip_invite_route_uri",
108        SipInviteDomain => "sip_invite_domain",
109        SipInviteParams => "sip_invite_params",
110
111        // --- SIP Features ---
112        SipAutoAnswer => "sip_auto_answer",
113        SipAutoSimplify => "sip_auto_simplify",
114        SipEnableSoa => "sip_enable_soa",
115        SipCopyCustomHeaders => "sip_copy_custom_headers",
116        SipCopyMultipart => "sip_copy_multipart",
117        SipLoopedCall => "sip_looped_call",
118
119        // --- SIP Redirect / Transfer ---
120        SipRedirectedTo => "sip_redirected_to",
121        SipRedirectedBy => "sip_redirected_by",
122        SipRedirectDialstring => "sip_redirect_dialstring",
123        SipReferReply => "sip_refer_reply",
124        SipReferStatusCode => "sip_refer_status_code",
125        SipReferredByFull => "sip_referred_by_full",
126        SipReferredByCid => "sip_referred_by_cid",
127        SipReinviteSdp => "sip_reinvite_sdp",
128
129        // --- SIP Gateway ---
130        SipGateway => "sip_gateway",
131        SipGatewayName => "sip_gateway_name",
132        SipUseGateway => "sip_use_gateway",
133        SipDestinationUrl => "sip_destination_url",
134
135        // --- Sofia Profile ---
136        SipProfileName => "sip_profile_name",
137        SofiaProfileName => "sofia_profile_name",
138        SofiaProfileUrl => "sofia_profile_url",
139        SofiaProfileDomainName => "sofia_profile_domain_name",
140
141        // --- RTP / SRTP (set via mod_sofia / switch_core_media) ---
142        RtpSecureMediaConfirmed => "rtp_secure_media_confirmed",
143        Rtp2833SendPayload => "rtp_2833_send_payload",
144        Rtp2833RecvPayload => "rtp_2833_recv_payload",
145        RtpDisableHold => "rtp_disable_hold",
146        RtpJitterBufferPlc => "rtp_jitter_buffer_plc",
147        RtpVideoMaxBandwidthIn => "rtp_video_max_bandwidth_in",
148        RtpVideoMaxBandwidthOut => "rtp_video_max_bandwidth_out",
149
150        // --- SIP Callee / Display ---
151        SipCalleeIdName => "sip_callee_id_name",
152        SipCalleeIdNumber => "sip_callee_id_number",
153        SipCidType => "sip_cid_type",
154
155        // --- SIP RTP Stats ---
156        SipRtpRxstat => "sip_rtp_rxstat",
157        SipRtpTxstat => "sip_rtp_txstat",
158        SipPRtpStat => "sip_p_rtp_stat",
159
160        // --- SIP History ---
161        SipHistoryInfo => "sip_history_info",
162        SipGeolocation => "sip_geolocation",
163
164        // --- SIP Body ---
165        SipMultipart => "sip_multipart",
166    }
167}
168
169#[cfg(test)]
170mod tests {
171    use super::*;
172
173    #[test]
174    fn display_round_trip() {
175        assert_eq!(SofiaVariable::SipCallId.to_string(), "sip_call_id");
176        assert_eq!(
177            SofiaVariable::SipFromDisplay.to_string(),
178            "sip_from_display"
179        );
180        assert_eq!(
181            SofiaVariable::SofiaProfileName.to_string(),
182            "sofia_profile_name"
183        );
184    }
185
186    #[test]
187    fn as_ref_str() {
188        let v: &str = SofiaVariable::SipNetworkIp.as_ref();
189        assert_eq!(v, "sip_network_ip");
190    }
191
192    #[test]
193    fn from_str_case_insensitive() {
194        assert_eq!(
195            "sip_call_id".parse::<SofiaVariable>(),
196            Ok(SofiaVariable::SipCallId)
197        );
198        assert_eq!(
199            "SIP_CALL_ID".parse::<SofiaVariable>(),
200            Ok(SofiaVariable::SipCallId)
201        );
202    }
203
204    #[test]
205    fn from_str_unknown() {
206        let err = "nonexistent_sip_var".parse::<SofiaVariable>();
207        assert!(err.is_err());
208    }
209}