summaryrefslogtreecommitdiff
path: root/src/supplicant-manager
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2013-06-05 08:01:46 -0500
committerDan Williams <dcbw@redhat.com>2013-06-07 11:33:42 -0500
commit309ecf4f90d73c3578961604ff264c9edc9eb47b (patch)
treefe8bcb53d3b7e80e793cf24619d96909a8c8529d /src/supplicant-manager
parent1666b0c3069392737f0d55e7df6b4f185ea6c125 (diff)
downloadNetworkManager-309ecf4f90d73c3578961604ff264c9edc9eb47b.tar.gz
wifi: remove NMSupplicantInfo pending call tracking struct
The sole purpose of this structure was to track in-progress D-Bus pending calls, so that they could be selectively canceled if the supplicant got disconnected during assocation (canceling only assocation-related calls) or if the supplicant went away (canceling both assocation-related and general calls). But its only benefit over NMCallStore alone was knowing which list of pending calls to remove the current pending call from, and we can just explicitly do that in the code instead. Thus, the SupplicantInfo structure is removed and replaced with explicitly adding and removing the pending calls from the call store. (The DBusGProxy is not referenced by dbus_g_proxy_begin_call(), the caller is expected to hold a reference to the proxy for as long as necessary, and when the proxy is destroyed, all its pending calls will be canceled. Since the supplicant interface owns the proxies, there's no possibility that the proxy will outlive the supplicant interface and thus call back into it when its dead. The old code referenced the supplicant interface over the life of the pending call, but that's not necessary.)
Diffstat (limited to 'src/supplicant-manager')
-rw-r--r--src/supplicant-manager/nm-supplicant-interface.c311
1 files changed, 116 insertions, 195 deletions
diff --git a/src/supplicant-manager/nm-supplicant-interface.c b/src/supplicant-manager/nm-supplicant-interface.c
index 3aeb75732f..ce02ecbb80 100644
--- a/src/supplicant-manager/nm-supplicant-interface.c
+++ b/src/supplicant-manager/nm-supplicant-interface.c
@@ -99,6 +99,7 @@ typedef struct {
gboolean scanning;
DBusGProxy * wpas_proxy;
+ DBusGProxy * introspect_proxy;
DBusGProxy * iface_proxy;
DBusGProxy * props_proxy;
char * net_path;
@@ -112,70 +113,6 @@ typedef struct {
gboolean disposed;
} NMSupplicantInterfacePrivate;
-typedef struct {
- NMSupplicantInterface *interface;
- DBusGProxy *proxy;
- NMCallStore *store;
- DBusGProxyCall *call;
- gboolean disposing;
-} NMSupplicantInfo;
-
-static NMSupplicantInfo *
-nm_supplicant_info_new (NMSupplicantInterface *interface,
- DBusGProxy *proxy,
- NMCallStore *store)
-{
- NMSupplicantInfo *info;
-
- info = g_slice_new0 (NMSupplicantInfo);
- info->interface = g_object_ref (interface);
- info->proxy = g_object_ref (proxy);
- info->store = store;
-
- return info;
-}
-
-static void
-nm_supplicant_info_set_call (NMSupplicantInfo *info, DBusGProxyCall *call)
-{
- g_return_if_fail (info != NULL);
- g_return_if_fail (call != NULL);
-
- nm_call_store_add (info->store, info->proxy, call);
- info->call = call;
-}
-
-static void
-nm_supplicant_info_destroy (gpointer user_data)
-{
- NMSupplicantInfo *info = (NMSupplicantInfo *) user_data;
-
- /* Guard against double-disposal; since DBusGProxy doesn't guard against
- * double-disposal, we could infinite loop here if we're in the middle of
- * some wpa_supplicant D-Bus calls. When the supplicant dies we'll dispose
- * of the proxy, which kills all its pending calls, which brings us here.
- * Then when we unref the proxy here, its dispose() function will get called
- * again, and we get right back here until we segfault because our callstack
- * is too long.
- */
- if (!info->disposing) {
- info->disposing = TRUE;
-
- if (info->call) {
- nm_call_store_remove (info->store, info->proxy, info->call);
- info->call = NULL;
- }
-
- g_object_unref (info->proxy);
- info->proxy = NULL;
- g_object_unref (info->interface);
- info->interface = NULL;
-
- memset (info, 0, sizeof (NMSupplicantInfo));
- g_slice_free (NMSupplicantInfo, info);
- }
-}
-
static void
emit_error_helper (NMSupplicantInterface *self,
GError *err)
@@ -199,14 +136,16 @@ signal_new_bss (NMSupplicantInterface *self,
static void
bssid_properties_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
{
- NMSupplicantInfo *info = (NMSupplicantInfo *) user_data;
+ NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
+ NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
GError *error = NULL;
GHashTable *props = NULL;
+ nm_call_store_remove (priv->other_pcalls, proxy, call_id);
if (dbus_g_proxy_end_call (proxy, call_id, &error,
DBUS_TYPE_G_MAP_OF_VARIANT, &props,
G_TYPE_INVALID)) {
- signal_new_bss (info->interface, dbus_g_proxy_get_path (proxy), props);
+ signal_new_bss (self, dbus_g_proxy_get_path (proxy), props);
g_hash_table_destroy (props);
} else {
if (!strstr (error->message, "The BSSID requested was invalid")) {
@@ -241,7 +180,6 @@ handle_new_bss (NMSupplicantInterface *self,
{
NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
DBusGProxy *bss_proxy;
- NMSupplicantInfo *info;
DBusGProxyCall *call;
g_return_if_fail (object_path != NULL);
@@ -272,14 +210,13 @@ handle_new_bss (NMSupplicantInterface *self,
if (props) {
signal_new_bss (self, object_path, props);
} else {
- info = nm_supplicant_info_new (self, bss_proxy, priv->other_pcalls);
call = dbus_g_proxy_begin_call (bss_proxy, "GetAll",
bssid_properties_cb,
- info,
- nm_supplicant_info_destroy,
+ self,
+ NULL,
G_TYPE_STRING, WPAS_DBUS_IFACE_BSS,
G_TYPE_INVALID);
- nm_supplicant_info_set_call (info, call);
+ nm_call_store_add (priv->other_pcalls, bss_proxy, call);
}
}
@@ -577,38 +514,38 @@ iface_check_ready (NMSupplicantInterface *self)
static void
iface_get_props_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
{
- NMSupplicantInfo *info = (NMSupplicantInfo *) user_data;
+ NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
+ NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
GHashTable *props = NULL;
GError *error = NULL;
+ nm_call_store_remove (priv->other_pcalls, proxy, call_id);
if (dbus_g_proxy_end_call (proxy, call_id, &error,
DBUS_TYPE_G_MAP_OF_VARIANT, &props,
G_TYPE_INVALID)) {
- wpas_iface_properties_changed (NULL, props, info->interface);
+ wpas_iface_properties_changed (NULL, props, self);
g_hash_table_destroy (props);
} else {
nm_log_warn (LOGD_SUPPLICANT, "could not get interface properties: %s.",
error && error->message ? error->message : "(unknown)");
g_clear_error (&error);
}
- iface_check_ready (info->interface);
+ iface_check_ready (self);
}
static void
wpas_iface_get_props (NMSupplicantInterface *self)
{
NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- NMSupplicantInfo *info;
DBusGProxyCall *call;
- info = nm_supplicant_info_new (self, priv->props_proxy, priv->other_pcalls);
call = dbus_g_proxy_begin_call (priv->props_proxy, "GetAll",
iface_get_props_cb,
- info,
- nm_supplicant_info_destroy,
+ self,
+ NULL,
G_TYPE_STRING, WPAS_DBUS_IFACE_INTERFACE,
G_TYPE_INVALID);
- nm_supplicant_info_set_call (info, call);
+ nm_call_store_add (priv->other_pcalls, priv->props_proxy, call);
}
gboolean
@@ -657,10 +594,11 @@ wpas_iface_network_request (DBusGProxy *proxy,
static void
iface_check_netreply_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
{
- NMSupplicantInfo *info = (NMSupplicantInfo *) user_data;
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (info->interface);
+ NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
+ NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
GError *error = NULL;
+ nm_call_store_remove (priv->other_pcalls, proxy, call_id);
if ( dbus_g_proxy_end_call (proxy, call_id, &error, G_TYPE_INVALID)
|| dbus_g_error_has_name (error, "fi.w1.wpa_supplicant1.InvalidArgs")) {
/* We know NetworkReply is supported if the NetworkReply method returned
@@ -676,27 +614,25 @@ iface_check_netreply_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer us
}
g_clear_error (&error);
- iface_check_ready (info->interface);
+ iface_check_ready (self);
}
static void
wpas_iface_check_network_reply (NMSupplicantInterface *self)
{
NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- NMSupplicantInfo *info;
DBusGProxyCall *call;
priv->ready_count++;
- info = nm_supplicant_info_new (self, priv->iface_proxy, priv->other_pcalls);
call = dbus_g_proxy_begin_call (priv->iface_proxy, "NetworkReply",
iface_check_netreply_cb,
- info,
- nm_supplicant_info_destroy,
+ self,
+ NULL,
DBUS_TYPE_G_OBJECT_PATH, "/foobaraasdfasdf",
G_TYPE_STRING, "foobar",
G_TYPE_STRING, "foobar",
G_TYPE_INVALID);
- nm_supplicant_info_set_call (info, call);
+ nm_call_store_add (priv->other_pcalls, priv->iface_proxy, call);
}
ApSupport
@@ -721,11 +657,12 @@ nm_supplicant_interface_set_ap_support (NMSupplicantInterface *self,
static void
iface_check_ap_mode_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
{
- NMSupplicantInfo *info = (NMSupplicantInfo *) user_data;
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (info->interface);
+ NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
+ NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
char *data;
/* The ProbeRequest method only exists if AP mode has been enabled */
+ nm_call_store_remove (priv->other_pcalls, proxy, call_id);
if (dbus_g_proxy_end_call (proxy, call_id, NULL,
G_TYPE_STRING,
&data,
@@ -735,38 +672,28 @@ iface_check_ap_mode_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer use
g_free (data);
}
- iface_check_ready (info->interface);
+ iface_check_ready (self);
}
static void
wpas_iface_check_ap_mode (NMSupplicantInterface *self)
{
NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- NMSupplicantInfo *info;
DBusGProxyCall *call;
- DBusGProxy *proxy;
priv->ready_count++;
- proxy = dbus_g_proxy_new_for_name (nm_dbus_manager_get_connection (priv->dbus_mgr),
- WPAS_DBUS_SERVICE,
- priv->object_path,
- DBUS_INTERFACE_INTROSPECTABLE);
-
- info = nm_supplicant_info_new (self, proxy, priv->other_pcalls);
- g_object_unref (proxy);
-
/* If the global supplicant capabilities property is not present, we can
* fall back to checking whether the ProbeRequest method is supported. If
* neither of these works we have no way of determining if AP mode is
* supported or not. hostap 1.0 and earlier don't support either of these.
*/
- call = dbus_g_proxy_begin_call (proxy, "Introspect",
+ call = dbus_g_proxy_begin_call (priv->introspect_proxy, "Introspect",
iface_check_ap_mode_cb,
- info,
- nm_supplicant_info_destroy,
+ self,
+ NULL,
G_TYPE_INVALID);
- nm_supplicant_info_set_call (info, call);
+ nm_call_store_add (priv->other_pcalls, priv->introspect_proxy, call);
}
static void
@@ -836,6 +763,11 @@ interface_add_done (NMSupplicantInterface *self, char *path)
self,
NULL);
+ priv->introspect_proxy = dbus_g_proxy_new_for_name (nm_dbus_manager_get_connection (priv->dbus_mgr),
+ WPAS_DBUS_SERVICE,
+ priv->object_path,
+ DBUS_INTERFACE_INTROSPECTABLE);
+
priv->props_proxy = dbus_g_proxy_new_for_name (nm_dbus_manager_get_connection (priv->dbus_mgr),
WPAS_DBUS_SERVICE,
path,
@@ -851,24 +783,23 @@ interface_add_done (NMSupplicantInterface *self, char *path)
}
static void
-interface_get_cb (DBusGProxy *proxy,
- DBusGProxyCall *call_id,
- gpointer user_data)
+interface_get_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
{
- NMSupplicantInfo *info = (NMSupplicantInfo *) user_data;
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (info->interface);
+ NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
+ NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
GError *error = NULL;
char *path = NULL;
+ nm_call_store_remove (priv->other_pcalls, proxy, call_id);
if (dbus_g_proxy_end_call (proxy, call_id, &error,
DBUS_TYPE_G_OBJECT_PATH, &path,
G_TYPE_INVALID)) {
- interface_add_done (info->interface, path);
+ interface_add_done (self, path);
} else {
nm_log_err (LOGD_SUPPLICANT, "(%s): error getting interface: %s",
priv->dev, error->message);
g_clear_error (&error);
- set_state (info->interface, NM_SUPPLICANT_INTERFACE_STATE_DOWN);
+ set_state (self, NM_SUPPLICANT_INTERFACE_STATE_DOWN);
}
}
@@ -876,37 +807,34 @@ static void
interface_get (NMSupplicantInterface *self)
{
NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
- NMSupplicantInfo *info;
DBusGProxyCall *call;
- info = nm_supplicant_info_new (self, priv->wpas_proxy, priv->other_pcalls);
call = dbus_g_proxy_begin_call (priv->wpas_proxy, "GetInterface",
interface_get_cb,
- info,
- nm_supplicant_info_destroy,
+ self,
+ NULL,
G_TYPE_STRING, priv->dev,
G_TYPE_INVALID);
- nm_supplicant_info_set_call (info, call);
+ nm_call_store_add (priv->other_pcalls, priv->wpas_proxy, call);
}
static void
-interface_add_cb (DBusGProxy *proxy,
- DBusGProxyCall *call_id,
- gpointer user_data)
+interface_add_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
{
- NMSupplicantInfo *info = (NMSupplicantInfo *) user_data;
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (info->interface);
+ NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
+ NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
GError *error = NULL;
char *path = NULL;
+ nm_call_store_remove (priv->other_pcalls, proxy, call_id);
if (dbus_g_proxy_end_call (proxy, call_id, &error,
DBUS_TYPE_G_OBJECT_PATH, &path,
G_TYPE_INVALID)) {
- interface_add_done (info->interface, path);
+ interface_add_done (self, path);
} else {
if (dbus_g_error_has_name (error, WPAS_ERROR_EXISTS_ERROR)) {
/* Interface already added, just get its object path */
- interface_get (info->interface);
+ interface_get (self);
} else if ( g_error_matches (error, DBUS_GERROR, DBUS_GERROR_SERVICE_UNKNOWN)
|| g_error_matches (error, DBUS_GERROR, DBUS_GERROR_SPAWN_EXEC_FAILED)
|| g_error_matches (error, DBUS_GERROR, DBUS_GERROR_SPAWN_FORK_FAILED)
@@ -919,11 +847,11 @@ interface_add_cb (DBusGProxy *proxy,
*/
nm_log_dbg (LOGD_SUPPLICANT, "(%s): failed to activate supplicant: %s",
priv->dev, error->message);
- set_state (info->interface, NM_SUPPLICANT_INTERFACE_STATE_INIT);
+ set_state (self, NM_SUPPLICANT_INTERFACE_STATE_INIT);
} else {
nm_log_err (LOGD_SUPPLICANT, "(%s): error adding interface: %s",
priv->dev, error->message);
- set_state (info->interface, NM_SUPPLICANT_INTERFACE_STATE_DOWN);
+ set_state (self, NM_SUPPLICANT_INTERFACE_STATE_DOWN);
}
g_clear_error (&error);
}
@@ -940,9 +868,9 @@ interface_add (NMSupplicantInterface *self, gboolean is_wireless)
{
NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
DBusGProxyCall *call;
- NMSupplicantInfo *info;
GHashTable *hash;
- GValue *driver, *ifname;
+ GValue driver = G_VALUE_INIT;
+ GValue ifname = G_VALUE_INIT;
/* Can only start the interface from INIT state */
g_return_if_fail (priv->state == NM_SUPPLICANT_INTERFACE_STATE_INIT);
@@ -957,34 +885,27 @@ interface_add (NMSupplicantInterface *self, gboolean is_wireless)
* when the supplicant has started.
*/
- info = nm_supplicant_info_new (self, priv->wpas_proxy, priv->other_pcalls);
-
hash = g_hash_table_new (g_str_hash, g_str_equal);
- driver = g_new0 (GValue, 1);
- g_value_init (driver, G_TYPE_STRING);
- g_value_set_string (driver, is_wireless ? DEFAULT_WIFI_DRIVER : "wired");
- g_hash_table_insert (hash, "Driver", driver);
+ g_value_init (&driver, G_TYPE_STRING);
+ g_value_set_string (&driver, is_wireless ? DEFAULT_WIFI_DRIVER : "wired");
+ g_hash_table_insert (hash, "Driver", &driver);
- ifname = g_new0 (GValue, 1);
- g_value_init (ifname, G_TYPE_STRING);
- g_value_set_string (ifname, priv->dev);
- g_hash_table_insert (hash, "Ifname", ifname);
+ g_value_init (&ifname, G_TYPE_STRING);
+ g_value_set_string (&ifname, priv->dev);
+ g_hash_table_insert (hash, "Ifname", &ifname);
call = dbus_g_proxy_begin_call (priv->wpas_proxy, "CreateInterface",
interface_add_cb,
- info,
- nm_supplicant_info_destroy,
+ self,
+ NULL,
DBUS_TYPE_G_MAP_OF_VARIANT, hash,
G_TYPE_INVALID);
+ nm_call_store_add (priv->other_pcalls, priv->wpas_proxy, call);
g_hash_table_destroy (hash);
- g_value_unset (driver);
- g_free (driver);
- g_value_unset (ifname);
- g_free (ifname);
-
- nm_supplicant_info_set_call (info, call);
+ g_value_unset (&driver);
+ g_value_unset (&ifname);
}
static void
@@ -1073,12 +994,14 @@ nm_supplicant_interface_disconnect (NMSupplicantInterface * self)
static void
select_network_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
{
- NMSupplicantInfo *info = (NMSupplicantInfo *) user_data;
+ NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
+ NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
GError *err = NULL;
+ nm_call_store_remove (priv->assoc_pcalls, proxy, call_id);
if (!dbus_g_proxy_end_call (proxy, call_id, &err, G_TYPE_INVALID)) {
nm_log_warn (LOGD_SUPPLICANT, "Couldn't select network config: %s.", err->message);
- emit_error_helper (info->interface, err);
+ emit_error_helper (self, err);
g_error_free (err);
}
}
@@ -1088,61 +1011,59 @@ call_select_network (NMSupplicantInterface *self)
{
NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
DBusGProxyCall *call;
- NMSupplicantInfo *info;
/* We only select the network after all blobs (if any) have been set */
- if (priv->blobs_left > 0)
- return;
-
- info = nm_supplicant_info_new (self, priv->iface_proxy, priv->assoc_pcalls);
- call = dbus_g_proxy_begin_call (priv->iface_proxy, "SelectNetwork",
- select_network_cb,
- info,
- nm_supplicant_info_destroy,
- DBUS_TYPE_G_OBJECT_PATH, priv->net_path,
- G_TYPE_INVALID);
- nm_supplicant_info_set_call (info, call);
+ if (priv->blobs_left == 0) {
+ call = dbus_g_proxy_begin_call (priv->iface_proxy, "SelectNetwork",
+ select_network_cb,
+ self,
+ NULL,
+ DBUS_TYPE_G_OBJECT_PATH, priv->net_path,
+ G_TYPE_INVALID);
+ nm_call_store_add (priv->assoc_pcalls, priv->iface_proxy, call);
+ }
}
static void
add_blob_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
{
- NMSupplicantInfo *info = (NMSupplicantInfo *) user_data;
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (info->interface);
+ NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
+ NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
GError *err = NULL;
guint tmp;
priv->blobs_left--;
+ nm_call_store_remove (priv->assoc_pcalls, proxy, call_id);
if (!dbus_g_proxy_end_call (proxy, call_id, &err, G_TYPE_UINT, &tmp, G_TYPE_INVALID)) {
nm_log_warn (LOGD_SUPPLICANT, "Couldn't set network certificates: %s.", err->message);
- emit_error_helper (info->interface, err);
+ emit_error_helper (self, err);
g_error_free (err);
} else
- call_select_network (info->interface);
+ call_select_network (self);
}
static void
add_network_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
{
- NMSupplicantInfo *info = (NMSupplicantInfo *) user_data;
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (info->interface);
+ NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
+ NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
GError *err = NULL;
GHashTable *blobs;
GHashTableIter iter;
gpointer name, data;
DBusGProxyCall *call;
- NMSupplicantInfo *blob_info;
g_free (priv->net_path);
priv->net_path = NULL;
+ nm_call_store_remove (priv->assoc_pcalls, proxy, call_id);
if (!dbus_g_proxy_end_call (proxy, call_id, &err,
DBUS_TYPE_G_OBJECT_PATH, &priv->net_path,
G_TYPE_INVALID)) {
nm_log_warn (LOGD_SUPPLICANT, "Couldn't add a network to the supplicant interface: %s.",
err->message);
- emit_error_helper (info->interface, err);
+ emit_error_helper (self, err);
g_error_free (err);
return;
}
@@ -1152,33 +1073,33 @@ add_network_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
priv->blobs_left = g_hash_table_size (blobs);
g_hash_table_iter_init (&iter, blobs);
while (g_hash_table_iter_next (&iter, &name, &data)) {
- blob_info = nm_supplicant_info_new (info->interface, priv->iface_proxy, priv->assoc_pcalls);
call = dbus_g_proxy_begin_call (priv->iface_proxy, "AddBlob",
add_blob_cb,
- blob_info,
- nm_supplicant_info_destroy,
+ self,
+ NULL,
DBUS_TYPE_STRING, name,
DBUS_TYPE_G_UCHAR_ARRAY, blobs,
G_TYPE_INVALID);
- nm_supplicant_info_set_call (blob_info, call);
+ nm_call_store_add (priv->assoc_pcalls, priv->iface_proxy, call);
}
- call_select_network (info->interface);
+ call_select_network (self);
}
static void
set_ap_scan_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
{
- NMSupplicantInfo *info = (NMSupplicantInfo *) user_data;
- NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (info->interface);
+ NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
+ NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
GError *err = NULL;
DBusGProxyCall *call;
GHashTable *config_hash;
+ nm_call_store_remove (priv->assoc_pcalls, proxy, call_id);
if (!dbus_g_proxy_end_call (proxy, call_id, &err, G_TYPE_INVALID)) {
nm_log_warn (LOGD_SUPPLICANT, "Couldn't send AP scan mode to the supplicant interface: %s.",
err->message);
- emit_error_helper (info->interface, err);
+ emit_error_helper (self, err);
g_error_free (err);
return;
}
@@ -1186,24 +1107,22 @@ set_ap_scan_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
nm_log_info (LOGD_SUPPLICANT, "Config: set interface ap_scan to %d",
nm_supplicant_config_get_ap_scan (priv->cfg));
- info = nm_supplicant_info_new (info->interface, priv->iface_proxy, info->store);
config_hash = nm_supplicant_config_get_hash (priv->cfg);
call = dbus_g_proxy_begin_call (priv->iface_proxy, "AddNetwork",
add_network_cb,
- info,
- nm_supplicant_info_destroy,
+ self,
+ NULL,
DBUS_TYPE_G_MAP_OF_VARIANT, config_hash,
G_TYPE_INVALID);
g_hash_table_destroy (config_hash);
- nm_supplicant_info_set_call (info, call);
+ nm_call_store_add (priv->assoc_pcalls, priv->iface_proxy, call);
}
gboolean
-nm_supplicant_interface_set_config (NMSupplicantInterface * self,
- NMSupplicantConfig * cfg)
+nm_supplicant_interface_set_config (NMSupplicantInterface *self,
+ NMSupplicantConfig *cfg)
{
NMSupplicantInterfacePrivate *priv;
- NMSupplicantInfo *info;
DBusGProxyCall *call;
GValue value = G_VALUE_INIT;
@@ -1233,16 +1152,15 @@ nm_supplicant_interface_set_config (NMSupplicantInterface * self,
g_value_init (&value, G_TYPE_UINT);
g_value_set_uint (&value, nm_supplicant_config_get_ap_scan (priv->cfg));
- info = nm_supplicant_info_new (self, priv->props_proxy, priv->other_pcalls);
call = dbus_g_proxy_begin_call (priv->props_proxy, "Set",
set_ap_scan_cb,
- info,
- nm_supplicant_info_destroy,
+ self,
+ NULL,
G_TYPE_STRING, WPAS_DBUS_IFACE_INTERFACE,
G_TYPE_STRING, "ApScan",
G_TYPE_VALUE, &value,
G_TYPE_INVALID);
- nm_supplicant_info_set_call (info, call);
+ nm_call_store_add (priv->assoc_pcalls, priv->props_proxy, call);
g_value_unset (&value);
return call != NULL;
@@ -1251,13 +1169,15 @@ nm_supplicant_interface_set_config (NMSupplicantInterface * self,
static void
scan_request_cb (DBusGProxy *proxy, DBusGProxyCall *call_id, gpointer user_data)
{
- NMSupplicantInfo *info = (NMSupplicantInfo *) user_data;
+ NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
+ NMSupplicantInterfacePrivate *priv = NM_SUPPLICANT_INTERFACE_GET_PRIVATE (self);
GError *err = NULL;
- if (!dbus_g_proxy_end_call (proxy, call_id, &err, G_TYPE_INVALID)) {
+ nm_call_store_remove (priv->other_pcalls, proxy, call_id);
+ if (!dbus_g_proxy_end_call (proxy, call_id, &err, G_TYPE_INVALID))
nm_log_warn (LOGD_SUPPLICANT, "Could not get scan request result: %s", err->message);
- }
- g_signal_emit (info->interface, signals[SCAN_DONE], 0, err ? FALSE : TRUE);
+
+ g_signal_emit (self, signals[SCAN_DONE], 0, err ? FALSE : TRUE);
g_clear_error (&err);
}
@@ -1294,7 +1214,6 @@ gboolean
nm_supplicant_interface_request_scan (NMSupplicantInterface *self, const GPtrArray *ssids)
{
NMSupplicantInterfacePrivate *priv;
- NMSupplicantInfo *info;
DBusGProxyCall *call;
GHashTable *hash;
@@ -1308,15 +1227,14 @@ nm_supplicant_interface_request_scan (NMSupplicantInterface *self, const GPtrArr
if (ssids)
g_hash_table_insert (hash, "SSIDs", byte_array_array_to_gvalue (ssids));
- info = nm_supplicant_info_new (self, priv->iface_proxy, priv->other_pcalls);
call = dbus_g_proxy_begin_call (priv->iface_proxy, "Scan",
scan_request_cb,
- info,
- nm_supplicant_info_destroy,
+ self,
+ NULL,
DBUS_TYPE_G_MAP_OF_VARIANT, hash,
G_TYPE_INVALID);
g_hash_table_destroy (hash);
- nm_supplicant_info_set_call (info, call);
+ nm_call_store_add (priv->other_pcalls, priv->iface_proxy, call);
return call != NULL;
}
@@ -1512,6 +1430,9 @@ dispose (GObject *object)
g_free (priv->net_path);
+ if (priv->introspect_proxy)
+ g_object_unref (priv->introspect_proxy);
+
if (priv->wpas_proxy)
g_object_unref (priv->wpas_proxy);