diff --git a/src/device.c b/src/device.c
index e97265b..15a34ce 100644
--- a/src/device.c
+++ b/src/device.c
guint attachid; /* Attrib server attach */
gboolean connected;
- gboolean profiles_connected; /* Profile level connected */
+ GSList *connected_profiles;
sdp_list_t *tmp_records;
gboolean blocked;
gboolean bonded;
gboolean auto_connect;
+ gboolean general_connect;
bool legacy;
int8_t rssi;
if (device->disconn_timer)
return;
- if (device->profiles_connected)
- g_slist_foreach(device->profiles, dev_disconn_profile, device);
+ g_slist_foreach(device->connected_profiles, dev_disconn_profile,
+ device);
+ g_slist_free(device->connected_profiles);
+ device->connected_profiles = NULL;
g_slist_free(device->pending);
device->pending = NULL;
dev->pending = g_slist_remove(dev->pending, profile);
if (!err) {
+ dev->connected_profiles =
+ g_slist_append(dev->connected_profiles,
+ profile);
if (connect_next(dev) == 0)
return;
- dev->profiles_connected = TRUE;
}
if (!dev->connect)
return;
+ if (!err && dbus_message_is_method_call(dev->connect, DEVICE_INTERFACE,
+ "Connect"))
+ dev->general_connect = TRUE;
+
DBG("returning response to %s", dbus_message_get_sender(dev->connect));
if (err)
DBG("%s %s, client %s", dev->path, uuid ? uuid : "(all)",
dbus_message_get_sender(msg));
- if (dev->profiles_connected)
- return btd_error_already_connected(msg);
-
if (dev->pending || dev->connect || dev->browse)
return btd_error_in_progress(msg);
if (!p->auto_connect)
continue;
+ if (g_slist_find(dev->pending, p))
+ continue;
+
+ if (g_slist_find(dev->connected_profiles, p))
+ continue;
+
dev->pending = g_slist_insert_sorted(dev->pending, p,
profile_prio_cmp);
}
void device_profile_disconnected(struct btd_device *dev,
struct btd_profile *profile, int err)
{
+ dev->connected_profiles = g_slist_remove(dev->connected_profiles,
+ profile);
+
if (!dev->disconnect)
return;
}
device->connected = FALSE;
- device->profiles_connected = FALSE;
+ device->general_connect = FALSE;
if (device->disconn_timer > 0) {
g_source_remove(device->disconn_timer);
browse_request_cancel(device->browse);
}
- if (device->profiles_connected)
- g_slist_foreach(device->profiles, dev_disconn_profile, device);
+ g_slist_foreach(device->connected_profiles, dev_disconn_profile,
+ device);
+ g_slist_free(device->connected_profiles);
+ device->connected_profiles = NULL;
g_slist_free(device->pending);
device->pending = NULL;