From f5f3f01b10cfba2bfe4ba2f11b5239423151dc4b Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Fri, 12 Aug 2011 01:51:20 +0000 Subject: [PATCH] Re-introducing SMS support --- src/modems/hayes.c | 71 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/src/modems/hayes.c b/src/modems/hayes.c index 34536c1..58b57ae 100644 --- a/src/modems/hayes.c +++ b/src/modems/hayes.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -75,6 +76,7 @@ typedef struct _Hayes char * contact_number; char * gprs_username; char * gprs_password; + char * message_number; char * model_name; char * model_vendor; char * model_version; @@ -293,6 +295,7 @@ static void _on_trigger_cgmr(ModemPlugin * modem, char const * answer); static void _on_trigger_clip(ModemPlugin * modem, char const * answer); static void _on_trigger_cme_error(ModemPlugin * modem, char const * answer); static void _on_trigger_cmgl(ModemPlugin * modem, char const * answer); +static void _on_trigger_cmgr(ModemPlugin * modem, char const * answer); static void _on_trigger_cmgs(ModemPlugin * modem, char const * answer); static void _on_trigger_cms_error(ModemPlugin * modem, char const * answer); static void _on_trigger_cmti(ModemPlugin * modem, char const * answer); @@ -449,6 +452,7 @@ static HayesTriggerHandler _hayes_trigger_handlers[] = { "+CLIP", _on_trigger_clip }, { "+CME ERROR", _on_trigger_cme_error }, { "+CMGL", _on_trigger_cmgl }, + { "+CMGR", _on_trigger_cmgr }, { "+CMGS", _on_trigger_cmgs }, { "+CMS ERROR", _on_trigger_cms_error }, { "+CMTI", _on_trigger_cmti }, @@ -520,6 +524,7 @@ static int _hayes_destroy(ModemPlugin * modem) string_delete(hayes->contact_number); string_delete(hayes->gprs_username); string_delete(hayes->gprs_password); + string_delete(hayes->message_number); string_delete(hayes->model_name); string_delete(hayes->model_vendor); string_delete(hayes->model_version); @@ -744,6 +749,7 @@ static char * _request_attention_message(ModemPlugin * modem, unsigned int id) char const cmd[] = "AT+CMGR="; char buf[32]; + /* FIXME force the message format to be in PDU mode? */ snprintf(buf, sizeof(buf), "%s%u", cmd, id); return strdup(buf); } @@ -2496,7 +2502,6 @@ static void _on_trigger_cme_error(ModemPlugin * modem, char const * answer) /* on_trigger_cmgl */ static void _on_trigger_cmgl(ModemPlugin * modem, char const * answer) { - Hayes * hayes = modem->priv; ModemRequest request; unsigned int id; unsigned int u; @@ -2512,6 +2517,70 @@ static void _on_trigger_cmgl(ModemPlugin * modem, char const * answer) } +/* on_trigger_cmgr */ +static char * _cmgr_pdu_parse(char const * pdu, time_t * timestamp, + char * number, ModemMessageEncoding * encoding, + size_t * length); + +static void _on_trigger_cmgr(ModemPlugin * modem, char const * answer) +{ + Hayes * hayes = modem->priv; + ModemEvent * event = &hayes->events[MODEM_EVENT_TYPE_MESSAGE]; + char buf[32]; + char number[32]; + char date[32]; + struct tm t; + unsigned int mbox; + unsigned int alpha = 0; + unsigned int length; + char * p; + + /* text mode support */ + if(sscanf(answer, "\"%31[^\"]\",\"%31[^\"]\",,\"%31[^\"]\"", buf, + number, date) == 3) + { + number[sizeof(number) - 1] = '\0'; + string_delete(hayes->message_number); + hayes->message_number = string_new(number); + event->message.number = hayes->message_number; + date[sizeof(date) - 1] = '\0'; + if(strptime(date, "%y/%m/%d,%H:%M:%S", &t) == NULL) + /* XXX also parse the timezone? */ + localtime_r(NULL, &t); + event->message.date = mktime(&t); + event->message.length = 0; + return; /* we need to wait for the next line */ + } + /* PDU mode support */ + if(sscanf(answer, "%u,%u,%u", &mbox, &alpha, &length) == 3 + || sscanf(answer, "%u,,%u", &mbox, &length) == 2) + return; /* we need to wait for the next line */ + /* message content */ + if(event->message.length == 0) /* XXX assumes this is text mode */ + { + event->message.encoding = MODEM_MESSAGE_ENCODING_UTF8; + event->message.content = answer; + event->message.length = strlen(answer); + modem->helper->event(modem->helper->modem, event); + return; + } + if((p = _cmgr_pdu_parse(answer, &event->message.date, number, + &event->message.encoding, + &event->message.length)) == NULL) + return; + event->message.number = number; /* XXX */ + modem->helper->event(modem->helper->modem, event); + free(p); +} + +static char * _cmgr_pdu_parse(char const * pdu, time_t * timestamp, + char * number, ModemMessageEncoding * encoding, size_t * length) +{ + /* FIXME implement */ + return NULL; +} + + /* on_trigger_cmgs */ static void _on_trigger_cmgs(ModemPlugin * modem, char const * answer) {