/* gerror.h - Error reporting system * * Copyright 2000 Red Hat, Inc. * * SPDX-License-Identifier: LGPL-2.1-or-later * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . */ #ifndef __G_ERROR_H__ #define __G_ERROR_H__ #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) #error "Only can be included directly." #endif #include #include G_BEGIN_DECLS /** * GError: * @domain: error domain, e.g. %G_FILE_ERROR * @code: error code, e.g. %G_FILE_ERROR_NOENT * @message: human-readable informative error message * * The `GError` structure contains information about * an error that has occurred. */ typedef struct _GError GError; struct _GError { GQuark domain; gint code; gchar *message; }; /** * G_DEFINE_EXTENDED_ERROR: * @ErrorType: name to return a #GQuark for * @error_type: prefix for the function name * * A convenience macro which defines two functions. First, returning * the #GQuark for the extended error type @ErrorType; it is called * `error_type_quark()`. Second, returning the private data from a * passed #GError; it is called `error_type_get_private()`. * * For this macro to work, a type named `ErrorTypePrivate` should be * defined, `error_type_private_init()`, `error_type_private_copy()` * and `error_type_private_clear()` functions need to be either * declared or defined. The functions should be similar to * #GErrorInitFunc, #GErrorCopyFunc and #GErrorClearFunc, * respectively, but they should receive the private data type instead * of #GError. * * See [Extended #GError Domains][gerror-extended-domains] for an example. * * Since: 2.68 */ #define G_DEFINE_EXTENDED_ERROR(ErrorType, error_type) \ static inline ErrorType ## Private * \ error_type ## _get_private (const GError *error) \ { \ /* Copied from gtype.c (STRUCT_ALIGNMENT and ALIGN_STRUCT macros). */ \ const gsize sa = 2 * sizeof (gsize); \ const gsize as = (sizeof (ErrorType ## Private) + (sa - 1)) & -sa; \ g_return_val_if_fail (error != NULL, NULL); \ g_return_val_if_fail (error->domain == error_type ## _quark (), NULL); \ return (ErrorType ## Private *) (((guint8 *)error) - as); \ } \ \ static void \ g_error_with_ ## error_type ## _private_init (GError *error) \ { \ ErrorType ## Private *priv = error_type ## _get_private (error); \ error_type ## _private_init (priv); \ } \ \ static void \ g_error_with_ ## error_type ## _private_copy (const GError *src_error, \ GError *dest_error) \ { \ const ErrorType ## Private *src_priv = error_type ## _get_private (src_error); \ ErrorType ## Private *dest_priv = error_type ## _get_private (dest_error); \ error_type ## _private_copy (src_priv, dest_priv); \ } \ \ static void \ g_error_with_ ## error_type ## _private_clear (GError *error) \ { \ ErrorType ## Private *priv = error_type ## _get_private (error); \ error_type ## _private_clear (priv); \ } \ \ GQuark \ error_type ## _quark (void) \ { \ static GQuark q; \ static gsize initialized = 0; \ \ if (g_once_init_enter (&initialized)) \ { \ q = g_error_domain_register_static (#ErrorType, \ sizeof (ErrorType ## Private), \ g_error_with_ ## error_type ## _private_init, \ g_error_with_ ## error_type ## _private_copy, \ g_error_with_ ## error_type ## _private_clear); \ g_once_init_leave (&initialized, 1); \ } \ \ return q; \ } /** * GErrorInitFunc: * @error: extended error * * Specifies the type of function which is called just after an * extended error instance is created and its fields filled. It should * only initialize the fields in the private data, which can be * received with the generated `*_get_private()` function. * * Normally, it is better to use G_DEFINE_EXTENDED_ERROR(), as it * already takes care of getting the private data from @error. * * Since: 2.68 */ typedef void (*GErrorInitFunc) (GError *error); /** * GErrorCopyFunc: * @src_error: source extended error * @dest_error: destination extended error * * Specifies the type of function which is called when an extended * error instance is copied. It is passed the pointer to the * destination error and source error, and should copy only the fields * of the private data from @src_error to @dest_error. * * Normally, it is better to use G_DEFINE_EXTENDED_ERROR(), as it * already takes care of getting the private data from @src_error and * @dest_error. * * Since: 2.68 */ typedef void (*GErrorCopyFunc) (const GError *src_error, GError *dest_error); /** * GErrorClearFunc: * @error: extended error to clear * * Specifies the type of function which is called when an extended * error instance is freed. It is passed the error pointer about to be * freed, and should free the error's private data fields. * * Normally, it is better to use G_DEFINE_EXTENDED_ERROR(), as it * already takes care of getting the private data from @error. * * Since: 2.68 */ typedef void (*GErrorClearFunc) (GError *error); GLIB_AVAILABLE_IN_2_68 GQuark g_error_domain_register_static (const char *error_type_name, gsize error_type_private_size, GErrorInitFunc error_type_init, GErrorCopyFunc error_type_copy, GErrorClearFunc error_type_clear); GLIB_AVAILABLE_IN_2_68 GQuark g_error_domain_register (const char *error_type_name, gsize error_type_private_size, GErrorInitFunc error_type_init, GErrorCopyFunc error_type_copy, GErrorClearFunc error_type_clear); GLIB_AVAILABLE_IN_ALL GError* g_error_new (GQuark domain, gint code, const gchar *format, ...) G_GNUC_PRINTF (3, 4); GLIB_AVAILABLE_IN_ALL GError* g_error_new_literal (GQuark domain, gint code, const gchar *message); GLIB_AVAILABLE_IN_ALL GError* g_error_new_valist (GQuark domain, gint code, const gchar *format, va_list args) G_GNUC_PRINTF(3, 0); GLIB_AVAILABLE_IN_ALL void g_error_free (GError *error); GLIB_AVAILABLE_IN_ALL GError* g_error_copy (const GError *error); GLIB_AVAILABLE_IN_ALL gboolean g_error_matches (const GError *error, GQuark domain, gint code); /* if (err) *err = g_error_new(domain, code, format, ...), also has * some sanity checks. */ GLIB_AVAILABLE_IN_ALL void g_set_error (GError **err, GQuark domain, gint code, const gchar *format, ...) G_GNUC_PRINTF (4, 5); GLIB_AVAILABLE_IN_ALL void g_set_error_literal (GError **err, GQuark domain, gint code, const gchar *message); /* if (dest) *dest = src; also has some sanity checks. */ GLIB_AVAILABLE_IN_ALL void g_propagate_error (GError **dest, GError *src); /* if (err && *err) { g_error_free(*err); *err = NULL; } */ GLIB_AVAILABLE_IN_ALL void g_clear_error (GError **err); /* if (err) prefix the formatted string to the ->message */ GLIB_AVAILABLE_IN_ALL void g_prefix_error (GError **err, const gchar *format, ...) G_GNUC_PRINTF (2, 3); /* if (err) prefix the string to the ->message */ GLIB_AVAILABLE_IN_2_70 void g_prefix_error_literal (GError **err, const gchar *prefix); /* g_propagate_error then g_error_prefix on dest */ GLIB_AVAILABLE_IN_ALL void g_propagate_prefixed_error (GError **dest, GError *src, const gchar *format, ...) G_GNUC_PRINTF (3, 4); G_END_DECLS #endif /* __G_ERROR_H__ */