From e5e024113e3ed63bebe90da4188a1ece73caf364 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Wed, 24 Jan 2007 13:21:51 +0000 Subject: Added function to store HID info --- input/input-service.c | 55 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 8 deletions(-) (limited to 'input') diff --git a/input/input-service.c b/input/input-service.c index 491eb5f8..627c2a99 100644 --- a/input/input-service.c +++ b/input/input-service.c @@ -68,8 +68,9 @@ struct input_device { }; struct pending_req { - char *adapter_path; - char peer[18]; + char *adapter_path; /* Local adapter D-Bus path */ + char adapter[18]; /* Local adapter BT address */ + char peer[18]; /* Peer BT address */ DBusConnection *conn; DBusMessage *msg; sdp_record_t *pnp_rec; @@ -108,7 +109,7 @@ void input_device_free(struct input_device *idev) } struct pending_req *pending_req_new(DBusConnection *conn, DBusMessage *msg, - const char *adapter_path, const char *peer) + const char *adapter_path, const char *adapter, const char *peer) { struct pending_req *pr; pr = malloc(sizeof(struct pending_req)); @@ -117,6 +118,7 @@ struct pending_req *pending_req_new(DBusConnection *conn, DBusMessage *msg, memset(pr, 0, sizeof(struct pending_req)); pr->adapter_path = strdup(adapter_path); + strncpy(pr->adapter, adapter, 18); strncpy(pr->peer, peer, 18); pr->conn = dbus_connection_ref(conn); pr->msg = dbus_message_ref(msg); @@ -303,6 +305,43 @@ static int get_stored_info(const char *local, const char *peer, return ret; } +static int store_info(const char *local, const char *peer, + struct hidp_connadd_req *req) +{ + char filename[PATH_MAX + 1], *str, *desc; + int i, size, ret; + + create_name(filename, PATH_MAX, STORAGEDIR, local, "hidd"); + + size = 15 + 3 + 3 + 5 + (req->rd_size * 2) + 1 + 9 + strlen(req->name) + 2; + str = malloc(size); + if (!str) + return -ENOMEM; + + desc = malloc((req->rd_size * 2) + 1); + if (!desc) { + free(str); + return -ENOMEM; + } + + memset(desc, 0, (req->rd_size * 2) + 1); + for (i = 0; i < req->rd_size; i++) + sprintf(desc + (i * 2), "%2.2X", req->rd_data[i]); + + snprintf(str, size - 1, "%04X:%04X:%04X %02X %02X %04X %s %08X %s", + req->vendor, req->product, req->version, + req->subclass, req->country, req->parser, desc, + req->flags, req->name); + free(desc); + + create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + + ret = textfile_put(filename, peer, str); + free(str); + + return ret; +} + static void extract_hid_record(sdp_record_t *rec, struct hidp_connadd_req *req) { sdp_data_t *pdlist, *pdlist2; @@ -1030,7 +1069,7 @@ static void hid_record_reply(DBusPendingCall *call, void *data) DBUS_TYPE_INVALID); send_message_and_unref(pr->conn, pr_reply); - /* FIXME: Store HID record data and free req */ + store_info(pr->adapter, pr->peer, &idev->hidp); fail: pending_req_free(pr); dbus_message_unref(reply); @@ -1168,7 +1207,7 @@ static DBusHandlerResult manager_create_device(DBusConnection *conn, struct hci_dev_info di; DBusMessage *reply; DBusError derr; - char adapter_addr[18], adapter_path[32]; + char adapter[18], adapter_path[32]; const char *addr, *path; GSList *l; int dev_id; @@ -1199,18 +1238,18 @@ static DBusHandlerResult manager_create_device(DBusConnection *conn, return err_failed(conn, msg, "Bluetooth adapter not available"); } - ba2str(&di.bdaddr, adapter_addr); + ba2str(&di.bdaddr, adapter); snprintf(adapter_path, 32, "/org/bluez/hci%d", dev_id); idev = input_device_new(addr); if (!idev) return DBUS_HANDLER_RESULT_NEED_MEMORY; - if (get_stored_info(adapter_addr, addr, &idev->hidp) < 0) { + if (get_stored_info(adapter, addr, &idev->hidp) < 0) { struct pending_req *pr; /* Data not found: create the input device later */ input_device_free(idev); - pr = pending_req_new(conn, msg, adapter_path, addr); + pr = pending_req_new(conn, msg, adapter_path, adapter, addr); if (!pr) return DBUS_HANDLER_RESULT_NEED_MEMORY; -- cgit