polkit_rs/auto/
unix_session.rs

1// Generated by gir (https://github.com/gtk-rs/gir @ b2a1c6f9b362)
2// from ../misc (@ ???)
3// DO NOT EDIT
4
5use 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}