diff options
Diffstat (limited to 'libsecret/src/hashtable.rs')
-rw-r--r-- | libsecret/src/hashtable.rs | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/libsecret/src/hashtable.rs b/libsecret/src/hashtable.rs new file mode 100644 index 0000000..1f42c95 --- /dev/null +++ b/libsecret/src/hashtable.rs @@ -0,0 +1,63 @@ +use glib::translate::*; +use std::collections::HashMap; + +use crate::Value; + +pub(crate) unsafe fn attribute_names_and_values( + entry: HashMap<&str, &str>, +) -> *mut glib::ffi::GHashTable { + let hash_table = glib::ffi::g_hash_table_new_full( + Some(glib::ffi::g_str_hash), + Some(glib::ffi::g_str_equal), + Some(glib::ffi::g_free), + Some(glib::ffi::g_free), + ); + + for (key, val) in entry { + let key_ptr: *mut libc::c_char = key.to_glib_full(); + let val_ptr: *mut libc::c_char = val.to_glib_full(); + glib::ffi::g_hash_table_insert(hash_table, key_ptr as *mut _, val_ptr as *mut _); + } + + hash_table +} + +pub(crate) unsafe fn attribute_names_and_properties( + hash_map: HashMap<&str, &glib::Variant>, +) -> *mut glib::ffi::GHashTable { + let hash_table = glib::ffi::g_hash_table_new_full( + Some(glib::ffi::g_str_hash), + Some(glib::ffi::g_str_equal), + Some(glib::ffi::g_free), + Some(glib::ffi::g_free), + ); + + for (name, value) in hash_map { + let key_ptr: *mut libc::c_char = name.to_glib_full(); + glib::ffi::g_hash_table_insert(hash_table, key_ptr as *mut _, value.as_ptr() as _); + } + + hash_table +} + +pub(crate) unsafe fn hash_map_from_glib_none( + ptr: *mut glib::ffi::GHashTable, +) -> HashMap<String, Value> { + unsafe extern "C" fn read_string_hash_table( + key: glib::ffi::gpointer, + value: glib::ffi::gpointer, + hash_map: glib::ffi::gpointer, + ) { + let key: String = from_glib_none(key as *const libc::c_char); + let value: Value = from_glib_none(value as *const ffi::SecretValue); + let hash_map: &mut HashMap<String, Value> = &mut *(hash_map as *mut HashMap<String, Value>); + hash_map.insert(key, value); + } + let mut map = HashMap::with_capacity(glib::ffi::g_hash_table_size(ptr) as usize); + glib::ffi::g_hash_table_foreach( + ptr, + Some(read_string_hash_table), + &mut map as *mut HashMap<String, Value> as *mut _, + ); + map +} |