summaryrefslogtreecommitdiff
path: root/android/dis.c
diff options
context:
space:
mode:
Diffstat (limited to 'android/dis.c')
-rw-r--r--android/dis.c293
1 files changed, 0 insertions, 293 deletions
diff --git a/android/dis.c b/android/dis.c
deleted file mode 100644
index 0c208505b..000000000
--- a/android/dis.c
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- *
- * BlueZ - Bluetooth protocol stack for Linux
- *
- * Copyright (C) 2012 Texas Instruments, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdbool.h>
-#include <errno.h>
-
-#include <glib.h>
-
-#include "src/log.h"
-
-#include "lib/bluetooth.h"
-#include "lib/sdp.h"
-#include "lib/uuid.h"
-
-#include "src/shared/util.h"
-#include "src/shared/queue.h"
-
-#include "attrib/gattrib.h"
-#include "attrib/att.h"
-#include "attrib/gatt.h"
-
-#include "android/dis.h"
-
-#define PNP_ID_SIZE 7
-
-struct bt_dis {
- int ref_count;
- uint16_t handle;
- uint8_t source;
- uint16_t vendor;
- uint16_t product;
- uint16_t version;
- GAttrib *attrib; /* GATT connection */
- struct gatt_primary *primary; /* Primary details */
- bt_dis_notify notify;
- void *notify_data;
- struct queue *gatt_op;
-};
-
-struct characteristic {
- struct gatt_char attr; /* Characteristic */
- struct bt_dis *d; /* deviceinfo where the char belongs */
-};
-
-struct gatt_request {
- unsigned int id;
- struct bt_dis *dis;
- void *user_data;
-};
-
-static void destroy_gatt_req(struct gatt_request *req)
-{
- queue_remove(req->dis->gatt_op, req);
- bt_dis_unref(req->dis);
- free(req);
-}
-
-static void dis_free(struct bt_dis *dis)
-{
- bt_dis_detach(dis);
-
- g_free(dis->primary);
- queue_destroy(dis->gatt_op, (void *) destroy_gatt_req);
- g_free(dis);
-}
-
-struct bt_dis *bt_dis_new(void *primary)
-{
- struct bt_dis *dis;
-
- dis = g_try_new0(struct bt_dis, 1);
- if (!dis)
- return NULL;
-
- dis->gatt_op = queue_new();
-
- if (primary)
- dis->primary = g_memdup(primary, sizeof(*dis->primary));
-
- return bt_dis_ref(dis);
-}
-
-struct bt_dis *bt_dis_ref(struct bt_dis *dis)
-{
- if (!dis)
- return NULL;
-
- __sync_fetch_and_add(&dis->ref_count, 1);
-
- return dis;
-}
-
-void bt_dis_unref(struct bt_dis *dis)
-{
- if (!dis)
- return;
-
- if (__sync_sub_and_fetch(&dis->ref_count, 1))
- return;
-
- dis_free(dis);
-}
-
-static struct gatt_request *create_request(struct bt_dis *dis,
- void *user_data)
-{
- struct gatt_request *req;
-
- req = new0(struct gatt_request, 1);
- req->user_data = user_data;
- req->dis = bt_dis_ref(dis);
-
- return req;
-}
-
-static bool set_and_store_gatt_req(struct bt_dis *dis,
- struct gatt_request *req,
- unsigned int id)
-{
- req->id = id;
- return queue_push_head(dis->gatt_op, req);
-}
-
-static void read_pnpid_cb(guint8 status, const guint8 *pdu, guint16 len,
- gpointer user_data)
-{
- struct gatt_request *req = user_data;
- struct bt_dis *dis = req->user_data;
- uint8_t value[PNP_ID_SIZE];
- ssize_t vlen;
-
- destroy_gatt_req(req);
-
- if (status != 0) {
- error("Error reading PNP_ID value: %s", att_ecode2str(status));
- return;
- }
-
- vlen = dec_read_resp(pdu, len, value, sizeof(value));
- if (vlen < 0) {
- error("Error reading PNP_ID: Protocol error");
- return;
- }
-
- if (vlen < 7) {
- error("Error reading PNP_ID: Invalid pdu length received");
- return;
- }
-
- dis->source = value[0];
- dis->vendor = get_le16(&value[1]);
- dis->product = get_le16(&value[3]);
- dis->version = get_le16(&value[5]);
-
- DBG("source: 0x%02X vendor: 0x%04X product: 0x%04X version: 0x%04X",
- dis->source, dis->vendor, dis->product, dis->version);
-
- if (dis->notify)
- dis->notify(dis->source, dis->vendor, dis->product,
- dis->version, dis->notify_data);
-}
-
-static void read_char(struct bt_dis *dis, GAttrib *attrib, uint16_t handle,
- GAttribResultFunc func, gpointer user_data)
-{
- struct gatt_request *req;
- unsigned int id;
-
- req = create_request(dis, user_data);
-
- id = gatt_read_char(attrib, handle, func, req);
-
- if (set_and_store_gatt_req(dis, req, id))
- return;
-
- error("dis: Could not read characteristic");
- g_attrib_cancel(attrib, id);
- free(req);
-}
-
-static void discover_char(struct bt_dis *dis, GAttrib *attrib,
- uint16_t start, uint16_t end,
- bt_uuid_t *uuid, gatt_cb_t func,
- gpointer user_data)
-{
- struct gatt_request *req;
- unsigned int id;
-
- req = create_request(dis, user_data);
-
- id = gatt_discover_char(attrib, start, end, uuid, func, req);
-
- if (set_and_store_gatt_req(dis, req, id))
- return;
-
- error("dis: Could not send discover characteristic");
- g_attrib_cancel(attrib, id);
- free(req);
-}
-
-static void configure_deviceinfo_cb(uint8_t status, GSList *characteristics,
- void *user_data)
-{
- struct gatt_request *req = user_data;
- struct bt_dis *d = req->user_data;
- GSList *l;
-
- destroy_gatt_req(req);
-
- if (status != 0) {
- error("Discover deviceinfo characteristics: %s",
- att_ecode2str(status));
- return;
- }
-
- for (l = characteristics; l; l = l->next) {
- struct gatt_char *c = l->data;
-
- if (strcmp(c->uuid, PNPID_UUID) == 0) {
- d->handle = c->value_handle;
- read_char(d, d->attrib, d->handle, read_pnpid_cb, d);
- break;
- }
- }
-}
-
-bool bt_dis_attach(struct bt_dis *dis, void *attrib)
-{
- struct gatt_primary *primary = dis->primary;
-
- if (dis->attrib || !primary)
- return false;
-
- dis->attrib = g_attrib_ref(attrib);
-
- if (!dis->handle)
- discover_char(dis, dis->attrib, primary->range.start,
- primary->range.end, NULL,
- configure_deviceinfo_cb, dis);
-
- return true;
-}
-
-static void cancel_gatt_req(struct gatt_request *req)
-{
- if (g_attrib_cancel(req->dis->attrib, req->id))
- destroy_gatt_req(req);
-}
-
-void bt_dis_detach(struct bt_dis *dis)
-{
- if (!dis->attrib)
- return;
-
- queue_foreach(dis->gatt_op, (void *) cancel_gatt_req, NULL);
- g_attrib_unref(dis->attrib);
- dis->attrib = NULL;
-}
-
-bool bt_dis_set_notification(struct bt_dis *dis, bt_dis_notify func,
- void *user_data)
-{
- if (!dis)
- return false;
-
- dis->notify = func;
- dis->notify_data = user_data;
-
- return true;
-}