Return-Path: MIME-Version: 1.0 In-Reply-To: <1470647741-12865-1-git-send-email-michal.narajowski@codecoup.pl> References: <1470647741-12865-1-git-send-email-michal.narajowski@codecoup.pl> From: Luiz Augusto von Dentz Date: Mon, 8 Aug 2016 14:34:20 +0300 Message-ID: Subject: Re: [PATCH BlueZ] client: Add better support for managing devices of multiple controllers To: =?UTF-8?Q?Micha=C5=82_Narajowski?= Cc: "linux-bluetooth@vger.kernel.org" Content-Type: text/plain; charset=UTF-8 Sender: linux-bluetooth-owner@vger.kernel.org List-ID: Hi Michał, On Mon, Aug 8, 2016 at 12:15 PM, Michał Narajowski wrote: > Previously devices list was cleared when selecting new default > controller. Now devices list is preserverd allowing to list and suggest > devices for default controller even after changing the default > controller. > --- > client/main.c | 56 ++++++++++++++++++++++++++++++++++++-------------------- > 1 file changed, 36 insertions(+), 20 deletions(-) > > diff --git a/client/main.c b/client/main.c > index 056331f..e1d8eeb 100644 > --- a/client/main.c > +++ b/client/main.c > @@ -63,6 +63,7 @@ static GDBusProxy *default_dev; > static GDBusProxy *default_attr; > static GList *ctrl_list; > static GList *dev_list; > +static GList *default_ctrl_dev_list; Hmm I don't think you will be able keep all the device list like that, instead what I would do is to create a struct per device so you keep a list of controllers like this: struct bt_adapter { GDBusProxy *proxy; GList *devices; }; That way when we switch we keep have the list of the devices to access directly from the struct. > static guint input = 0; > > @@ -358,6 +359,24 @@ static gboolean service_is_child(GDBusProxy *service) > return FALSE; > } > > +static void update_default_ctrl_dev_list(void) > +{ > + GList *list; > + > + if (default_ctrl_dev_list) { > + g_list_free(default_ctrl_dev_list); > + default_ctrl_dev_list = NULL; > + } > + > + for (list = g_list_first(dev_list); list; list = g_list_next(list)) { > + GDBusProxy *proxy = list->data; > + > + if (device_is_child(proxy, default_ctrl) == TRUE) > + default_ctrl_dev_list = g_list_append(default_ctrl_dev_list, > + proxy); > + } > +} > + > static void set_default_device(GDBusProxy *proxy, const char *attribute) > { > char *desc = NULL; > @@ -418,9 +437,8 @@ static void proxy_added(GDBusProxy *proxy, void *user_data) > interface = g_dbus_proxy_get_interface(proxy); > > if (!strcmp(interface, "org.bluez.Device1")) { > - if (device_is_child(proxy, default_ctrl) == TRUE) > - device_added(proxy); > - > + device_added(proxy); > + update_default_ctrl_dev_list(); > } else if (!strcmp(interface, "org.bluez.Adapter1")) { > ctrl_list = g_list_append(ctrl_list, proxy); > > @@ -466,14 +484,13 @@ static void proxy_removed(GDBusProxy *proxy, void *user_data) > interface = g_dbus_proxy_get_interface(proxy); > > if (!strcmp(interface, "org.bluez.Device1")) { > - if (device_is_child(proxy, default_ctrl) == TRUE) { > - dev_list = g_list_remove(dev_list, proxy); > + dev_list = g_list_remove(dev_list, proxy); > > - print_device(proxy, COLORED_DEL); > + print_device(proxy, COLORED_DEL); > + update_default_ctrl_dev_list(); > > - if (default_dev == proxy) > - set_default_device(NULL, NULL); > - } > + if (default_dev == proxy) > + set_default_device(NULL, NULL); > } else if (!strcmp(interface, "org.bluez.Adapter1")) { > ctrl_list = g_list_remove(ctrl_list, proxy); > > @@ -482,9 +499,7 @@ static void proxy_removed(GDBusProxy *proxy, void *user_data) > if (default_ctrl == proxy) { > default_ctrl = NULL; > set_default_device(NULL, NULL); > - > - g_list_free(dev_list); > - dev_list = NULL; > + update_default_ctrl_dev_list(); > } > } else if (!strcmp(interface, "org.bluez.AgentManager1")) { > if (agent_manager == proxy) { > @@ -734,16 +749,14 @@ static void cmd_select(const char *arg) > > default_ctrl = proxy; > print_adapter(proxy, NULL); > - > - g_list_free(dev_list); > - dev_list = NULL; > + update_default_ctrl_dev_list(); > } > > static void cmd_devices(const char *arg) > { > GList *list; > > - for (list = g_list_first(dev_list); list; list = g_list_next(list)) { > + for (list = g_list_first(default_ctrl_dev_list); list; list = g_list_next(list)) { > GDBusProxy *proxy = list->data; > print_device(proxy, NULL); > } > @@ -753,7 +766,7 @@ static void cmd_paired_devices(const char *arg) > { > GList *list; > > - for (list = g_list_first(dev_list); list; list = g_list_next(list)) { > + for (list = g_list_first(default_ctrl_dev_list); list; list = g_list_next(list)) { > GDBusProxy *proxy = list->data; > DBusMessageIter iter; > dbus_bool_t paired; > @@ -1439,22 +1452,24 @@ static void cmd_remove(const char *arg) > if (strcmp(arg, "*") == 0) { > GList *list; > > - for (list = g_list_first(dev_list); list; list = g_list_next(list)) { > + for (list = g_list_first(default_ctrl_dev_list); list; list = g_list_next(list)) { > GDBusProxy *proxy = list->data; > > remove_device(proxy); > } > + update_default_ctrl_dev_list(); > > return; > } > > - proxy = find_proxy_by_address(dev_list, arg); > + proxy = find_proxy_by_address(default_ctrl_dev_list, arg); > if (!proxy) { > rl_printf("Device %s not available\n", arg); > return; > } > > remove_device(proxy); > + update_default_ctrl_dev_list(); > } > > static void connect_reply(DBusMessage *message, void *user_data) > @@ -1755,7 +1770,7 @@ static char *ctrl_generator(const char *text, int state) > > static char *dev_generator(const char *text, int state) > { > - return generic_generator(text, state, dev_list, "Address"); > + return generic_generator(text, state, default_ctrl_dev_list, "Address"); > } > > static char *attribute_generator(const char *text, int state) > @@ -2156,6 +2171,7 @@ int main(int argc, char *argv[]) > > g_list_free_full(ctrl_list, proxy_leak); > g_list_free_full(dev_list, proxy_leak); > + g_list_free(default_ctrl_dev_list); > > g_free(auto_register_agent); > > -- > 2.7.4 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Luiz Augusto von Dentz