summaryrefslogtreecommitdiff
path: root/src/gatt-database.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gatt-database.c')
-rw-r--r--src/gatt-database.c48
1 files changed, 35 insertions, 13 deletions
diff --git a/src/gatt-database.c b/src/gatt-database.c
index 55fd28a54..11d886c56 100644
--- a/src/gatt-database.c
+++ b/src/gatt-database.c
@@ -53,6 +53,7 @@
#define GATT_SERVICE_IFACE "org.bluez.GattService1"
#define GATT_CHRC_IFACE "org.bluez.GattCharacteristic1"
#define GATT_DESC_IFACE "org.bluez.GattDescriptor1"
+#define ERROR_FAILED ERROR_INTERFACE ".Failed"
#define UUID_GAP 0x1800
#define UUID_GATT 0x1801
@@ -2027,28 +2028,30 @@ static bool parse_handle(GDBusProxy *proxy, uint16_t *handle)
return true;
}
-static uint8_t dbus_error_to_att_ecode(const char *error_name)
+static uint8_t dbus_error_to_att_ecode(const char *error_name, uint8_t perm_err)
{
-
- if (strcmp(error_name, "org.bluez.Error.Failed") == 0)
+ if (strcmp(error_name, ERROR_INTERFACE ".Failed") == 0)
return 0x80; /* For now return this "application error" */
- if (strcmp(error_name, "org.bluez.Error.NotSupported") == 0)
+ if (strcmp(error_name, ERROR_INTERFACE ".NotSupported") == 0)
return BT_ATT_ERROR_REQUEST_NOT_SUPPORTED;
- if (strcmp(error_name, "org.bluez.Error.NotAuthorized") == 0)
+ if (strcmp(error_name, ERROR_INTERFACE ".NotAuthorized") == 0)
return BT_ATT_ERROR_AUTHORIZATION;
- if (strcmp(error_name, "org.bluez.Error.InvalidValueLength") == 0)
+ if (strcmp(error_name, ERROR_INTERFACE ".InvalidValueLength") == 0)
return BT_ATT_ERROR_INVALID_ATTRIBUTE_VALUE_LEN;
- if (strcmp(error_name, "org.bluez.Error.InvalidOffset") == 0)
+ if (strcmp(error_name, ERROR_INTERFACE ".InvalidOffset") == 0)
return BT_ATT_ERROR_INVALID_OFFSET;
- if (strcmp(error_name, "org.bluez.Error.InProgress") == 0)
+ if (strcmp(error_name, ERROR_INTERFACE ".InProgress") == 0)
return BT_ERROR_ALREADY_IN_PROGRESS;
- return 0;
+ if (strcmp(error_name, ERROR_INTERFACE ".NotPermitted") == 0)
+ return perm_err;
+
+ return BT_ATT_ERROR_UNLIKELY;
}
static void read_reply_cb(DBusMessage *message, void *user_data)
@@ -2069,8 +2072,8 @@ static void read_reply_cb(DBusMessage *message, void *user_data)
if (dbus_set_error_from_message(&err, message) == TRUE) {
DBG("Failed to read value: %s: %s", err.name, err.message);
- ecode = dbus_error_to_att_ecode(err.name);
- ecode = ecode ? ecode : BT_ATT_ERROR_READ_NOT_PERMITTED;
+ ecode = dbus_error_to_att_ecode(err.name,
+ BT_ATT_ERROR_READ_NOT_PERMITTED);
dbus_error_free(&err);
goto done;
}
@@ -2246,8 +2249,8 @@ static void write_reply_cb(DBusMessage *message, void *user_data)
if (dbus_set_error_from_message(&err, message) == TRUE) {
DBG("Failed to write value: %s: %s", err.name, err.message);
- ecode = dbus_error_to_att_ecode(err.name);
- ecode = ecode ? ecode : BT_ATT_ERROR_WRITE_NOT_PERMITTED;
+ ecode = dbus_error_to_att_ecode(err.name,
+ BT_ATT_ERROR_WRITE_NOT_PERMITTED);
dbus_error_free(&err);
goto done;
}
@@ -2414,8 +2417,20 @@ static void acquire_write_reply(DBusMessage *message, void *user_data)
dbus_error_init(&err);
if (dbus_set_error_from_message(&err, message) == TRUE) {
+ uint8_t ecode;
+
error("Failed to acquire write: %s\n", err.name);
+
+ ecode = dbus_error_to_att_ecode(err.name,
+ BT_ATT_ERROR_WRITE_NOT_PERMITTED);
dbus_error_free(&err);
+
+ if (ecode != BT_ATT_ERROR_UNLIKELY) {
+ gatt_db_attribute_write_result(op->attrib, op->id,
+ ecode);
+ return;
+ }
+
goto retry;
}
@@ -2501,6 +2516,13 @@ static void acquire_notify_reply(DBusMessage *message, void *user_data)
if (dbus_set_error_from_message(&err, message) == TRUE) {
error("Failed to acquire notify: %s\n", err.name);
+
+ if (dbus_error_has_name(&err, DBUS_ERROR_NO_REPLY) ||
+ dbus_error_has_name(&err, ERROR_FAILED)) {
+ dbus_error_free(&err);
+ return;
+ }
+
dbus_error_free(&err);
goto retry;
}