static void input_device_free(struct input_device *idev) { bt_uhid_unref(idev->uhid); btd_service_unref(idev->service); btd_device_unref(idev->device); g_free(idev->path); if (idev->ctrl_watch > 0) g_source_remove(idev->ctrl_watch); if (idev->intr_watch > 0) g_source_remove(idev->intr_watch); if (idev->sec_watch > 0) g_source_remove(idev->sec_watch); if (idev->intr_io) g_io_channel_unref(idev->intr_io); if (idev->ctrl_io) g_io_channel_unref(idev->ctrl_io); if (idev->req) { g_free(idev->req->rd_data); g_free(idev->req); } if (idev->reconnect_timer > 0) g_source_remove(idev->reconnect_timer); if (idev->report_req_timer > 0) g_source_remove(idev->report_req_timer); g_free(idev); }
static void hid_device_free(void *data) { struct hid_device *dev = data; if (dev->reconnect_id > 0) g_source_remove(dev->reconnect_id); if (dev->ctrl_watch > 0) g_source_remove(dev->ctrl_watch); if (dev->intr_watch > 0) g_source_remove(dev->intr_watch); if (dev->intr_io) g_io_channel_unref(dev->intr_io); if (dev->ctrl_io) g_io_channel_unref(dev->ctrl_io); if (dev->uhid) bt_uhid_unref(dev->uhid); if (dev->hog) bt_hog_unref(dev->hog); g_free(dev->rd_data); g_free(dev); }
static void hog_free(void *data) { struct bt_hog *hog = data; bt_hog_detach(hog); g_slist_free_full(hog->instances, hog_free); bt_scpp_unref(hog->scpp); bt_dis_unref(hog->dis); bt_bas_unref(hog->bas); bt_uhid_unref(hog->uhid); g_slist_free_full(hog->reports, report_free); g_free(hog->name); g_free(hog->primary); g_free(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; }