diff --git a/src/advertising.c b/src/advertising.c
index 0eb489a..d6ab084 100644
--- a/src/advertising.c
+++ b/src/advertising.c
return true;
}
+static void add_adverting_complete(struct advertisement *ad, uint8_t status)
+{
+ DBusMessage *reply;
+
+ if (status) {
+ error("Failed to add advertisement: %s (0x%02x)",
+ mgmt_errstr(status), status);
+ reply = btd_error_failed(ad->reg,
+ "Failed to register advertisement");
+ queue_remove(ad->manager->ads, ad);
+ g_idle_add(advertisement_free_idle_cb, ad);
+
+ } else
+ reply = dbus_message_new_method_return(ad->reg);
+
+ g_dbus_send_message(btd_get_dbus_connection(), reply);
+ dbus_message_unref(ad->reg);
+ ad->reg = NULL;
+}
+
static void add_advertising_callback(uint8_t status, uint16_t length,
const void *param, void *user_data)
{
struct advertisement *ad = user_data;
const struct mgmt_rp_add_advertising *rp = param;
- if (status || !param) {
- error("Failed to add advertisement: %s (0x%02x)",
- mgmt_errstr(status), status);
- return;
- }
+ if (status)
+ goto done;
- if (length < sizeof(*rp)) {
- error("Wrong size of add advertising response");
- return;
+ if (!param || length < sizeof(*rp)) {
+ status = MGMT_STATUS_FAILED;
+ goto done;
}
ad->instance = rp->instance;
+
+ g_dbus_client_set_disconnect_watch(ad->client, client_disconnect_cb,
+ ad);
+ DBG("Advertisement registered: %s", ad->path);
+
+done:
+ add_adverting_complete(ad, status);
}
static size_t calc_max_adv_len(struct advertisement *ad, uint32_t flags)
DBusMessage *reply;
reply = parse_advertisement(ad);
+ if (!reply)
+ return;
- if (reply) {
- /* Failed to publish for some reason, remove. */
- queue_remove(ad->manager->ads, ad);
-
- g_idle_add(advertisement_free_idle_cb, ad);
-
- goto done;
- }
-
- g_dbus_client_set_disconnect_watch(ad->client, client_disconnect_cb,
- ad);
-
- reply = dbus_message_new_method_return(ad->reg);
+ /* Failed to publish for some reason, remove. */
+ queue_remove(ad->manager->ads, ad);
- DBG("Advertisement registered: %s", ad->path);
+ g_idle_add(advertisement_free_idle_cb, ad);
-done:
g_dbus_send_message(btd_get_dbus_connection(), reply);
dbus_message_unref(ad->reg);