iface-modem-messaging: automatically detect the best default storage

Instead of letting the plugins specify a default storage to use, just look at
the supported ones and use the best one.

"MT is preferred over "ME" or "SM", as "MT=ME+SM"
This commit is contained in:
Aleksander Morgado
2012-09-10 19:01:50 +02:00
parent 54178a7959
commit b42b5795e3
6 changed files with 43 additions and 29 deletions

View File

@@ -1163,7 +1163,6 @@ mm_broadband_modem_cinterion_new (const gchar *device,
MM_BASE_MODEM_PLUGIN, plugin, MM_BASE_MODEM_PLUGIN, plugin,
MM_BASE_MODEM_VENDOR_ID, vendor_id, MM_BASE_MODEM_VENDOR_ID, vendor_id,
MM_BASE_MODEM_PRODUCT_ID, product_id, MM_BASE_MODEM_PRODUCT_ID, product_id,
MM_IFACE_MODEM_MESSAGING_SMS_DEFAULT_STORAGE, MM_SMS_STORAGE_MT,
NULL); NULL);
} }

View File

@@ -410,8 +410,6 @@ mm_broadband_modem_iridium_new (const gchar *device,
MM_BASE_MODEM_MAX_TIMEOUTS, 3, MM_BASE_MODEM_MAX_TIMEOUTS, 3,
/* Only CS network is supported by the Iridium modem */ /* Only CS network is supported by the Iridium modem */
MM_IFACE_MODEM_3GPP_PS_NETWORK_SUPPORTED, FALSE, MM_IFACE_MODEM_3GPP_PS_NETWORK_SUPPORTED, FALSE,
/* 'ME' storage not supported */
MM_IFACE_MODEM_MESSAGING_SMS_DEFAULT_STORAGE, MM_SMS_STORAGE_SM,
NULL); NULL);
} }

View File

@@ -432,8 +432,6 @@ mm_broadband_modem_novatel_lte_new (const gchar *device,
MM_BASE_MODEM_PLUGIN, plugin, MM_BASE_MODEM_PLUGIN, plugin,
MM_BASE_MODEM_VENDOR_ID, vendor_id, MM_BASE_MODEM_VENDOR_ID, vendor_id,
MM_BASE_MODEM_PRODUCT_ID, product_id, MM_BASE_MODEM_PRODUCT_ID, product_id,
/* 'ME' storage not supported */
MM_IFACE_MODEM_MESSAGING_SMS_DEFAULT_STORAGE, MM_SMS_STORAGE_SM,
NULL); NULL);
} }

View File

@@ -753,8 +753,6 @@ mm_broadband_modem_novatel_new (const gchar *device,
MM_BASE_MODEM_PLUGIN, plugin, MM_BASE_MODEM_PLUGIN, plugin,
MM_BASE_MODEM_VENDOR_ID, vendor_id, MM_BASE_MODEM_VENDOR_ID, vendor_id,
MM_BASE_MODEM_PRODUCT_ID, product_id, MM_BASE_MODEM_PRODUCT_ID, product_id,
/* 'ME' storage not supported */
MM_IFACE_MODEM_MESSAGING_SMS_DEFAULT_STORAGE, MM_SMS_STORAGE_SM,
NULL); NULL);
} }

View File

@@ -7960,7 +7960,7 @@ mm_broadband_modem_init (MMBroadbandModem *self)
self->priv->modem_cdma_evdo_registration_state = MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN; self->priv->modem_cdma_evdo_registration_state = MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN;
self->priv->modem_cdma_cdma1x_network_supported = TRUE; self->priv->modem_cdma_cdma1x_network_supported = TRUE;
self->priv->modem_cdma_evdo_network_supported = TRUE; self->priv->modem_cdma_evdo_network_supported = TRUE;
self->priv->modem_messaging_sms_default_storage = MM_SMS_STORAGE_ME; self->priv->modem_messaging_sms_default_storage = MM_SMS_STORAGE_UNKNOWN;
self->priv->current_sms_mem1_storage = MM_SMS_STORAGE_UNKNOWN; self->priv->current_sms_mem1_storage = MM_SMS_STORAGE_UNKNOWN;
self->priv->current_sms_mem2_storage = MM_SMS_STORAGE_UNKNOWN; self->priv->current_sms_mem2_storage = MM_SMS_STORAGE_UNKNOWN;
} }

View File

@@ -791,6 +791,31 @@ enable_unsolicited_events_ready (MMIfaceModemMessaging *self,
interface_enabling_step (ctx); interface_enabling_step (ctx);
} }
static MMSmsStorage
get_best_initial_default_sms_storage (MMIfaceModemMessaging *self)
{
StorageContext *storage_ctx;
guint i;
MMSmsStorage default_storages_preference[] = {
MM_SMS_STORAGE_MT, /* MT=ME+SM */
MM_SMS_STORAGE_ME,
MM_SMS_STORAGE_SM,
MM_SMS_STORAGE_UNKNOWN
};
storage_ctx = get_storage_context (self);
for (i = 0; default_storages_preference[i] != MM_SMS_STORAGE_UNKNOWN; i++) {
/* Check if the requested storage is really supported in both mem2 and mem3 */
if (is_storage_supported (storage_ctx->supported_mem2, default_storages_preference[i], "storing", NULL) &&
is_storage_supported (storage_ctx->supported_mem3, default_storages_preference[i], "receiving", NULL)) {
break;
}
}
return default_storages_preference[i];
}
static void static void
interface_enabling_step (EnablingContext *ctx) interface_enabling_step (EnablingContext *ctx)
{ {
@@ -840,34 +865,25 @@ interface_enabling_step (EnablingContext *ctx)
/* Set storage defaults */ /* Set storage defaults */
if (MM_IFACE_MODEM_MESSAGING_GET_INTERFACE (ctx->self)->set_default_storage && if (MM_IFACE_MODEM_MESSAGING_GET_INTERFACE (ctx->self)->set_default_storage &&
MM_IFACE_MODEM_MESSAGING_GET_INTERFACE (ctx->self)->set_default_storage_finish) { MM_IFACE_MODEM_MESSAGING_GET_INTERFACE (ctx->self)->set_default_storage_finish) {
StorageContext *storage_ctx; MMSmsStorage default_storage;
MMSmsStorage default_storage = MM_SMS_STORAGE_UNKNOWN;
GError *error = NULL;
mm_dbg ("Setting default storage..."); default_storage = get_best_initial_default_sms_storage (ctx->self);
g_object_get (ctx->self, /* Already bound to the 'default-storage' property in the skeleton */
MM_IFACE_MODEM_MESSAGING_SMS_DEFAULT_STORAGE, &default_storage, g_object_set (ctx->self,
MM_IFACE_MODEM_MESSAGING_SMS_DEFAULT_STORAGE, default_storage,
NULL); NULL);
g_assert (default_storage != MM_SMS_STORAGE_UNKNOWN);
/* Check if the requested storages are really supported */ if (default_storage != MM_SMS_STORAGE_UNKNOWN) {
storage_ctx = get_storage_context (ctx->self); MM_IFACE_MODEM_MESSAGING_GET_INTERFACE (ctx->self)->set_default_storage (
if (!is_storage_supported (storage_ctx->supported_mem2, default_storage, "storing", &error) || ctx->self,
!is_storage_supported (storage_ctx->supported_mem3, default_storage, "receiving", &error)) { default_storage,
g_simple_async_result_take_error (ctx->result, error); (GAsyncReadyCallback)set_default_storage_ready,
enabling_context_complete_and_free (ctx); ctx);
return; return;
} }
mm_gdbus_modem_messaging_set_default_storage (ctx->skeleton, default_storage); mm_info ("Cannot set default storage, none of the suggested ones supported");
MM_IFACE_MODEM_MESSAGING_GET_INTERFACE (ctx->self)->set_default_storage (
ctx->self,
default_storage,
(GAsyncReadyCallback)set_default_storage_ready,
ctx);
return;
} }
/* Fall down to next step */ /* Fall down to next step */
ctx->step++; ctx->step++;
@@ -1228,6 +1244,11 @@ mm_iface_modem_messaging_initialize (MMIfaceModemMessaging *self,
skeleton = mm_gdbus_modem_messaging_skeleton_new (); skeleton = mm_gdbus_modem_messaging_skeleton_new ();
mm_gdbus_modem_messaging_set_supported_storages (skeleton, NULL); mm_gdbus_modem_messaging_set_supported_storages (skeleton, NULL);
/* Bind our Default messaging property */
g_object_bind_property (self, MM_IFACE_MODEM_MESSAGING_SMS_DEFAULT_STORAGE,
skeleton, "default-storage",
G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
g_object_set (self, g_object_set (self,
MM_IFACE_MODEM_MESSAGING_DBUS_SKELETON, skeleton, MM_IFACE_MODEM_MESSAGING_DBUS_SKELETON, skeleton,
NULL); NULL);