summaryrefslogtreecommitdiffstats
path: root/input/device.c
diff options
context:
space:
mode:
Diffstat (limited to 'input/device.c')
-rw-r--r--input/device.c58
1 files changed, 40 insertions, 18 deletions
diff --git a/input/device.c b/input/device.c
index 9eee6e5a..46214217 100644
--- a/input/device.c
+++ b/input/device.c
@@ -52,6 +52,7 @@
#include "error.h"
#include "manager.h"
#include "storage.h"
+#include "fakehid.h"
#define INPUT_DEVICE_INTERFACE "org.bluez.input.Device"
@@ -63,16 +64,6 @@
struct device;
-struct fake_input {
- int flags;
- GIOChannel *io;
- int rfcomm; /* RFCOMM socket */
- int uinput; /* uinput socket */
- uint8_t ch; /* RFCOMM channel number */
- gboolean (*connect)(struct device *idev);
- int (*disconnect)(struct device *idev);
-};
-
struct device {
bdaddr_t src;
bdaddr_t dst;
@@ -1336,24 +1327,47 @@ int input_device_close_channels(bdaddr_t *src, bdaddr_t *dst)
return 0;
}
+static gboolean fake_hid_connect(struct device *dev)
+{
+ struct fake_hid *fhid = dev->fake->priv;
+
+ return fhid->connect(dev->fake);
+}
+
+static int fake_hid_disconnect(struct device *dev)
+{
+ struct fake_hid *fhid = dev->fake->priv;
+
+ return fhid->disconnect(dev->fake);
+}
+
int input_device_connadd(bdaddr_t *src, bdaddr_t *dst)
{
struct device *idev;
+ struct fake_hid *fake_hid;
+ struct fake_input *fake = NULL;
int err;
idev = find_device(src, dst);
if (!idev)
return -ENOENT;
- err = hidp_connadd(src, dst, idev->ctrl_sk, idev->intr_sk, idev->name);
- if (err < 0) {
- close(idev->ctrl_sk);
- close(idev->intr_sk);
- idev->ctrl_sk = -1;
- idev->intr_sk = -1;
+ fake_hid = get_fake_hid(idev->vendor, idev->product);
+ if (fake_hid) {
+ fake = g_try_new0(struct fake_input, 1);
+ if (!fake) {
+ err = -ENOMEM;
+ goto error;
+ }
- return err;
- }
+ fake->connect = fake_hid_connect;
+ fake->disconnect = fake_hid_disconnect;
+ fake->priv = fake_hid;
+ err = fake_hid_connadd(fake, idev->intr_sk, fake_hid);
+ } else
+ err = hidp_connadd(src, dst, idev->ctrl_sk, idev->intr_sk, idev->name);
+ if (err < 0)
+ goto error;
idev->intr_watch = create_watch(idev->intr_sk, intr_watch_cb, idev);
idev->ctrl_watch = create_watch(idev->ctrl_sk, ctrl_watch_cb, idev);
@@ -1363,4 +1377,12 @@ int input_device_connadd(bdaddr_t *src, bdaddr_t *dst)
"Connected",
DBUS_TYPE_INVALID);
return 0;
+
+error:
+ close(idev->ctrl_sk);
+ close(idev->intr_sk);
+ idev->ctrl_sk = -1;
+ idev->intr_sk = -1;
+ g_free(fake);
+ return err;
}