diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-broadband-modem.c | 42 | ||||
-rw-r--r-- | src/mm-modem-helpers.c | 12 | ||||
-rw-r--r-- | src/mm-modem-helpers.h | 1 |
3 files changed, 55 insertions, 0 deletions
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index 0b3e62df..fb6f765e 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -4602,6 +4602,39 @@ cmti_received (MMAtSerialPort *port, } 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, GAsyncReadyCallback callback, @@ -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); diff --git a/src/mm-modem-helpers.c b/src/mm-modem-helpers.c index 991900ce..60d7459b 100644 --- a/src/mm-modem-helpers.c +++ b/src/mm-modem-helpers.c @@ -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 diff --git a/src/mm-modem-helpers.h b/src/mm-modem-helpers.h index 26169e97..95b15ebc 100644 --- a/src/mm-modem-helpers.h +++ b/src/mm-modem-helpers.h @@ -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 */ |