diff --git a/src/gsm.c b/src/gsm.c index 7c6b98b..fbb6bd2 100644 --- a/src/gsm.c +++ b/src/gsm.c @@ -480,6 +480,15 @@ int gsm_set_line_presentation(GSM * gsm, int set) } +/* gsm_set_message_indications */ +int gsm_set_message_indications(GSM * gsm, GSMMessageMode mode, + int unsollicited) +{ + return gsm_modem_set_message_indications(gsm->modem, mode, + (unsollicited != 0) ? TRUE : FALSE); +} + + /* gsm_set_mute */ int gsm_set_mute(GSM * gsm, int mute) { diff --git a/src/gsm.h b/src/gsm.h index b20afd4..41f32fd 100644 --- a/src/gsm.h +++ b/src/gsm.h @@ -114,6 +114,14 @@ typedef enum _GSMMessageList GSM_MESSAGE_LIST_ALL = 4 } GSMMessageList; +typedef enum _GSMMessageMode +{ + GSM_MESSAGE_MODE_BUFFER_REPLACE = 0, + GSM_MESSAGE_MODE_DISCARD_REJECT = 1, + GSM_MESSAGE_MODE_BUFFER_FLUSH = 2, + GSM_MESSAGE_MODE_FORWARD = 3 +} GSMMessageMode; + typedef enum _GSMMode { GSM_MODE_INIT = 0, GSM_MODE_COMMAND, GSM_MODE_PDU @@ -336,6 +344,8 @@ int gsm_set_call_waiting_control(GSM * gsm, int unsollicited); int gsm_set_extended_ring_reports(GSM * gsm, int extended); int gsm_set_functional(GSM * gsm, int functional); int gsm_set_line_presentation(GSM * gsm, int set); +int gsm_set_message_indications(GSM * gsm, GSMMessageMode mode, + int unsollicited); int gsm_set_mute(GSM * gsm, int mute); int gsm_set_operator_format(GSM * gsm, GSMOperatorFormat format); int gsm_set_operator_mode(GSM * gsm, GSMOperatorMode mode); diff --git a/src/modem.c b/src/modem.c index 5c899e2..7bc2c53 100644 --- a/src/modem.c +++ b/src/modem.c @@ -500,7 +500,7 @@ int gsm_modem_send_message(GSMModem * gsmm, char const * number, & GSM_MODEM_QUIRK_WANT_SMSC_IN_PDU ? "00" : "", cmd2, strlen(number), addr, pid, dcs, vp, length, data); - len2 = strlen(buf2); + len2 = strlen(buf2); /* XXX obtain it from snprintf() */ if(gsmm->quirks & GSM_MODEM_QUIRK_WANT_SMSC_IN_PDU) len2 -= 2; snprintf(buf1, len1, "%s%lu", cmd1, (len2 - 1) / 2); @@ -720,6 +720,28 @@ int gsm_modem_set_message_format(GSMModem * gsmm, GSMMessageFormat format) } +/* gsm_modem_set_message_indications */ +int gsm_modem_set_message_indications(GSMModem * gsmm, GSMMessageMode mode, + gboolean unsollicited) +{ + char cmd[] = "AT+CNMI=X,X"; + + switch(mode) + { + case GSM_MESSAGE_MODE_BUFFER_REPLACE: + case GSM_MESSAGE_MODE_DISCARD_REJECT: + case GSM_MESSAGE_MODE_BUFFER_FLUSH: + case GSM_MESSAGE_MODE_FORWARD: + break; + default: + return 1; + } + cmd[8] = mode + '0'; + cmd[10] = unsollicited ? '1' : '0'; + return (gsm_queue(gsmm->gsm, cmd) != NULL) ? 0 : 1; +} + + /* gsm_modem_set_mute */ static void _modem_set_mute_callback(GSM * gsm); diff --git a/src/modem.h b/src/modem.h index a48b97f..5b991ea 100644 --- a/src/modem.h +++ b/src/modem.h @@ -91,6 +91,8 @@ int gsm_modem_set_extended_ring_reports(GSMModem * gsmm, gboolean extended); int gsm_modem_set_line_presentation(GSMModem * gsmm, gboolean set); int gsm_modem_set_functional(GSMModem * gsmm, gboolean functional); int gsm_modem_set_message_format(GSMModem * gsmm, GSMMessageFormat format); +int gsm_modem_set_message_indications(GSMModem * gsmm, GSMMessageMode mode, + gboolean unsollicited); int gsm_modem_set_mute(GSMModem * gsmm, gboolean mute); int gsm_modem_set_operator_format(GSMModem * gsmm, GSMOperatorFormat format); int gsm_modem_set_operator_mode(GSMModem * gsmm, GSMOperatorMode mode); diff --git a/src/phone.c b/src/phone.c index ae37570..4070195 100644 --- a/src/phone.c +++ b/src/phone.c @@ -2348,6 +2348,8 @@ static int _phone_gsm_event(GSMEvent * event, gpointer data) } gsm_set_call_presentation(phone->gsm, TRUE); gsm_set_extended_ring_reports(phone->gsm, TRUE); + gsm_set_message_indications(phone->gsm, + GSM_MESSAGE_MODE_BUFFER_FLUSH, TRUE); gsm_set_operator_mode(phone->gsm, GSM_OPERATOR_MODE_AUTOMATIC); gsm_set_registration_report(phone->gsm, report);