gfileinfo: Add APIs to get and set {access,creation}_date_time

This commit is contained in:
Abanoub Ghadban 2021-03-28 22:59:22 +02:00
parent 7629fdaaeb
commit 240cc7da97
3 changed files with 174 additions and 0 deletions

View File

@ -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

View File

@ -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.

View File

@ -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);