gio/
file_info.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use 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}