Skip to main content

soup/
logger.rs

1use crate::{Logger, LoggerLogLevel, prelude::*};
2use glib::GStr;
3use glib::translate::*;
4use std::boxed::Box as Box_;
5
6mod sealed {
7    pub trait Sealed {}
8    impl<T: super::IsA<crate::Logger>> Sealed for T {}
9}
10
11pub trait LoggerExtManual: IsA<Logger> + sealed::Sealed + 'static {
12    #[doc(alias = "soup_logger_set_printer")]
13    fn set_printer<P: Fn(&Logger, LoggerLogLevel, char, &GStr) + Send + Sync + 'static>(
14        &self,
15        printer: P,
16    ) {
17        let printer_data: Box_<P> = Box_::new(printer);
18        unsafe extern "C" fn printer_func<
19            P: Fn(&Logger, LoggerLogLevel, char, &GStr) + Send + Sync + 'static,
20        >(
21            logger: *mut ffi::SoupLogger,
22            level: ffi::SoupLoggerLogLevel,
23            direction: libc::c_char,
24            data: *const libc::c_char,
25            user_data: glib::ffi::gpointer,
26        ) {
27            unsafe {
28                let logger = from_glib_borrow(logger);
29                let direction: glib::Char = from_glib(direction);
30                let data: &GStr = GStr::from_ptr(data);
31                let callback: &P = &*(user_data as *mut _);
32                (*callback)(&logger, from_glib(level), char::from(direction), data);
33            }
34        }
35        unsafe extern "C" fn destroy_func<
36            P: Fn(&Logger, LoggerLogLevel, char, &GStr) + Send + Sync + 'static,
37        >(
38            data: glib::ffi::gpointer,
39        ) {
40            unsafe {
41                let _callback: Box_<P> = Box_::from_raw(data as *mut _);
42            }
43        }
44        unsafe {
45            ffi::soup_logger_set_printer(
46                self.as_ref().to_glib_none().0,
47                Some(printer_func::<P> as _),
48                Box_::into_raw(printer_data) as *mut _,
49                Some(destroy_func::<P> as _),
50            )
51        }
52    }
53}
54
55impl<O: IsA<Logger>> LoggerExtManual for O {}