Thread (3 messages) 3 messages, 2 authors, 2016-08-23

Re: [PATCH BlueZ v5] client: Add better support for managing devices of multiple controllers

flat view

From: Luiz Augusto von Dentz <luiz.dentz@gmail.com>
Date: 2016-08-23 10:48:46

Hi

On Thu, Aug 18, 2016 at 3:16 PM, Micha=C5=82 Narajowski
[off-list ref] 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 | 262 +++++++++++++++++++++++++++++++++++++++++-----------=
------
quoted hunk ↗ jump to hunk
 1 file changed, 188 insertions(+), 74 deletions(-)
diff --git a/client/main.c b/client/main.c
index 1ceddb0..8394668 100644
--- a/client/main.c
+++ b/client/main.c
@@ -38,6 +38,7 @@
 #include <readline/history.h>
 #include <glib.h>

+#include "src/shared/util.h"
 #include "gdbus/gdbus.h"
 #include "monitor/uuid.h"
 #include "agent.h"
@@ -59,13 +60,16 @@ static DBusConnection *dbus_conn;
 static GDBusProxy *agent_manager;
 static char *auto_register_agent =3D NULL;

-static GDBusProxy *ad_manager;
+struct adapter {
+       GDBusProxy *proxy;
+       GList *devices;
+};

-static GDBusProxy *default_ctrl;
+static struct adapter *default_ctrl;
 static GDBusProxy *default_dev;
 static GDBusProxy *default_attr;
+static GDBusProxy *ad_manager;
 static GList *ctrl_list;
-static GList *dev_list;

 static guint input =3D 0;
@@ -145,13 +149,10 @@ static void disconnect_handler(DBusConnection *conn=
ection, void *user_data)
quoted hunk ↗ jump to hunk
        rl_on_new_line();
        rl_redisplay();

-       g_list_free(ctrl_list);
+       g_list_free_full(ctrl_list, proxy_leak);
        ctrl_list =3D NULL;

        default_ctrl =3D NULL;
-
-       g_list_free(dev_list);
-       dev_list =3D NULL;
 }

 static void print_adapter(GDBusProxy *proxy, const char *description)
@@ -174,7 +175,7 @@ static void print_adapter(GDBusProxy *proxy, const ch=
ar *description)
quoted hunk ↗ jump to hunk
                                description ? : "",
                                description ? "] " : "",
                                address, name,
-                               default_ctrl =3D=3D proxy ? "[default]" :=
 "");
+                               default_ctrl && default_ctrl->proxy =3D=
=3D proxy ? "[default]" : "");
quoted hunk ↗ jump to hunk
 }
@@ -357,10 +358,13 @@ static gboolean service_is_child(GDBusProxy *servic=
e)
quoted hunk ↗ jump to hunk

        dbus_message_iter_get_basic(&iter, &device);

-       for (l =3D dev_list; l; l =3D g_list_next(l)) {
-               GDBusProxy *proxy =3D l->data;
+       if (!default_ctrl)
+               return FALSE;
+
+       for (l =3D default_ctrl->devices; l; l =3D g_list_next(l)) {
+               struct adapter *adapter =3D l->data;

-               path =3D g_dbus_proxy_get_path(proxy);
+               path =3D g_dbus_proxy_get_path(adapter->proxy);

                if (!strcmp(path, device))
                        return TRUE;
@@ -369,6 +373,19 @@ static gboolean service_is_child(GDBusProxy *service=
)
quoted hunk ↗ jump to hunk
        return FALSE;
 }

+static struct adapter *find_parent(GDBusProxy *device)
+{
+       GList *list;
+
+       for (list =3D g_list_first(ctrl_list); list; list =3D g_list_next=
(list)) {
quoted hunk ↗ jump to hunk
+               struct adapter *adapter =3D list->data;
+
+               if (device_is_child(device, adapter->proxy) =3D=3D TRUE)
+                       return adapter;
+       }
+       return NULL;
+}
+
 static void set_default_device(GDBusProxy *proxy, const char *attribute)
 {
        char *desc =3D NULL;
@@ -405,8 +422,13 @@ static void device_added(GDBusProxy *proxy)
 {
        DBusMessageIter iter;

-       dev_list =3D g_list_append(dev_list, proxy);
+       struct adapter *adapter =3D find_parent(proxy);
+       if (!adapter) {
+               /* TODO: Error */
+               return;
+       }

+       adapter->devices =3D g_list_append(adapter->devices, proxy);
        print_device(proxy, COLORED_NEW);

        if (default_dev)
@@ -422,6 +444,19 @@ static void device_added(GDBusProxy *proxy)
        }
 }

+static void adapter_added(GDBusProxy *proxy)
+{
+       struct adapter *adapter =3D g_malloc0(sizeof(struct adapter));
+
+       adapter->proxy =3D proxy;
+       ctrl_list =3D g_list_append(ctrl_list, adapter);
+
+       if (!default_ctrl)
+               default_ctrl =3D adapter;
+
+       print_adapter(proxy, COLORED_NEW);
+}
+
 static void proxy_added(GDBusProxy *proxy, void *user_data)
 {
        const char *interface;
@@ -429,16 +464,9 @@ static void proxy_added(GDBusProxy *proxy, void *use=
r_data)
quoted hunk ↗ jump to hunk
        interface =3D g_dbus_proxy_get_interface(proxy);

        if (!strcmp(interface, "org.bluez.Device1")) {
-               if (device_is_child(proxy, default_ctrl) =3D=3D TRUE)
-                       device_added(proxy);
-
+               device_added(proxy);
        } else if (!strcmp(interface, "org.bluez.Adapter1")) {
-               ctrl_list =3D g_list_append(ctrl_list, proxy);
-
-               if (!default_ctrl)
-                       default_ctrl =3D proxy;
-
-               print_adapter(proxy, COLORED_NEW);
+               adapter_added(proxy);
        } else if (!strcmp(interface, "org.bluez.AgentManager1")) {
                if (!agent_manager) {
                        agent_manager =3D proxy;
@@ -472,33 +500,56 @@ static void set_default_attribute(GDBusProxy *proxy=
)
quoted hunk ↗ jump to hunk
        set_default_device(default_dev, path);
 }

-static void proxy_removed(GDBusProxy *proxy, void *user_data)
+static void device_removed(GDBusProxy *proxy)
 {
-       const char *interface;
+       struct adapter *adapter =3D find_parent(proxy);
+       if (!adapter) {
+               /* TODO: Error */
+               return;
+       }

-       interface =3D g_dbus_proxy_get_interface(proxy);
+       adapter->devices =3D g_list_remove(adapter->devices, proxy);

-       if (!strcmp(interface, "org.bluez.Device1")) {
-               if (device_is_child(proxy, default_ctrl) =3D=3D TRUE) {
-                       dev_list =3D g_list_remove(dev_list, proxy);
+       print_device(proxy, COLORED_DEL);
+
+       if (default_dev =3D=3D proxy)
+               set_default_device(NULL, NULL);
+}
+
+static void adapter_removed(GDBusProxy *proxy)
+{
+       GList *llink;
+
+       for (llink =3D g_list_first(ctrl_list); llink; llink =3D g_list_n=
ext(llink)) {
quoted hunk ↗ jump to hunk
+               struct adapter *adapter =3D llink->data;

-                       print_device(proxy, COLORED_DEL);
+               if (adapter->proxy =3D=3D proxy) {
+                       print_adapter(proxy, COLORED_DEL);

-                       if (default_dev =3D=3D proxy)
+                       if (default_ctrl && default_ctrl->proxy =3D=3D pr=
oxy) {
quoted hunk ↗ jump to hunk
+                               default_ctrl =3D NULL;
                                set_default_device(NULL, NULL);
+                       }
+
+                       ctrl_list =3D g_list_remove_link(ctrl_list, llink=
);
quoted hunk ↗ jump to hunk
+                       g_list_free(adapter->devices);
+                       g_free(adapter);
+                       g_list_free(llink);
+                       return;
                }
-       } else if (!strcmp(interface, "org.bluez.Adapter1")) {
-               ctrl_list =3D g_list_remove(ctrl_list, proxy);
+       }
+}

-               print_adapter(proxy, COLORED_DEL);
+static void proxy_removed(GDBusProxy *proxy, void *user_data)
+{
+       const char *interface;

-               if (default_ctrl =3D=3D proxy) {
-                       default_ctrl =3D NULL;
-                       set_default_device(NULL, NULL);
+       interface =3D g_dbus_proxy_get_interface(proxy);

-                       g_list_free(dev_list);
-                       dev_list =3D NULL;
-               }
+       if (!strcmp(interface, "org.bluez.Device1")) {
+               device_removed(proxy);
+       } else if (!strcmp(interface, "org.bluez.Adapter1")) {
+               adapter_removed(proxy);
        } else if (!strcmp(interface, "org.bluez.AgentManager1")) {
                if (agent_manager =3D=3D proxy) {
                        agent_manager =3D NULL;
@@ -538,7 +589,7 @@ static void property_changed(GDBusProxy *proxy, const=
 char *name,
quoted hunk ↗ jump to hunk
        interface =3D g_dbus_proxy_get_interface(proxy);

        if (!strcmp(interface, "org.bluez.Device1")) {
-               if (device_is_child(proxy, default_ctrl) =3D=3D TRUE) {
+               if (default_ctrl && device_is_child(proxy, default_ctrl->=
proxy) =3D=3D TRUE) {
quoted hunk ↗ jump to hunk
                        DBusMessageIter addr_iter;
                        char *str;
@@ -601,6 +652,27 @@ static void message_handler(DBusConnection *connecti=
on,
                                        dbus_message_get_member(message))=
;
 }

+static struct adapter *find_ctrl_by_address(GList *source, const char *a=
ddress)
quoted hunk ↗ jump to hunk
+{
+       GList *list;
+
+       for (list =3D g_list_first(source); list; list =3D g_list_next(li=
st)) {
quoted hunk ↗ jump to hunk
+               struct adapter *adapter =3D list->data;
+               DBusMessageIter iter;
+               const char *str;
+
+               if (g_dbus_proxy_get_property(adapter->proxy, "Address", =
&iter) =3D=3D FALSE)
quoted hunk ↗ jump to hunk
+                       continue;
+
+               dbus_message_iter_get_basic(&iter, &str);
+
+               if (!strcmp(str, address))
+                       return adapter;
+       }
+
+       return NULL;
+}
+
 static GDBusProxy *find_proxy_by_address(GList *source, const char *addr=
ess)
quoted hunk ↗ jump to hunk
 {
        GList *list;
@@ -691,13 +763,14 @@ static void cmd_list(const char *arg)
        GList *list;

        for (list =3D g_list_first(ctrl_list); list; list =3D g_list_next=
(list)) {
quoted hunk ↗ jump to hunk
-               GDBusProxy *proxy =3D list->data;
-               print_adapter(proxy, NULL);
+               struct adapter *adapter =3D list->data;
+               print_adapter(adapter->proxy, NULL);
        }
 }

 static void cmd_show(const char *arg)
 {
+       struct adapter *adapter;
        GDBusProxy *proxy;
        DBusMessageIter iter;
        const char *address;
@@ -706,13 +779,14 @@ static void cmd_show(const char *arg)
                if (check_default_ctrl() =3D=3D FALSE)
                        return;

-               proxy =3D default_ctrl;
+               proxy =3D default_ctrl->proxy;
        } else {
-               proxy =3D find_proxy_by_address(ctrl_list, arg);
-               if (!proxy) {
+               adapter =3D find_ctrl_by_address(ctrl_list, arg);
+               if (!adapter) {
                        rl_printf("Controller %s not available\n", arg);
                        return;
                }
+               proxy =3D adapter->proxy;
        }

        if (g_dbus_proxy_get_property(proxy, "Address", &iter) =3D=3D FAL=
SE)
quoted hunk ↗ jump to hunk
@@ -734,34 +808,34 @@ static void cmd_show(const char *arg)

 static void cmd_select(const char *arg)
 {
-       GDBusProxy *proxy;
+       struct adapter *adapter;

        if (!arg || !strlen(arg)) {
                rl_printf("Missing controller address argument\n");
                return;
        }

-       proxy =3D find_proxy_by_address(ctrl_list, arg);
-       if (!proxy) {
+       adapter =3D find_ctrl_by_address(ctrl_list, arg);
+       if (!adapter) {
                rl_printf("Controller %s not available\n", arg);
                return;
        }

-       if (default_ctrl =3D=3D proxy)
+       if (default_ctrl && default_ctrl->proxy =3D=3D adapter->proxy)
                return;

-       default_ctrl =3D proxy;
-       print_adapter(proxy, NULL);
-
-       g_list_free(dev_list);
-       dev_list =3D NULL;
+       default_ctrl =3D adapter;
+       print_adapter(adapter->proxy, NULL);
 }

 static void cmd_devices(const char *arg)
 {
        GList *list;

-       for (list =3D g_list_first(dev_list); list; list =3D g_list_next(=
list)) {
quoted hunk ↗ jump to hunk
+       if (check_default_ctrl() =3D=3D FALSE)
+               return;
+
+       for (list =3D g_list_first(default_ctrl->devices); list; list =3D=
 g_list_next(list)) {
quoted hunk ↗ jump to hunk
                GDBusProxy *proxy =3D list->data;
                print_device(proxy, NULL);
        }
@@ -771,7 +845,10 @@ static void cmd_paired_devices(const char *arg)
 {
        GList *list;

-       for (list =3D g_list_first(dev_list); list; list =3D g_list_next(=
list)) {
quoted hunk ↗ jump to hunk
+       if (check_default_ctrl() =3D=3D FALSE)
+               return;
+
+       for (list =3D g_list_first(default_ctrl->devices); list; list =3D=
 g_list_next(list)) {
quoted hunk ↗ jump to hunk
                GDBusProxy *proxy =3D list->data;
                DBusMessageIter iter;
                dbus_bool_t paired;
@@ -811,7 +888,7 @@ static void cmd_system_alias(const char *arg)

        name =3D g_strdup(arg);

-       if (g_dbus_proxy_set_property_basic(default_ctrl, "Alias",
+       if (g_dbus_proxy_set_property_basic(default_ctrl->proxy, "Alias",
                                        DBUS_TYPE_STRING, &name,
                                        generic_callback, name, g_free) =
=3D=3D TRUE)
quoted hunk ↗ jump to hunk
                return;
@@ -828,7 +905,7 @@ static void cmd_reset_alias(const char *arg)

        name =3D g_strdup("");

-       if (g_dbus_proxy_set_property_basic(default_ctrl, "Alias",
+       if (g_dbus_proxy_set_property_basic(default_ctrl->proxy, "Alias",
                                        DBUS_TYPE_STRING, &name,
                                        generic_callback, name, g_free) =
=3D=3D TRUE)
quoted hunk ↗ jump to hunk
                return;
@@ -849,7 +926,7 @@ static void cmd_power(const char *arg)

        str =3D g_strdup_printf("power %s", powered =3D=3D TRUE ? "on" : =
"off");
-       if (g_dbus_proxy_set_property_basic(default_ctrl, "Powered",
+       if (g_dbus_proxy_set_property_basic(default_ctrl->proxy, "Powered=
",
                                        DBUS_TYPE_BOOLEAN, &powered,
                                        generic_callback, str, g_free) =
=3D=3D TRUE)
quoted hunk ↗ jump to hunk
                return;
@@ -870,7 +947,7 @@ static void cmd_pairable(const char *arg)

        str =3D g_strdup_printf("pairable %s", pairable =3D=3D TRUE ? "on=
" : "off");
-       if (g_dbus_proxy_set_property_basic(default_ctrl, "Pairable",
+       if (g_dbus_proxy_set_property_basic(default_ctrl->proxy, "Pairabl=
e",
                                        DBUS_TYPE_BOOLEAN, &pairable,
                                        generic_callback, str, g_free) =
=3D=3D TRUE)
quoted hunk ↗ jump to hunk
                return;
@@ -892,7 +969,7 @@ static void cmd_discoverable(const char *arg)
        str =3D g_strdup_printf("discoverable %s",
                                discoverable =3D=3D TRUE ? "on" : "off");

-       if (g_dbus_proxy_set_property_basic(default_ctrl, "Discoverable",
+       if (g_dbus_proxy_set_property_basic(default_ctrl->proxy, "Discove=
rable",
                                        DBUS_TYPE_BOOLEAN, &discoverable,
                                        generic_callback, str, g_free) =
=3D=3D TRUE)
quoted hunk ↗ jump to hunk
                return;
@@ -966,7 +1043,7 @@ static void cmd_scan(const char *arg)
        else
                method =3D "StopDiscovery";

-       if (g_dbus_proxy_method_call(default_ctrl, method,
+       if (g_dbus_proxy_method_call(default_ctrl->proxy, method,
                                NULL, start_discovery_reply,
                                GUINT_TO_POINTER(enable), NULL) =3D=3D FA=
LSE) {
quoted hunk ↗ jump to hunk
                rl_printf("Failed to %s discovery\n",
@@ -1135,7 +1212,7 @@ static void cmd_set_scan_filter_commit(void)
        if (check_default_ctrl() =3D=3D FALSE)
                return;

-       if (g_dbus_proxy_method_call(default_ctrl, "SetDiscoveryFilter",
+       if (g_dbus_proxy_method_call(default_ctrl->proxy, "SetDiscoveryFi=
lter",
quoted hunk ↗ jump to hunk
                set_discovery_filter_setup, set_discovery_filter_reply,
                &args, NULL) =3D=3D FALSE) {
                rl_printf("Failed to set discovery filter\n");
@@ -1224,7 +1301,10 @@ static void cmd_set_scan_filter_clear(const char *=
arg)
quoted hunk ↗ jump to hunk
        g_free(filtered_scan_transport);
        filtered_scan_transport =3D NULL;

-       if (g_dbus_proxy_method_call(default_ctrl, "SetDiscoveryFilter",
+       if (check_default_ctrl() =3D=3D FALSE)
+               return;
+
+       if (g_dbus_proxy_method_call(default_ctrl->proxy, "SetDiscoveryFi=
lter",
quoted hunk ↗ jump to hunk
                clear_discovery_filter_setup, set_discovery_filter_reply,
                NULL, NULL) =3D=3D FALSE) {
                rl_printf("Failed to clear discovery filter\n");
@@ -1242,7 +1322,10 @@ static struct GDBusProxy *find_device(const char *=
arg)
quoted hunk ↗ jump to hunk
                return NULL;
        }

-       proxy =3D find_proxy_by_address(dev_list, arg);
+       if (check_default_ctrl() =3D=3D FALSE)
+               return NULL;
+
+       proxy =3D find_proxy_by_address(default_ctrl->devices, arg);
        if (!proxy) {
                rl_printf("Device %s not available\n", arg);
                return NULL;
@@ -1432,8 +1515,11 @@ static void remove_device(GDBusProxy *proxy)
        char *path;

        path =3D g_strdup(g_dbus_proxy_get_path(proxy));
+
+       if (!default_ctrl)
+               return;

-       if (g_dbus_proxy_method_call(default_ctrl, "RemoveDevice",
+       if (g_dbus_proxy_method_call(default_ctrl->proxy, "RemoveDevice",
                                                remove_device_setup,
                                                remove_device_reply,
                                                path, g_free) =3D=3D FALS=
E) {
quoted hunk ↗ jump to hunk
@@ -1457,16 +1543,15 @@ static void cmd_remove(const char *arg)
        if (strcmp(arg, "*") =3D=3D 0) {
                GList *list;

-               for (list =3D g_list_first(dev_list); list; list =3D g_li=
st_next(list)) {
+               for (list =3D g_list_first(default_ctrl->devices); list; =
list =3D g_list_next(list)) {
quoted hunk ↗ jump to hunk
                        GDBusProxy *proxy =3D list->data;

                        remove_device(proxy);
                }
-
                return;
        }

-       proxy =3D find_proxy_by_address(dev_list, arg);
+       proxy =3D find_proxy_by_address(default_ctrl->devices, arg);
        if (!proxy) {
                rl_printf("Device %s not available\n", arg);
                return;
@@ -1502,7 +1587,10 @@ static void cmd_connect(const char *arg)
                return;
        }

-       proxy =3D find_proxy_by_address(dev_list, arg);
+       if (check_default_ctrl() =3D=3D FALSE)
+               return;
+
+       proxy =3D find_proxy_by_address(default_ctrl->devices, arg);
        if (!proxy) {
                rl_printf("Device %s not available\n", arg);
                return;
@@ -1712,7 +1800,7 @@ static void cmd_register_profile(const char *arg)
                return;
        }

-       gatt_register_profile(dbus_conn, default_ctrl, &w);
+       gatt_register_profile(dbus_conn, default_ctrl->proxy, &w);

        wordfree(&w);
 }
@@ -1722,7 +1810,7 @@ static void cmd_unregister_profile(const char *arg)
        if (check_default_ctrl() =3D=3D FALSE)
                return;

-       gatt_unregister_profile(dbus_conn, default_ctrl);
+       gatt_unregister_profile(dbus_conn, default_ctrl->proxy);
 }

 static void cmd_version(const char *arg)
@@ -1768,12 +1856,39 @@ static char *generic_generator(const char *text, =
int state,
quoted hunk ↗ jump to hunk

 static char *ctrl_generator(const char *text, int state)
 {
-       return generic_generator(text, state, ctrl_list, "Address");
+       static int index =3D 0;
+       static int len =3D 0;
+       GList *list;
+
+       if (!state) {
+               index =3D 0;
+               len =3D strlen(text);
+       }
+
+       for (list =3D g_list_nth(ctrl_list, index); list;
+                                               list =3D g_list_next(list=
)) {
quoted hunk ↗ jump to hunk
+               struct adapter *adapter =3D list->data;
+               DBusMessageIter iter;
+               const char *str;
+
+               index++;
+
+               if (g_dbus_proxy_get_property(adapter->proxy, "Address", =
&iter) =3D=3D FALSE)
quoted hunk ↗ jump to hunk
+                       continue;
+
+               dbus_message_iter_get_basic(&iter, &str);
+
+               if (!strncmp(str, text, len))
+                       return strdup(str);
+        }
+
+       return NULL;
 }

 static char *dev_generator(const char *text, int state)
 {
-       return generic_generator(text, state, dev_list, "Address");
+       return generic_generator(text, state,
+                       default_ctrl ? default_ctrl->devices : NULL, "Add=
ress");
quoted hunk ↗ jump to hunk
 }

 static char *attribute_generator(const char *text, int state)
@@ -2294,7 +2409,6 @@ int main(int argc, char *argv[])
        g_main_loop_unref(main_loop);

        g_list_free_full(ctrl_list, proxy_leak);
-       g_list_free_full(dev_list, proxy_leak);

        g_free(auto_register_agent);

--
2.7.4
Could you please fix these errors:

Applying: client: Add better support for managing devices of multiple
controllers
.git/rebase-apply/patch:89: trailing whitespace.
if (device_is_child(device, adapter->proxy) =3D=3D TRUE)
.git/rebase-apply/patch:446: trailing whitespace.
.git/rebase-apply/patch:541: trailing whitespace.
return generic_generator(text, state,
fatal: 3 lines add whitespace errors.


--=20
Luiz Augusto von Dentz
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help