int input_device_register(struct btd_service *service) { struct btd_device *device = btd_service_get_device(service); const char *path = device_get_path(device); struct input_device *idev; DBG("%s", path); idev = input_device_new(service); if (!idev) return -EINVAL; if (uhid_enabled) { idev->uhid = bt_uhid_new_default(); if (!idev->uhid) { error("bt_uhid_new_default: failed"); input_device_free(idev); return -EIO; } } if (g_dbus_register_interface(btd_get_dbus_connection(), idev->path, INPUT_INTERFACE, NULL, NULL, input_properties, idev, NULL) == FALSE) { error("Unable to register %s interface", INPUT_INTERFACE); input_device_free(idev); return -EINVAL; } btd_service_set_user_data(service, idev); return 0; }
struct bt_hog *bt_hog_new(const char *name, uint16_t vendor, uint16_t product, uint16_t version, void *primary) { struct bt_hog *hog; hog = g_try_new0(struct bt_hog, 1); if (!hog) return NULL; hog->uhid = bt_uhid_new_default(); if (!hog->uhid) { hog_free(hog); return NULL; } hog->name = g_strdup(name); hog->vendor = vendor; hog->product = product; hog->version = version; if (primary) hog->primary = g_memdup(primary, sizeof(*hog->primary)); return bt_hog_ref(hog); }
static int uhid_create(struct hid_device *dev) { struct uhid_event ev; int err; dev->uhid = bt_uhid_new_default(); if (!dev->uhid) { err = -errno; error("hidhost: Failed to create bt_uhid instance"); return err; } memset(&ev, 0, sizeof(ev)); ev.type = UHID_CREATE; strcpy((char *) ev.u.create.name, "bluez-input-device"); ev.u.create.bus = BUS_BLUETOOTH; ev.u.create.vendor = dev->vendor; ev.u.create.product = dev->product; ev.u.create.version = dev->version; ev.u.create.country = dev->country; ev.u.create.rd_size = dev->rd_size; ev.u.create.rd_data = dev->rd_data; err = bt_uhid_send(dev->uhid, &ev); if (err < 0) { error("hidhost: Failed to create uHID device: %s", strerror(-err)); bt_uhid_unref(dev->uhid); dev->uhid = NULL; return err; } bt_uhid_register(dev->uhid, UHID_OUTPUT, handle_uhid_output, dev); bt_hid_set_info(dev); return 0; }