D-Bus 1.2.24
|
00001 /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ 00002 /* dbus-errors.c Error reporting 00003 * 00004 * Copyright (C) 2002, 2004 Red Hat Inc. 00005 * Copyright (C) 2003 CodeFactory AB 00006 * 00007 * Licensed under the Academic Free License version 2.1 00008 * 00009 * This program is free software; you can redistribute it and/or modify 00010 * it under the terms of the GNU General Public License as published by 00011 * the Free Software Foundation; either version 2 of the License, or 00012 * (at your option) any later version. 00013 * 00014 * This program is distributed in the hope that it will be useful, 00015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00017 * GNU General Public License for more details. 00018 * 00019 * You should have received a copy of the GNU General Public License 00020 * along with this program; if not, write to the Free Software 00021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00022 * 00023 */ 00024 #include "dbus-errors.h" 00025 #include "dbus-internals.h" 00026 #include "dbus-string.h" 00027 #include "dbus-protocol.h" 00028 #include <stdarg.h> 00029 #include <string.h> 00030 00063 typedef struct 00064 { 00065 char *name; 00066 char *message; 00068 unsigned int const_message : 1; 00070 unsigned int dummy2 : 1; 00071 unsigned int dummy3 : 1; 00072 unsigned int dummy4 : 1; 00073 unsigned int dummy5 : 1; 00075 void *padding1; 00077 } DBusRealError; 00078 00087 static const char* 00088 message_from_error (const char *error) 00089 { 00090 if (strcmp (error, DBUS_ERROR_FAILED) == 0) 00091 return "Unknown error"; 00092 else if (strcmp (error, DBUS_ERROR_NO_MEMORY) == 0) 00093 return "Not enough memory available"; 00094 else if (strcmp (error, DBUS_ERROR_IO_ERROR) == 0) 00095 return "Error reading or writing data"; 00096 else if (strcmp (error, DBUS_ERROR_BAD_ADDRESS) == 0) 00097 return "Could not parse address"; 00098 else if (strcmp (error, DBUS_ERROR_NOT_SUPPORTED) == 0) 00099 return "Feature not supported"; 00100 else if (strcmp (error, DBUS_ERROR_LIMITS_EXCEEDED) == 0) 00101 return "Resource limits exceeded"; 00102 else if (strcmp (error, DBUS_ERROR_ACCESS_DENIED) == 0) 00103 return "Permission denied"; 00104 else if (strcmp (error, DBUS_ERROR_AUTH_FAILED) == 0) 00105 return "Could not authenticate to server"; 00106 else if (strcmp (error, DBUS_ERROR_NO_SERVER) == 0) 00107 return "No server available at address"; 00108 else if (strcmp (error, DBUS_ERROR_TIMEOUT) == 0) 00109 return "Connection timed out"; 00110 else if (strcmp (error, DBUS_ERROR_NO_NETWORK) == 0) 00111 return "Network unavailable"; 00112 else if (strcmp (error, DBUS_ERROR_ADDRESS_IN_USE) == 0) 00113 return "Address already in use"; 00114 else if (strcmp (error, DBUS_ERROR_DISCONNECTED) == 0) 00115 return "Disconnected."; 00116 else if (strcmp (error, DBUS_ERROR_INVALID_ARGS) == 0) 00117 return "Invalid arguments."; 00118 else if (strcmp (error, DBUS_ERROR_NO_REPLY) == 0) 00119 return "Did not get a reply message."; 00120 else if (strcmp (error, DBUS_ERROR_FILE_NOT_FOUND) == 0) 00121 return "File doesn't exist."; 00122 else if (strcmp (error, DBUS_ERROR_OBJECT_PATH_IN_USE) == 0) 00123 return "Object path already in use"; 00124 else 00125 return error; 00126 } 00127 /* End of internals */ 00129 00183 void 00184 dbus_error_init (DBusError *error) 00185 { 00186 DBusRealError *real; 00187 00188 _dbus_return_if_fail (error != NULL); 00189 00190 _dbus_assert (sizeof (DBusError) == sizeof (DBusRealError)); 00191 00192 real = (DBusRealError *)error; 00193 00194 real->name = NULL; 00195 real->message = NULL; 00196 00197 real->const_message = TRUE; 00198 } 00199 00206 void 00207 dbus_error_free (DBusError *error) 00208 { 00209 DBusRealError *real; 00210 00211 _dbus_return_if_fail (error != NULL); 00212 00213 real = (DBusRealError *)error; 00214 00215 if (!real->const_message) 00216 { 00217 dbus_free (real->name); 00218 dbus_free (real->message); 00219 } 00220 00221 dbus_error_init (error); 00222 } 00223 00238 void 00239 dbus_set_error_const (DBusError *error, 00240 const char *name, 00241 const char *message) 00242 { 00243 DBusRealError *real; 00244 00245 _dbus_return_if_error_is_set (error); 00246 _dbus_return_if_fail (name != NULL); 00247 00248 if (error == NULL) 00249 return; 00250 00251 _dbus_assert (error->name == NULL); 00252 _dbus_assert (error->message == NULL); 00253 00254 if (message == NULL) 00255 message = message_from_error (name); 00256 00257 real = (DBusRealError *)error; 00258 00259 real->name = (char*) name; 00260 real->message = (char *)message; 00261 real->const_message = TRUE; 00262 } 00263 00274 void 00275 dbus_move_error (DBusError *src, 00276 DBusError *dest) 00277 { 00278 _dbus_return_if_error_is_set (dest); 00279 00280 if (dest) 00281 { 00282 dbus_error_free (dest); 00283 *dest = *src; 00284 dbus_error_init (src); 00285 } 00286 else 00287 dbus_error_free (src); 00288 } 00289 00297 dbus_bool_t 00298 dbus_error_has_name (const DBusError *error, 00299 const char *name) 00300 { 00301 _dbus_return_val_if_fail (error != NULL, FALSE); 00302 _dbus_return_val_if_fail (name != NULL, FALSE); 00303 00304 _dbus_assert ((error->name != NULL && error->message != NULL) || 00305 (error->name == NULL && error->message == NULL)); 00306 00307 if (error->name != NULL) 00308 { 00309 DBusString str1, str2; 00310 _dbus_string_init_const (&str1, error->name); 00311 _dbus_string_init_const (&str2, name); 00312 return _dbus_string_equal (&str1, &str2); 00313 } 00314 else 00315 return FALSE; 00316 } 00317 00324 dbus_bool_t 00325 dbus_error_is_set (const DBusError *error) 00326 { 00327 _dbus_return_val_if_fail (error != NULL, FALSE); 00328 _dbus_assert ((error->name != NULL && error->message != NULL) || 00329 (error->name == NULL && error->message == NULL)); 00330 return error->name != NULL; 00331 } 00332 00349 void 00350 dbus_set_error (DBusError *error, 00351 const char *name, 00352 const char *format, 00353 ...) 00354 { 00355 DBusRealError *real; 00356 DBusString str; 00357 va_list args; 00358 00359 if (error == NULL) 00360 return; 00361 00362 /* it's a bug to pile up errors */ 00363 _dbus_return_if_error_is_set (error); 00364 _dbus_return_if_fail (name != NULL); 00365 00366 _dbus_assert (error->name == NULL); 00367 _dbus_assert (error->message == NULL); 00368 00369 if (!_dbus_string_init (&str)) 00370 goto nomem; 00371 00372 if (format == NULL) 00373 { 00374 if (!_dbus_string_append (&str, 00375 message_from_error (name))) 00376 { 00377 _dbus_string_free (&str); 00378 va_end (args); 00379 goto nomem; 00380 } 00381 } 00382 else 00383 { 00384 va_start (args, format); 00385 if (!_dbus_string_append_printf_valist (&str, format, args)) 00386 { 00387 _dbus_string_free (&str); 00388 va_end (args); 00389 goto nomem; 00390 } 00391 va_end (args); 00392 } 00393 00394 real = (DBusRealError *)error; 00395 00396 if (!_dbus_string_steal_data (&str, &real->message)) 00397 { 00398 _dbus_string_free (&str); 00399 goto nomem; 00400 } 00401 _dbus_string_free (&str); 00402 00403 real->name = _dbus_strdup (name); 00404 if (real->name == NULL) 00405 { 00406 dbus_free (real->message); 00407 real->message = NULL; 00408 goto nomem; 00409 } 00410 real->const_message = FALSE; 00411 00412 return; 00413 00414 nomem: 00415 _DBUS_SET_OOM (error); 00416 } 00417 /* End public API */