@@ -27,6 +27,7 @@
#include <config.h>
#endif
+#include <stdio.h>
#include "gdbus/gdbus.h"
#include "error.h"
@@ -43,6 +44,12 @@ DBusMessage *btd_error_invalid_args_str(DBusMessage *msg, const char *str)
"%s", str);
}
+DBusMessage *btd_error_invalid_args_err(DBusMessage *msg, uint16_t err)
+{
+ return g_dbus_create_error(msg, ERROR_INTERFACE ".InvalidArguments",
+ "0x%04X", err);
+}
+
DBusMessage *btd_error_busy(DBusMessage *msg)
{
return g_dbus_create_error(msg, ERROR_INTERFACE ".InProgress",
@@ -79,12 +86,24 @@ DBusMessage *btd_error_in_progress(DBusMessage *msg)
"In Progress");
}
+DBusMessage *btd_error_in_progress_err(DBusMessage *msg, uint16_t err)
+{
+ return g_dbus_create_error(msg, ERROR_INTERFACE ".InProgress", "0x%04X",
+ err);
+}
+
DBusMessage *btd_error_not_available(DBusMessage *msg)
{
return g_dbus_create_error(msg, ERROR_INTERFACE ".NotAvailable",
"Operation currently not available");
}
+DBusMessage *btd_error_not_available_err(DBusMessage *msg, uint16_t err)
+{
+ return g_dbus_create_error(msg, ERROR_INTERFACE ".NotAvailable",
+ "0x%04X", err);
+}
+
DBusMessage *btd_error_does_not_exist(DBusMessage *msg)
{
return g_dbus_create_error(msg, ERROR_INTERFACE ".DoesNotExist",
@@ -121,8 +140,100 @@ DBusMessage *btd_error_not_ready(DBusMessage *msg)
"Resource Not Ready");
}
+DBusMessage *btd_error_not_ready_err(DBusMessage *msg, uint16_t err)
+{
+ return g_dbus_create_error(msg, ERROR_INTERFACE ".NotReady", "0x%04X",
+ err);
+}
+
DBusMessage *btd_error_failed(DBusMessage *msg, const char *str)
{
return g_dbus_create_error(msg, ERROR_INTERFACE
".Failed", "%s", str);
}
+
+DBusMessage *btd_error_failed_err(DBusMessage *msg, uint16_t err)
+{
+ return g_dbus_create_error(msg, ERROR_INTERFACE ".Failed", "0x%04X",
+ err);
+}
+
+uint16_t btd_error_bredr_conn_from_errno(int errno_code)
+{
+ switch (-errno_code) {
+ case EALREADY:
+ case EISCONN:
+ return BTD_ERR_BREDR_CONN_ALREADY_CONNECTED;
+ case EHOSTDOWN:
+ return BTD_ERR_BREDR_CONN_PAGE_TIMEOUT;
+ case ENOPROTOOPT:
+ return BTD_ERR_BREDR_CONN_PROFILE_UNAVAILABLE;
+ case EIO:
+ return BTD_ERR_BREDR_CONN_CREATE_SOCKET;
+ case EINVAL:
+ return BTD_ERR_BREDR_CONN_INVALID_ARGUMENTS;
+ case EHOSTUNREACH:
+ return BTD_ERR_BREDR_CONN_ADAPTER_NOT_POWERED;
+ case EOPNOTSUPP:
+ case EPROTONOSUPPORT:
+ return BTD_ERR_BREDR_CONN_NOT_SUPPORTED;
+ case EBADFD:
+ return BTD_ERR_BREDR_CONN_BAD_SOCKET;
+ case ENOMEM:
+ return BTD_ERR_BREDR_CONN_MEMORY_ALLOC;
+ case EBUSY:
+ return BTD_ERR_BREDR_CONN_BUSY;
+ case EMLINK:
+ return BTD_ERR_BREDR_CONN_CNCR_CONNECT_LIMIT;
+ case ETIMEDOUT:
+ return BTD_ERR_BREDR_CONN_TIMEOUT;
+ case ECONNREFUSED:
+ return BTD_ERR_BREDR_CONN_REFUSED;
+ case ECONNRESET:
+ return BTD_ERR_BREDR_CONN_ABORT_BY_REMOTE;
+ case ECONNABORTED:
+ return BTD_ERR_BREDR_CONN_ABORT_BY_LOCAL;
+ case EPROTO:
+ return BTD_ERR_BREDR_CONN_PROTO_ERROR;
+ default:
+ return BTD_ERR_BREDR_CONN_UNKNOWN;
+ }
+}
+
+uint16_t btd_error_le_conn_from_errno(int errno_code)
+{
+ switch (-errno_code) {
+ case EINVAL:
+ return BTD_ERR_LE_CONN_INVALID_ARGUMENTS;
+ case EHOSTUNREACH:
+ return BTD_ERR_LE_CONN_ADAPTER_NOT_POWERED;
+ case EOPNOTSUPP:
+ case EPROTONOSUPPORT:
+ return BTD_ERR_LE_CONN_NOT_SUPPORTED;
+ case EALREADY:
+ case EISCONN:
+ return BTD_ERR_LE_CONN_ALREADY_CONNECTED;
+ case EBADFD:
+ return BTD_ERR_LE_CONN_BAD_SOCKET;
+ case ENOMEM:
+ return BTD_ERR_LE_CONN_MEMORY_ALLOC;
+ case EBUSY:
+ return BTD_ERR_LE_CONN_BUSY;
+ case ECONNREFUSED:
+ return BTD_ERR_LE_CONN_REFUSED;
+ case EIO:
+ return BTD_ERR_LE_CONN_CREATE_SOCKET;
+ case ETIMEDOUT:
+ return BTD_ERR_LE_CONN_TIMEOUT;
+ case EMLINK:
+ return BTD_ERR_LE_CONN_SYNC_CONNECT_LIMIT;
+ case ECONNRESET:
+ return BTD_ERR_LE_CONN_ABORT_BY_REMOTE;
+ case ECONNABORTED:
+ return BTD_ERR_LE_CONN_ABORT_BY_LOCAL;
+ case EPROTO:
+ return BTD_ERR_LE_CONN_PROTO_ERROR;
+ default:
+ return BTD_ERR_LE_CONN_UNKNOWN;
+ }
+}
@@ -24,22 +24,74 @@
*/
#include <dbus/dbus.h>
+#include <stdint.h>
#define ERROR_INTERFACE "org.bluez.Error"
+/* BR/EDR connection failure reasons
+ * BT_ERR_* should be used as one of the parameters to btd_error_*_err().
+ */
+#define BTD_ERR_BREDR_CONN_ALREADY_CONNECTED 0x0001
+#define BTD_ERR_BREDR_CONN_PAGE_TIMEOUT 0x0002
+#define BTD_ERR_BREDR_CONN_PROFILE_UNAVAILABLE 0x0003
+#define BTD_ERR_BREDR_CONN_SDP_SEARCH 0x0004
+#define BTD_ERR_BREDR_CONN_CREATE_SOCKET 0x0005
+#define BTD_ERR_BREDR_CONN_INVALID_ARGUMENTS 0x0006
+#define BTD_ERR_BREDR_CONN_ADAPTER_NOT_POWERED 0x0007
+#define BTD_ERR_BREDR_CONN_NOT_SUPPORTED 0x0008
+#define BTD_ERR_BREDR_CONN_BAD_SOCKET 0x0009
+#define BTD_ERR_BREDR_CONN_MEMORY_ALLOC 0x000A
+#define BTD_ERR_BREDR_CONN_BUSY 0x000B
+#define BTD_ERR_BREDR_CONN_CNCR_CONNECT_LIMIT 0x000C
+#define BTD_ERR_BREDR_CONN_TIMEOUT 0x000D
+#define BTD_ERR_BREDR_CONN_REFUSED 0x000E
+#define BTD_ERR_BREDR_CONN_ABORT_BY_REMOTE 0x000F
+#define BTD_ERR_BREDR_CONN_ABORT_BY_LOCAL 0x0010
+#define BTD_ERR_BREDR_CONN_PROTO_ERROR 0x0011
+#define BTD_ERR_BREDR_CONN_CANCELED 0x0012
+#define BTD_ERR_BREDR_CONN_UNKNOWN 0x0013
+
+/* LE connection failure reasons
+ * BT_ERR_* should be used as one of the parameters to btd_error_*_err().
+ */
+#define BTD_ERR_LE_CONN_INVALID_ARGUMENTS 0x0101
+#define BTD_ERR_LE_CONN_ADAPTER_NOT_POWERED 0x0102
+#define BTD_ERR_LE_CONN_NOT_SUPPORTED 0x0103
+#define BTD_ERR_LE_CONN_ALREADY_CONNECTED 0x0104
+#define BTD_ERR_LE_CONN_BAD_SOCKET 0x0105
+#define BTD_ERR_LE_CONN_MEMORY_ALLOC 0x0106
+#define BTD_ERR_LE_CONN_BUSY 0x0107
+#define BTD_ERR_LE_CONN_REFUSED 0x0108
+#define BTD_ERR_LE_CONN_CREATE_SOCKET 0x0109
+#define BTD_ERR_LE_CONN_TIMEOUT 0x010A
+#define BTD_ERR_LE_CONN_SYNC_CONNECT_LIMIT 0x010B
+#define BTD_ERR_LE_CONN_ABORT_BY_REMOTE 0x010C
+#define BTD_ERR_LE_CONN_ABORT_BY_LOCAL 0x010D
+#define BTD_ERR_LE_CONN_PROTO_ERROR 0x010E
+#define BTD_ERR_LE_CONN_GATT_BROWSE 0x010F
+#define BTD_ERR_LE_CONN_UNKNOWN 0x0110
+
DBusMessage *btd_error_invalid_args(DBusMessage *msg);
DBusMessage *btd_error_invalid_args_str(DBusMessage *msg, const char *str);
+DBusMessage *btd_error_invalid_args_err(DBusMessage *msg, uint16_t err);
DBusMessage *btd_error_busy(DBusMessage *msg);
DBusMessage *btd_error_already_exists(DBusMessage *msg);
DBusMessage *btd_error_not_supported(DBusMessage *msg);
DBusMessage *btd_error_not_connected(DBusMessage *msg);
DBusMessage *btd_error_already_connected(DBusMessage *msg);
DBusMessage *btd_error_not_available(DBusMessage *msg);
+DBusMessage *btd_error_not_available_err(DBusMessage *msg, uint16_t err);
DBusMessage *btd_error_in_progress(DBusMessage *msg);
+DBusMessage *btd_error_in_progress_err(DBusMessage *msg, uint16_t err);
DBusMessage *btd_error_does_not_exist(DBusMessage *msg);
DBusMessage *btd_error_not_authorized(DBusMessage *msg);
DBusMessage *btd_error_not_permitted(DBusMessage *msg, const char *str);
DBusMessage *btd_error_no_such_adapter(DBusMessage *msg);
DBusMessage *btd_error_agent_not_available(DBusMessage *msg);
DBusMessage *btd_error_not_ready(DBusMessage *msg);
+DBusMessage *btd_error_not_ready_err(DBusMessage *msg, uint16_t err);
DBusMessage *btd_error_failed(DBusMessage *msg, const char *str);
+DBusMessage *btd_error_failed_err(DBusMessage *msg, uint16_t err);
+
+uint16_t btd_error_bredr_conn_from_errno(int errno_code);
+uint16_t btd_error_le_conn_from_errno(int errno_code);