[glib: 14/26] gfileinfo: Add g_file_info_{get, set}_modification_date_time() APIs
- From: Philip Withnall <pwithnall src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib: 14/26] gfileinfo: Add g_file_info_{get, set}_modification_date_time() APIs
- Date: Mon, 29 Jul 2019 13:01:28 +0000 (UTC)
commit d166a55c6498919641edcfa238b6d4b19e34dcc7
Author: Philip Withnall <withnall endlessm com>
Date: Fri Jun 28 19:02:09 2019 +0100
gfileinfo: Add g_file_info_{get,set}_modification_date_time() APIs
These are alternatives to g_file_info_{get,set}_modification_time(),
which will soon be deprecated due to using the deprecated GTimeVal
type, which is not year 2038 safe.
The new APIs take a GDateTime instead.
Signed-off-by: Philip Withnall <withnall endlessm com>
Helps: #1438
docs/reference/gio/gio-sections-common.txt | 2 +
gio/gfileinfo.c | 74 ++++++++++++++++++++++++++++++
gio/gfileinfo.h | 5 ++
3 files changed, 81 insertions(+)
---
diff --git a/docs/reference/gio/gio-sections-common.txt b/docs/reference/gio/gio-sections-common.txt
index 95433ce43..bb483b0ce 100644
--- a/docs/reference/gio/gio-sections-common.txt
+++ b/docs/reference/gio/gio-sections-common.txt
@@ -395,6 +395,7 @@ g_file_info_get_symbolic_icon
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_symlink_target
g_file_info_get_etag
g_file_info_get_sort_order
@@ -412,6 +413,7 @@ g_file_info_set_symbolic_icon
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_symlink_target
g_file_info_set_sort_order
g_file_attribute_matcher_new
diff --git a/gio/gfileinfo.c b/gio/gfileinfo.c
index 68bacde52..db5ba5dd7 100644
--- a/gio/gfileinfo.c
+++ b/gio/gfileinfo.c
@@ -1776,6 +1776,46 @@ g_file_info_get_modification_time (GFileInfo *info,
result->tv_usec = _g_file_attribute_value_get_uint32 (value);
}
+/**
+ * g_file_info_get_modification_date_time:
+ * @info: a #GFileInfo.
+ *
+ * Gets the modification time of the current @info and returns it as a
+ * #GDateTime.
+ *
+ * Returns: (transfer full) (nullable): modification time, or %NULL if unknown
+ * Since: 2.62
+ */
+GDateTime *
+g_file_info_get_modification_date_time (GFileInfo *info)
+{
+ static guint32 attr_mtime = 0, attr_mtime_usec;
+ GFileAttributeValue *value, *value_usec;
+ GDateTime *dt = NULL, *dt2 = NULL;
+
+ g_return_val_if_fail (G_IS_FILE_INFO (info), NULL);
+
+ if (attr_mtime == 0)
+ {
+ attr_mtime = lookup_attribute (G_FILE_ATTRIBUTE_TIME_MODIFIED);
+ attr_mtime_usec = lookup_attribute (G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC);
+ }
+
+ value = g_file_info_find_value (info, attr_mtime);
+ if (value == NULL)
+ return NULL;
+
+ value_usec = g_file_info_find_value (info, attr_mtime_usec);
+ if (value_usec == NULL)
+ return NULL;
+
+ dt = g_date_time_new_from_unix_utc (_g_file_attribute_value_get_uint64 (value));
+ dt2 = g_date_time_add_seconds (dt, _g_file_attribute_value_get_uint32 (value_usec) / (gdouble)
G_USEC_PER_SEC);
+ g_date_time_unref (dt);
+
+ return g_steal_pointer (&dt2);
+}
+
/**
* g_file_info_get_symlink_target:
* @info: a #GFileInfo.
@@ -2138,6 +2178,40 @@ g_file_info_set_modification_time (GFileInfo *info,
_g_file_attribute_value_set_uint32 (value, mtime->tv_usec);
}
+/**
+ * g_file_info_set_modification_date_time:
+ * @info: a #GFileInfo.
+ * @mtime: (not nullable): a #GDateTime.
+ *
+ * Sets the %G_FILE_ATTRIBUTE_TIME_MODIFIED attribute in the file
+ * info to the given date/time value.
+ *
+ * Since: 2.62
+ */
+void
+g_file_info_set_modification_date_time (GFileInfo *info,
+ GDateTime *mtime)
+{
+ static guint32 attr_mtime = 0, attr_mtime_usec;
+ GFileAttributeValue *value;
+
+ g_return_if_fail (G_IS_FILE_INFO (info));
+ g_return_if_fail (mtime != NULL);
+
+ if (attr_mtime == 0)
+ {
+ attr_mtime = lookup_attribute (G_FILE_ATTRIBUTE_TIME_MODIFIED);
+ attr_mtime_usec = lookup_attribute (G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC);
+ }
+
+ value = g_file_info_create_value (info, attr_mtime);
+ if (value)
+ _g_file_attribute_value_set_uint64 (value, g_date_time_to_unix (mtime));
+ value = g_file_info_create_value (info, attr_mtime_usec);
+ if (value)
+ _g_file_attribute_value_set_uint32 (value, g_date_time_get_microsecond (mtime));
+}
+
/**
* g_file_info_set_symlink_target:
* @info: a #GFileInfo.
diff --git a/gio/gfileinfo.h b/gio/gfileinfo.h
index 622c2b611..01dcc4f14 100644
--- a/gio/gfileinfo.h
+++ b/gio/gfileinfo.h
@@ -1049,6 +1049,8 @@ goffset g_file_info_get_size (GFileInfo *info);
GLIB_AVAILABLE_IN_ALL
void g_file_info_get_modification_time (GFileInfo *info,
GTimeVal *result);
+GLIB_AVAILABLE_IN_2_62
+GDateTime * g_file_info_get_modification_date_time (GFileInfo *info);
GLIB_AVAILABLE_IN_ALL
const char * g_file_info_get_symlink_target (GFileInfo *info);
GLIB_AVAILABLE_IN_ALL
@@ -1096,6 +1098,9 @@ void g_file_info_set_size (GFileInfo *info,
GLIB_AVAILABLE_IN_ALL
void g_file_info_set_modification_time (GFileInfo *info,
GTimeVal *mtime);
+GLIB_AVAILABLE_IN_2_62
+void g_file_info_set_modification_date_time (GFileInfo *info,
+ GDateTime *mtime);
GLIB_AVAILABLE_IN_ALL
void g_file_info_set_symlink_target (GFileInfo *info,
const char *symlink_target);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]