From 05ba90324ddfd1de724c39f2f9f28ec10930996f Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Mon, 26 Nov 2007 13:40:09 +0000 Subject: Add common error helper functions --- common/error.c | 242 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 242 insertions(+) create mode 100644 common/error.c (limited to 'common/error.c') 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 + * Copyright (C) 2007 Fabien Chevalier + * + * + * 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 +#endif + +#include +#include + +#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); +} -- cgit From e823c15e43a6f924779e466d434c51157002d9ee Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Sat, 2 Feb 2008 03:37:05 +0000 Subject: Update copyright information --- common/error.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'common/error.c') diff --git a/common/error.c b/common/error.c index b00294f7..daabe48d 100644 --- a/common/error.c +++ b/common/error.c @@ -3,8 +3,8 @@ * BlueZ - Bluetooth protocol stack for Linux * * Copyright (C) 2006-2007 Nokia Corporation - * Copyright (C) 2004-2007 Marcel Holtmann - * Copyright (C) 2007 Fabien Chevalier + * Copyright (C) 2004-2008 Marcel Holtmann + * Copyright (C) 2007-2008 Fabien Chevalier * * * This program is free software; you can redistribute it and/or modify -- cgit From dfad08e334136022c3918d6247823e7a79ca899f Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 13 Mar 2008 16:57:12 +0000 Subject: Move error_unknown_method to libhelper. --- common/error.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'common/error.c') diff --git a/common/error.c b/common/error.c index daabe48d..58999393 100644 --- a/common/error.c +++ b/common/error.c @@ -27,6 +27,7 @@ #include #endif +#include #include #include @@ -240,3 +241,23 @@ DBusHandlerResult error_common_reply(DBusConnection *conn, DBusMessage *msg, return dbus_connection_send_and_unref(conn, derr); } + +/** + org.bluez.Error.UnknownMethod: + + Used in experimental code. +*/ +DBusHandlerResult error_unknown_method(DBusConnection *conn, DBusMessage *msg) +{ + char error[128]; + const char *signature = dbus_message_get_signature(msg); + const char *method = dbus_message_get_member(msg); + const char *interface = dbus_message_get_interface(msg); + + snprintf(error, 128, "Method \"%s\" with signature \"%s\" on interface \"%s\" doesn't exist", + method, signature, interface); + + return send_message_and_unref(conn, + dbus_message_new_error(msg, ERROR_INTERFACE ".UnknownMethod", + error)); +} -- cgit From 15ea15b3a752f0487bc50d0ea04925f1b9d33dcb Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Thu, 8 May 2008 22:19:14 +0000 Subject: Move D-Bus object and interface helpers into libgdbus --- common/error.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'common/error.c') diff --git a/common/error.c b/common/error.c index 58999393..656c7299 100644 --- a/common/error.c +++ b/common/error.c @@ -31,7 +31,8 @@ #include #include -#include "dbus-helper.h" +#include + #include "error.h" /** -- cgit From 40b5cf346c985b629c927c5b2a6d188ccd0966dd Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Tue, 27 May 2008 11:43:25 +0000 Subject: Restore error handling for the new manager interface --- common/error.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'common/error.c') diff --git a/common/error.c b/common/error.c index 656c7299..51f4f4bc 100644 --- a/common/error.c +++ b/common/error.c @@ -35,6 +35,12 @@ #include "error.h" +DBusMessage *create_errno_message(DBusMessage *msg, int err) +{ + return g_dbus_create_error(msg, ERROR_INTERFACE ".Failed", + strerror(err)); +} + /** org.bluez.Error.DeviceUnreachable: -- cgit From 52f1452d5dedfade299fa81b68fa759b13aa86d9 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Fri, 6 Jun 2008 10:01:33 +0000 Subject: Fix the D-Bus sending for error messages --- common/error.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'common/error.c') diff --git a/common/error.c b/common/error.c index 51f4f4bc..096b8651 100644 --- a/common/error.c +++ b/common/error.c @@ -246,7 +246,11 @@ DBusHandlerResult error_common_reply(DBusConnection *conn, DBusMessage *msg, if (!derr) return DBUS_HANDLER_RESULT_NEED_MEMORY; - return dbus_connection_send_and_unref(conn, derr); + dbus_connection_send(conn, derr, NULL); + + dbus_message_unref(derr); + + return DBUS_HANDLER_RESULT_HANDLED; } /** @@ -256,6 +260,7 @@ DBusHandlerResult error_common_reply(DBusConnection *conn, DBusMessage *msg, */ DBusHandlerResult error_unknown_method(DBusConnection *conn, DBusMessage *msg) { + DBusMessage *derr; char error[128]; const char *signature = dbus_message_get_signature(msg); const char *method = dbus_message_get_member(msg); @@ -264,7 +269,14 @@ DBusHandlerResult error_unknown_method(DBusConnection *conn, DBusMessage *msg) snprintf(error, 128, "Method \"%s\" with signature \"%s\" on interface \"%s\" doesn't exist", method, signature, interface); - return send_message_and_unref(conn, - dbus_message_new_error(msg, ERROR_INTERFACE ".UnknownMethod", - error)); + derr = dbus_message_new_error(msg, ERROR_INTERFACE ".UnknownMethod", + error); + if (!derr) + return DBUS_HANDLER_RESULT_NEED_MEMORY; + + dbus_connection_send(conn, derr, NULL); + + dbus_message_unref(derr); + + return DBUS_HANDLER_RESULT_HANDLED; } -- cgit From 92faff9a094d5cbdfaa3c83f3fe17074a483ce55 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Sat, 7 Jun 2008 08:49:19 +0000 Subject: Cleanup errors and remove unused functions --- common/error.c | 157 --------------------------------------------------------- 1 file changed, 157 deletions(-) (limited to 'common/error.c') diff --git a/common/error.c b/common/error.c index 096b8651..adf2aa4f 100644 --- a/common/error.c +++ b/common/error.c @@ -41,17 +41,6 @@ DBusMessage *create_errno_message(DBusMessage *msg, int err) strerror(err)); } -/** - 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: @@ -65,74 +54,6 @@ DBusHandlerResult error_connection_attempt_failed(DBusConnection *conn, DBusMess 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: @@ -146,56 +67,6 @@ DBusHandlerResult error_not_supported(DBusConnection *conn, DBusMessage *msg) "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: @@ -252,31 +123,3 @@ DBusHandlerResult error_common_reply(DBusConnection *conn, DBusMessage *msg, return DBUS_HANDLER_RESULT_HANDLED; } - -/** - org.bluez.Error.UnknownMethod: - - Used in experimental code. -*/ -DBusHandlerResult error_unknown_method(DBusConnection *conn, DBusMessage *msg) -{ - DBusMessage *derr; - char error[128]; - const char *signature = dbus_message_get_signature(msg); - const char *method = dbus_message_get_member(msg); - const char *interface = dbus_message_get_interface(msg); - - snprintf(error, 128, "Method \"%s\" with signature \"%s\" on interface \"%s\" doesn't exist", - method, signature, interface); - - derr = dbus_message_new_error(msg, ERROR_INTERFACE ".UnknownMethod", - error); - if (!derr) - return DBUS_HANDLER_RESULT_NEED_MEMORY; - - dbus_connection_send(conn, derr, NULL); - - dbus_message_unref(derr); - - return DBUS_HANDLER_RESULT_HANDLED; -} -- cgit From 2b742d9f7a637b713bf77c52523dfee30922a080 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Tue, 10 Jun 2008 00:10:02 +0000 Subject: Fix some minor details --- common/error.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'common/error.c') diff --git a/common/error.c b/common/error.c index adf2aa4f..bc813d74 100644 --- a/common/error.c +++ b/common/error.c @@ -50,8 +50,8 @@ DBusMessage *create_errno_message(DBusMessage *msg, int err) 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"); + ERROR_INTERFACE ".ConnectionAttemptFailed", + err > 0 ? strerror(err) : "Connection attempt failed"); } /** @@ -109,6 +109,7 @@ DBusHandlerResult error_common_reply(DBusConnection *conn, DBusMessage *msg, const char *name, const char *descr) { DBusMessage *derr; + dbus_bool_t ret; if (!conn || !msg) return DBUS_HANDLER_RESULT_HANDLED; @@ -117,7 +118,7 @@ DBusHandlerResult error_common_reply(DBusConnection *conn, DBusMessage *msg, if (!derr) return DBUS_HANDLER_RESULT_NEED_MEMORY; - dbus_connection_send(conn, derr, NULL); + ret = dbus_connection_send(conn, derr, NULL); dbus_message_unref(derr); -- cgit