dbus-errors.c revision dc33f4f7749ed303374ebdf00e48ea8a471afd25
1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
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
21dc33f4f7749ed303374ebdf00e48ea8a471afd25Tobias Mueller * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  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 */
37262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie
38262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie/**
39a18ebe81bdcfcc95d721e70529d6791fc16d2483Simon McVittie * @def DBUS_ERROR_INIT
40262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie *
41262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * Expands to a suitable initializer for a DBusError on the stack.
42262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * Declaring a DBusError with:
43262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie *
44262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * @code
45a18ebe81bdcfcc95d721e70529d6791fc16d2483Simon McVittie * DBusError error = DBUS_ERROR_INIT;
46262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie *
47262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * do_things_with (&error);
48262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * @endcode
49262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie *
50262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * is a more concise form of:
51262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie *
52262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * @code
53262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * DBusError error;
54262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie *
55262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * dbus_error_init (&error);
56262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * do_things_with (&error);
57262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * @endcode
58262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie */
59262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie
6085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington/**
6185ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * Internals of DBusError
6285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington */
63b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssontypedef struct
64b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{
65222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  char *name; /**< error name */
66b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  char *message; /**< error message */
67b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
6885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington  unsigned int const_message : 1; /**< Message is not owned by DBusError */
69b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington
70b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington  unsigned int dummy2 : 1; /**< placeholder */
71b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington  unsigned int dummy3 : 1; /**< placeholder */
72b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington  unsigned int dummy4 : 1; /**< placeholder */
73b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington  unsigned int dummy5 : 1; /**< placeholder */
74b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington
75b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington  void *padding1; /**< placeholder */
76b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington
77b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson} DBusRealError;
78b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
79041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
80ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * Returns a longer message describing an error name.
81ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * If the error name is unknown, returns the name
82ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * itself.
83041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
84ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * @param error the error to describe
85ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * @returns a constant string describing the error.
86041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
87ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Penningtonstatic const char*
88ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Penningtonmessage_from_error (const char *error)
89041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{
90ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  if (strcmp (error, DBUS_ERROR_FAILED) == 0)
91ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Unknown error";
92ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_NO_MEMORY) == 0)
93ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Not enough memory available";
94ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_IO_ERROR) == 0)
95ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Error reading or writing data";
96ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_BAD_ADDRESS) == 0)
97ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Could not parse address";
98ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_NOT_SUPPORTED) == 0)
99ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Feature not supported";
100ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_LIMITS_EXCEEDED) == 0)
101ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Resource limits exceeded";
102ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_ACCESS_DENIED) == 0)
103ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Permission denied";
104ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_AUTH_FAILED) == 0)
105ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Could not authenticate to server";
106ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_NO_SERVER) == 0)
107e45e4382274149ca60c11f068ccca719f3598074Havoc Pennington    return "No server available at address";
108ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_TIMEOUT) == 0)
109ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Connection timed out";
110ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_NO_NETWORK) == 0)
111ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Network unavailable";
112ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_ADDRESS_IN_USE) == 0)
113ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Address already in use";
114ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_DISCONNECTED) == 0)
115ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Disconnected.";
116ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_INVALID_ARGS) == 0)
117d86fc4071ccb8590d922e3456c5c80c0f7bb9d6fKristian Høgsberg    return "Invalid arguments.";
118ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_NO_REPLY) == 0)
119ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Did not get a reply message.";
120ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_FILE_NOT_FOUND) == 0)
121ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "File doesn't exist.";
122d7fbcb5e025b3c718dd1fd332b8759ae26c0d8dcSimon McVittie  else if (strcmp (error, DBUS_ERROR_OBJECT_PATH_IN_USE) == 0)
123d7fbcb5e025b3c718dd1fd332b8759ae26c0d8dcSimon McVittie    return "Object path already in use";
124ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else
125ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return error;
126041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington}
127041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
12885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington/** @} */ /* End of internals */
12985ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington
13085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington/**
13185ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @defgroup DBusErrors Error reporting
13285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @ingroup  DBus
13385ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @brief Error reporting
13485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
13585ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * Types and functions related to reporting errors.
13685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
13785ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
1387652304bff969afb3969603149bb385efe861fe8John (J * In essence D-Bus error reporting works as follows:
13985ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
14085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @code
14185ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * DBusError error;
14285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * dbus_error_init (&error);
14385ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * dbus_some_function (arg1, arg2, &error);
14485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * if (dbus_error_is_set (&error))
14585ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *   {
14685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *     fprintf (stderr, "an error occurred: %s\n", error.message);
14785ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *     dbus_error_free (&error);
14885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *   }
14985ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @endcode
15085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
151afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * By convention, all functions allow #NULL instead of a DBusError*,
152afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * so callers who don't care about the error can ignore it.
153afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington *
1547652304bff969afb3969603149bb385efe861fe8John (J * There are some rules. An error passed to a D-Bus function must
15585ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * always be unset; you can't pass in an error that's already set.  If
15685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * a function has a return code indicating whether an error occurred,
15785ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * and also a #DBusError parameter, then the error will always be set
15885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * if and only if the return code indicates an error occurred. i.e.
15985ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * the return code and the error are never going to disagree.
16085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
16185ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * An error only needs to be freed if it's been set, not if
16285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * it's merely been initialized.
16385ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
16485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * You can check the specific error that occurred using
16585ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * dbus_error_has_name().
16685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
167afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Errors will not be set for programming errors, such as passing
168afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * invalid arguments to the libdbus API. Instead, libdbus will print
169afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * warnings, exit on a failed assertion, or even crash in those cases
170afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * (in other words, incorrect use of the API results in undefined
171afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * behavior, possibly accompanied by helpful debugging output if
172afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * you're lucky).
173afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington *
17485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @{
17585ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington */
17685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington
177a7c05492537b149f67760ecb1958350900843173Anders Carlsson/**
178afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Initializes a DBusError structure. Does not allocate any memory;
179afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * the error only needs to be freed if it is set at some point.
180a7c05492537b149f67760ecb1958350900843173Anders Carlsson *
181a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param error the DBusError.
182a7c05492537b149f67760ecb1958350900843173Anders Carlsson */
183b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssonvoid
184b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_error_init (DBusError *error)
185b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{
186b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  DBusRealError *real;
187b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
188c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_if_fail (error != NULL);
189b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
190b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  _dbus_assert (sizeof (DBusError) == sizeof (DBusRealError));
191b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
192b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real = (DBusRealError *)error;
193b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
194b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real->name = NULL;
195b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real->message = NULL;
196b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
197b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real->const_message = TRUE;
198b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson}
199b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
200a7c05492537b149f67760ecb1958350900843173Anders Carlsson/**
20129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Frees an error that's been set (or just initialized),
20229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * then reinitializes the error as in dbus_error_init().
203a7c05492537b149f67760ecb1958350900843173Anders Carlsson *
204a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param error memory where the error is stored.
205a7c05492537b149f67760ecb1958350900843173Anders Carlsson */
206b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssonvoid
207b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_error_free (DBusError *error)
208b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{
209b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  DBusRealError *real;
210b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
211c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_if_fail (error != NULL);
212c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
213b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real = (DBusRealError *)error;
214b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
215b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  if (!real->const_message)
216f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington    {
217f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington      dbus_free (real->name);
218f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington      dbus_free (real->message);
219f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington    }
22029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
22129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_error_init (error);
222b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson}
223b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
224a7c05492537b149f67760ecb1958350900843173Anders Carlsson/**
225e0b284c7e38f0c002b2173d85ab89dc18700867cHavoc Pennington * Assigns an error name and message to a DBusError.  Does nothing if
226afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * error is #NULL. The message may be #NULL, which means a default
227afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * message will be deduced from the name. The default message will be
228afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * totally useless, though, so using a #NULL message is not recommended.
229a7c05492537b149f67760ecb1958350900843173Anders Carlsson *
230afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Because this function does not copy the error name or message, you
231afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * must ensure the name and message are global data that won't be
232afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * freed. You probably want dbus_set_error() instead, in most cases.
233afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington *
234afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param error the error.or #NULL
235a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param name the error name (not copied!!!)
236a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param message the error message (not copied!!!)
237a7c05492537b149f67760ecb1958350900843173Anders Carlsson */
238b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssonvoid
239b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_set_error_const (DBusError  *error,
240b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson		      const char *name,
241b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson		      const char *message)
242b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{
243b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  DBusRealError *real;
244b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
245c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_if_error_is_set (error);
246c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_if_fail (name != NULL);
247c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
248b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  if (error == NULL)
249b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson    return;
2502f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington
2512f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington  _dbus_assert (error->name == NULL);
2522f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington  _dbus_assert (error->message == NULL);
253ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington
254ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  if (message == NULL)
255ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    message = message_from_error (name);
256b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
257b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real = (DBusRealError *)error;
258b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
259222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  real->name = (char*) name;
260b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real->message = (char *)message;
261b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real->const_message = TRUE;
262b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson}
263b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
264a7c05492537b149f67760ecb1958350900843173Anders Carlsson/**
26529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Moves an error src into dest, freeing src and
26629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * overwriting dest. Both src and dest must be initialized.
26729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * src is reinitialized to an empty error. dest may not
26829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * contain an existing error. If the destination is
26929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * #NULL, just frees and reinits the source error.
270410a80c43126376e9308a03a7cef108716018f5aHavoc Pennington *
27129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @param src the source error
27229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @param dest the destination error or #NULL
27329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */
27429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid
27529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_move_error (DBusError *src,
27629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                 DBusError *dest)
27729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
278c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_if_error_is_set (dest);
27929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
28029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (dest)
28129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
28229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_error_free (dest);
28329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      *dest = *src;
28429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_error_init (src);
28529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
28629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
28729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    dbus_error_free (src);
28829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
28929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
29029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/**
2917e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * Checks whether the error is set and has the given
2927e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * name.
2937e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @param error the error
2947e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @param name the name
2957e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @returns #TRUE if the given named error occurred
2967e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington */
2977e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Penningtondbus_bool_t
2987e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Penningtondbus_error_has_name (const DBusError *error,
2997e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington                     const char      *name)
3007e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington{
301c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_val_if_fail (error != NULL, FALSE);
302c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_val_if_fail (name != NULL, FALSE);
303c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
3047e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington  _dbus_assert ((error->name != NULL && error->message != NULL) ||
3057e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington                (error->name == NULL && error->message == NULL));
3067e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington
3077e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington  if (error->name != NULL)
3087e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington    {
3097e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington      DBusString str1, str2;
3107e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington      _dbus_string_init_const (&str1, error->name);
3117e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington      _dbus_string_init_const (&str2, name);
3127e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington      return _dbus_string_equal (&str1, &str2);
3137e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington    }
3147e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington  else
3157e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington    return FALSE;
3167e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington}
3177e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington
3187e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington/**
3197e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * Checks whether an error occurred (the error is set).
3207e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington *
3217e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @param error the error object
3227e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @returns #TRUE if an error occurred
3237e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington */
3247e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Penningtondbus_bool_t
3257e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Penningtondbus_error_is_set (const DBusError *error)
3267e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington{
327c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_val_if_fail (error != NULL, FALSE);
3287e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington  _dbus_assert ((error->name != NULL && error->message != NULL) ||
3297e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington                (error->name == NULL && error->message == NULL));
3307e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington  return error->name != NULL;
3317e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington}
3327e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington
3337e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington/**
334a7c05492537b149f67760ecb1958350900843173Anders Carlsson * Assigns an error name and message to a DBusError.
335a7c05492537b149f67760ecb1958350900843173Anders Carlsson * Does nothing if error is #NULL.
336a7c05492537b149f67760ecb1958350900843173Anders Carlsson *
337afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The format may be #NULL, which means a (pretty much useless)
338afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * default message will be deduced from the name. This is not a good
339afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * idea, just go ahead and provide a useful error message. It won't
340afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * hurt you.
341ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington *
3422aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson * If no memory can be allocated for the error message,
3432aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson * an out-of-memory error message will be set instead.
3446b40feaff4114ab3498ad06e13063fceff4d48e9Havoc Pennington *
345afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param error the error.or #NULL
346f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington * @param name the error name
347a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param format printf-style format string.
348a7c05492537b149f67760ecb1958350900843173Anders Carlsson */
3492aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlssonvoid
350b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_set_error (DBusError  *error,
351b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson		const char *name,
352b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson		const char *format,
353b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson		...)
354b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{
355b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  DBusRealError *real;
3561d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  DBusString str;
3572f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington  va_list args;
3581d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington
359b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  if (error == NULL)
3602aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson    return;
3612f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington
3622f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington  /* it's a bug to pile up errors */
363c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_if_error_is_set (error);
364c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_if_fail (name != NULL);
365c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
3662f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington  _dbus_assert (error->name == NULL);
3672f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington  _dbus_assert (error->message == NULL);
368ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington
3691d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  if (!_dbus_string_init (&str))
3701d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington    goto nomem;
3713c8db267892bbce5c82d5060cef993dd54dc6ed4Anders Carlsson
3721d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  if (format == NULL)
3732aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson    {
3741d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington      if (!_dbus_string_append (&str,
3751d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington                                message_from_error (name)))
3761d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington        {
3771d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington          _dbus_string_free (&str);
3781d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington          goto nomem;
3791d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington        }
3801d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington    }
3811d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  else
3821d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington    {
3831d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington      va_start (args, format);
3841d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington      if (!_dbus_string_append_printf_valist (&str, format, args))
3851d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington        {
3861d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington          _dbus_string_free (&str);
38797872bf72ff327855e2e86a4760348cd2ca03b9eJohn (J          va_end (args);
3881d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington          goto nomem;
3891d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington        }
3901d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington      va_end (args);
3912aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson    }
392b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
393b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real = (DBusRealError *)error;
3941d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington
3951d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  if (!_dbus_string_steal_data (&str, &real->message))
3961d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington    {
3971d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington      _dbus_string_free (&str);
3981d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington      goto nomem;
3991d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington    }
400f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington  _dbus_string_free (&str);
401b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
402f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington  real->name = _dbus_strdup (name);
403f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington  if (real->name == NULL)
404f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington    {
405f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington      dbus_free (real->message);
406f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington      real->message = NULL;
407f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington      goto nomem;
408f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington    }
409b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real->const_message = FALSE;
4101d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington
4111d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  return;
4121d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington
4131d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington nomem:
414fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu  _DBUS_SET_OOM (error);
415b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson}
416b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
41785ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington/** @} */ /* End public API */
418