diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-04-10 23:24:19 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-04-10 23:27:25 +0200 |
commit | d379b9ea2a1c7ee559878609fd1c14bfc7ae7b83 (patch) | |
tree | b87722ad4d4c8742fd4354177db27f0ccc64779f | |
parent | dac1021e4c4c52989fa74247b17a610813281f81 (diff) |
bearer: allow subclasses to report disconnection
The new `mm_bearer_report_disconnection()' allows subclasses to notify about
being disconnected, so that every layer of inheritance can chain its own code
to reset the connection status.
This commit partially disables the logic included in commit 981222. Now
subclasses (actually, no one) are not allowed to g_object_set() the
MM_BEARER_STATUS property.
-rw-r--r-- | plugins/option/mm-broadband-bearer-hso.c | 4 | ||||
-rw-r--r-- | src/mm-bearer.c | 28 | ||||
-rw-r--r-- | src/mm-bearer.h | 5 | ||||
-rw-r--r-- | src/mm-broadband-bearer.c | 42 |
4 files changed, 59 insertions, 20 deletions
diff --git a/plugins/option/mm-broadband-bearer-hso.c b/plugins/option/mm-broadband-bearer-hso.c index 13b40cd7..1d8e1d19 100644 --- a/plugins/option/mm-broadband-bearer-hso.c +++ b/plugins/option/mm-broadband-bearer-hso.c @@ -382,9 +382,7 @@ mm_broadband_bearer_hso_report_connection_status (MMBroadbandBearerHso *self, dial_3gpp_context_complete_and_free (ctx); } else { /* Just ensure we mark ourselves as being disconnected... */ - g_object_set (self, - MM_BEARER_STATUS, MM_BEARER_STATUS_DISCONNECTED, - NULL); + mm_bearer_report_disconnection (MM_BEARER (self)); } break; } diff --git a/src/mm-bearer.c b/src/mm-bearer.c index f738f389..c0b8c332 100644 --- a/src/mm-bearer.c +++ b/src/mm-bearer.c @@ -671,6 +671,22 @@ mm_bearer_disconnect_force (MMBearer *self) /*****************************************************************************/ +static void +report_disconnection (MMBearer *self) +{ + /* In the generic bearer implementation we just need to reset the + * interface status */ + bearer_update_status (self, MM_BEARER_STATUS_DISCONNECTED); +} + +void +mm_bearer_report_disconnection (MMBearer *self) +{ + return MM_BEARER_GET_CLASS (self)->report_disconnection (self); +} + +/*****************************************************************************/ + gboolean mm_bearer_cmp_properties (MMBearer *self, MMBearerProperties *properties) @@ -719,12 +735,8 @@ set_property (GObject *object, G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE); break; case PROP_STATUS: - self->priv->status = g_value_get_enum (value); - - /* Ensure that we don't expose any connection related data in the - * interface when going into disconnected state. */ - if (self->priv->status == MM_BEARER_STATUS_DISCONNECTED) - bearer_reset_interface_status (self); + /* We don't allow g_object_set()-ing the status property */ + g_assert_not_reached (); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -819,6 +831,8 @@ mm_bearer_class_init (MMBearerClass *klass) object_class->finalize = finalize; object_class->dispose = dispose; + klass->report_disconnection = report_disconnection; + properties[PROP_CONNECTION] = g_param_spec_object (MM_BEARER_CONNECTION, "Connection", @@ -849,6 +863,6 @@ mm_bearer_class_init (MMBearerClass *klass) "Status of the bearer", MM_TYPE_BEARER_STATUS, MM_BEARER_STATUS_DISCONNECTED, - G_PARAM_READWRITE); + G_PARAM_READABLE); g_object_class_install_property (object_class, PROP_STATUS, properties[PROP_STATUS]); } diff --git a/src/mm-bearer.h b/src/mm-bearer.h index 84fbcb37..6f35e2d7 100644 --- a/src/mm-bearer.h +++ b/src/mm-bearer.h @@ -76,6 +76,9 @@ struct _MMBearerClass { GAsyncResult *res, GError **error); + /* Report disconnection */ + void (* report_disconnection) (MMBearer *bearer); + /* Check if the bearer has the exact same properties */ gboolean (* cmp_properties) (MMBearer *self, MMBearerProperties *properties); @@ -111,6 +114,8 @@ gboolean mm_bearer_disconnect_finish (MMBearer *self, void mm_bearer_disconnect_force (MMBearer *self); +void mm_bearer_report_disconnection (MMBearer *self); + gboolean mm_bearer_cmp_properties (MMBearer *self, MMBearerProperties *properties); diff --git a/src/mm-broadband-bearer.c b/src/mm-broadband-bearer.c index bd9c36b7..a90360b9 100644 --- a/src/mm-broadband-bearer.c +++ b/src/mm-broadband-bearer.c @@ -1602,21 +1602,30 @@ disconnect_finish (MMBearer *self, } static void -disconnect_succeeded (DisconnectContext *ctx) +reset_bearer_connection (MMBroadbandBearer *self) { - /* If properly disconnected, close the data port */ - if (MM_IS_AT_SERIAL_PORT (ctx->data)) - mm_serial_port_close (MM_SERIAL_PORT (ctx->data)); + if (self->priv->port) { + /* If properly disconnected, close the data port */ + if (MM_IS_AT_SERIAL_PORT (self->priv->port)) + mm_serial_port_close (MM_SERIAL_PORT (self->priv->port)); - /* Port is disconnected; update the state. Note: implementations may - * already have set the port as disconnected (e.g the 3GPP one) */ - mm_port_set_connected (ctx->data, FALSE); + /* Port is disconnected; update the state. Note: implementations may + * already have set the port as disconnected (e.g the 3GPP one) */ + mm_port_set_connected (self->priv->port, FALSE); - /* Clear data port */ - g_clear_object (&ctx->self->priv->port); + /* Clear data port */ + g_clear_object (&self->priv->port); + } /* Reset current connection type */ - ctx->self->priv->connection_type = CONNECTION_TYPE_NONE; + self->priv->connection_type = CONNECTION_TYPE_NONE; +} + +static void +disconnect_succeeded (DisconnectContext *ctx) +{ + /* Cleanup all connection related data */ + reset_bearer_connection (ctx->self); /* Set operation result */ g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE); @@ -1746,6 +1755,18 @@ disconnect (MMBearer *self, /*****************************************************************************/ +static void +report_disconnection (MMBearer *self) +{ + /* Cleanup all connection related data */ + reset_bearer_connection (MM_BROADBAND_BEARER (self)); + + /* Chain up parent's report_disconection() */ + MM_BEARER_CLASS (mm_broadband_bearer_parent_class)->report_disconnection (self); +} + +/*****************************************************************************/ + static gboolean cmp_properties (MMBearer *self, MMBearerProperties *properties) @@ -2241,6 +2262,7 @@ mm_broadband_bearer_class_init (MMBroadbandBearerClass *klass) bearer_class->connect_finish = connect_finish; bearer_class->disconnect = disconnect; bearer_class->disconnect_finish = disconnect_finish; + bearer_class->report_disconnection = report_disconnection; klass->connect_3gpp = connect_3gpp; klass->connect_3gpp_finish = detailed_connect_finish; |