soup/
logger.rs

1use crate::{prelude::*, Logger, LoggerLogLevel};
2use glib::translate::*;
3use glib::GStr;
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            let logger = from_glib_borrow(logger);
28            let direction: glib::Char = from_glib(direction);
29            let data: &GStr = GStr::from_ptr(data);
30            let callback: &P = &*(user_data as *mut _);
31            (*callback)(&logger, from_glib(level), char::from(direction), data);
32        }
33        unsafe extern "C" fn destroy_func<
34            P: Fn(&Logger, LoggerLogLevel, char, &GStr) + Send + Sync + 'static,
35        >(
36            data: glib::ffi::gpointer,
37        ) {
38            let _callback: Box_<P> = Box_::from_raw(data as *mut _);
39        }
40        unsafe {
41            ffi::soup_logger_set_printer(
42                self.as_ref().to_glib_none().0,
43                Some(printer_func::<P> as _),
44                Box_::into_raw(printer_data) as *mut _,
45                Some(destroy_func::<P> as _),
46            )
47        }
48    }
49}
50
51impl<O: IsA<Logger>> LoggerExtManual for O {}