mirror of git://git.sysmocom.de/ofono
hfp_hf_bluez5: Rework code handling device changes
This splits the handling of device changes and modem registration so they can be uses separately.
This commit is contained in:
parent
f23ea6b45f
commit
94839129d9
|
@ -176,11 +176,42 @@ static int service_level_connection(struct ofono_modem *modem,
|
||||||
return -EINPROGRESS;
|
return -EINPROGRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ofono_modem *modem_register(const char *device,
|
static void modem_removed(GDBusProxy *proxy, void *user_data)
|
||||||
const char *device_address, const char *alias)
|
{
|
||||||
|
struct ofono_modem *modem = user_data;
|
||||||
|
|
||||||
|
ofono_modem_remove(modem);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void alias_changed(GDBusProxy *proxy, const char *name,
|
||||||
|
DBusMessageIter *iter, void *user_data)
|
||||||
|
{
|
||||||
|
const char *alias;
|
||||||
|
struct ofono_modem *modem = user_data;
|
||||||
|
|
||||||
|
if (g_str_equal("Alias", name) == FALSE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
dbus_message_iter_get_basic(iter, &alias);
|
||||||
|
ofono_modem_set_name(modem, alias);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct ofono_modem *modem_register(const char *device, GDBusProxy *proxy)
|
||||||
{
|
{
|
||||||
struct ofono_modem *modem;
|
struct ofono_modem *modem;
|
||||||
char *path;
|
char *path;
|
||||||
|
DBusMessageIter iter;
|
||||||
|
const char *alias, *remote;
|
||||||
|
|
||||||
|
if (g_dbus_proxy_get_property(proxy, "Alias", &iter) == FALSE)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
dbus_message_iter_get_basic(&iter, &alias);
|
||||||
|
|
||||||
|
if (g_dbus_proxy_get_property(proxy, "Address", &iter) == FALSE)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
dbus_message_iter_get_basic(&iter, &remote);
|
||||||
|
|
||||||
path = g_strconcat("hfp", device, NULL);
|
path = g_strconcat("hfp", device, NULL);
|
||||||
|
|
||||||
|
@ -191,12 +222,15 @@ static struct ofono_modem *modem_register(const char *device,
|
||||||
if (modem == NULL)
|
if (modem == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
ofono_modem_set_string(modem, "Remote", device_address);
|
ofono_modem_set_string(modem, "Remote", remote);
|
||||||
ofono_modem_set_string(modem, "DevicePath", device);
|
ofono_modem_set_string(modem, "DevicePath", device);
|
||||||
|
|
||||||
ofono_modem_set_name(modem, alias);
|
ofono_modem_set_name(modem, alias);
|
||||||
ofono_modem_register(modem);
|
ofono_modem_register(modem);
|
||||||
|
|
||||||
|
g_dbus_proxy_set_property_watch(proxy, alias_changed, modem);
|
||||||
|
g_dbus_proxy_set_removed_watch(proxy, modem_removed, modem);
|
||||||
|
|
||||||
return modem;
|
return modem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -522,30 +556,15 @@ static gboolean has_hfp_ag_uuid(DBusMessageIter *array)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void modem_removed(GDBusProxy *proxy, void *user_data)
|
static void modem_unregister(struct ofono_modem *modem, GDBusProxy *proxy)
|
||||||
{
|
{
|
||||||
struct ofono_modem *modem = user_data;
|
|
||||||
|
|
||||||
ofono_modem_remove(modem);
|
ofono_modem_remove(modem);
|
||||||
|
g_dbus_proxy_set_removed_watch(proxy, NULL, NULL);
|
||||||
|
g_dbus_proxy_set_property_watch(proxy, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void alias_changed(GDBusProxy *proxy, const char *name,
|
static void *device_changed(GDBusProxy *proxy, const char *path)
|
||||||
DBusMessageIter *iter, void *user_data)
|
|
||||||
{
|
{
|
||||||
const char *alias;
|
|
||||||
struct ofono_modem *modem = user_data;
|
|
||||||
|
|
||||||
if (g_str_equal("Alias", name) == FALSE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
dbus_message_iter_get_basic(iter, &alias);
|
|
||||||
ofono_modem_set_name(modem, alias);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct ofono_modem *modem_register_from_proxy(GDBusProxy *proxy,
|
|
||||||
const char *path)
|
|
||||||
{
|
|
||||||
const char *alias, *remote;
|
|
||||||
DBusMessageIter iter;
|
DBusMessageIter iter;
|
||||||
dbus_bool_t paired;
|
dbus_bool_t paired;
|
||||||
struct ofono_modem *modem;
|
struct ofono_modem *modem;
|
||||||
|
@ -558,36 +577,23 @@ static struct ofono_modem *modem_register_from_proxy(GDBusProxy *proxy,
|
||||||
modem = ofono_modem_find(device_path_compare, (void *) path);
|
modem = ofono_modem_find(device_path_compare, (void *) path);
|
||||||
|
|
||||||
if (paired == FALSE) {
|
if (paired == FALSE) {
|
||||||
if (modem != NULL) {
|
if (modem != NULL)
|
||||||
ofono_modem_remove(modem);
|
modem_unregister(modem, proxy);
|
||||||
g_dbus_proxy_set_removed_watch(proxy, NULL, NULL);
|
|
||||||
g_dbus_proxy_set_property_watch(proxy, NULL, NULL);
|
|
||||||
}
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (g_dbus_proxy_get_property(proxy, "UUIDs", &iter) == FALSE ||
|
||||||
|
has_hfp_ag_uuid(&iter) == FALSE) {
|
||||||
|
if (modem != NULL)
|
||||||
|
modem_unregister(modem, proxy);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Skip if modem already registered */
|
||||||
if (modem)
|
if (modem)
|
||||||
return modem;
|
return modem;
|
||||||
|
|
||||||
if (g_dbus_proxy_get_property(proxy, "UUIDs", &iter) == FALSE)
|
modem = modem_register(path, proxy);
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (has_hfp_ag_uuid(&iter) == FALSE)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (g_dbus_proxy_get_property(proxy, "Alias", &iter) == FALSE)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
dbus_message_iter_get_basic(&iter, &alias);
|
|
||||||
|
|
||||||
if (g_dbus_proxy_get_property(proxy, "Address", &iter) == FALSE)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
dbus_message_iter_get_basic(&iter, &remote);
|
|
||||||
|
|
||||||
modem = modem_register(path, remote, alias);
|
|
||||||
g_dbus_proxy_set_property_watch(proxy, alias_changed, modem);
|
|
||||||
g_dbus_proxy_set_removed_watch(proxy, modem_removed, modem);
|
|
||||||
|
|
||||||
return modem;
|
return modem;
|
||||||
}
|
}
|
||||||
|
@ -637,7 +643,7 @@ static DBusMessage *profile_new_connection(DBusConnection *conn,
|
||||||
GDBusProxy *proxy;
|
GDBusProxy *proxy;
|
||||||
|
|
||||||
proxy = g_dbus_proxy_new(bluez, device, BLUEZ_DEVICE_INTERFACE);
|
proxy = g_dbus_proxy_new(bluez, device, BLUEZ_DEVICE_INTERFACE);
|
||||||
modem = modem_register_from_proxy(proxy, device);
|
modem = modem_register(device, proxy);
|
||||||
g_dbus_proxy_unref(proxy);
|
g_dbus_proxy_unref(proxy);
|
||||||
|
|
||||||
if (!modem) {
|
if (!modem) {
|
||||||
|
@ -797,7 +803,7 @@ static void proxy_added(GDBusProxy *proxy, void *user_data)
|
||||||
if (g_str_equal(BLUEZ_DEVICE_INTERFACE, interface) == FALSE)
|
if (g_str_equal(BLUEZ_DEVICE_INTERFACE, interface) == FALSE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
modem_register_from_proxy(proxy, path);
|
device_changed(proxy, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void property_changed(GDBusProxy *proxy, const char *name,
|
static void property_changed(GDBusProxy *proxy, const char *name,
|
||||||
|
@ -815,7 +821,7 @@ static void property_changed(GDBusProxy *proxy, const char *name,
|
||||||
g_str_equal("ServicesResolved", name) != TRUE)
|
g_str_equal("ServicesResolved", name) != TRUE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
modem_register_from_proxy(proxy, path);
|
device_changed(proxy, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hfp_init(void)
|
static int hfp_init(void)
|
||||||
|
|
Loading…
Reference in New Issue