diff options
| author | Johan Hedberg <johan.hedberg@nokia.com> | 2007-11-26 13:40:09 +0000 | 
|---|---|---|
| committer | Johan Hedberg <johan.hedberg@nokia.com> | 2007-11-26 13:40:09 +0000 | 
| commit | 05ba90324ddfd1de724c39f2f9f28ec10930996f (patch) | |
| tree | 0a5b179bc6d6e71736bf8f4275c97f3cf75e4f35 | |
| parent | 3ff24ea225437af91db69a069caa65b00ed642d9 (diff) | |
Add common error helper functions
| -rw-r--r-- | common/Makefile.am | 1 | ||||
| -rw-r--r-- | common/dbus-helper.h | 1 | ||||
| -rw-r--r-- | common/error.c | 242 | ||||
| -rw-r--r-- | common/error.h | 80 | 
4 files changed, 324 insertions, 0 deletions
| diff --git a/common/Makefile.am b/common/Makefile.am index a2e50354..ed92765e 100644 --- a/common/Makefile.am +++ b/common/Makefile.am @@ -26,6 +26,7 @@ noinst_LIBRARIES = libhelper.a  libhelper_a_SOURCES = oui.h oui.c dbus.h dbus.c \  	textfile.h textfile.c logging.h logging.c \  	dbus-helper.h dbus-helper.c \ +	error.h error.c \  	sdp-xml.h sdp-xml.c $(sdp_sources) \  	hal.h $(hal_sources) notify.h $(notify_sources) diff --git a/common/dbus-helper.h b/common/dbus-helper.h index 4dd9d155..fa5282d9 100644 --- a/common/dbus-helper.h +++ b/common/dbus-helper.h @@ -21,6 +21,7 @@   *   */  #include <stdarg.h> +#include <dbus.h>  #define DBUS_TYPE_STRING_ARRAY_AS_STRING (DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING)  #define DBUS_TYPE_BYTE_ARRAY_AS_STRING   (DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_BYTE_AS_STRING) diff --git a/common/error.c b/common/error.c new file mode 100644 index 00000000..b00294f7 --- /dev/null +++ b/common/error.c @@ -0,0 +1,242 @@ +/* + * + *  BlueZ - Bluetooth protocol stack for Linux + * + *  Copyright (C) 2006-2007  Nokia Corporation + *  Copyright (C) 2004-2007  Marcel Holtmann <marcel@holtmann.org> + *  Copyright (C) 2007  Fabien Chevalier <fabchevalier@free.fr> + * + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  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 St, Fifth Floor, Boston, MA  02110-1301  USA + * + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <string.h> +#include <errno.h> + +#include "dbus-helper.h" +#include "error.h" + +/** +  org.bluez.Error.DeviceUnreachable: + +  The remote device is either powered down or out of range. +*/ +DBusHandlerResult error_device_unreachable(DBusConnection *conn, DBusMessage *msg) +{ +	return error_common_reply(conn, msg, ERROR_INTERFACE ".DeviceUnreachable", +							"Device Unreachable"); +} + +/** +  org.bluez.Error.ConnectionAttemptFailed: + +  An unexpected error (other than DeviceUnreachable) error has occured while +  attempting a connection to a device +*/ +DBusHandlerResult error_connection_attempt_failed(DBusConnection *conn, DBusMessage *msg, int err) +{ +	return error_common_reply(conn, msg, +				ERROR_INTERFACE ".ConnectionAttemptFailed", +				err ? strerror(err) : "Connection attempt failed"); +} + +/** +  org.bluez.Error.AlreadyConnected: + +  A connection request has been received on an already connected device. +*/ +DBusHandlerResult error_already_connected(DBusConnection *conn, DBusMessage *msg) +{ +	return error_common_reply(conn, msg, +				ERROR_INTERFACE ".AlreadyConnected", +				"Already connected to a device"); +} + +/** +  org.bluez.Error.InProgress: + +  Error returned if an operation is in progress. Since +  this is a generic error that can be used in various +  situations, the error message should be more clear +  about what is in progress. For example "Bonding in +  progress". +  */ +DBusHandlerResult error_in_progress(DBusConnection *conn, DBusMessage *msg, +						const char *str) +{ +	return error_common_reply(conn, msg, ERROR_INTERFACE ".InProgress", str); +} + +/** +  org.bluez.Error.InvalidArguments: + +  The DBUS request does not contain the right number of +  arguments with the right type, or the arguments are there but +  their value is wrong, or does not makes sense in the current context. +*/ +DBusHandlerResult error_invalid_arguments(DBusConnection *conn, DBusMessage *msg, +						const char *descr) +{ +	return error_common_reply(conn, msg, +				ERROR_INTERFACE ".InvalidArguments", +				descr ? descr : "Invalid arguments in method call"); +} + +/** +  org.bluez.Error.OutOfMemory: + +  Not enough memory to execute the request. +  Error returned when a memory allocation via malloc() +  fails. This error is similar to ENOMEM. +*/ +DBusHandlerResult error_out_of_memory(DBusConnection *conn, DBusMessage *msg) +{ +	return error_common_reply(conn, msg, ERROR_INTERFACE ".OutOfMemory", +							"Out of memory"); +} + +/** +  org.bluez.Error.NotAvailable: + +  The requested information is not there. +  Examples of use: Adapter object when remote info is not available, or Database +  object record is not found +*/ +DBusHandlerResult error_not_available(DBusConnection *conn, DBusMessage *msg) +{ +	return error_common_reply(conn, msg, ERROR_INTERFACE ".NotAvailable", +							"Not available"); +} + +/** +  org.bluez.Error.NotSupported: + +  The remote device does not support the expected feature. +  Examples of use: trying to connect to audio device while audio is not +  declared in device sdp record. +*/ +DBusHandlerResult error_not_supported(DBusConnection *conn, DBusMessage *msg) +{ +	return error_common_reply(conn, msg, ERROR_INTERFACE ".NotSupported", +							"Not supported"); +} + +/** +  org.bluez.Error.NotConnected: + +  The remote device is not connected, while the method call +  would expect it to be, or is not in the expected state to +  perform the action +*/ +DBusHandlerResult error_not_connected(DBusConnection *conn, DBusMessage *msg) +{ +	return error_common_reply(conn, msg, ERROR_INTERFACE ".NotConnected", +							"Not connected"); +} + +/** +  org.bluez.Error.AlreadyExists: + +  One of the requested elements already exists +  Examples of use: Bonding, record, passkey agent, auth agent, +  hid device ... already exists +*/ +DBusHandlerResult error_already_exists(DBusConnection *conn, DBusMessage *msg, +					const char *str) +{ +	return error_common_reply(conn, msg, ERROR_INTERFACE ".AlreadyExists", str); +} + +/** +  org.bluez.Error.DoesNotExist: + +  One of the requested elements does not exist +  Examples of use: Bonding, record, passkey agent, auth agent, bluetooth device +  ... does not exist. +*/ +DBusHandlerResult error_does_not_exist(DBusConnection *conn, DBusMessage *msg, +					const char *str) +{ +	return error_common_reply(conn, msg, ERROR_INTERFACE ".DoesNotExist", str); +} + +/** +  org.bluez.Error.DoesNotExist: + +  Same as error_does_not_exist, but with device error message +*/ +DBusHandlerResult error_device_does_not_exist(DBusConnection *conn, +						DBusMessage *msg) +{ +	return error_does_not_exist(conn, msg, "Device does not exist"); +} + +/** +  org.bluez.Error.Canceled: + +  The operation was canceled. +  Examples of use : autorization process canceled, connection canceled +*/ +DBusHandlerResult error_canceled(DBusConnection *conn, DBusMessage *msg, +					const char *str) +{ +	return error_common_reply(conn, msg, ERROR_INTERFACE ".Canceled", str); +} + +/** +  org.bluez.Error.Failed: + +  This is a the most generic error. +  desc filed is MANDATORY +*/ +DBusHandlerResult error_failed(DBusConnection *conn, DBusMessage *msg, +				const char * desc) +{ +	return error_common_reply(conn, msg, ERROR_INTERFACE ".Failed", desc); +} + +/** +  org.bluez.Error.Failed: + +  This is a the most generic error, instantiated form a UNIX errno number. +*/ +DBusHandlerResult error_failed_errno(DBusConnection *conn, DBusMessage *msg, +					int err) +{ +	const char *desc = strerror(err); + +	return error_failed(conn, msg, desc); +} + +/* Helper function - internal use only */ +DBusHandlerResult error_common_reply(DBusConnection *conn, DBusMessage *msg, +					const char *name, const char *descr) +{ +	DBusMessage *derr; + +	if (!conn || !msg) +		return DBUS_HANDLER_RESULT_HANDLED; + +	derr = dbus_message_new_error(msg, name, descr); +	if (!derr) +		return DBUS_HANDLER_RESULT_NEED_MEMORY; + +	return dbus_connection_send_and_unref(conn, derr); +} diff --git a/common/error.h b/common/error.h new file mode 100644 index 00000000..d6f17f06 --- /dev/null +++ b/common/error.h @@ -0,0 +1,80 @@ +/* + * + *  BlueZ - Bluetooth protocol stack for Linux + * + *  Copyright (C) 2006-2007  Nokia Corporation + *  Copyright (C) 2004-2007  Marcel Holtmann <marcel@holtmann.org> + *  Copyright (C) 2007 Fabien Chevalier <fabchevalier@free.fr> + * + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  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 St, Fifth Floor, Boston, MA  02110-1301  USA + * + */ + +/* +  Please update dbus-api.txt in hcid folder when changes are made to this file. + */ + +#include <dbus/dbus.h> + +#define ERROR_INTERFACE "org.bluez.Error" + +DBusHandlerResult error_device_unreachable(DBusConnection *conn, +						DBusMessage *msg); + +DBusHandlerResult error_connection_attempt_failed(DBusConnection *conn, +							DBusMessage *msg, +							int err); + +DBusHandlerResult error_already_connected(DBusConnection *conn, +						DBusMessage *msg); + +DBusHandlerResult error_not_connected(DBusConnection *conn, DBusMessage *msg); + +DBusHandlerResult error_in_progress(DBusConnection *conn, DBusMessage *msg, +					const char *str); + +DBusHandlerResult error_invalid_arguments(DBusConnection *conn, +						DBusMessage *msg, +						const char *str); + +DBusHandlerResult error_out_of_memory(DBusConnection *conn, DBusMessage *msg); + +DBusHandlerResult error_not_available(DBusConnection *conn, DBusMessage *msg); + +DBusHandlerResult error_not_supported(DBusConnection *conn, +						DBusMessage *msg); + +DBusHandlerResult error_already_exists(DBusConnection *conn, DBusMessage *msg, +						const char *str); + +DBusHandlerResult error_does_not_exist(DBusConnection *conn, DBusMessage *msg, +						const char *str); + +DBusHandlerResult error_device_does_not_exist(DBusConnection *conn, +						DBusMessage *msg); + +DBusHandlerResult error_canceled(DBusConnection *conn, DBusMessage *msg, +						const char *str); + +DBusHandlerResult error_failed(DBusConnection *conn, DBusMessage *msg, +					const char *desc); + +DBusHandlerResult error_failed_errno(DBusConnection *conn, DBusMessage *msg, +					int err); + +DBusHandlerResult error_common_reply(DBusConnection *conn, DBusMessage *msg, +					const char *name, const char *descr); + | 
