dbus-errors.c revision 7652304bff969afb3969603149bb385efe861fe8
1041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/* -*- mode: C; c-file-style: "gnu" -*- */
2041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/* dbus-errors.c Error reporting
3041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
4961e6ca41c1e9433055130569ce3492866e2126bHavoc Pennington * Copyright (C) 2002, 2004  Red Hat Inc.
52a751e51a7be07d48e4f9a25e90cad5d12ae0a61Richard Hult * Copyright (C) 2003  CodeFactory AB
6041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
743605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1
8041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
9041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * This program is free software; you can redistribute it and/or modify
10041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * it under the terms of the GNU General Public License as published by
11041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * the Free Software Foundation; either version 2 of the License, or
12041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * (at your option) any later version.
13041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
14041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * This program is distributed in the hope that it will be useful,
15041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of
16041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * GNU General Public License for more details.
18041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
19041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * You should have received a copy of the GNU General Public License
20041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * along with this program; if not, write to the Free Software
21041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
23041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
24041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include "dbus-errors.h"
25b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson#include "dbus-internals.h"
261d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington#include "dbus-string.h"
27961e6ca41c1e9433055130569ce3492866e2126bHavoc Pennington#include "dbus-protocol.h"
28b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson#include <stdarg.h>
29ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington#include <string.h>
30041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
31041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
3285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @defgroup DBusErrorInternals Error reporting internals
3385ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @ingroup  DBusInternals
3485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @brief Error reporting internals
35041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @{
36041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
3785ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington
3885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington/**
3985ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * Internals of DBusError
4085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington */
41b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssontypedef struct
42b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{
43b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  const char *name; /**< error name */
44b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  char *message; /**< error message */
45b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
4685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington  unsigned int const_message : 1; /**< Message is not owned by DBusError */
47b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington
48b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington  unsigned int dummy2 : 1; /**< placeholder */
49b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington  unsigned int dummy3 : 1; /**< placeholder */
50b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington  unsigned int dummy4 : 1; /**< placeholder */
51b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington  unsigned int dummy5 : 1; /**< placeholder */
52b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington
53b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington  void *padding1; /**< placeholder */
54b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington
55b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson} DBusRealError;
56b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
57041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
58ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * Returns a longer message describing an error name.
59ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * If the error name is unknown, returns the name
60ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * itself.
61041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
62ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * @param error the error to describe
63ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * @returns a constant string describing the error.
64041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
65ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Penningtonstatic const char*
66ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Penningtonmessage_from_error (const char *error)
67041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{
68ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  if (strcmp (error, DBUS_ERROR_FAILED) == 0)
69ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Unknown error";
70ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_NO_MEMORY) == 0)
71ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Not enough memory available";
72ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_IO_ERROR) == 0)
73ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Error reading or writing data";
74ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_BAD_ADDRESS) == 0)
75ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Could not parse address";
76ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_NOT_SUPPORTED) == 0)
77ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Feature not supported";
78ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_LIMITS_EXCEEDED) == 0)
79ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Resource limits exceeded";
80ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_ACCESS_DENIED) == 0)
81ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Permission denied";
82ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_AUTH_FAILED) == 0)
83ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Could not authenticate to server";
84ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_NO_SERVER) == 0)
85e45e4382274149ca60c11f068ccca719f3598074Havoc Pennington    return "No server available at address";
86ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_TIMEOUT) == 0)
87ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Connection timed out";
88ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_NO_NETWORK) == 0)
89ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Network unavailable";
90ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_ADDRESS_IN_USE) == 0)
91ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Address already in use";
92ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_DISCONNECTED) == 0)
93ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Disconnected.";
94ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_INVALID_ARGS) == 0)
95d86fc4071ccb8590d922e3456c5c80c0f7bb9d6fKristian Høgsberg    return "Invalid arguments.";
96ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_NO_REPLY) == 0)
97ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Did not get a reply message.";
98ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_FILE_NOT_FOUND) == 0)
99ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "File doesn't exist.";
100ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else
101ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return error;
102041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington}
103041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
10485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington/** @} */ /* End of internals */
10585ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington
10685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington/**
10785ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @defgroup DBusErrors Error reporting
10885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @ingroup  DBus
10985ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @brief Error reporting
11085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
11185ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * Types and functions related to reporting errors.
11285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
11385ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
1147652304bff969afb3969603149bb385efe861fe8John (J * In essence D-Bus error reporting works as follows:
11585ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
11685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @code
11785ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * DBusError error;
11885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * dbus_error_init (&error);
11985ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * dbus_some_function (arg1, arg2, &error);
12085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * if (dbus_error_is_set (&error))
12185ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *   {
12285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *     fprintf (stderr, "an error occurred: %s\n", error.message);
12385ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *     dbus_error_free (&error);
12485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *   }
12585ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @endcode
12685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
1277652304bff969afb3969603149bb385efe861fe8John (J * There are some rules. An error passed to a D-Bus function must
12885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * always be unset; you can't pass in an error that's already set.  If
12985ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * a function has a return code indicating whether an error occurred,
13085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * and also a #DBusError parameter, then the error will always be set
13185ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * if and only if the return code indicates an error occurred. i.e.
13285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * the return code and the error are never going to disagree.
13385ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
13485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * An error only needs to be freed if it's been set, not if
13585ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * it's merely been initialized.
13685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
13785ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * You can check the specific error that occurred using
13885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * dbus_error_has_name().
13985ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
14085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @{
14185ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington */
14285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington
143a7c05492537b149f67760ecb1958350900843173Anders Carlsson/**
14429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Initializes a DBusError structure. Does not allocate
14529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * any memory; the error only needs to be freed
14629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * if it is set at some point.
147a7c05492537b149f67760ecb1958350900843173Anders Carlsson *
148a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param error the DBusError.
149a7c05492537b149f67760ecb1958350900843173Anders Carlsson */
150b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssonvoid
151b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_error_init (DBusError *error)
152b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{
153b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  DBusRealError *real;
154b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
155c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_if_fail (error != NULL);
156b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
157b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  _dbus_assert (sizeof (DBusError) == sizeof (DBusRealError));
158b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
159b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real = (DBusRealError *)error;
160b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
161b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real->name = NULL;
162b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real->message = NULL;
163b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
164b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real->const_message = TRUE;
165b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson}
166b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
167a7c05492537b149f67760ecb1958350900843173Anders Carlsson/**
16829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Frees an error that's been set (or just initialized),
16929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * then reinitializes the error as in dbus_error_init().
170a7c05492537b149f67760ecb1958350900843173Anders Carlsson *
171a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param error memory where the error is stored.
172a7c05492537b149f67760ecb1958350900843173Anders Carlsson */
173b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssonvoid
174b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_error_free (DBusError *error)
175b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{
176b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  DBusRealError *real;
177b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
178c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_if_fail (error != NULL);
179c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
180b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real = (DBusRealError *)error;
181b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
182b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  if (!real->const_message)
183f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington    {
184f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington      dbus_free (real->name);
185f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington      dbus_free (real->message);
186f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington    }
18729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
18829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_error_init (error);
189b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson}
190b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
191a7c05492537b149f67760ecb1958350900843173Anders Carlsson/**
192e0b284c7e38f0c002b2173d85ab89dc18700867cHavoc Pennington * Assigns an error name and message to a DBusError.  Does nothing if
193e0b284c7e38f0c002b2173d85ab89dc18700867cHavoc Pennington * error is #NULL. The message may be NULL, which means a default
194e0b284c7e38f0c002b2173d85ab89dc18700867cHavoc Pennington * message will be deduced from the name. If the error name is unknown
1957652304bff969afb3969603149bb385efe861fe8John (J * to D-Bus the default message will be totally useless, though.
196a7c05492537b149f67760ecb1958350900843173Anders Carlsson *
197a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param error the error.
198a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param name the error name (not copied!!!)
199a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param message the error message (not copied!!!)
200a7c05492537b149f67760ecb1958350900843173Anders Carlsson */
201b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssonvoid
202b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_set_error_const (DBusError  *error,
203b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson		      const char *name,
204b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson		      const char *message)
205b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{
206b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  DBusRealError *real;
207b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
208c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_if_error_is_set (error);
209c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_if_fail (name != NULL);
210c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
211b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  if (error == NULL)
212b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson    return;
2132f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington
2142f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington  _dbus_assert (error->name == NULL);
2152f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington  _dbus_assert (error->message == NULL);
216ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington
217ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  if (message == NULL)
218ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    message = message_from_error (name);
219b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
220b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real = (DBusRealError *)error;
221b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
222b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real->name = name;
223b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real->message = (char *)message;
224b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real->const_message = TRUE;
225b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson}
226b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
227a7c05492537b149f67760ecb1958350900843173Anders Carlsson/**
22829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Moves an error src into dest, freeing src and
22929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * overwriting dest. Both src and dest must be initialized.
23029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * src is reinitialized to an empty error. dest may not
23129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * contain an existing error. If the destination is
23229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * #NULL, just frees and reinits the source error.
233410a80c43126376e9308a03a7cef108716018f5aHavoc Pennington *
23429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @param src the source error
23529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @param dest the destination error or #NULL
23629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */
23729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid
23829560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_move_error (DBusError *src,
23929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                 DBusError *dest)
24029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
241c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_if_error_is_set (dest);
24229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
24329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (dest)
24429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
24529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_error_free (dest);
24629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      *dest = *src;
24729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_error_init (src);
24829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
24929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
25029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    dbus_error_free (src);
25129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
25229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
25329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/**
2547e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * Checks whether the error is set and has the given
2557e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * name.
2567e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @param error the error
2577e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @param name the name
2587e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @returns #TRUE if the given named error occurred
2597e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington */
2607e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Penningtondbus_bool_t
2617e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Penningtondbus_error_has_name (const DBusError *error,
2627e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington                     const char      *name)
2637e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington{
264c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_val_if_fail (error != NULL, FALSE);
265c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_val_if_fail (name != NULL, FALSE);
266c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
2677e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington  _dbus_assert ((error->name != NULL && error->message != NULL) ||
2687e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington                (error->name == NULL && error->message == NULL));
2697e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington
2707e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington  if (error->name != NULL)
2717e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington    {
2727e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington      DBusString str1, str2;
2737e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington      _dbus_string_init_const (&str1, error->name);
2747e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington      _dbus_string_init_const (&str2, name);
2757e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington      return _dbus_string_equal (&str1, &str2);
2767e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington    }
2777e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington  else
2787e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington    return FALSE;
2797e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington}
2807e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington
2817e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington/**
2827e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * Checks whether an error occurred (the error is set).
2837e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington *
2847e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @param error the error object
2857e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @returns #TRUE if an error occurred
2867e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington */
2877e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Penningtondbus_bool_t
2887e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Penningtondbus_error_is_set (const DBusError *error)
2897e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington{
290c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_val_if_fail (error != NULL, FALSE);
2917e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington  _dbus_assert ((error->name != NULL && error->message != NULL) ||
2927e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington                (error->name == NULL && error->message == NULL));
2937e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington  return error->name != NULL;
2947e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington}
2957e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington
2967e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington/**
297a7c05492537b149f67760ecb1958350900843173Anders Carlsson * Assigns an error name and message to a DBusError.
298a7c05492537b149f67760ecb1958350900843173Anders Carlsson * Does nothing if error is #NULL.
299a7c05492537b149f67760ecb1958350900843173Anders Carlsson *
300e0b284c7e38f0c002b2173d85ab89dc18700867cHavoc Pennington * The format may be NULL, which means a default message will be
3017652304bff969afb3969603149bb385efe861fe8John (J * deduced from the name. If the error name is unknown to D-Bus the
302e0b284c7e38f0c002b2173d85ab89dc18700867cHavoc Pennington * default message will be totally useless, though.
303ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington *
3042aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson * If no memory can be allocated for the error message,
3052aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson * an out-of-memory error message will be set instead.
3066b40feaff4114ab3498ad06e13063fceff4d48e9Havoc Pennington *
307a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param error the error.
308f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington * @param name the error name
309a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param format printf-style format string.
310a7c05492537b149f67760ecb1958350900843173Anders Carlsson */
3112aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlssonvoid
312b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_set_error (DBusError  *error,
313b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson		const char *name,
314b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson		const char *format,
315b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson		...)
316b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{
317b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  DBusRealError *real;
3181d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  DBusString str;
3192f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington  va_list args;
3201d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington
321b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  if (error == NULL)
3222aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson    return;
3232f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington
3242f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington  /* it's a bug to pile up errors */
325c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_if_error_is_set (error);
326c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_if_fail (name != NULL);
327c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
3282f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington  _dbus_assert (error->name == NULL);
3292f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington  _dbus_assert (error->message == NULL);
330ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington
3311d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  if (!_dbus_string_init (&str))
3321d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington    goto nomem;
3333c8db267892bbce5c82d5060cef993dd54dc6ed4Anders Carlsson
3341d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  if (format == NULL)
3352aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson    {
3361d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington      if (!_dbus_string_append (&str,
3371d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington                                message_from_error (name)))
3381d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington        {
3391d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington          _dbus_string_free (&str);
3401d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington          goto nomem;
3411d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington        }
3421d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington    }
3431d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  else
3441d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington    {
3451d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington      va_start (args, format);
3461d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington      if (!_dbus_string_append_printf_valist (&str, format, args))
3471d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington        {
3481d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington          _dbus_string_free (&str);
3491d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington          goto nomem;
3501d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington        }
3511d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington      va_end (args);
3522aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson    }
353b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
354b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real = (DBusRealError *)error;
3551d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington
3561d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  if (!_dbus_string_steal_data (&str, &real->message))
3571d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington    {
3581d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington      _dbus_string_free (&str);
3591d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington      goto nomem;
3601d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington    }
361f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington  _dbus_string_free (&str);
362b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
363f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington  real->name = _dbus_strdup (name);
364f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington  if (real->name == NULL)
365f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington    {
366f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington      dbus_free (real->message);
367f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington      real->message = NULL;
368f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington      goto nomem;
369f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington    }
370b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real->const_message = FALSE;
3711d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington
3721d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  return;
3731d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington
3741d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington nomem:
375fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu  _DBUS_SET_OOM (error);
376b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson}
377b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
37885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington/** @} */ /* End public API */
379