diff options
author | Vika <vika@fireburn.ru> | 2024-10-22 21:52:10 +0300 |
---|---|---|
committer | Vika <vika@fireburn.ru> | 2024-10-22 21:52:10 +0300 |
commit | f2f7b6ffec7bf657966353c850d25c6ab218ff7c (patch) | |
tree | d4d5cc76474453863a064eb04d75af5353579f5b /libsecret/src/value.rs | |
parent | 3bd499a9d696a850a493bf81c01c68aee18c9d7b (diff) | |
download | bowl-f2f7b6ffec7bf657966353c850d25c6ab218ff7c.tar.zst |
vendor libsecret
The libsecret-rs crate is unmaintained, so I'm vendoring it for now. Bumping the glib version turned out to be enough. The exact process I used was: 1. Cloning the repository 2. Making changes 3. `cargo build` to ensure it works 4. `cargo package --no-verify` (b/c it tries to build all crates separately instead of the entire workspace as a whole) 5. `mkdir libsecret/sys -p` 6. `tar --strip-components 1 -C libsecret -xvf ../libsecret-rs/target/package/libsecret-0.6.0.crate` 7. `tar --strip-components 1 -C libsecret/sys -xvf ../libsecret-rs/target/package/libsecret-sys-0.6.0.crate` Then `Cargo.toml` is modified to ensure the libsecret and its `-sys` crate build out of my vendored sources. In the future, if I gain maintainership of the `libsecret` crate, I could just revert this commit to make it point back to the upstream.
Diffstat (limited to 'libsecret/src/value.rs')
-rw-r--r-- | libsecret/src/value.rs | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/libsecret/src/value.rs b/libsecret/src/value.rs new file mode 100644 index 0000000..ef43da8 --- /dev/null +++ b/libsecret/src/value.rs @@ -0,0 +1,67 @@ +use glib::translate::*; +use std::mem; +use std::os::raw::c_void; + +glib::wrapper! { + #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] + pub struct Value(Shared<ffi::SecretValue>); + + match fn { + ref => |ptr| ffi::secret_value_ref(ptr), + // Manual + unref => |ptr| ffi::secret_value_unref(ptr as *mut _ as *mut c_void), + type_ => || ffi::secret_value_get_type(), + } +} + +impl Value { + #[doc(alias = "secret_value_new")] + pub fn new(secret: &str, content_type: &str) -> Value { + let length = secret.len() as isize; + unsafe { + from_glib_full(ffi::secret_value_new( + secret.to_glib_none().0, + length, + content_type.to_glib_none().0, + )) + } + } + + #[doc(alias = "secret_value_get")] + pub fn get(&self) -> Vec<u8> { + unsafe { + let mut length = mem::MaybeUninit::uninit(); + let ret = FromGlibContainer::from_glib_none_num( + ffi::secret_value_get(self.to_glib_none().0, length.as_mut_ptr()), + length.assume_init() as _, + ); + ret + } + } + + #[doc(alias = "secret_value_get_content_type")] + #[doc(alias = "get_content_type")] + pub fn content_type(&self) -> glib::GString { + unsafe { from_glib_none(ffi::secret_value_get_content_type(self.to_glib_none().0)) } + } + + #[doc(alias = "secret_value_get_text")] + #[doc(alias = "get_text")] + pub fn text(&self) -> Option<glib::GString> { + unsafe { from_glib_none(ffi::secret_value_get_text(self.to_glib_none().0)) } + } + + #[cfg(any(feature = "v0_19", feature = "dox"))] + #[cfg_attr(feature = "dox", doc(cfg(feature = "v0_19")))] + #[doc(alias = "secret_value_unref_to_password")] + pub fn unref_to_password(&self) -> glib::GString { + unsafe { + let mut length = std::mem::MaybeUninit::uninit(); + let password = + ffi::secret_value_unref_to_password(self.to_glib_none().0, length.as_mut_ptr()); + length.assume_init(); + + from_glib_full(password) + } + } +} |