Re: [RFC 1/5] android/bluetooth: Split devices list to devices and bonded_devices

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Szymon,

On Tue, Jan 14, 2014 at 1:11 PM, Szymon Janc <szymon.janc@xxxxxxxxx> wrote:
> From: Szymon Janc <szymon.janc@xxxxxxxxx>
>
> Bonded devices are permament until unbondedn. Non-bonded devices will
> be held in (size limited) cache based on timestamp property so split
> list to ease separation.
> ---
>  android/bluetooth.c | 47 +++++++++++++++++++++++++++++++++++------------
>  1 file changed, 35 insertions(+), 12 deletions(-)
>
> diff --git a/android/bluetooth.c b/android/bluetooth.c
> index 735b03e..78e98c1 100644
> --- a/android/bluetooth.c
> +++ b/android/bluetooth.c
> @@ -133,6 +133,8 @@ static const uint16_t uuid_list[] = {
>  };
>
>  static struct mgmt *mgmt_if = NULL;
> +
> +static GSList *bonded_devices = NULL;
>  static GSList *devices = NULL;
>
>  /* This list contains addresses which are asked for records */
> @@ -284,6 +286,10 @@ static struct device *find_device(const bdaddr_t *bdaddr)
>  {
>         GSList *l;
>
> +       l = g_slist_find_custom(bonded_devices, bdaddr, device_match);
> +       if (l)
> +               return l->data;
> +
>         l = g_slist_find_custom(devices, bdaddr, device_match);
>         if (l)
>                 return l->data;
> @@ -560,12 +566,30 @@ static void set_device_bond_state(const bdaddr_t *addr, uint8_t status,
>         if (!dev)
>                 return;
>
> -       if (dev->bond_state != state) {
> -               dev->bond_state = state;
> -               send_bond_state_change(&dev->bdaddr, status, state);
> +       if (dev->bond_state == state)
> +               return;
>
> -               store_device_info(dev);
> +       switch (state) {
> +       case HAL_BOND_STATE_NONE:
> +               if (dev->bond_state == HAL_BOND_STATE_BONDED) {
> +                       bonded_devices = g_slist_remove(bonded_devices, dev);
> +                       devices = g_slist_prepend(devices, dev);
> +               }
> +               break;
> +       case HAL_BOND_STATE_BONDED:
> +               devices = g_slist_remove(devices, dev);
> +               bonded_devices = g_slist_prepend(bonded_devices, dev);
> +               break;
> +       case HAL_BOND_STATE_BONDING:
> +       default:
> +               break;
>         }
> +
> +       dev->bond_state = state;
> +
> +       store_device_info(dev);
> +
> +       send_bond_state_change(&dev->bdaddr, status, state);
>  }
>
>  static  void send_device_property(const bdaddr_t *bdaddr, uint8_t type,
> @@ -2134,18 +2158,15 @@ static uint8_t get_adapter_scan_mode(void)
>
>  static uint8_t get_adapter_bonded_devices(void)
>  {
> -       uint8_t buf[sizeof(bdaddr_t) * g_slist_length(devices)];
> +       uint8_t buf[sizeof(bdaddr_t) * g_slist_length(bonded_devices)];
>         int i = 0;
>         GSList *l;
>
>         DBG("");
>
> -       for (l = devices; l; l = g_slist_next(l)) {
> +       for (l = bonded_devices; l; l = g_slist_next(l)) {
>                 struct device *dev = l->data;
>
> -               if (dev->bond_state != HAL_BOND_STATE_BONDED)
> -                       continue;
> -
>                 bdaddr2android(&dev->bdaddr, buf + (i * sizeof(bdaddr_t)));
>                 i++;
>         }
> @@ -2697,11 +2718,10 @@ static void send_bonded_devices_props(void)
>  {
>         GSList *l;
>
> -       for (l = devices; l; l = g_slist_next(l)) {
> +       for (l = bonded_devices; l; l = g_slist_next(l)) {
>                 struct device *dev = l->data;
>
> -               if (dev->bond_state == HAL_BOND_STATE_BONDED)
> -                       get_remote_device_props(dev);
> +               get_remote_device_props(dev);
>         }
>  }
>
> @@ -3099,6 +3119,9 @@ void bt_bluetooth_unregister(void)
>  {
>         DBG("");
>
> +       g_slist_free_full(bonded_devices, (GDestroyNotify) free_device);
> +       bonded_devices = NULL;
> +
>         g_slist_free_full(devices, (GDestroyNotify) free_device);

You can make free_device to take a void pointer so you don't have to
cast in such cases.



-- 
Luiz Augusto von Dentz
--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux