static DBusMessage *sink_connect(DBusConnection *conn, DBusMessage *msg, void *data) { struct audio_device *dev = data; struct sink *sink = dev->sink; struct pending_request *pending; if (!sink->session) sink->session = avdtp_get(&dev->src, &dev->dst); if (!sink->session) return btd_error_failed(msg, "Unable to get a session"); if (sink->connect || sink->disconnect) return btd_error_busy(msg); if (sink->stream_state >= AVDTP_STATE_OPEN) return btd_error_already_connected(msg); if (!sink_setup_stream(sink, NULL)) return btd_error_failed(msg, "Failed to create a stream"); dev->auto_connect = FALSE; pending = sink->connect; pending->conn = dbus_connection_ref(conn); pending->msg = dbus_message_ref(msg); DBG("stream creation in progress"); return NULL; }
/* * Input Device methods */ static DBusMessage *input_device_connect(DBusConnection *conn, DBusMessage *msg, void *data) { struct input_device *idev = data; struct input_conn *iconn; DBusMessage *reply; GError *err = NULL; DBG("idev %p", idev); iconn = find_connection(idev->connections, HID_UUID); if (!iconn) return btd_error_not_supported(msg); if (iconn->pending_connect) return btd_error_in_progress(msg); if (is_connected(iconn)) return btd_error_already_connected(msg); iconn->pending_connect = dbus_message_ref(msg); dev_connect(idev, iconn, &err); if (err == NULL) return NULL; error("%s", err->message); dbus_message_unref(iconn->pending_connect); iconn->pending_connect = NULL; reply = btd_error_failed(msg, err->message); g_error_free(err); return reply; }
/* Connect and initiate BNEP session */ static DBusMessage *connection_connect(DBusConnection *conn, DBusMessage *msg, void *data) { struct network_peer *peer = data; struct network_conn *nc; const char *svc; uint16_t id; GError *err = NULL; if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &svc, DBUS_TYPE_INVALID) == FALSE) return NULL; id = bnep_service_id(svc); nc = find_connection(peer->connections, id); if (!nc) return btd_error_not_supported(msg); if (nc->state != DISCONNECTED) return btd_error_already_connected(msg); nc->io = bt_io_connect(BT_IO_L2CAP, connect_cb, nc, NULL, &err, BT_IO_OPT_SOURCE_BDADDR, &peer->src, BT_IO_OPT_DEST_BDADDR, &peer->dst, BT_IO_OPT_PSM, BNEP_PSM, BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM, BT_IO_OPT_OMTU, BNEP_MTU, BT_IO_OPT_IMTU, BNEP_MTU, BT_IO_OPT_INVALID); if (!nc->io) { DBusMessage *reply; error("%s", err->message); reply = btd_error_failed(msg, err->message); g_error_free(err); return reply; } nc->state = CONNECTING; nc->msg = dbus_message_ref(msg); nc->watch = g_dbus_add_disconnect_watch(conn, dbus_message_get_sender(msg), connection_destroy, nc, NULL); return NULL; }
static DBusMessage *ag_connect(DBusConnection *conn, DBusMessage *msg, void *data) { struct audio_device *au_dev = (struct audio_device *) data; struct gateway *gw = au_dev->gateway; int err; if (gw->state == GATEWAY_STATE_CONNECTING) return btd_error_in_progress(msg); else if (gw->state > GATEWAY_STATE_CONNECTING) return btd_error_already_connected(msg); if (!gw->agent) return btd_error_agent_not_available(msg); err = get_records(au_dev); if (err < 0) return btd_error_failed(msg, strerror(-err)); gw->msg = dbus_message_ref(msg); return NULL; }
static DBusMessage *dev_connect(DBusConnection *conn, DBusMessage *msg, void *data) { struct audio_device *dev = data; struct dev_priv *priv = dev->priv; if (priv->state == AUDIO_STATE_CONNECTING) return btd_error_in_progress(msg); else if (priv->state == AUDIO_STATE_CONNECTED) return btd_error_already_connected(msg); dev->auto_connect = TRUE; if (dev->headset) headset_config_stream(dev, FALSE, NULL, NULL); if (priv->state != AUDIO_STATE_CONNECTING && dev->sink) { struct avdtp *session = avdtp_get(&dev->src, &dev->dst); if (!session) return btd_error_failed(msg, "Failed to get AVDTP session"); sink_setup_stream(dev->sink, session); avdtp_unref(session); } /* The previous calls should cause a call to the state callback to * indicate AUDIO_STATE_CONNECTING */ if (priv->state != AUDIO_STATE_CONNECTING) return btd_error_failed(msg, "Connect Failed"); priv->conn_req = dbus_message_ref(msg); return NULL; }
/* * Input Device methods */ static DBusMessage *input_device_connect(DBusConnection *conn, DBusMessage *msg, void *data) { //+++ BRCM #ifdef BT_ALT_STACK struct input_device *idev = data; tDTUN_DEVICE_METHOD method; method.hh_open.hdr.id = DTUN_METHOD_HH_OPEN; method.hh_open.hdr.len = sizeof(tDTUN_METHOD_HH_OPEN) - sizeof(tDTUN_HDR); memcpy(&method.hh_open.bdaddr, &idev->dst, 6); read_remote_class(&idev->src, &idev->dst, &method.hh_open.cod); dtun_client_call_method(&method); return NULL; #else struct input_device *idev = data; struct input_conn *iconn; struct fake_input *fake; DBusMessage *reply; GError *err = NULL; iconn = find_connection(idev->connections, "HID"); if (!iconn) return btd_error_not_supported(msg); if (iconn->pending_connect) return btd_error_in_progress(msg); if (is_connected(iconn)) return btd_error_already_connected(msg); iconn->pending_connect = dbus_message_ref(msg); fake = iconn->fake; if (fake) { /* Fake input device */ if (fake->connect(iconn, &err)) fake->flags |= FI_FLAG_CONNECTED; } else { /* HID devices */ GIOChannel *io; io = bt_io_connect(BT_IO_L2CAP, control_connect_cb, iconn, NULL, &err, BT_IO_OPT_SOURCE_BDADDR, &idev->src, BT_IO_OPT_DEST_BDADDR, &idev->dst, BT_IO_OPT_PSM, L2CAP_PSM_HIDP_CTRL, BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_LOW, BT_IO_OPT_POWER_ACTIVE, 0, BT_IO_OPT_INVALID); iconn->ctrl_io = io; } if (err == NULL) return NULL; error("%s", err->message); dbus_message_unref(iconn->pending_connect); iconn->pending_connect = NULL; reply = btd_error_failed(msg, err->message); g_error_free(err); return reply; #endif //--- BRCM }