1use crate::{LoggerLogLevel, Message, SessionFeature, ffi};
7use glib::{
8 prelude::*,
9 signal::{SignalHandlerId, connect_raw},
10 translate::*,
11};
12use std::boxed::Box as Box_;
13
14glib::wrapper! {
15 #[doc(alias = "SoupLogger")]
16 pub struct Logger(Object<ffi::SoupLogger, ffi::SoupLoggerClass>) @implements SessionFeature;
17
18 match fn {
19 type_ => || ffi::soup_logger_get_type(),
20 }
21}
22
23impl Logger {
24 #[doc(alias = "soup_logger_new")]
25 pub fn new(level: LoggerLogLevel) -> Logger {
26 assert_initialized_main_thread!();
27 unsafe { from_glib_full(ffi::soup_logger_new(level.into_glib())) }
28 }
29
30 pub fn builder() -> LoggerBuilder {
35 LoggerBuilder::new()
36 }
37
38 #[doc(alias = "soup_logger_get_max_body_size")]
39 #[doc(alias = "get_max_body_size")]
40 #[doc(alias = "max-body-size")]
41 pub fn max_body_size(&self) -> i32 {
42 unsafe { ffi::soup_logger_get_max_body_size(self.to_glib_none().0) }
43 }
44
45 #[doc(alias = "soup_logger_set_max_body_size")]
46 #[doc(alias = "max-body-size")]
47 pub fn set_max_body_size(&self, max_body_size: i32) {
48 unsafe {
49 ffi::soup_logger_set_max_body_size(self.to_glib_none().0, max_body_size);
50 }
51 }
52
53 #[doc(alias = "soup_logger_set_request_filter")]
54 pub fn set_request_filter<P: Fn(&Logger, &Message) -> LoggerLogLevel + 'static>(
55 &self,
56 request_filter: P,
57 ) {
58 let request_filter_data: Box_<P> = Box_::new(request_filter);
59 unsafe extern "C" fn request_filter_func<
60 P: Fn(&Logger, &Message) -> LoggerLogLevel + 'static,
61 >(
62 logger: *mut ffi::SoupLogger,
63 msg: *mut ffi::SoupMessage,
64 user_data: glib::ffi::gpointer,
65 ) -> ffi::SoupLoggerLogLevel {
66 unsafe {
67 let logger = from_glib_borrow(logger);
68 let msg = from_glib_borrow(msg);
69 let callback = &*(user_data as *mut P);
70 (*callback)(&logger, &msg).into_glib()
71 }
72 }
73 let request_filter = Some(request_filter_func::<P> as _);
74 unsafe extern "C" fn destroy_func<P: Fn(&Logger, &Message) -> LoggerLogLevel + 'static>(
75 data: glib::ffi::gpointer,
76 ) {
77 unsafe {
78 let _callback = Box_::from_raw(data as *mut P);
79 }
80 }
81 let destroy_call3 = Some(destroy_func::<P> as _);
82 let super_callback0: Box_<P> = request_filter_data;
83 unsafe {
84 ffi::soup_logger_set_request_filter(
85 self.to_glib_none().0,
86 request_filter,
87 Box_::into_raw(super_callback0) as *mut _,
88 destroy_call3,
89 );
90 }
91 }
92
93 #[doc(alias = "soup_logger_set_response_filter")]
94 pub fn set_response_filter<P: Fn(&Logger, &Message) -> LoggerLogLevel + 'static>(
95 &self,
96 response_filter: P,
97 ) {
98 let response_filter_data: Box_<P> = Box_::new(response_filter);
99 unsafe extern "C" fn response_filter_func<
100 P: Fn(&Logger, &Message) -> LoggerLogLevel + 'static,
101 >(
102 logger: *mut ffi::SoupLogger,
103 msg: *mut ffi::SoupMessage,
104 user_data: glib::ffi::gpointer,
105 ) -> ffi::SoupLoggerLogLevel {
106 unsafe {
107 let logger = from_glib_borrow(logger);
108 let msg = from_glib_borrow(msg);
109 let callback = &*(user_data as *mut P);
110 (*callback)(&logger, &msg).into_glib()
111 }
112 }
113 let response_filter = Some(response_filter_func::<P> as _);
114 unsafe extern "C" fn destroy_func<P: Fn(&Logger, &Message) -> LoggerLogLevel + 'static>(
115 data: glib::ffi::gpointer,
116 ) {
117 unsafe {
118 let _callback = Box_::from_raw(data as *mut P);
119 }
120 }
121 let destroy_call3 = Some(destroy_func::<P> as _);
122 let super_callback0: Box_<P> = response_filter_data;
123 unsafe {
124 ffi::soup_logger_set_response_filter(
125 self.to_glib_none().0,
126 response_filter,
127 Box_::into_raw(super_callback0) as *mut _,
128 destroy_call3,
129 );
130 }
131 }
132
133 pub fn level(&self) -> LoggerLogLevel {
134 ObjectExt::property(self, "level")
135 }
136
137 pub fn set_level(&self, level: LoggerLogLevel) {
138 ObjectExt::set_property(self, "level", level)
139 }
140
141 #[doc(alias = "level")]
142 pub fn connect_level_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
143 unsafe extern "C" fn notify_level_trampoline<F: Fn(&Logger) + 'static>(
144 this: *mut ffi::SoupLogger,
145 _param_spec: glib::ffi::gpointer,
146 f: glib::ffi::gpointer,
147 ) {
148 unsafe {
149 let f: &F = &*(f as *const F);
150 f(&from_glib_borrow(this))
151 }
152 }
153 unsafe {
154 let f: Box_<F> = Box_::new(f);
155 connect_raw(
156 self.as_ptr() as *mut _,
157 c"notify::level".as_ptr(),
158 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
159 notify_level_trampoline::<F> as *const (),
160 )),
161 Box_::into_raw(f),
162 )
163 }
164 }
165
166 #[doc(alias = "max-body-size")]
167 pub fn connect_max_body_size_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
168 unsafe extern "C" fn notify_max_body_size_trampoline<F: Fn(&Logger) + 'static>(
169 this: *mut ffi::SoupLogger,
170 _param_spec: glib::ffi::gpointer,
171 f: glib::ffi::gpointer,
172 ) {
173 unsafe {
174 let f: &F = &*(f as *const F);
175 f(&from_glib_borrow(this))
176 }
177 }
178 unsafe {
179 let f: Box_<F> = Box_::new(f);
180 connect_raw(
181 self.as_ptr() as *mut _,
182 c"notify::max-body-size".as_ptr(),
183 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
184 notify_max_body_size_trampoline::<F> as *const (),
185 )),
186 Box_::into_raw(f),
187 )
188 }
189 }
190}
191
192impl Default for Logger {
193 fn default() -> Self {
194 glib::object::Object::new::<Self>()
195 }
196}
197
198#[must_use = "The builder must be built to be used"]
203pub struct LoggerBuilder {
204 builder: glib::object::ObjectBuilder<'static, Logger>,
205}
206
207impl LoggerBuilder {
208 fn new() -> Self {
209 Self {
210 builder: glib::object::Object::builder(),
211 }
212 }
213
214 pub fn level(self, level: LoggerLogLevel) -> Self {
215 Self {
216 builder: self.builder.property("level", level),
217 }
218 }
219
220 pub fn max_body_size(self, max_body_size: i32) -> Self {
221 Self {
222 builder: self.builder.property("max-body-size", max_body_size),
223 }
224 }
225
226 #[must_use = "Building the object from the builder is usually expensive and is not expected to have side effects"]
229 pub fn build(self) -> Logger {
230 assert_initialized_main_thread!();
231 self.builder.build()
232 }
233}