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 {}