iface-modem: simplify interface handling

Interfaces won't have a 'status', just initialize(), enable(), disable() and
shutdown().

Also, shutdown() should never fail. We will take care of cancelling any ongoing
operation afterwards, before calling shutdown().
This commit is contained in:
Aleksander Morgado
2011-11-28 12:21:48 +01:00
parent d2d9251733
commit b9448b83cb
3 changed files with 66 additions and 145 deletions

View File

@@ -1425,16 +1425,10 @@ static void
dispose (GObject *object) dispose (GObject *object)
{ {
MMBroadbandModem *self = MM_BROADBAND_MODEM (object); MMBroadbandModem *self = MM_BROADBAND_MODEM (object);
GError *error = NULL;
if (self->priv->modem_dbus_skeleton) { if (self->priv->modem_dbus_skeleton) {
if (!mm_iface_modem_shutdown (MM_IFACE_MODEM (object), &error)) {
/* TODO: Cancel initialization/enabling/disabling, whatever */ /* TODO: Cancel initialization/enabling/disabling, whatever */
mm_warn ("couldn't shutdown interface: '%s'", mm_iface_modem_shutdown (MM_IFACE_MODEM (object));
error ? error->message : "unknown error");
g_clear_error (&error);
}
g_clear_object (&self->priv->modem_dbus_skeleton); g_clear_object (&self->priv->modem_dbus_skeleton);
} }

View File

@@ -35,13 +35,6 @@ static void interface_enabling_step (EnablingContext *ctx);
typedef struct _DisablingContext DisablingContext; typedef struct _DisablingContext DisablingContext;
static void interface_disabling_step (DisablingContext *ctx); static void interface_disabling_step (DisablingContext *ctx);
typedef enum {
INTERFACE_STATUS_SHUTDOWN,
INTERFACE_STATUS_INITIALIZING,
INTERFACE_STATUS_INITIALIZED,
INTERFACE_STATUS_ENABLED,
} InterfaceStatus;
typedef struct { typedef struct {
MmGdbusModem *skeleton; MmGdbusModem *skeleton;
GDBusMethodInvocation *invocation; GDBusMethodInvocation *invocation;
@@ -1981,37 +1974,6 @@ interface_initialization (MMIfaceModem *self,
/*****************************************************************************/ /*****************************************************************************/
static InterfaceStatus
get_status (MMIfaceModem *self)
{
GObject *skeleton = NULL;
MMModemState modem_state;
/* Are we already disabled? */
g_object_get (self,
MM_IFACE_MODEM_DBUS_SKELETON, &skeleton,
NULL);
if (!skeleton)
return INTERFACE_STATUS_SHUTDOWN;
g_object_unref (skeleton);
/* Are we being initialized? (interface not yet exported) */
skeleton = G_OBJECT (mm_gdbus_object_get_modem (MM_GDBUS_OBJECT (self)));
if (!skeleton)
return INTERFACE_STATUS_INITIALIZING;
modem_state = MM_MODEM_STATE_UNKNOWN;
g_object_get (self,
MM_IFACE_MODEM_STATE, &modem_state,
NULL);
g_object_unref (skeleton);
return (modem_state > MM_MODEM_STATE_DISABLED ?
INTERFACE_STATUS_ENABLED :
INTERFACE_STATUS_INITIALIZED);
}
gboolean gboolean
mm_iface_modem_initialize_finish (MMIfaceModem *self, mm_iface_modem_initialize_finish (MMIfaceModem *self,
GAsyncResult *res, GAsyncResult *res,
@@ -2098,6 +2060,8 @@ mm_iface_modem_initialize (MMIfaceModem *self,
gpointer user_data) gpointer user_data)
{ {
GSimpleAsyncResult *result; GSimpleAsyncResult *result;
MmGdbusModem *skeleton = NULL;
MMModemState modem_state = MM_MODEM_STATE_UNKNOWN;
g_return_if_fail (MM_IS_IFACE_MODEM (self)); g_return_if_fail (MM_IS_IFACE_MODEM (self));
@@ -2107,13 +2071,6 @@ mm_iface_modem_initialize (MMIfaceModem *self,
user_data, user_data,
mm_iface_modem_initialize); mm_iface_modem_initialize);
switch (get_status (self)) {
case INTERFACE_STATUS_ENABLED:
case INTERFACE_STATUS_INITIALIZED:
case INTERFACE_STATUS_SHUTDOWN: {
MmGdbusModem *skeleton = NULL;
MMModemState modem_state = MM_MODEM_STATE_UNKNOWN;
/* Did we already create it? */ /* Did we already create it? */
g_object_get (self, g_object_get (self,
MM_IFACE_MODEM_DBUS_SKELETON, &skeleton, MM_IFACE_MODEM_DBUS_SKELETON, &skeleton,
@@ -2169,36 +2126,11 @@ mm_iface_modem_initialize (MMIfaceModem *self,
return; return;
} }
case INTERFACE_STATUS_INITIALIZING: void
g_simple_async_result_set_error (result, mm_iface_modem_shutdown (MMIfaceModem *self)
MM_CORE_ERROR,
MM_CORE_ERROR_IN_PROGRESS,
"Interface is already being enabled");
g_simple_async_result_complete_in_idle (result);
g_object_unref (result);
return;
}
g_return_if_reached ();
}
gboolean
mm_iface_modem_shutdown (MMIfaceModem *self,
GError **error)
{ {
g_return_val_if_fail (MM_IS_IFACE_MODEM (self), FALSE); g_return_if_fail (MM_IS_IFACE_MODEM (self));
switch (get_status (self)) {
case INTERFACE_STATUS_SHUTDOWN:
return TRUE;
case INTERFACE_STATUS_INITIALIZING:
g_set_error (error,
MM_CORE_ERROR,
MM_CORE_ERROR_IN_PROGRESS,
"Iinterface being currently initialized");
return FALSE;
case INTERFACE_STATUS_ENABLED:
case INTERFACE_STATUS_INITIALIZED:
/* Remove SIM object */ /* Remove SIM object */
g_object_set (self, g_object_set (self,
MM_IFACE_MODEM_SIM, NULL, MM_IFACE_MODEM_SIM, NULL,
@@ -2208,10 +2140,6 @@ mm_iface_modem_shutdown (MMIfaceModem *self,
g_object_set (self, g_object_set (self,
MM_IFACE_MODEM_DBUS_SKELETON, NULL, MM_IFACE_MODEM_DBUS_SKELETON, NULL,
NULL); NULL);
return TRUE;
}
g_return_val_if_reached (FALSE);
} }

View File

@@ -271,8 +271,7 @@ gboolean mm_iface_modem_disable_finish (MMIfaceModem *self,
GError **error); GError **error);
/* Shutdown Modem interface */ /* Shutdown Modem interface */
gboolean mm_iface_modem_shutdown (MMIfaceModem *self, void mm_iface_modem_shutdown (MMIfaceModem *self);
GError **error);
/* Request unlock recheck. /* Request unlock recheck.
* It will not only return the lock status, but also set the property values * It will not only return the lock status, but also set the property values