Clean up newlines and adds the reconnect and disconnect device functions. input/generichid.c | 92 +++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 73 insertions(+), 19 deletions(-) diff --git a/input/generichid.c b/input/generichid.c index 42d6a29..7957774 100644 --- a/input/generichid.c +++ b/input/generichid.c @@ -130,7 +130,6 @@ struct user_data { func_ptr func; }; - static void add_lang_attr(sdp_record_t *r) { sdp_lang_attr_t base_lang; @@ -145,7 +144,6 @@ static void add_lang_attr(sdp_record_t *r) sdp_list_free(langs, 0); } - static int sdp_keyboard_service(struct adapter_data *adapt) { bdaddr_t src; @@ -347,7 +345,6 @@ static int sdp_keyboard_service(struct adapter_data *adapt) return 0; } - static void initiate_keyboard(struct keyboard_state *keyboard) { keyboard->value[0] = 0xa1; @@ -459,8 +456,6 @@ static DBusMessage *send_report(GIOChannel *chan, return NULL; } - - static DBusMessage *keyboard_event(GIOChannel *chan, DBusMessage *msg, struct keyboard_state *keyboard, unsigned char code, @@ -502,8 +497,6 @@ static DBusMessage *keyboard_event(GIOChannel *chan, DBusMessage *msg, return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); } - - static DBusMessage *send_event(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -573,7 +566,6 @@ static gboolean set_protocol_listener(GIOChannel *chan, GIOCondition condition, return TRUE; } - static gboolean channel_listener(GIOChannel *chan, GIOCondition condition, gpointer data) { @@ -596,7 +588,6 @@ static gboolean channel_listener(GIOChannel *chan, GIOCondition condition, return FALSE; } - static void interrupt_connect_cb(GIOChannel *chan, GError *conn_err, void *data) { @@ -648,8 +639,6 @@ failed: } } - - static void control_connect_cb(GIOChannel *chan, GError *conn_err, void *data) { @@ -691,16 +680,88 @@ failed: dev->ctrl = NULL; } - static DBusMessage *reconnect_device(DBusConnection *conn, DBusMessage *msg, gpointer data) { + GError *err = NULL; + GIOChannel *io; + bdaddr_t src; + struct adapter_data *adapt = data; + struct device_data *dev = adapt->dev; + struct user_data *info; + + if (adapt->pending) + return btd_error_in_progress(msg); + + if (dev->intr != NULL) + return btd_error_already_connected(msg); + + info = g_try_new(struct user_data, 1); + if (info == NULL) + return btd_error_failed(msg, strerror(-ENOMEM)); + + info->adapt = adapt; + info->func = NULL; + + adapter_get_address(adapt->adapter, &src); + + io = bt_io_connect(BT_IO_L2CAP, control_connect_cb, info, + NULL, &err, + BT_IO_OPT_SOURCE_BDADDR, &src, + BT_IO_OPT_DEST_BDADDR, &(dev->dst), + BT_IO_OPT_PSM, L2CAP_PSM_HIDP_CTRL, + BT_IO_OPT_INVALID); + + /* TODO: treat plug failed even with errors from cb */ + if (err != NULL) + error("%s", err->message); + + if (io == NULL) { + if (info != NULL) + g_free(info); + + return btd_error_failed(msg, "Failed to plug the device"); + } + + dev->ctrl = io; + return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); } static DBusMessage *disconnect_device(DBusConnection *conn, DBusMessage *msg, gpointer data) { + struct adapter_data *adapt = data; + struct device_data *dev = adapt->dev; + + if (dev->intr != NULL) { + g_io_channel_shutdown(dev->intr, TRUE, NULL); + g_io_channel_unref(dev->intr); + dev->intr = NULL; + + g_source_remove(dev->intr_watch); + } + + if (dev->ctrl != NULL) { + g_io_channel_shutdown(dev->ctrl, TRUE, NULL); + g_io_channel_unref(dev->ctrl); + dev->ctrl = NULL; + } + + g_dbus_unregister_interface(conn, dev->input_path, + GENERIC_INPUT_DEVICE); + + if (dev->input_path != NULL) { + g_free(dev->input_path); + dev->input_path = NULL; + } + + g_dbus_emit_signal(connection, adapter_get_path(adapt->adapter), + GENERIC_HID_INTERFACE, "DeviceReleased", + DBUS_TYPE_INVALID); + + return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); + } static const GDBusSignalTable ghid_input_device_signals[] = { @@ -716,7 +777,6 @@ static const GDBusMethodTable ghid_input_device_methods[] = { {} }; - static void generic_input_device_path(char *path, struct btd_adapter *adapter) { char *adapt; @@ -826,20 +886,17 @@ static DBusMessage *connect_device(DBusConnection *conn, DBusMessage *msg, } - static const GDBusSignalTable ghid_adapter_signals[] = { { GDBUS_SIGNAL("IncomingConnection", NULL) }, { GDBUS_SIGNAL("DeviceReleased", NULL) }, { } }; - static const GDBusMethodTable ghid_adapter_methods[] = { { GDBUS_METHOD("Connect", GDBUS_ARGS({"path", "s"}), NULL, connect_device) }, { } }; - static void register_interface(const char *path, struct adapter_data *adapt) { if (g_dbus_register_interface(connection, path, GENERIC_HID_INTERFACE, @@ -854,7 +911,6 @@ static void register_interface(const char *path, struct adapter_data *adapt) } - static void unregister_interface(const char *path) { btd_debug("path %s", path); @@ -862,7 +918,6 @@ static void unregister_interface(const char *path) g_dbus_unregister_interface(connection, path, GENERIC_HID_INTERFACE); } - static void connect_cb(GIOChannel *chan, GError *err, gpointer data) { uint16_t psm; @@ -935,7 +990,6 @@ failed: } } - static void confirm_event_cb(GIOChannel *chan, GError *err, gpointer data) { uint16_t psm; -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html