[glib: 1/3] gfileinfo: Add APIs to get and set {access, creation}_date_time




commit 240cc7da97f27b683757a79679e2ca0bb6c9c75d
Author: Abanoub Ghadban <abanoub gdb gmail com>
Date:   Sun Mar 28 22:59:22 2021 +0200

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

 docs/reference/gio/gio-sections-common.txt |   4 +
 gio/gfileinfo.c                            | 160 +++++++++++++++++++++++++++++
 gio/gfileinfo.h                            |  10 ++
 3 files changed, 174 insertions(+)
---
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);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]