diff --git a/docs/reference/gio/gio-sections-common.txt b/docs/reference/gio/gio-sections-common.txt index 945c26ade..e38971c12 100644 --- a/docs/reference/gio/gio-sections-common.txt +++ b/docs/reference/gio/gio-sections-common.txt @@ -397,6 +397,8 @@ g_file_info_get_content_type g_file_info_get_size g_file_info_get_modification_time g_file_info_get_modification_date_time +g_file_info_get_access_date_time +g_file_info_get_creation_date_time g_file_info_get_symlink_target g_file_info_get_etag g_file_info_get_sort_order @@ -415,6 +417,8 @@ g_file_info_set_content_type g_file_info_set_size g_file_info_set_modification_time g_file_info_set_modification_date_time +g_file_info_set_access_date_time +g_file_info_set_creation_date_time g_file_info_set_symlink_target g_file_info_set_sort_order g_file_attribute_matcher_new diff --git a/gio/gfileinfo.c b/gio/gfileinfo.c index 2a97758b2..cec1b4e56 100644 --- a/gio/gfileinfo.c +++ b/gio/gfileinfo.c @@ -1834,6 +1834,96 @@ g_file_info_get_modification_date_time (GFileInfo *info) return g_steal_pointer (&dt2); } +/** + * g_file_info_get_access_date_time: + * @info: a #GFileInfo. + * + * Gets the access time of the current @info and returns it as a + * #GDateTime. + * + * This requires the %G_FILE_ATTRIBUTE_TIME_ACCESS attribute. If + * %G_FILE_ATTRIBUTE_TIME_ACCESS_USEC is provided, the resulting #GDateTime + * will have microsecond precision. + * + * Returns: (transfer full) (nullable): access time, or %NULL if unknown + * Since: 2.70 + */ +GDateTime * +g_file_info_get_access_date_time (GFileInfo *info) +{ + static guint32 attr_atime = 0, attr_atime_usec; + GFileAttributeValue *value, *value_usec; + GDateTime *dt = NULL, *dt2 = NULL; + + g_return_val_if_fail (G_IS_FILE_INFO (info), NULL); + + if (attr_atime == 0) + { + attr_atime = lookup_attribute (G_FILE_ATTRIBUTE_TIME_ACCESS); + attr_atime_usec = lookup_attribute (G_FILE_ATTRIBUTE_TIME_ACCESS_USEC); + } + + value = g_file_info_find_value (info, attr_atime); + if (value == NULL) + return NULL; + + dt = g_date_time_new_from_unix_utc (_g_file_attribute_value_get_uint64 (value)); + + value_usec = g_file_info_find_value (info, attr_atime_usec); + if (value_usec == NULL) + return g_steal_pointer (&dt); + + dt2 = g_date_time_add (dt, _g_file_attribute_value_get_uint32 (value_usec)); + g_date_time_unref (dt); + + return g_steal_pointer (&dt2); +} + +/** + * g_file_info_get_creation_date_time: + * @info: a #GFileInfo. + * + * Gets the creation time of the current @info and returns it as a + * #GDateTime. + * + * This requires the %G_FILE_ATTRIBUTE_TIME_CREATED attribute. If + * %G_FILE_ATTRIBUTE_TIME_CREATED_USEC is provided, the resulting #GDateTime + * will have microsecond precision. + * + * Returns: (transfer full) (nullable): creation time, or %NULL if unknown + * Since: 2.70 + */ +GDateTime * +g_file_info_get_creation_date_time (GFileInfo *info) +{ + static guint32 attr_ctime = 0, attr_ctime_usec; + GFileAttributeValue *value, *value_usec; + GDateTime *dt = NULL, *dt2 = NULL; + + g_return_val_if_fail (G_IS_FILE_INFO (info), NULL); + + if (attr_ctime == 0) + { + attr_ctime = lookup_attribute (G_FILE_ATTRIBUTE_TIME_CREATED); + attr_ctime_usec = lookup_attribute (G_FILE_ATTRIBUTE_TIME_CREATED_USEC); + } + + value = g_file_info_find_value (info, attr_ctime); + if (value == NULL) + return NULL; + + dt = g_date_time_new_from_unix_utc (_g_file_attribute_value_get_uint64 (value)); + + value_usec = g_file_info_find_value (info, attr_ctime_usec); + if (value_usec == NULL) + return g_steal_pointer (&dt); + + dt2 = g_date_time_add (dt, _g_file_attribute_value_get_uint32 (value_usec)); + g_date_time_unref (dt); + + return g_steal_pointer (&dt2); +} + /** * g_file_info_get_symlink_target: * @info: a #GFileInfo. @@ -2237,6 +2327,76 @@ g_file_info_set_modification_date_time (GFileInfo *info, _g_file_attribute_value_set_uint32 (value, g_date_time_get_microsecond (mtime)); } +/** + * g_file_info_set_access_date_time: + * @info: a #GFileInfo. + * @atime: (not nullable): a #GDateTime. + * + * Sets the %G_FILE_ATTRIBUTE_TIME_ACCESS and + * %G_FILE_ATTRIBUTE_TIME_ACCESS_USEC attributes in the file info to the + * given date/time value. + * + * Since: 2.70 + */ +void +g_file_info_set_access_date_time (GFileInfo *info, + GDateTime *atime) +{ + static guint32 attr_atime = 0, attr_atime_usec; + GFileAttributeValue *value; + + g_return_if_fail (G_IS_FILE_INFO (info)); + g_return_if_fail (atime != NULL); + + if (attr_atime == 0) + { + attr_atime = lookup_attribute (G_FILE_ATTRIBUTE_TIME_ACCESS); + attr_atime_usec = lookup_attribute (G_FILE_ATTRIBUTE_TIME_ACCESS_USEC); + } + + value = g_file_info_create_value (info, attr_atime); + if (value) + _g_file_attribute_value_set_uint64 (value, g_date_time_to_unix (atime)); + value = g_file_info_create_value (info, attr_atime_usec); + if (value) + _g_file_attribute_value_set_uint32 (value, g_date_time_get_microsecond (atime)); +} + +/** + * g_file_info_set_creation_date_time: + * @info: a #GFileInfo. + * @creation_time: (not nullable): a #GDateTime. + * + * Sets the %G_FILE_ATTRIBUTE_TIME_CREATED and + * %G_FILE_ATTRIBUTE_TIME_CREATED_USEC attributes in the file info to the + * given date/time value. + * + * Since: 2.70 + */ +void +g_file_info_set_creation_date_time (GFileInfo *info, + GDateTime *creation_time) +{ + static guint32 attr_ctime = 0, attr_ctime_usec; + GFileAttributeValue *value; + + g_return_if_fail (G_IS_FILE_INFO (info)); + g_return_if_fail (creation_time != NULL); + + if (attr_ctime == 0) + { + attr_ctime = lookup_attribute (G_FILE_ATTRIBUTE_TIME_CREATED); + attr_ctime_usec = lookup_attribute (G_FILE_ATTRIBUTE_TIME_CREATED_USEC); + } + + value = g_file_info_create_value (info, attr_ctime); + if (value) + _g_file_attribute_value_set_uint64 (value, g_date_time_to_unix (creation_time)); + value = g_file_info_create_value (info, attr_ctime_usec); + if (value) + _g_file_attribute_value_set_uint32 (value, g_date_time_get_microsecond (creation_time)); +} + /** * g_file_info_set_symlink_target: * @info: a #GFileInfo. diff --git a/gio/gfileinfo.h b/gio/gfileinfo.h index da202e6a7..4f736e487 100644 --- a/gio/gfileinfo.h +++ b/gio/gfileinfo.h @@ -1057,6 +1057,10 @@ void g_file_info_get_modification_time (GFileInfo *info, G_GNUC_END_IGNORE_DEPRECATIONS GLIB_AVAILABLE_IN_2_62 GDateTime * g_file_info_get_modification_date_time (GFileInfo *info); +GLIB_AVAILABLE_IN_2_70 +GDateTime * g_file_info_get_access_date_time (GFileInfo *info); +GLIB_AVAILABLE_IN_2_70 +GDateTime * g_file_info_get_creation_date_time (GFileInfo *info); GLIB_AVAILABLE_IN_ALL const char * g_file_info_get_symlink_target (GFileInfo *info); GLIB_AVAILABLE_IN_ALL @@ -1109,6 +1113,12 @@ G_GNUC_END_IGNORE_DEPRECATIONS GLIB_AVAILABLE_IN_2_62 void g_file_info_set_modification_date_time (GFileInfo *info, GDateTime *mtime); +GLIB_AVAILABLE_IN_2_70 +void g_file_info_set_access_date_time (GFileInfo *info, + GDateTime *atime); +GLIB_AVAILABLE_IN_2_70 +void g_file_info_set_creation_date_time (GFileInfo *info, + GDateTime *creation_time); GLIB_AVAILABLE_IN_ALL void g_file_info_set_symlink_target (GFileInfo *info, const char *symlink_target);