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