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