dbus-errors.c revision b822fb3913e175ff7c139e064453d5d97e758db0
1/* -*- mode: C; c-file-style: "gnu" -*- */ 2/* dbus-errors.c Error reporting 3 * 4 * Copyright (C) 2002 Red Hat Inc. 5 * Copyright (C) 2003 CodeFactory AB 6 * 7 * Licensed under the Academic Free License version 1.2 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License as published by 11 * the Free Software Foundation; either version 2 of the License, or 12 * (at your option) any later version. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 22 * 23 */ 24#include "dbus-errors.h" 25#include "dbus-internals.h" 26#include <stdarg.h> 27#include <stdio.h> 28 29/** 30 * @defgroup DBusErrors Error reporting 31 * @ingroup DBus 32 * @brief Error reporting 33 * 34 * Types and functions related to reporting errors. 35 * 36 * 37 * In essence D-BUS error reporting works as follows: 38 * 39 * @code 40 * DBusResultCode result = DBUS_RESULT_SUCCESS; 41 * dbus_some_function (arg1, arg2, &result); 42 * if (result != DBUS_RESULT_SUCCESS) 43 * printf ("an error occurred\n"); 44 * @endcode 45 * 46 * @{ 47 */ 48 49typedef struct 50{ 51 const char *name; /**< error name */ 52 char *message; /**< error message */ 53 54 unsigned int const_message : 1; /** Message is not owned by DBusError */ 55} DBusRealError; 56 57/** 58 * Set a result code at a result code location, 59 * if code_address is not #NULL. 60 * 61 * @param code_address place to store the result code. 62 * @param code the result code itself. 63 */ 64void 65dbus_set_result (DBusResultCode *code_address, 66 DBusResultCode code) 67{ 68 if (code_address) 69 *code_address = code; 70} 71 72/** 73 * Returns a string describing the given result code. 74 * 75 * @param code the result code to describe. 76 * @returns a constant string describing the code. 77 */ 78const char* 79dbus_result_to_string (DBusResultCode code) 80{ 81 /* This is a switch to the compiler will complain if we 82 * aren't handling some codes 83 */ 84 switch (code) 85 { 86 case DBUS_RESULT_SUCCESS: 87 return "Success"; 88 case DBUS_RESULT_FAILED: 89 return "Unknown error"; 90 case DBUS_RESULT_NO_MEMORY: 91 return "Not enough memory available"; 92 case DBUS_RESULT_IO_ERROR: 93 return "Error reading or writing data"; 94 case DBUS_RESULT_BAD_ADDRESS: 95 return "Could not parse address"; 96 case DBUS_RESULT_NOT_SUPPORTED: 97 return "Feature not supported"; 98 case DBUS_RESULT_LIMITS_EXCEEDED: 99 return "Resource limits exceeded"; 100 case DBUS_RESULT_ACCESS_DENIED: 101 return "Permission denied"; 102 case DBUS_RESULT_AUTH_FAILED: 103 return "Could not authenticate to server"; 104 case DBUS_RESULT_NO_SERVER: 105 return "No server"; 106 case DBUS_RESULT_TIMEOUT: 107 return "Connection timed out"; 108 case DBUS_RESULT_NO_NETWORK: 109 return "Network unavailable"; 110 case DBUS_RESULT_ADDRESS_IN_USE: 111 return "Address already in use"; 112 case DBUS_RESULT_DISCONNECTED: 113 return "Disconnected."; 114 case DBUS_RESULT_INVALID_ARGS: 115 return "Invalid argumemts."; 116 case DBUS_RESULT_NO_REPLY: 117 return "Did not get a reply message."; 118 case DBUS_RESULT_FILE_NOT_FOUND: 119 return "File doesn't exist."; 120 121 /* no default, it would break our compiler warnings */ 122 } 123 124 return "Invalid error code"; 125} 126 127/** 128 * Initializes a DBusError structure. 129 * 130 * @todo calling dbus_error_init() in here is no good, 131 * for the same reason a GError* has to be set to NULL 132 * before you pass it in. 133 * 134 * @param error the DBusError. 135 */ 136void 137dbus_error_init (DBusError *error) 138{ 139 DBusRealError *real; 140 141 _dbus_assert (error != NULL); 142 143 _dbus_assert (sizeof (DBusError) == sizeof (DBusRealError)); 144 145 real = (DBusRealError *)error; 146 147 real->name = NULL; 148 real->message = NULL; 149 150 real->const_message = TRUE; 151} 152 153/** 154 * Frees an error created by dbus_error_init(). 155 * 156 * @param error memory where the error is stored. 157 */ 158void 159dbus_error_free (DBusError *error) 160{ 161 DBusRealError *real; 162 163 real = (DBusRealError *)error; 164 165 if (!real->const_message) 166 dbus_free (real->message); 167} 168 169/** 170 * Assigns an error name and message to a DBusError. 171 * Does nothing if error is #NULL. 172 * 173 * @todo calling dbus_error_init() in here is no good, 174 * for the same reason a GError* has to be set to NULL 175 * before you pass it in. 176 * 177 * @param error the error. 178 * @param name the error name (not copied!!!) 179 * @param message the error message (not copied!!!) 180 */ 181void 182dbus_set_error_const (DBusError *error, 183 const char *name, 184 const char *message) 185{ 186 DBusRealError *real; 187 188 if (error == NULL) 189 return; 190 191 dbus_error_init (error); 192 193 real = (DBusRealError *)error; 194 195 real->name = name; 196 real->message = (char *)message; 197 real->const_message = TRUE; 198} 199 200/** 201 * Assigns an error name and message to a DBusError. 202 * Does nothing if error is #NULL. 203 * 204 * @param error the error. 205 * @param name the error name (not copied!!!) 206 * @param format printf-style format string. 207 * @returns #TRUE on success. 208 */ 209dbus_bool_t 210dbus_set_error (DBusError *error, 211 const char *name, 212 const char *format, 213 ...) 214{ 215 DBusRealError *real; 216 va_list args, args2; 217 int message_length; 218 char *message; 219 char c; 220 221 if (error == NULL) 222 return TRUE; 223 224 va_start (args, format); 225 226 va_copy (args2, args); 227 228 /* Measure the message length */ 229 message_length = vsnprintf (&c, 1,format, args) + 1; 230 231 message = dbus_malloc (message_length); 232 233 vsprintf (message, format, args2); 234 235 if (!message) 236 return FALSE; 237 238 va_end (args); 239 240 dbus_error_init (error); 241 real = (DBusRealError *)error; 242 243 real->name = name; 244 real->message = message; 245 real->const_message = FALSE; 246 247 return TRUE; 248} 249 250/** @} */ 251