diff --git a/client/main.c b/client/main.c
index 4d31570..b8eb707 100644
--- a/client/main.c
+++ b/client/main.c
static GMainLoop *main_loop;
static DBusConnection *dbus_conn;
-static GList *ctrl_list;
-static GDBusProxy *default_ctrl;
static GDBusProxy *agent_manager;
static gboolean auto_register_agent = FALSE;
+static GDBusProxy *default_ctrl;
+static GList *ctrl_list;
+static GList *dev_list;
+
static void connect_handler(DBusConnection *connection, void *user_data)
{
rl_set_prompt(COLOR_BLUE "[bluetooth]" COLOR_OFF "# ");
printf("\r");
rl_on_new_line();
rl_redisplay();
+
+ default_ctrl = NULL;
}
static void disconnect_handler(DBusConnection *connection, void *user_data)
printf("\r");
rl_on_new_line();
rl_redisplay();
+
+ g_list_free(ctrl_list);
+ ctrl_list = NULL;
}
static void print_adapter(GDBusProxy *proxy, const char *description)
print_iter("\t", name, &iter);
}
+static gboolean device_is_child(GDBusProxy *device, GDBusProxy *master)
+{
+ DBusMessageIter iter;
+ const char *adapter, *path;
+
+ if (!master)
+ return FALSE;
+
+ if (g_dbus_proxy_get_property(device, "Adapter", &iter) == FALSE)
+ return FALSE;
+
+ dbus_message_iter_get_basic(&iter, &adapter);
+ path = g_dbus_proxy_get_path(master);
+
+ if (!strcmp(path, adapter))
+ return TRUE;
+
+ return FALSE;
+}
+
static void proxy_added(GDBusProxy *proxy, void *user_data)
{
const char *interface;
interface = g_dbus_proxy_get_interface(proxy);
- if (!strcmp(interface, "org.bluez.Adapter1")) {
+ if (!strcmp(interface, "org.bluez.Device1")) {
+ if (device_is_child(proxy, default_ctrl) == TRUE) {
+ dev_list = g_list_append(dev_list, proxy);
+
+ begin_message();
+ print_device(proxy, "NEW");
+ end_message();
+ }
+ } else if (!strcmp(interface, "org.bluez.Adapter1")) {
ctrl_list = g_list_append(ctrl_list, proxy);
if (!default_ctrl)
interface = g_dbus_proxy_get_interface(proxy);
- if (!strcmp(interface, "org.bluez.Adapter1")) {
+ if (!strcmp(interface, "org.bluez.Device1")) {
+ if (device_is_child(proxy, default_ctrl) == TRUE) {
+ dev_list = g_list_remove(dev_list, proxy);
+
+ begin_message();
+ print_device(proxy, "DEL");
+ end_message();
+ }
+ } else if (!strcmp(interface, "org.bluez.Adapter1")) {
ctrl_list = g_list_remove(ctrl_list, proxy);
begin_message();
print_adapter(proxy, "DEL");
end_message();
- if (default_ctrl == proxy)
+ if (default_ctrl == proxy) {
default_ctrl = NULL;
+
+ g_list_free(dev_list);
+ dev_list = NULL;
+ }
} else if (!strcmp(interface, "org.bluez.AgentManager1")) {
if (agent_manager == proxy)
agent_manager = NULL;
interface = g_dbus_proxy_get_interface(proxy);
- if (!strcmp(interface, "org.bluez.Adapter1")) {
+ if (!strcmp(interface, "org.bluez.Device1")) {
+ if (device_is_child(proxy, default_ctrl) == TRUE) {
+ DBusMessageIter addr_iter;
+
+ begin_message();
+
+ if (g_dbus_proxy_get_property(proxy, "Address",
+ &addr_iter) == TRUE) {
+ const char *address;
+
+ dbus_message_iter_get_basic(&addr_iter,
+ &address);
+ printf("[CHG] Device %s ", address);
+ }
+
+ print_iter("", name, iter);
+ end_message();
+ }
+ } else if (!strcmp(interface, "org.bluez.Adapter1")) {
DBusMessageIter addr_iter;
begin_message();
dbus_message_iter_get_basic(&iter, &str);
- if (!strcmp(address, str))
+ if (!strcmp(str, address))
return proxy;
}
print_adapter(proxy, NULL);
}
+static void cmd_devices(const char *arg)
+{
+ GList *list;
+
+ for (list = g_list_first(dev_list); list; list = g_list_next(list)) {
+ GDBusProxy *proxy = list->data;
+ print_device(proxy, NULL);
+ }
+}
+
static void generic_callback(const DBusError *error, void *user_data)
{
char *str = user_data;
ctrl_generator },
{ "select", "<ctrl>", cmd_select, "Select default controller",
ctrl_generator },
+ { "devices", NULL, cmd_devices, "List available devices" },
{ "power", "<on/off>", cmd_power, "Set controller power" },
{ "name", "<name>", cmd_name, "Set controller local name" },
{ "pairable", "<on/off>", cmd_pairable,