blob: 1936b9b73bdb4713387be2cbb606cf82ebc46a9c [file] [log] [blame]
/* libnih
*
* Copyright © 2009 Scott James Remnant <scott@netsplit.com>.
* Copyright © 2009 Canonical Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2, as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef NIH_DBUS_ERROR_H
#define NIH_DBUS_ERROR_H
/**
* Errors in libnih are raised by placing an NihError object in a local
* variable that can be retrieved using nih_error_get(). Errors in libdbus
* are returned on the stack by passing the address of a DBusError object
* when calling functions.
*
* This module allows the two techniques to be bridged.
*
* When calling a libnih function, or writing a handler called by such
* a function, you may use nih_dbus_error_raise() or
* nih_dbus_error_raise_printf(). This may be retrieved by nih_error_get(),
* and the handler poll function will do so and convert this into a D-Bus
* error message if appropriate.
*
* For example:
*
* nih_dbus_error_raise (DBUS_ERROR_INVALID_ARGS, "Expected Int32");
* return -1;
*
* When calling a libdbus function you should initialise a DBusError with
* dbus_error_init() and pass its address to your function call. Should
* an error be returned, you can raise that so it can be retrieved by
* nih_error_get() by passing the name and message members to
* nih_dbus_error_raise().
*
* For example:
*
* dbus_error_init (&dbus_err);
* if (! dbus_connection_open (address, &dbus_err)) {
* nih_dbus_error_raise (dbus_err.name, dbus_err.message);
* dbus_error_free (&dbus_err);
*
* return -1;
* }
*
* In both cases, the error variable returned by nih_error_get() is not
* actually NihError but NihDBusError. This extends the original structure
* to add a "name" member containing the D-Bus error name. The error
* number for all such errors is NIH_DBUS_ERROR.
*
* The nih_dbus_message_error() function defined in nih-dbus/dbus_message.h
* allows you to send either type of error as a D-Bus error message.
**/
#include <nih/macros.h>
#include <nih/error.h>
/**
* NihDBusError:
* @name: D-Bus name.
*
* This structure builds on NihError to include an additional @name field
* required for transport across D-Bus.
*
* If you receive a NIH_DBUS_ERROR, the returned NihError structure is
* actually this structure and can be cast to get the additional fields.
**/
typedef struct nih_dbus_error {
NIH_ERROR_MEMBERS
char * name;
} NihDBusError;
NIH_BEGIN_EXTERN
void nih_dbus_error_raise (const char *name, const char *message);
void nih_dbus_error_raise_printf (const char *name, const char *format, ...)
__attribute__ ((format (printf, 2, 3)));
NIH_END_EXTERN
#endif /* NIH_DBUS_ERROR_H */