polkit_rs/auto/
unix_session.rs1use crate::{Subject, ffi};
6use glib::{
7 prelude::*,
8 signal::{SignalHandlerId, connect_raw},
9 translate::*,
10};
11use std::{boxed::Box as Box_, pin::Pin};
12
13glib::wrapper! {
14 #[doc(alias = "PolkitUnixSession")]
15 pub struct UnixSession(Object<ffi::PolkitUnixSession, ffi::PolkitUnixSessionClass>) @implements Subject;
16
17 match fn {
18 type_ => || ffi::polkit_unix_session_get_type(),
19 }
20}
21
22impl UnixSession {
23 #[doc(alias = "polkit_unix_session_get_session_id")]
24 #[doc(alias = "get_session_id")]
25 #[doc(alias = "session-id")]
26 pub fn session_id(&self) -> glib::GString {
27 unsafe {
28 from_glib_none(ffi::polkit_unix_session_get_session_id(
29 self.to_glib_none().0,
30 ))
31 }
32 }
33
34 #[doc(alias = "polkit_unix_session_set_session_id")]
35 #[doc(alias = "session-id")]
36 pub fn set_session_id(&self, session_id: &str) {
37 unsafe {
38 ffi::polkit_unix_session_set_session_id(
39 self.to_glib_none().0,
40 session_id.to_glib_none().0,
41 );
42 }
43 }
44
45 #[doc(alias = "polkit_unix_session_new")]
46 pub fn new(session_id: &str) -> Self {
47 let subject: Subject =
48 unsafe { from_glib_full(ffi::polkit_unix_session_new(session_id.to_glib_none().0)) };
49 subject.dynamic_cast().expect("it should always work")
50 }
51
52 #[doc(alias = "polkit_unix_session_new_for_process")]
53 pub fn new_for_process<P: FnOnce(Result<Self, glib::Error>) + 'static>(
54 pid: i32,
55 cancellable: Option<&impl IsA<gio::Cancellable>>,
56 callback: P,
57 ) {
58 let main_context = glib::MainContext::ref_thread_default();
59 let is_main_context_owner = main_context.is_owner();
60 let has_acquired_main_context = (!is_main_context_owner)
61 .then(|| main_context.acquire().ok())
62 .flatten();
63 assert!(
64 is_main_context_owner || has_acquired_main_context.is_some(),
65 "Async operations only allowed if the thread is owning the MainContext"
66 );
67
68 let user_data: Box_<glib::thread_guard::ThreadGuard<P>> =
69 Box_::new(glib::thread_guard::ThreadGuard::new(callback));
70 unsafe extern "C" fn new_for_process_trampoline<
71 P: FnOnce(Result<UnixSession, glib::Error>) + 'static,
72 >(
73 _source_object: *mut glib::gobject_ffi::GObject,
74 res: *mut gio::ffi::GAsyncResult,
75 user_data: glib::ffi::gpointer,
76 ) {
77 unsafe {
78 let mut error = std::ptr::null_mut();
79 let ret = ffi::polkit_unix_session_new_for_process_finish(res, &mut error);
80 let result = if error.is_null() {
81 let subject: Subject = from_glib_full(ret);
82 Ok(subject.unsafe_cast())
83 } else {
84 Err(from_glib_full(error))
85 };
86 let callback: Box_<glib::thread_guard::ThreadGuard<P>> =
87 Box_::from_raw(user_data as *mut _);
88 let callback: P = callback.into_inner();
89 callback(result);
90 }
91 }
92 let callback = new_for_process_trampoline::<P>;
93 unsafe {
94 ffi::polkit_unix_session_new_for_process(
95 pid,
96 cancellable.map(|p| p.as_ref()).to_glib_none().0,
97 Some(callback),
98 Box_::into_raw(user_data) as *mut _,
99 );
100 }
101 }
102
103 pub fn new_for_process_future(
104 pid: i32,
105 ) -> Pin<Box_<dyn std::future::Future<Output = Result<Self, glib::Error>> + 'static>> {
106 Box_::pin(gio::GioFuture::new(&(), move |_obj, cancellable, send| {
107 Self::new_for_process(pid, Some(cancellable), move |res| {
108 send.resolve(res);
109 });
110 }))
111 }
112
113 #[doc(alias = "polkit_unix_session_new_for_process_sync")]
114 pub fn new_for_process_sync(
115 pid: i32,
116 cancellable: Option<&impl IsA<gio::Cancellable>>,
117 ) -> Result<Self, glib::Error> {
118 unsafe {
119 let mut error = std::ptr::null_mut();
120 let ret = ffi::polkit_unix_session_new_for_process_sync(
121 pid,
122 cancellable.map(|p| p.as_ref()).to_glib_none().0,
123 &mut error,
124 );
125 if error.is_null() {
126 let subject: Subject = from_glib_full(ret);
127 Ok(subject.unsafe_cast())
128 } else {
129 Err(from_glib_full(error))
130 }
131 }
132 }
133
134 #[doc(alias = "session-id")]
135 pub fn connect_session_id_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
136 unsafe extern "C" fn notify_session_id_trampoline<F: Fn(&UnixSession) + 'static>(
137 this: *mut ffi::PolkitUnixSession,
138 _param_spec: glib::ffi::gpointer,
139 f: glib::ffi::gpointer,
140 ) {
141 unsafe {
142 let f: &F = &*(f as *const F);
143 f(&from_glib_borrow(this))
144 }
145 }
146 unsafe {
147 let f: Box_<F> = Box_::new(f);
148 connect_raw(
149 self.as_ptr() as *mut _,
150 c"notify::session-id".as_ptr() as *const _,
151 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
152 notify_session_id_trampoline::<F> as *const (),
153 )),
154 Box_::into_raw(f),
155 )
156 }
157 }
158}