libpulse_binding/mainloop/events/
io.rs1use std::os::raw::c_void;
17use std::rc::Rc;
18use bitflags::bitflags;
19use crate::mainloop::api::{MainloopApi, MainloopInnerType};
20use crate::callbacks::MultiUseCallback;
21
22pub use capi::pa_io_event as IoEventInternal;
23
24bitflags! {
25 #[repr(transparent)]
27 pub struct FlagSet: u32 {
28 const NULL = capi::PA_IO_EVENT_NULL;
30 const INPUT = capi::PA_IO_EVENT_INPUT;
32 const OUTPUT = capi::PA_IO_EVENT_OUTPUT;
34 const HANGUP = capi::PA_IO_EVENT_HANGUP;
36 const ERROR = capi::PA_IO_EVENT_ERROR;
38 }
39}
40
41pub struct IoEvent<T>
43 where T: MainloopInnerType
44{
45 ptr: *mut IoEventInternal,
47 owner: Rc<T>,
49 _saved_cb: EventCb,
51}
52
53pub struct IoEventRef<T: 'static>
56 where T: MainloopInnerType
57{
58 ptr: *mut IoEventInternal,
60 owner: Rc<T>,
62}
63
64pub(crate) type EventCb = MultiUseCallback<dyn FnMut(*mut IoEventInternal, i32, FlagSet),
65 extern "C" fn(a: *const MainloopApi, e: *mut IoEventInternal, fd: i32, events: FlagSet,
66 userdata: *mut c_void)>;
67
68impl<T> IoEvent<T>
69 where T: MainloopInnerType
70{
71 #[inline]
72 pub(crate) fn from_raw(ptr: *mut IoEventInternal, mainloop_inner: Rc<T>, callback: EventCb)
73 -> Self
74 {
75 assert_eq!(false, ptr.is_null());
76 Self { ptr: ptr, owner: mainloop_inner, _saved_cb: callback }
77 }
78
79 #[inline]
81 pub fn enable(&mut self, events: FlagSet) {
82 let fn_ptr = (*self.owner).get_api().io_enable.unwrap();
83 fn_ptr(self.ptr, events);
84 }
85}
86
87impl<T> IoEventRef<T>
88 where T: MainloopInnerType
89{
90 #[inline]
91 pub(crate) fn from_raw(ptr: *mut IoEventInternal, mainloop_inner: Rc<T>) -> Self {
92 assert_eq!(false, ptr.is_null());
93 Self { ptr: ptr, owner: mainloop_inner }
94 }
95
96 #[inline]
98 pub fn enable(&mut self, events: FlagSet) {
99 let fn_ptr = (*self.owner).get_api().io_enable.unwrap();
100 fn_ptr(self.ptr, events);
101 }
102}
103
104impl<T> Drop for IoEvent<T>
105 where T: MainloopInnerType
106{
107 fn drop(&mut self) {
108 let fn_ptr = (*self.owner).get_api().io_free.unwrap();
109 fn_ptr(self.ptr);
110 }
111}
112
113pub(crate)
118extern "C"
119fn event_cb_proxy(_: *const MainloopApi, e: *mut IoEventInternal, fd: i32, events: FlagSet,
120 userdata: *mut c_void)
121{
122 let _ = std::panic::catch_unwind(|| {
123 let callback = EventCb::get_callback(userdata);
124 (callback)(e, fd, events);
125 });
126}