diff --git a/src/adapter.c b/src/adapter.c
index c30febc..b189841 100644
--- a/src/adapter.c
+++ b/src/adapter.c
#define check_address(address) bachk(address)
+#define OFF_TIMER 3
+
static DBusConnection *connection = NULL;
static GSList *adapter_drivers = NULL;
gint ref;
+ guint off_timer;
+
GSList *powered_callbacks;
gboolean name_stored;
adapter->pairable_timeout = get_pairable_timeout(address);
adapter->state = STATE_IDLE;
adapter->mode = MODE_CONNECTABLE;
+ adapter->off_timer = 0;
if (main_opts.le)
adapter_ops->enable_le(adapter->dev_id);
return 0;
}
+static void off_timer_remove(struct btd_adapter *adapter)
+{
+ g_source_remove(adapter->off_timer);
+ adapter->off_timer = 0;
+}
+
static void adapter_free(gpointer user_data)
{
struct btd_adapter *adapter = user_data;
if (adapter->auth_idle_id)
g_source_remove(adapter->auth_idle_id);
+ if (adapter->off_timer)
+ off_timer_remove(adapter);
+
sdp_list_free(adapter->services, NULL);
g_slist_foreach(adapter->found_devices, (GFunc) dev_info_free, NULL);
return adapter_ops->set_powered(adapter->dev_id, TRUE);
}
+static gboolean switch_off_timeout(gpointer user_data)
+{
+ struct btd_adapter *adapter = user_data;
+
+ adapter_ops->set_powered(adapter->dev_id, FALSE);
+ adapter->off_timer = 0;
+
+ return FALSE;
+}
+
int btd_adapter_switch_online(struct btd_adapter *adapter)
{
if (!adapter_ops)
if (adapter->up)
return 0;
+ if (adapter->off_timer)
+ off_timer_remove(adapter);
+
return adapter_ops->set_powered(adapter->dev_id, TRUE);
}
if (!adapter->up)
return 0;
- return adapter_ops->set_powered(adapter->dev_id, FALSE);
+ if (adapter->off_timer)
+ return 0;
+
+ if (adapter->connections == NULL)
+ return adapter_ops->set_powered(adapter->dev_id, FALSE);
+
+ g_slist_foreach(adapter->connections,
+ (GFunc) device_request_disconnect, NULL);
+
+ adapter->off_timer = g_timeout_add_seconds(OFF_TIMER,
+ switch_off_timeout, adapter);
+
+ return 0;
}
int btd_register_adapter_ops(struct btd_adapter_ops *ops, gboolean priority)