broadband-modem: process not-stored SMS part indications

This commit is contained in:
Aleksander Morgado
2012-09-14 07:05:24 +02:00
parent 7be32700fb
commit 8acaf7baa7
3 changed files with 55 additions and 0 deletions
+42
View File
@@ -4601,6 +4601,39 @@ cmti_received (MMAtSerialPort *port,
g_free (command);
}
static void
cds_received (MMAtSerialPort *port,
GMatchInfo *info,
MMBroadbandModem *self)
{
GError *error = NULL;
MMSmsPart *part;
guint length;
gchar *pdu;
mm_dbg ("Got new non-stored message indication");
if (!mm_get_uint_from_match_info (info, 1, &length))
return;
pdu = g_match_info_fetch (info, 2);
if (!pdu)
return;
part = mm_sms_part_new_from_pdu (SMS_PART_INVALID_INDEX, pdu, &error);
if (part) {
mm_dbg ("Correctly parsed non-stored PDU");
mm_iface_modem_messaging_take_part (MM_IFACE_MODEM_MESSAGING (self),
part,
MM_SMS_STATE_RECEIVED,
MM_SMS_STORAGE_UNKNOWN);
} else {
/* Don't treat the error as critical */
mm_dbg ("Error parsing non-stored PDU: %s", error->message);
g_error_free (error);
}
}
static void
set_messaging_unsolicited_events_handlers (MMIfaceModemMessaging *self,
gboolean enable,
@@ -4610,6 +4643,7 @@ set_messaging_unsolicited_events_handlers (MMIfaceModemMessaging *self,
GSimpleAsyncResult *result;
MMAtSerialPort *ports[2];
GRegex *cmti_regex;
GRegex *cds_regex;
guint i;
result = g_simple_async_result_new (G_OBJECT (self),
@@ -4618,6 +4652,7 @@ set_messaging_unsolicited_events_handlers (MMIfaceModemMessaging *self,
set_messaging_unsolicited_events_handlers);
cmti_regex = mm_3gpp_cmti_regex_get ();
cds_regex = mm_3gpp_cds_regex_get ();
ports[0] = mm_base_modem_peek_port_primary (MM_BASE_MODEM (self));
ports[1] = mm_base_modem_peek_port_secondary (MM_BASE_MODEM (self));
@@ -4636,9 +4671,16 @@ set_messaging_unsolicited_events_handlers (MMIfaceModemMessaging *self,
enable ? (MMAtSerialUnsolicitedMsgFn) cmti_received : NULL,
enable ? self : NULL,
NULL);
mm_at_serial_port_add_unsolicited_msg_handler (
ports[i],
cds_regex,
enable ? (MMAtSerialUnsolicitedMsgFn) cds_received : NULL,
enable ? self : NULL,
NULL);
}
g_regex_unref (cmti_regex);
g_regex_unref (cds_regex);
g_simple_async_result_set_op_res_gboolean (result, TRUE);
g_simple_async_result_complete_in_idle (result);
g_object_unref (result);
+12
View File
@@ -285,6 +285,18 @@ mm_3gpp_cmti_regex_get (void)
NULL);
}
GRegex *
mm_3gpp_cds_regex_get (void)
{
/* Example:
* <CR><LF>+CDS: 24<CR><LF>07914356060013F10659098136395339F6219011707193802190117071938030<CR><LF>
*/
return g_regex_new ("\\r\\n\\+CDS:\\s*(\\d+)\\r\\n(.*)\\r\\n",
G_REGEX_RAW | G_REGEX_OPTIMIZE,
0,
NULL);
}
/*************************************************************************/
static void
+1
View File
@@ -70,6 +70,7 @@ void mm_3gpp_creg_regex_destroy (GPtrArray *array);
GRegex *mm_3gpp_ciev_regex_get (void);
GRegex *mm_3gpp_cusd_regex_get (void);
GRegex *mm_3gpp_cmti_regex_get (void);
GRegex *mm_3gpp_cds_regex_get (void);
/* AT+COPS=? (network scan) response parser */