[glib: 11/24] gerror: Add an utility function to get the GIO Error from GFileError




commit b64fd312da70491b5b24c69c4a7eec7ee6551d5d
Author: Marco Trevisan (TreviƱo) <mail 3v1n0 net>
Date:   Tue Jun 14 19:45:53 2022 +0200

    gerror: Add an utility function to get the GIO Error from GFileError
    
    When GIO functions are using GLib file utils functions we expect to
    return a GIO Error, so provide a way to map such error values.

 docs/reference/gio/gio-sections-common.txt |  1 +
 gio/gioerror.c                             | 66 ++++++++++++++++++++++++++++++
 gio/gioerror.h                             |  3 ++
 gio/tests/error.c                          | 63 ++++++++++++++++++++++++++++
 4 files changed, 133 insertions(+)
---
diff --git a/docs/reference/gio/gio-sections-common.txt b/docs/reference/gio/gio-sections-common.txt
index a1537f0df6..b7c9e933c6 100644
--- a/docs/reference/gio/gio-sections-common.txt
+++ b/docs/reference/gio/gio-sections-common.txt
@@ -1373,6 +1373,7 @@ g_io_scheduler_job_send_to_mainloop_async
 G_IO_ERROR
 GIOErrorEnum
 g_io_error_from_errno
+g_io_error_from_file_error
 g_io_error_from_win32_error
 <SUBSECTION Standard>
 G_TYPE_IO_ERROR_ENUM
diff --git a/gio/gioerror.c b/gio/gioerror.c
index 37c8122dc3..bcb5e4bc1b 100644
--- a/gio/gioerror.c
+++ b/gio/gioerror.c
@@ -1,6 +1,7 @@
 /* GIO - GLib Input, Output and Streaming Library
  * 
  * Copyright (C) 2006-2007 Red Hat, Inc.
+ * Copyright (C) 2022 Canonical Ltd.
  *
  * SPDX-License-Identifier: LGPL-2.1-or-later
  *
@@ -18,6 +19,7 @@
  * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
  *
  * Author: Alexander Larsson <alexl redhat com>
+ * Author: Marco Trevisan <marco trevisan canonical com>
  */
 
 #include "config.h"
@@ -345,6 +347,70 @@ g_io_error_from_errno (gint err_no)
     }
 }
 
+/**
+ * g_io_error_from_file_error:
+ * @file_error: a #GFileError.
+ *
+ * Converts #GFileError error codes into GIO error codes.
+ *
+ * Returns: #GIOErrorEnum value for the given #GFileError error value.
+ *
+ * Since: 2.74
+ **/
+GIOErrorEnum
+g_io_error_from_file_error (GFileError file_error)
+{
+  switch (file_error)
+  {
+    case G_FILE_ERROR_EXIST:
+      return G_IO_ERROR_EXISTS;
+    case G_FILE_ERROR_ISDIR:
+      return G_IO_ERROR_IS_DIRECTORY;
+    case G_FILE_ERROR_ACCES:
+      return G_IO_ERROR_PERMISSION_DENIED;
+    case G_FILE_ERROR_NAMETOOLONG:
+      return G_IO_ERROR_FILENAME_TOO_LONG;
+    case G_FILE_ERROR_NOENT:
+      return G_IO_ERROR_NOT_FOUND;
+    case G_FILE_ERROR_NOTDIR:
+      return G_IO_ERROR_NOT_DIRECTORY;
+    case G_FILE_ERROR_NXIO:
+      return G_IO_ERROR_NOT_REGULAR_FILE;
+    case G_FILE_ERROR_NODEV:
+      return G_IO_ERROR_NO_SUCH_DEVICE;
+    case G_FILE_ERROR_ROFS:
+      return G_IO_ERROR_READ_ONLY;
+    case G_FILE_ERROR_TXTBSY:
+      return G_IO_ERROR_BUSY;
+    case G_FILE_ERROR_LOOP:
+      return G_IO_ERROR_TOO_MANY_LINKS;
+    case G_FILE_ERROR_NOSPC:
+    case G_FILE_ERROR_NOMEM:
+      return G_IO_ERROR_NO_SPACE;
+    case G_FILE_ERROR_MFILE:
+    case G_FILE_ERROR_NFILE:
+      return G_IO_ERROR_TOO_MANY_OPEN_FILES;
+    case G_FILE_ERROR_INVAL:
+      return G_IO_ERROR_INVALID_ARGUMENT;
+    case G_FILE_ERROR_PIPE:
+      return G_IO_ERROR_BROKEN_PIPE;
+    case G_FILE_ERROR_AGAIN:
+      return G_IO_ERROR_WOULD_BLOCK;
+    case G_FILE_ERROR_PERM:
+      return G_IO_ERROR_PERMISSION_DENIED;
+    case G_FILE_ERROR_NOSYS:
+      return G_IO_ERROR_NOT_SUPPORTED;
+    case G_FILE_ERROR_BADF:
+    case G_FILE_ERROR_FAILED:
+    case G_FILE_ERROR_FAULT:
+    case G_FILE_ERROR_INTR:
+    case G_FILE_ERROR_IO:
+      return G_IO_ERROR_FAILED;
+    default:
+      g_return_val_if_reached (G_IO_ERROR_FAILED);
+  }
+}
+
 #ifdef G_OS_WIN32
 
 /**
diff --git a/gio/gioerror.h b/gio/gioerror.h
index cb136fc9ab..958c4a9317 100644
--- a/gio/gioerror.h
+++ b/gio/gioerror.h
@@ -29,6 +29,7 @@
 
 #include <glib.h>
 #include <gio/gioenums.h>
+#include <glib/gfileutils.h>
 
 G_BEGIN_DECLS
 
@@ -44,6 +45,8 @@ GLIB_AVAILABLE_IN_ALL
 GQuark       g_io_error_quark      (void);
 GLIB_AVAILABLE_IN_ALL
 GIOErrorEnum g_io_error_from_errno (gint err_no);
+GLIB_AVAILABLE_IN_2_74
+GIOErrorEnum g_io_error_from_file_error (GFileError file_error);
 
 #ifdef G_OS_WIN32
 GLIB_AVAILABLE_IN_ALL
diff --git a/gio/tests/error.c b/gio/tests/error.c
index a38008eee3..dc79a4d826 100644
--- a/gio/tests/error.c
+++ b/gio/tests/error.c
@@ -706,6 +706,68 @@ test_error_from_errno (void)
 #endif
 }
 
+static void
+test_error_from_file_error (void)
+{
+  g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
+                         "*should not be reached*");
+  g_assert_cmpuint (g_io_error_from_file_error (-1), ==,
+                    G_IO_ERROR_FAILED);
+  g_test_assert_expected_messages ();
+
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_EXIST), ==,
+                    G_IO_ERROR_EXISTS);
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_ISDIR), ==,
+                    G_IO_ERROR_IS_DIRECTORY);
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_ACCES), ==,
+                    G_IO_ERROR_PERMISSION_DENIED);
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_NAMETOOLONG), ==,
+                    G_IO_ERROR_FILENAME_TOO_LONG);
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_NOENT), ==,
+                    G_IO_ERROR_NOT_FOUND);
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_NOTDIR), ==,
+                    G_IO_ERROR_NOT_DIRECTORY);
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_NXIO), ==,
+                    G_IO_ERROR_NOT_REGULAR_FILE);
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_NODEV), ==,
+                    G_IO_ERROR_NO_SUCH_DEVICE);
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_ROFS), ==,
+                    G_IO_ERROR_READ_ONLY);
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_TXTBSY), ==,
+                    G_IO_ERROR_BUSY);
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_LOOP), ==,
+                    G_IO_ERROR_TOO_MANY_LINKS);
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_NOSPC), ==,
+                    G_IO_ERROR_NO_SPACE);
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_NOMEM), ==,
+                    G_IO_ERROR_NO_SPACE);
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_MFILE), ==,
+                    G_IO_ERROR_TOO_MANY_OPEN_FILES);
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_NFILE), ==,
+                    G_IO_ERROR_TOO_MANY_OPEN_FILES);
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_INVAL), ==,
+                    G_IO_ERROR_INVALID_ARGUMENT);
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_PIPE), ==,
+                    G_IO_ERROR_BROKEN_PIPE);
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_AGAIN), ==,
+                    G_IO_ERROR_WOULD_BLOCK);
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_PERM), ==,
+                    G_IO_ERROR_PERMISSION_DENIED);
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_NOSYS), ==,
+                    G_IO_ERROR_NOT_SUPPORTED);
+
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_BADF), ==,
+                    G_IO_ERROR_FAILED);
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_FAILED), ==,
+                    G_IO_ERROR_FAILED);
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_FAULT), ==,
+                    G_IO_ERROR_FAILED);
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_INTR), ==,
+                    G_IO_ERROR_FAILED);
+  g_assert_cmpuint (g_io_error_from_file_error (G_FILE_ERROR_IO), ==,
+                    G_IO_ERROR_FAILED);
+}
+
 static void
 test_error_from_win32_error (void)
 {
@@ -787,6 +849,7 @@ main (int   argc,
   g_test_init (&argc, &argv, G_TEST_OPTION_ISOLATE_DIRS, NULL);
 
   g_test_add_func ("/error/from-errno", test_error_from_errno);
+  g_test_add_func ("/error/from-file-error", test_error_from_file_error);
   g_test_add_func ("/error/from-win32-error", test_error_from_win32_error);
 
   return g_test_run ();


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