gstreamer_rtsp_server/
rtsp_auth.rs1use std::{boxed::Box as Box_, mem::transmute};
4
5use glib::{
6 prelude::*,
7 signal::{connect_raw, SignalHandlerId},
8 translate::*,
9};
10
11use crate::{ffi, RTSPAuth, RTSPToken};
12
13pub trait RTSPAuthExtManual: IsA<RTSPAuth> + 'static {
14 #[doc(alias = "gst_rtsp_auth_set_default_token")]
15 fn set_default_token(&self, mut token: Option<&mut RTSPToken>) {
16 unsafe {
17 ffi::gst_rtsp_auth_set_default_token(
18 self.as_ref().to_glib_none().0,
19 token.to_glib_none_mut().0,
20 );
21 }
22 }
23
24 fn connect_accept_certificate<
25 F: Fn(
26 &Self,
27 &gio::TlsConnection,
28 &gio::TlsCertificate,
29 gio::TlsCertificateFlags,
30 ) -> Result<(), gst::LoggableError>
31 + Send
32 + Sync
33 + 'static,
34 >(
35 &self,
36 f: F,
37 ) -> SignalHandlerId {
38 unsafe {
39 let f: Box_<F> = Box_::new(f);
40 connect_raw(
41 self.as_ptr() as *mut _,
42 b"accept-certificate\0".as_ptr() as *const _,
43 Some(transmute::<*const (), unsafe extern "C" fn()>(
44 accept_certificate_trampoline::<Self, F> as *const (),
45 )),
46 Box_::into_raw(f),
47 )
48 }
49 }
50}
51
52impl<O: IsA<RTSPAuth>> RTSPAuthExtManual for O {}
53
54unsafe extern "C" fn accept_certificate_trampoline<
55 P,
56 F: Fn(
57 &P,
58 &gio::TlsConnection,
59 &gio::TlsCertificate,
60 gio::TlsCertificateFlags,
61 ) -> Result<(), gst::LoggableError>
62 + Send
63 + Sync
64 + 'static,
65>(
66 this: *mut ffi::GstRTSPAuth,
67 connection: *mut gio::ffi::GTlsConnection,
68 peer_cert: *mut gio::ffi::GTlsCertificate,
69 errors: gio::ffi::GTlsCertificateFlags,
70 f: glib::ffi::gpointer,
71) -> glib::ffi::gboolean
72where
73 P: IsA<RTSPAuth>,
74{
75 let f: &F = &*(f as *const F);
76 match f(
77 RTSPAuth::from_glib_borrow(this).unsafe_cast_ref(),
78 &from_glib_borrow(connection),
79 &from_glib_borrow(peer_cert),
80 from_glib(errors),
81 ) {
82 Ok(()) => true,
83 Err(err) => {
84 err.log();
85 false
86 }
87 }
88 .into_glib()
89}