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 */
24dbecdeabb20e0ce11121819c63373f0afba57c58Marcus Brinkmann
25dbecdeabb20e0ce11121819c63373f0afba57c58Marcus Brinkmann#include <config.h>
26041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include "dbus-errors.h"
27b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson#include "dbus-internals.h"
281d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington#include "dbus-string.h"
29961e6ca41c1e9433055130569ce3492866e2126bHavoc Pennington#include "dbus-protocol.h"
30b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson#include <stdarg.h>
31ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington#include <string.h>
32041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
33041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
3485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @defgroup DBusErrorInternals Error reporting internals
3585ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @ingroup  DBusInternals
3685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @brief Error reporting internals
37041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @{
38041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
39262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie
40262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie/**
41a18ebe81bdcfcc95d721e70529d6791fc16d2483Simon McVittie * @def DBUS_ERROR_INIT
42262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie *
43262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * Expands to a suitable initializer for a DBusError on the stack.
44262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * Declaring a DBusError with:
45262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie *
46262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * @code
47a18ebe81bdcfcc95d721e70529d6791fc16d2483Simon McVittie * DBusError error = DBUS_ERROR_INIT;
48262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie *
49262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * do_things_with (&error);
50262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * @endcode
51262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie *
52262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * is a more concise form of:
53262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie *
54262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * @code
55262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * DBusError error;
56262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie *
57262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * dbus_error_init (&error);
58262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * do_things_with (&error);
59262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * @endcode
60262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie */
61262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie
6285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington/**
6385ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * Internals of DBusError
6485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington */
65b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssontypedef struct
66b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{
67222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  char *name; /**< error name */
68b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  char *message; /**< error message */
69b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
7085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington  unsigned int const_message : 1; /**< Message is not owned by DBusError */
71b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington
72b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington  unsigned int dummy2 : 1; /**< placeholder */
73b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington  unsigned int dummy3 : 1; /**< placeholder */
74b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington  unsigned int dummy4 : 1; /**< placeholder */
75b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington  unsigned int dummy5 : 1; /**< placeholder */
76b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington
77b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington  void *padding1; /**< placeholder */
78b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington
79b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson} DBusRealError;
80b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
81041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
82ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * Returns a longer message describing an error name.
83ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * If the error name is unknown, returns the name
84ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * itself.
85041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
86ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * @param error the error to describe
87ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * @returns a constant string describing the error.
88041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
89ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Penningtonstatic const char*
90ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Penningtonmessage_from_error (const char *error)
91041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{
92ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  if (strcmp (error, DBUS_ERROR_FAILED) == 0)
93ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Unknown error";
94ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_NO_MEMORY) == 0)
95ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Not enough memory available";
96ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_IO_ERROR) == 0)
97ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Error reading or writing data";
98ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_BAD_ADDRESS) == 0)
99ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Could not parse address";
100ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_NOT_SUPPORTED) == 0)
101ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Feature not supported";
102ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_LIMITS_EXCEEDED) == 0)
103ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Resource limits exceeded";
104ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_ACCESS_DENIED) == 0)
105ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Permission denied";
106ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_AUTH_FAILED) == 0)
107ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Could not authenticate to server";
108ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_NO_SERVER) == 0)
109e45e4382274149ca60c11f068ccca719f3598074Havoc Pennington    return "No server available at address";
110ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_TIMEOUT) == 0)
111ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Connection timed out";
112ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_NO_NETWORK) == 0)
113ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Network unavailable";
114ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_ADDRESS_IN_USE) == 0)
115ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Address already in use";
116ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_DISCONNECTED) == 0)
117ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Disconnected.";
118ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_INVALID_ARGS) == 0)
119d86fc4071ccb8590d922e3456c5c80c0f7bb9d6fKristian Høgsberg    return "Invalid arguments.";
120ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_NO_REPLY) == 0)
121ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "Did not get a reply message.";
122ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else if (strcmp (error, DBUS_ERROR_FILE_NOT_FOUND) == 0)
123ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return "File doesn't exist.";
124d7fbcb5e025b3c718dd1fd332b8759ae26c0d8dcSimon McVittie  else if (strcmp (error, DBUS_ERROR_OBJECT_PATH_IN_USE) == 0)
125d7fbcb5e025b3c718dd1fd332b8759ae26c0d8dcSimon McVittie    return "Object path already in use";
126ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  else
127ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    return error;
128041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington}
129041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
13085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington/** @} */ /* End of internals */
13185ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington
13285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington/**
13385ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @defgroup DBusErrors Error reporting
13485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @ingroup  DBus
13585ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @brief Error reporting
13685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
13785ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * Types and functions related to reporting errors.
13885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
13985ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
1407652304bff969afb3969603149bb385efe861fe8John (J * In essence D-Bus error reporting works as follows:
14185ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
14285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @code
14385ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * DBusError error;
14485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * dbus_error_init (&error);
14585ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * dbus_some_function (arg1, arg2, &error);
14685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * if (dbus_error_is_set (&error))
14785ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *   {
14885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *     fprintf (stderr, "an error occurred: %s\n", error.message);
14985ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *     dbus_error_free (&error);
15085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *   }
15185ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @endcode
15285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
153afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * By convention, all functions allow #NULL instead of a DBusError*,
154afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * so callers who don't care about the error can ignore it.
155afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington *
1567652304bff969afb3969603149bb385efe861fe8John (J * There are some rules. An error passed to a D-Bus function must
15785ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * always be unset; you can't pass in an error that's already set.  If
15885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * a function has a return code indicating whether an error occurred,
15985ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * and also a #DBusError parameter, then the error will always be set
16085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * if and only if the return code indicates an error occurred. i.e.
16185ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * the return code and the error are never going to disagree.
16285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
16385ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * An error only needs to be freed if it's been set, not if
16485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * it's merely been initialized.
16585ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
16685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * You can check the specific error that occurred using
16785ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * dbus_error_has_name().
16885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington *
169afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Errors will not be set for programming errors, such as passing
170afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * invalid arguments to the libdbus API. Instead, libdbus will print
171afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * warnings, exit on a failed assertion, or even crash in those cases
172afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * (in other words, incorrect use of the API results in undefined
173afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * behavior, possibly accompanied by helpful debugging output if
174afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * you're lucky).
175afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington *
17685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @{
17785ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington */
17885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington
179a7c05492537b149f67760ecb1958350900843173Anders Carlsson/**
180afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Initializes a DBusError structure. Does not allocate any memory;
181afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * the error only needs to be freed if it is set at some point.
182a7c05492537b149f67760ecb1958350900843173Anders Carlsson *
183a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param error the DBusError.
184a7c05492537b149f67760ecb1958350900843173Anders Carlsson */
185b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssonvoid
186b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_error_init (DBusError *error)
187b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{
188b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  DBusRealError *real;
189b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
190c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_if_fail (error != NULL);
191b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
192b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  _dbus_assert (sizeof (DBusError) == sizeof (DBusRealError));
193b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
194b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real = (DBusRealError *)error;
195b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
196b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real->name = NULL;
197b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real->message = NULL;
198b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
199b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real->const_message = TRUE;
200b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson}
201b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
202a7c05492537b149f67760ecb1958350900843173Anders Carlsson/**
20329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Frees an error that's been set (or just initialized),
20429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * then reinitializes the error as in dbus_error_init().
205a7c05492537b149f67760ecb1958350900843173Anders Carlsson *
206a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param error memory where the error is stored.
207a7c05492537b149f67760ecb1958350900843173Anders Carlsson */
208b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssonvoid
209b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_error_free (DBusError *error)
210b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{
211b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  DBusRealError *real;
212b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
213c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_if_fail (error != NULL);
214c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
215b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real = (DBusRealError *)error;
216b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
217b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  if (!real->const_message)
218f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington    {
219f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington      dbus_free (real->name);
220f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington      dbus_free (real->message);
221f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington    }
22229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
22329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  dbus_error_init (error);
224b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson}
225b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
226a7c05492537b149f67760ecb1958350900843173Anders Carlsson/**
227e0b284c7e38f0c002b2173d85ab89dc18700867cHavoc Pennington * Assigns an error name and message to a DBusError.  Does nothing if
228afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * error is #NULL. The message may be #NULL, which means a default
229afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * message will be deduced from the name. The default message will be
230afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * totally useless, though, so using a #NULL message is not recommended.
231a7c05492537b149f67760ecb1958350900843173Anders Carlsson *
232afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Because this function does not copy the error name or message, you
233afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * must ensure the name and message are global data that won't be
234afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * freed. You probably want dbus_set_error() instead, in most cases.
235afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington *
236afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param error the error.or #NULL
237a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param name the error name (not copied!!!)
238a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param message the error message (not copied!!!)
239a7c05492537b149f67760ecb1958350900843173Anders Carlsson */
240b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssonvoid
241b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_set_error_const (DBusError  *error,
242b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson		      const char *name,
243b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson		      const char *message)
244b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{
245b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  DBusRealError *real;
246b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
247c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_if_error_is_set (error);
248c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_if_fail (name != NULL);
249c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
250b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  if (error == NULL)
251b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson    return;
2522f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington
2532f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington  _dbus_assert (error->name == NULL);
2542f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington  _dbus_assert (error->message == NULL);
255ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington
256ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington  if (message == NULL)
257ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington    message = message_from_error (name);
258b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
259b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real = (DBusRealError *)error;
260b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
261222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  real->name = (char*) name;
262b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real->message = (char *)message;
263b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real->const_message = TRUE;
264b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson}
265b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
266a7c05492537b149f67760ecb1958350900843173Anders Carlsson/**
26729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Moves an error src into dest, freeing src and
26829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * overwriting dest. Both src and dest must be initialized.
26929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * src is reinitialized to an empty error. dest may not
27029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * contain an existing error. If the destination is
27129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * #NULL, just frees and reinits the source error.
272410a80c43126376e9308a03a7cef108716018f5aHavoc Pennington *
27329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @param src the source error
27429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @param dest the destination error or #NULL
27529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */
27629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid
27729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_move_error (DBusError *src,
27829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington                 DBusError *dest)
27929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{
280c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_if_error_is_set (dest);
28129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
28229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  if (dest)
28329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    {
28429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_error_free (dest);
28529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      *dest = *src;
28629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington      dbus_error_init (src);
28729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    }
28829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington  else
28929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington    dbus_error_free (src);
29029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington}
29129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
29229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/**
2937e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * Checks whether the error is set and has the given
2947e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * name.
2957e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @param error the error
2967e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @param name the name
2977e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @returns #TRUE if the given named error occurred
2987e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington */
2997e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Penningtondbus_bool_t
3007e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Penningtondbus_error_has_name (const DBusError *error,
3017e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington                     const char      *name)
3027e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington{
303c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_val_if_fail (error != NULL, FALSE);
304c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_val_if_fail (name != NULL, FALSE);
305c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
3067e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington  _dbus_assert ((error->name != NULL && error->message != NULL) ||
3077e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington                (error->name == NULL && error->message == NULL));
3087e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington
3097e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington  if (error->name != NULL)
3107e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington    {
3117e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington      DBusString str1, str2;
3127e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington      _dbus_string_init_const (&str1, error->name);
3137e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington      _dbus_string_init_const (&str2, name);
3147e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington      return _dbus_string_equal (&str1, &str2);
3157e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington    }
3167e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington  else
3177e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington    return FALSE;
3187e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington}
3197e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington
3207e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington/**
3217e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * Checks whether an error occurred (the error is set).
3227e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington *
3237e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @param error the error object
3247e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @returns #TRUE if an error occurred
3257e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington */
3267e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Penningtondbus_bool_t
3277e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Penningtondbus_error_is_set (const DBusError *error)
3287e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington{
329c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_val_if_fail (error != NULL, FALSE);
3307e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington  _dbus_assert ((error->name != NULL && error->message != NULL) ||
3317e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington                (error->name == NULL && error->message == NULL));
3327e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington  return error->name != NULL;
3337e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington}
3347e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington
3357e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington/**
336a7c05492537b149f67760ecb1958350900843173Anders Carlsson * Assigns an error name and message to a DBusError.
337a7c05492537b149f67760ecb1958350900843173Anders Carlsson * Does nothing if error is #NULL.
338a7c05492537b149f67760ecb1958350900843173Anders Carlsson *
339afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The format may be #NULL, which means a (pretty much useless)
340afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * default message will be deduced from the name. This is not a good
341afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * idea, just go ahead and provide a useful error message. It won't
342afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * hurt you.
343ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington *
3442aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson * If no memory can be allocated for the error message,
3452aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson * an out-of-memory error message will be set instead.
3466b40feaff4114ab3498ad06e13063fceff4d48e9Havoc Pennington *
347afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param error the error.or #NULL
348f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington * @param name the error name
349a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param format printf-style format string.
350a7c05492537b149f67760ecb1958350900843173Anders Carlsson */
3512aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlssonvoid
352b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_set_error (DBusError  *error,
353b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson		const char *name,
354b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson		const char *format,
355b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson		...)
356b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{
357b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  DBusRealError *real;
3581d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  DBusString str;
3592f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington  va_list args;
3601d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington
361b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  if (error == NULL)
3622aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson    return;
3632f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington
3642f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington  /* it's a bug to pile up errors */
365c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_if_error_is_set (error);
366c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  _dbus_return_if_fail (name != NULL);
367c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
3682f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington  _dbus_assert (error->name == NULL);
3692f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington  _dbus_assert (error->message == NULL);
370ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington
3711d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  if (!_dbus_string_init (&str))
3721d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington    goto nomem;
3733c8db267892bbce5c82d5060cef993dd54dc6ed4Anders Carlsson
3741d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  if (format == NULL)
3752aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson    {
3761d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington      if (!_dbus_string_append (&str,
3771d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington                                message_from_error (name)))
3781d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington        {
3791d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington          _dbus_string_free (&str);
380922c6f3285c429af364a44cbc19950fff92bb62bKimmo Hämäläinen          va_end (args);
3811d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington          goto nomem;
3821d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington        }
3831d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington    }
3841d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  else
3851d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington    {
3861d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington      va_start (args, format);
3871d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington      if (!_dbus_string_append_printf_valist (&str, format, args))
3881d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington        {
3891d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington          _dbus_string_free (&str);
39097872bf72ff327855e2e86a4760348cd2ca03b9eJohn (J          va_end (args);
3911d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington          goto nomem;
3921d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington        }
3931d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington      va_end (args);
3942aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson    }
395b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
396b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real = (DBusRealError *)error;
3971d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington
3981d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  if (!_dbus_string_steal_data (&str, &real->message))
3991d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington    {
4001d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington      _dbus_string_free (&str);
4011d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington      goto nomem;
4021d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington    }
403f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington  _dbus_string_free (&str);
404b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
405f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington  real->name = _dbus_strdup (name);
406f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington  if (real->name == NULL)
407f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington    {
408f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington      dbus_free (real->message);
409f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington      real->message = NULL;
410f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington      goto nomem;
411f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington    }
412b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson  real->const_message = FALSE;
4131d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington
4141d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington  return;
4151d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington
4161d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington nomem:
417fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu  _DBUS_SET_OOM (error);
418b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson}
419b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson
42085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington/** @} */ /* End public API */
421