broadband-modem-qmi: when listing all SMS fails, list per tag
Some QMI modems seem to fail when requesting to list all SMS messages in a given storage. When this happens, we'll loop through all storages but performing per tag list requests.
This commit is contained in:
@@ -5975,11 +5975,24 @@ messaging_set_default_storage (MMIfaceModemMessaging *self,
|
|||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Load initial SMS parts */
|
/* Load initial SMS parts */
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
LOAD_INITIAL_SMS_PARTS_STEP_FIRST,
|
||||||
|
LOAD_INITIAL_SMS_PARTS_STEP_LIST_ALL,
|
||||||
|
LOAD_INITIAL_SMS_PARTS_STEP_LIST_MT_READ,
|
||||||
|
LOAD_INITIAL_SMS_PARTS_STEP_LIST_MT_NOT_READ,
|
||||||
|
LOAD_INITIAL_SMS_PARTS_STEP_LIST_MO_SENT,
|
||||||
|
LOAD_INITIAL_SMS_PARTS_STEP_LIST_MO_NOT_SENT,
|
||||||
|
LOAD_INITIAL_SMS_PARTS_STEP_LAST
|
||||||
|
} LoadInitialSmsPartsStep;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
MMBroadbandModemQmi *self;
|
MMBroadbandModemQmi *self;
|
||||||
GSimpleAsyncResult *result;
|
GSimpleAsyncResult *result;
|
||||||
QmiClientWms *client;
|
QmiClientWms *client;
|
||||||
MMSmsStorage storage;
|
MMSmsStorage storage;
|
||||||
|
LoadInitialSmsPartsStep step;
|
||||||
|
|
||||||
|
/* For each step */
|
||||||
GArray *message_array;
|
GArray *message_array;
|
||||||
guint i;
|
guint i;
|
||||||
} LoadInitialSmsPartsContext;
|
} LoadInitialSmsPartsContext;
|
||||||
@@ -6104,6 +6117,8 @@ wms_raw_read_ready (QmiClientWms *client,
|
|||||||
read_next_sms_part (ctx);
|
read_next_sms_part (ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void load_initial_sms_parts_step (LoadInitialSmsPartsContext *ctx);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
read_next_sms_part (LoadInitialSmsPartsContext *ctx)
|
read_next_sms_part (LoadInitialSmsPartsContext *ctx)
|
||||||
{
|
{
|
||||||
@@ -6112,8 +6127,12 @@ read_next_sms_part (LoadInitialSmsPartsContext *ctx)
|
|||||||
|
|
||||||
if (ctx->i >= ctx->message_array->len ||
|
if (ctx->i >= ctx->message_array->len ||
|
||||||
!ctx->message_array) {
|
!ctx->message_array) {
|
||||||
g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
|
/* If we just listed all SMS, we're done. Otherwise go to next tag. */
|
||||||
load_initial_sms_parts_context_complete_and_free (ctx);
|
if (ctx->step == LOAD_INITIAL_SMS_PARTS_STEP_LIST_ALL)
|
||||||
|
ctx->step = LOAD_INITIAL_SMS_PARTS_STEP_LAST;
|
||||||
|
else
|
||||||
|
ctx->step++;
|
||||||
|
load_initial_sms_parts_step (ctx);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6159,10 +6178,11 @@ wms_list_messages_ready (QmiClientWms *client,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!qmi_message_wms_list_messages_output_get_result (output, &error)) {
|
if (!qmi_message_wms_list_messages_output_get_result (output, &error)) {
|
||||||
g_prefix_error (&error, "Couldn't list messages: ");
|
/* Ignore error, keep on */
|
||||||
g_simple_async_result_take_error (ctx->result, error);
|
g_debug ("Couldn't read SMS messages: %s", error->message);
|
||||||
load_initial_sms_parts_context_complete_and_free (ctx);
|
g_error_free (error);
|
||||||
qmi_message_wms_list_messages_output_unref (output);
|
ctx->step++;
|
||||||
|
load_initial_sms_parts_step (ctx);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6181,6 +6201,77 @@ wms_list_messages_ready (QmiClientWms *client,
|
|||||||
read_next_sms_part (ctx);
|
read_next_sms_part (ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
load_initial_sms_parts_step (LoadInitialSmsPartsContext *ctx)
|
||||||
|
{
|
||||||
|
QmiMessageWmsListMessagesInput *input;
|
||||||
|
|
||||||
|
/* Request to list messages in a given storage */
|
||||||
|
input = qmi_message_wms_list_messages_input_new ();
|
||||||
|
qmi_message_wms_list_messages_input_set_storage_type (
|
||||||
|
input,
|
||||||
|
mm_sms_storage_to_qmi_storage_type (ctx->storage),
|
||||||
|
NULL);
|
||||||
|
qmi_message_wms_list_messages_input_set_message_mode (input,
|
||||||
|
QMI_WMS_MESSAGE_MODE_GSM_WCDMA,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
switch (ctx->step) {
|
||||||
|
case LOAD_INITIAL_SMS_PARTS_STEP_FIRST:
|
||||||
|
ctx->step++;
|
||||||
|
/* Fall down */
|
||||||
|
case LOAD_INITIAL_SMS_PARTS_STEP_LIST_ALL:
|
||||||
|
mm_dbg ("loading all messages from storage '%s'...",
|
||||||
|
mm_sms_storage_get_string (ctx->storage));
|
||||||
|
break;
|
||||||
|
case LOAD_INITIAL_SMS_PARTS_STEP_LIST_MT_READ:
|
||||||
|
mm_dbg ("loading MT-read messages from storage '%s'...",
|
||||||
|
mm_sms_storage_get_string (ctx->storage));
|
||||||
|
qmi_message_wms_list_messages_input_set_message_tag (
|
||||||
|
input,
|
||||||
|
QMI_WMS_MESSAGE_TAG_TYPE_MT_READ,
|
||||||
|
NULL);
|
||||||
|
break;
|
||||||
|
case LOAD_INITIAL_SMS_PARTS_STEP_LIST_MT_NOT_READ:
|
||||||
|
mm_dbg ("loading MT-not-read messages from storage '%s'...",
|
||||||
|
mm_sms_storage_get_string (ctx->storage));
|
||||||
|
qmi_message_wms_list_messages_input_set_message_tag (
|
||||||
|
input,
|
||||||
|
QMI_WMS_MESSAGE_TAG_TYPE_MT_NOT_READ,
|
||||||
|
NULL);
|
||||||
|
break;
|
||||||
|
case LOAD_INITIAL_SMS_PARTS_STEP_LIST_MO_SENT:
|
||||||
|
mm_dbg ("loading MO-sent messages from storage '%s'...",
|
||||||
|
mm_sms_storage_get_string (ctx->storage));
|
||||||
|
qmi_message_wms_list_messages_input_set_message_tag (
|
||||||
|
input,
|
||||||
|
QMI_WMS_MESSAGE_TAG_TYPE_MO_SENT,
|
||||||
|
NULL);
|
||||||
|
break;
|
||||||
|
case LOAD_INITIAL_SMS_PARTS_STEP_LIST_MO_NOT_SENT:
|
||||||
|
mm_dbg ("loading MO-not-sent messages from storage '%s'...",
|
||||||
|
mm_sms_storage_get_string (ctx->storage));
|
||||||
|
qmi_message_wms_list_messages_input_set_message_tag (
|
||||||
|
input,
|
||||||
|
QMI_WMS_MESSAGE_TAG_TYPE_MO_NOT_SENT,
|
||||||
|
NULL);
|
||||||
|
break;
|
||||||
|
case LOAD_INITIAL_SMS_PARTS_STEP_LAST:
|
||||||
|
/* All steps done */
|
||||||
|
g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
|
||||||
|
load_initial_sms_parts_context_complete_and_free (ctx);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
qmi_client_wms_list_messages (QMI_CLIENT_WMS (ctx->client),
|
||||||
|
input,
|
||||||
|
5,
|
||||||
|
NULL,
|
||||||
|
(GAsyncReadyCallback)wms_list_messages_ready,
|
||||||
|
ctx);
|
||||||
|
qmi_message_wms_list_messages_input_unref (input);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
load_initial_sms_parts (MMIfaceModemMessaging *self,
|
load_initial_sms_parts (MMIfaceModemMessaging *self,
|
||||||
MMSmsStorage storage,
|
MMSmsStorage storage,
|
||||||
@@ -6189,7 +6280,6 @@ load_initial_sms_parts (MMIfaceModemMessaging *self,
|
|||||||
{
|
{
|
||||||
LoadInitialSmsPartsContext *ctx;
|
LoadInitialSmsPartsContext *ctx;
|
||||||
QmiClient *client = NULL;
|
QmiClient *client = NULL;
|
||||||
QmiMessageWmsListMessagesInput *input;
|
|
||||||
|
|
||||||
if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self),
|
if (!ensure_qmi_client (MM_BROADBAND_MODEM_QMI (self),
|
||||||
QMI_SERVICE_WMS, &client,
|
QMI_SERVICE_WMS, &client,
|
||||||
@@ -6204,27 +6294,9 @@ load_initial_sms_parts (MMIfaceModemMessaging *self,
|
|||||||
callback,
|
callback,
|
||||||
user_data,
|
user_data,
|
||||||
load_initial_sms_parts);
|
load_initial_sms_parts);
|
||||||
|
ctx->step = LOAD_INITIAL_SMS_PARTS_STEP_FIRST;
|
||||||
|
|
||||||
mm_dbg ("loading messages from storage '%s'...",
|
load_initial_sms_parts_step (ctx);
|
||||||
mm_sms_storage_get_string (storage));
|
|
||||||
|
|
||||||
/* Request to list messages in a given storage */
|
|
||||||
input = qmi_message_wms_list_messages_input_new ();
|
|
||||||
qmi_message_wms_list_messages_input_set_storage_type (
|
|
||||||
input,
|
|
||||||
mm_sms_storage_to_qmi_storage_type (storage),
|
|
||||||
NULL);
|
|
||||||
qmi_message_wms_list_messages_input_set_message_mode (
|
|
||||||
input,
|
|
||||||
QMI_WMS_MESSAGE_MODE_GSM_WCDMA,
|
|
||||||
NULL);
|
|
||||||
qmi_client_wms_list_messages (QMI_CLIENT_WMS (ctx->client),
|
|
||||||
input,
|
|
||||||
5,
|
|
||||||
NULL,
|
|
||||||
(GAsyncReadyCallback)wms_list_messages_ready,
|
|
||||||
ctx);
|
|
||||||
qmi_message_wms_list_messages_input_unref (input);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
Reference in New Issue
Block a user