broadband-modem-mbim: setup enabling and disabling of unsolicited messages

This commit is contained in:
Aleksander Morgado
2013-06-24 19:37:38 +02:00
parent 817fc43bb0
commit ee62806a1a
+144 -89
View File
@@ -65,6 +65,7 @@ struct _MMBroadbandModemMbimPrivate {
/* Process unsolicited notifications */
guint notification_id;
ProcessNotificationFlag setup_flags;
ProcessNotificationFlag enable_flags;
/* 3GPP registration helpers */
gchar *current_operator_id;
@@ -1712,6 +1713,11 @@ common_setup_cleanup_unsolicited_events (MMBroadbandModemMbim *self,
user_data,
common_setup_cleanup_unsolicited_events);
mm_dbg ("Supported notifications: signal (%s), registration (%s), sms (%s)",
self->priv->setup_flags & PROCESS_NOTIFICATION_FLAG_SIGNAL_QUALITY ? "yes" : "no",
self->priv->setup_flags & PROCESS_NOTIFICATION_FLAG_REGISTRATION_UPDATES ? "yes" : "no",
self->priv->setup_flags & PROCESS_NOTIFICATION_FLAG_SMS_READ ? "yes" : "no");
if (setup) {
/* Don't re-enable it if already there */
if (!self->priv->notification_id)
@@ -1784,20 +1790,20 @@ setup_unsolicited_registration_events (MMIfaceModem3gpp *self,
}
/*****************************************************************************/
/* Enable/Disable unsolicited events (3GPP interface) */
/* Enable/disable unsolicited events (common) */
static gboolean
modem_3gpp_common_enable_disable_unsolicited_events_finish (MMIfaceModem3gpp *self,
GAsyncResult *res,
GError **error)
common_enable_disable_unsolicited_events_finish (MMBroadbandModemMbim *self,
GAsyncResult *res,
GError **error)
{
return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error);
}
static void
disable_signal_state_set_ready_cb (MbimDevice *device,
GAsyncResult *res,
GSimpleAsyncResult *simple)
subscriber_list_set_ready_cb (MbimDevice *device,
GAsyncResult *res,
GSimpleAsyncResult *simple)
{
MbimMessage *response;
GError *error = NULL;
@@ -1818,57 +1824,15 @@ disable_signal_state_set_ready_cb (MbimDevice *device,
}
static void
enable_signal_state_set_ready_cb (MbimDevice *device,
GAsyncResult *res,
GSimpleAsyncResult *simple)
common_enable_disable_unsolicited_events (MMBroadbandModemMbim *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
MbimMessage *response;
GError *error = NULL;
guint32 rssi;
response = mbim_device_command_finish (device, res, &error);
if (response &&
mbim_message_command_done_get_result (response, &error) &&
mbim_message_signal_state_response_parse (
response,
&rssi,
NULL, /* error_rate */
NULL, /* signal_strength_interval */
NULL, /* rssi_threshold */
NULL, /* error_rate_threshold */
&error)) {
guint32 quality;
GObject *self;
/* Normalize the quality. 99 means unknown, we default it to 0 */
quality = CLAMP (rssi == 99 ? 0 : rssi, 0, 31) * 100 / 31;
mm_dbg ("Initial signal state: %u --> %u%%", rssi, quality);
self = g_async_result_get_source_object (G_ASYNC_RESULT (simple));
mm_iface_modem_update_signal_quality (MM_IFACE_MODEM (self), quality);
g_object_unref (self);
g_simple_async_result_set_op_res_gboolean (simple, TRUE);
} else
g_simple_async_result_take_error (simple, error);
if (response)
mbim_message_unref (response);
g_simple_async_result_complete (simple);
g_object_unref (simple);
}
static void
common_enable_disable_unsolicited_events_3gpp (MMIfaceModem3gpp *_self,
gboolean enable,
GAsyncReadyCallback callback,
gpointer user_data)
{
MMBroadbandModemMbim *self = MM_BROADBAND_MODEM_MBIM (_self);
MbimMessage *request;
MbimDevice *device;
GSimpleAsyncResult *result;
MbimMessage *message;
GAsyncReadyCallback ready_cb;
MbimEventEntry **entries;
guint n_entries = 0;
if (!peek_device (self, &device, callback, user_data))
return;
@@ -1876,37 +1840,99 @@ common_enable_disable_unsolicited_events_3gpp (MMIfaceModem3gpp *_self,
result = g_simple_async_result_new (G_OBJECT (self),
callback,
user_data,
common_enable_disable_unsolicited_events_3gpp);
common_enable_disable_unsolicited_events);
#define DISABLE_FEATURE G_MAXUINT32
#define AUTO_FEATURE 0
mm_dbg ("Enabled notifications: signal (%s), registration (%s), sms (%s)",
self->priv->enable_flags & PROCESS_NOTIFICATION_FLAG_SIGNAL_QUALITY ? "yes" : "no",
self->priv->enable_flags & PROCESS_NOTIFICATION_FLAG_REGISTRATION_UPDATES ? "yes" : "no",
self->priv->enable_flags & PROCESS_NOTIFICATION_FLAG_SMS_READ ? "yes" : "no");
if (enable) {
ready_cb = (GAsyncReadyCallback)enable_signal_state_set_ready_cb;
message = (mbim_message_signal_state_set_new (
30, /* signal_strength_interval */
DISABLE_FEATURE, /* rssi_threshold */
DISABLE_FEATURE, /* error_rate_threshold */
NULL));
} else {
ready_cb = (GAsyncReadyCallback)disable_signal_state_set_ready_cb;
message = (mbim_message_signal_state_set_new (
DISABLE_FEATURE, /* signal_strength_interval */
DISABLE_FEATURE, /* rssi_threshold */
DISABLE_FEATURE, /* error_rate_threshold */
NULL));
entries = g_new0 (MbimEventEntry *, 3);
/* Basic connect service */
if (self->priv->enable_flags & PROCESS_NOTIFICATION_FLAG_SIGNAL_QUALITY ||
self->priv->enable_flags & PROCESS_NOTIFICATION_FLAG_REGISTRATION_UPDATES) {
entries[n_entries] = g_new (MbimEventEntry, 1);
memcpy (&(entries[n_entries]->device_service_id), MBIM_UUID_BASIC_CONNECT, sizeof (MbimUuid));
entries[n_entries]->cids_count = 0;
entries[n_entries]->cids = g_new0 (guint32, 2);
if (self->priv->enable_flags & PROCESS_NOTIFICATION_FLAG_SIGNAL_QUALITY)
entries[n_entries]->cids[entries[n_entries]->cids_count++] = MBIM_CID_BASIC_CONNECT_SIGNAL_STATE;
if (self->priv->enable_flags & PROCESS_NOTIFICATION_FLAG_REGISTRATION_UPDATES)
entries[n_entries]->cids[entries[n_entries]->cids_count++] = MBIM_CID_BASIC_CONNECT_REGISTER_STATE;
n_entries++;
}
#undef DISABLE_FEATURE
#undef AUTO_FEATURE
/* SMS service */
if (self->priv->enable_flags & PROCESS_NOTIFICATION_FLAG_SMS_READ) {
entries[n_entries] = g_new (MbimEventEntry, 1);
memcpy (&(entries[n_entries]->device_service_id), MBIM_UUID_SMS, sizeof (MbimUuid));
entries[n_entries]->cids_count = 2;
entries[n_entries]->cids = g_new0 (guint32, 2);
entries[n_entries]->cids[0] = MBIM_CID_SMS_READ;
entries[n_entries]->cids[1] = MBIM_CID_SMS_MESSAGE_STORE_STATUS;
n_entries++;
}
request = (mbim_message_device_service_subscriber_list_set_new (
n_entries,
(const MbimEventEntry *const *)entries,
NULL));
mbim_device_command (device,
message,
request,
10,
NULL,
ready_cb,
(GAsyncReadyCallback)subscriber_list_set_ready_cb,
result);
mbim_message_unref (message);
mbim_message_unref (request);
mbim_event_entry_array_free (entries);
}
/*****************************************************************************/
/* Enable/Disable unsolicited registration events */
static gboolean
modem_3gpp_common_enable_disable_unsolicited_registration_events_finish (MMIfaceModem3gpp *self,
GAsyncResult *res,
GError **error)
{
return common_enable_disable_unsolicited_events_finish (MM_BROADBAND_MODEM_MBIM (self), res, error);
}
static void
modem_3gpp_disable_unsolicited_registration_events (MMIfaceModem3gpp *self,
gboolean cs_supported,
gboolean ps_supported,
gboolean eps_supported,
GAsyncReadyCallback callback,
gpointer user_data)
{
MM_BROADBAND_MODEM_MBIM (self)->priv->enable_flags &= ~PROCESS_NOTIFICATION_FLAG_REGISTRATION_UPDATES;
common_enable_disable_unsolicited_events (MM_BROADBAND_MODEM_MBIM (self), callback, user_data);
}
static void
modem_3gpp_enable_unsolicited_registration_events (MMIfaceModem3gpp *self,
gboolean cs_supported,
gboolean ps_supported,
gboolean eps_supported,
GAsyncReadyCallback callback,
gpointer user_data)
{
MM_BROADBAND_MODEM_MBIM (self)->priv->enable_flags |= PROCESS_NOTIFICATION_FLAG_REGISTRATION_UPDATES;
common_enable_disable_unsolicited_events (MM_BROADBAND_MODEM_MBIM (self), callback, user_data);
}
/*****************************************************************************/
/* Enable/Disable unsolicited events (3GPP interface) */
static gboolean
modem_3gpp_common_enable_disable_unsolicited_events_finish (MMIfaceModem3gpp *self,
GAsyncResult *res,
GError **error)
{
return common_enable_disable_unsolicited_events_finish (MM_BROADBAND_MODEM_MBIM (self), res, error);
}
static void
@@ -1914,7 +1940,8 @@ modem_3gpp_disable_unsolicited_events (MMIfaceModem3gpp *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
common_enable_disable_unsolicited_events_3gpp (self, FALSE, callback, user_data);
MM_BROADBAND_MODEM_MBIM (self)->priv->enable_flags &= ~PROCESS_NOTIFICATION_FLAG_SIGNAL_QUALITY;
common_enable_disable_unsolicited_events (MM_BROADBAND_MODEM_MBIM (self), callback, user_data);
}
static void
@@ -1922,7 +1949,8 @@ modem_3gpp_enable_unsolicited_events (MMIfaceModem3gpp *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
common_enable_disable_unsolicited_events_3gpp (self, TRUE, callback, user_data);
MM_BROADBAND_MODEM_MBIM (self)->priv->enable_flags |= PROCESS_NOTIFICATION_FLAG_SIGNAL_QUALITY;
common_enable_disable_unsolicited_events (MM_BROADBAND_MODEM_MBIM (self), callback, user_data);
}
/*****************************************************************************/
@@ -2402,6 +2430,35 @@ setup_unsolicited_events_messaging (MMIfaceModemMessaging *self,
common_setup_cleanup_unsolicited_events (MM_BROADBAND_MODEM_MBIM (self), TRUE, callback, user_data);
}
/*****************************************************************************/
/* Enable/Disable unsolicited event handlers (Messaging interface) */
static gboolean
common_enable_disable_unsolicited_events_messaging_finish (MMIfaceModemMessaging *self,
GAsyncResult *res,
GError **error)
{
return common_enable_disable_unsolicited_events_finish (MM_BROADBAND_MODEM_MBIM (self), res, error);
}
static void
disable_unsolicited_events_messaging (MMIfaceModemMessaging *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
MM_BROADBAND_MODEM_MBIM (self)->priv->enable_flags &= ~PROCESS_NOTIFICATION_FLAG_SMS_READ;
common_enable_disable_unsolicited_events (MM_BROADBAND_MODEM_MBIM (self), callback, user_data);
}
static void
enable_unsolicited_events_messaging (MMIfaceModemMessaging *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
MM_BROADBAND_MODEM_MBIM (self)->priv->enable_flags |= PROCESS_NOTIFICATION_FLAG_SMS_READ;
common_enable_disable_unsolicited_events (MM_BROADBAND_MODEM_MBIM (self), callback, user_data);
}
/*****************************************************************************/
/* Create SMS (Messaging interface) */
@@ -2533,6 +2590,10 @@ iface_modem_3gpp_init (MMIfaceModem3gpp *iface)
iface->setup_unsolicited_registration_events_finish = common_setup_cleanup_unsolicited_events_3gpp_finish;
iface->cleanup_unsolicited_registration_events = cleanup_unsolicited_registration_events;
iface->cleanup_unsolicited_registration_events_finish = common_setup_cleanup_unsolicited_events_3gpp_finish;
iface->enable_unsolicited_registration_events = modem_3gpp_enable_unsolicited_registration_events;
iface->enable_unsolicited_registration_events_finish = modem_3gpp_common_enable_disable_unsolicited_registration_events_finish;
iface->disable_unsolicited_registration_events = modem_3gpp_disable_unsolicited_registration_events;
iface->disable_unsolicited_registration_events_finish = modem_3gpp_common_enable_disable_unsolicited_registration_events_finish;
iface->load_operator_code = modem_3gpp_load_operator_code;
iface->load_operator_code_finish = modem_3gpp_load_operator_code_finish;
iface->load_operator_name = modem_3gpp_load_operator_name;
@@ -2542,12 +2603,6 @@ iface_modem_3gpp_init (MMIfaceModem3gpp *iface)
iface->register_in_network = modem_3gpp_register_in_network;
iface->register_in_network_finish = modem_3gpp_register_in_network_finish;
/* Unneeded things */
iface->enable_unsolicited_registration_events = NULL;
iface->enable_unsolicited_registration_events_finish = NULL;
iface->disable_unsolicited_registration_events = NULL;
iface->disable_unsolicited_registration_events_finish = NULL;
/* TODO: use MBIM_CID_VISIBLE_PROVIDERS */
iface->scan_networks = NULL;
iface->scan_networks_finish = NULL;
@@ -2570,10 +2625,10 @@ iface_modem_messaging_init (MMIfaceModemMessaging *iface)
iface->setup_unsolicited_events_finish = common_setup_cleanup_unsolicited_events_messaging_finish;
iface->cleanup_unsolicited_events = cleanup_unsolicited_events_messaging;
iface->cleanup_unsolicited_events_finish = common_setup_cleanup_unsolicited_events_messaging_finish;
iface->enable_unsolicited_events = NULL;
iface->enable_unsolicited_events_finish = NULL;
iface->disable_unsolicited_events = NULL;
iface->disable_unsolicited_events_finish = NULL;
iface->enable_unsolicited_events = enable_unsolicited_events_messaging;
iface->enable_unsolicited_events_finish = common_enable_disable_unsolicited_events_messaging_finish;
iface->disable_unsolicited_events = disable_unsolicited_events_messaging;
iface->disable_unsolicited_events_finish = common_enable_disable_unsolicited_events_messaging_finish;
iface->create_sms = messaging_create_sms;
}