bearer: subclasses need to report IPv4/v6 config when connection ready

This commit is contained in:
Aleksander Morgado
2012-01-19 15:34:51 +01:00
parent aa36af424d
commit c6b9aead81
2 changed files with 47 additions and 1 deletions

View File

@@ -119,9 +119,17 @@ connect_ready (MMBearer *self,
{ {
GError *error = NULL; GError *error = NULL;
gboolean launch_disconnect = FALSE; gboolean launch_disconnect = FALSE;
MMPort *data = NULL;
MMCommonBearerIpConfig *ipv4_config = NULL;
MMCommonBearerIpConfig *ipv6_config = NULL;
/* NOTE: connect() implementations *MUST* handle cancellations themselves */ /* NOTE: connect() implementations *MUST* handle cancellations themselves */
if (!MM_BEARER_GET_CLASS (self)->connect_finish (self, res, &error)) { if (!MM_BEARER_GET_CLASS (self)->connect_finish (self,
res,
&data,
&ipv4_config,
&ipv6_config,
&error)) {
mm_dbg ("Couldn't connect bearer '%s': '%s'", mm_dbg ("Couldn't connect bearer '%s': '%s'",
self->priv->path, self->priv->path,
error->message); error->message);
@@ -136,8 +144,14 @@ connect_ready (MMBearer *self,
} }
g_simple_async_result_take_error (simple, error); g_simple_async_result_take_error (simple, error);
} }
/* Handle cancellations detected after successful connection */
else if (g_cancellable_is_cancelled (self->priv->connect_cancellable)) { else if (g_cancellable_is_cancelled (self->priv->connect_cancellable)) {
mm_dbg ("Connected bearer '%s', but need to disconnect", self->priv->path); mm_dbg ("Connected bearer '%s', but need to disconnect", self->priv->path);
g_clear_object (&data);
g_clear_object (&ipv4_config);
g_clear_object (&ipv6_config);
g_simple_async_result_set_error ( g_simple_async_result_set_error (
simple, simple,
MM_CORE_ERROR, MM_CORE_ERROR,
@@ -147,8 +161,24 @@ connect_ready (MMBearer *self,
} }
else { else {
mm_dbg ("Connected bearer '%s'", self->priv->path); mm_dbg ("Connected bearer '%s'", self->priv->path);
self->priv->status = MM_BEARER_STATUS_CONNECTED; self->priv->status = MM_BEARER_STATUS_CONNECTED;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_STATUS]); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_STATUS]);
/* Update the interface state */
mm_gdbus_bearer_set_connected (MM_GDBUS_BEARER (self), TRUE);
mm_gdbus_bearer_set_interface (MM_GDBUS_BEARER (self), mm_port_get_device (data));
mm_gdbus_bearer_set_ip4_config (
MM_GDBUS_BEARER (self),
mm_common_bearer_ip_config_get_dictionary (ipv4_config));
mm_gdbus_bearer_set_ip6_config (
MM_GDBUS_BEARER (self),
mm_common_bearer_ip_config_get_dictionary (ipv6_config));
g_clear_object (&data);
g_clear_object (&ipv4_config);
g_clear_object (&ipv6_config);
g_simple_async_result_set_op_res_gboolean (simple, TRUE); g_simple_async_result_set_op_res_gboolean (simple, TRUE);
} }
@@ -316,6 +346,13 @@ disconnect_ready (MMBearer *self,
else { else {
mm_dbg ("Disconnected bearer '%s'", self->priv->path); mm_dbg ("Disconnected bearer '%s'", self->priv->path);
self->priv->status = MM_BEARER_STATUS_DISCONNECTED; self->priv->status = MM_BEARER_STATUS_DISCONNECTED;
/* Update the interface state */
mm_gdbus_bearer_set_connected (MM_GDBUS_BEARER (self), FALSE);
mm_gdbus_bearer_set_interface (MM_GDBUS_BEARER (self), NULL);
mm_gdbus_bearer_set_ip4_config (MM_GDBUS_BEARER (self), NULL);
mm_gdbus_bearer_set_ip6_config (MM_GDBUS_BEARER (self), NULL);
g_simple_async_result_set_op_res_gboolean (simple, TRUE); g_simple_async_result_set_op_res_gboolean (simple, TRUE);
} }
@@ -341,6 +378,12 @@ status_changed_complete_disconnect (MMBearer *self,
self->priv->disconnect_signal_handler); self->priv->disconnect_signal_handler);
self->priv->disconnect_signal_handler = 0; self->priv->disconnect_signal_handler = 0;
/* Update the interface state */
mm_gdbus_bearer_set_connected (MM_GDBUS_BEARER (self), FALSE);
mm_gdbus_bearer_set_interface (MM_GDBUS_BEARER (self), NULL);
mm_gdbus_bearer_set_ip4_config (MM_GDBUS_BEARER (self), NULL);
mm_gdbus_bearer_set_ip6_config (MM_GDBUS_BEARER (self), NULL);
g_simple_async_result_set_op_res_gboolean (simple, TRUE); g_simple_async_result_set_op_res_gboolean (simple, TRUE);
g_simple_async_result_complete (simple); g_simple_async_result_complete (simple);
g_object_unref (simple); g_object_unref (simple);

View File

@@ -73,6 +73,9 @@ struct _MMBearerClass {
gpointer user_data); gpointer user_data);
gboolean (* connect_finish) (MMBearer *bearer, gboolean (* connect_finish) (MMBearer *bearer,
GAsyncResult *res, GAsyncResult *res,
MMPort **data,
MMCommonBearerIpConfig **ipv4_config,
MMCommonBearerIpConfig **ipv6_config,
GError **error); GError **error);
/* Disconnect this bearer */ /* Disconnect this bearer */