1use std::{
4 mem,
5 time::{Duration, SystemTime},
6};
7
8use glib::{translate::*, StrV};
9
10use crate::{ffi, FileAttributeValue, FileInfo};
11
12impl FileInfo {
13 #[cfg_attr(feature = "v2_62", deprecated)]
14 #[doc(alias = "g_file_info_get_modification_time")]
15 #[doc(alias = "get_modification_time")]
16 pub fn modification_time(&self) -> SystemTime {
17 unsafe {
18 let mut result = mem::MaybeUninit::uninit();
19 ffi::g_file_info_get_modification_time(self.to_glib_none().0, result.as_mut_ptr());
20 let result = result.assume_init();
21
22 if result.tv_sec > 0 {
23 let duration = Duration::from_secs(result.tv_sec as u64)
24 + Duration::from_millis(result.tv_usec as u64);
25 SystemTime::UNIX_EPOCH + duration
26 } else {
27 let duration = Duration::from_secs((-result.tv_sec) as u64)
28 + Duration::from_millis(result.tv_usec as u64);
29 SystemTime::UNIX_EPOCH - duration
30 }
31 }
32 }
33
34 #[cfg_attr(feature = "v2_62", deprecated)]
35 #[doc(alias = "g_file_info_set_modification_time")]
36 pub fn set_modification_time(&self, mtime: SystemTime) {
37 let diff = mtime
38 .duration_since(SystemTime::UNIX_EPOCH)
39 .expect("failed to convert time");
40 unsafe {
41 ffi::g_file_info_set_modification_time(
42 self.to_glib_none().0,
43 mut_override(&glib::ffi::GTimeVal {
44 tv_sec: diff.as_secs() as _,
45 tv_usec: diff.subsec_micros() as _,
46 }),
47 );
48 }
49 }
50
51 #[doc(alias = "g_file_info_get_attribute_stringv")]
52 #[doc(alias = "get_attribute_stringv")]
53 pub fn attribute_stringv(&self, attribute: &str) -> StrV {
54 unsafe {
55 FromGlibPtrContainer::from_glib_none(ffi::g_file_info_get_attribute_stringv(
56 self.to_glib_none().0,
57 attribute.to_glib_none().0,
58 ))
59 }
60 }
61
62 #[doc(alias = "g_file_info_set_attribute_stringv")]
63 pub fn set_attribute_stringv(&self, attribute: &str, attr_value: impl IntoStrV) {
64 unsafe {
65 attr_value.run_with_strv(|attr_value| {
66 ffi::g_file_info_set_attribute_stringv(
67 self.to_glib_none().0,
68 attribute.to_glib_none().0,
69 attr_value.as_ptr() as *mut _,
70 );
71 });
72 }
73 }
74
75 #[doc(alias = "g_file_info_set_attribute")]
76 pub fn set_attribute<'a>(&self, attribute: &str, value: impl Into<FileAttributeValue<'a>>) {
77 unsafe {
78 let value: FileAttributeValue<'a> = value.into();
79 ffi::g_file_info_set_attribute(
80 self.to_glib_none().0,
81 attribute.to_glib_none().0,
82 value.type_().into_glib(),
83 value.as_ptr(),
84 );
85 }
86 }
87}