From 9ba6e09f0688f9e1fd7171718df7181cfe41a73d Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Tue, 11 May 2010 10:31:10 +0000 Subject: [PATCH] Fetching messages in text mode for the moment --- src/gsm.c | 38 ++++++++++++++++++++++++++++---------- src/gsm.h | 2 ++ src/modem.c | 3 ++- 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/gsm.c b/src/gsm.c index 0472c92..2f60e1b 100644 --- a/src/gsm.c +++ b/src/gsm.c @@ -539,6 +539,8 @@ int gsm_event(GSM * gsm, GSMEventType type, ...) case GSM_EVENT_TYPE_MESSAGE: /* FIXME implement correctly */ event->message.index = va_arg(ap, unsigned int); + event->message.date = va_arg(ap, time_t); + event->message.length = va_arg(ap, unsigned int); event->message.content = va_arg(ap, char const *); break; case GSM_EVENT_TYPE_MESSAGE_LIST: @@ -602,6 +604,7 @@ int gsm_fetch_message_list(GSM * gsm, GSMMessageList list) /* gsm_fetch_message */ int gsm_fetch_message(GSM * gsm, unsigned int index) { + gsm->event.message.index = index; /* FIXME may be over-written */ return gsm_modem_get_message(gsm->modem, index); } @@ -1210,22 +1213,37 @@ static int _gsm_trigger_cmgl(GSM * gsm, char const * result) /* gsm_trigger_cmgr */ static int _gsm_trigger_cmgr(GSM * gsm, char const * result) { - unsigned int stat; + char buf[32]; + char date[32]; + unsigned int mbox; unsigned int alpha = 0; - unsigned int length; + unsigned int * length = &gsm->event.message.length; + struct tm t; #ifdef DEBUG fprintf(stderr, "DEBUG: %s(\"%s\")\n", __func__, result); #endif - /* FIXME implement: - * - store the index (and length?) somewhere - * - then we (blindly) parse the PDU and report the message */ - if(sscanf(result, "%u,%u,%u", &stat, &alpha, &length) == 3 - || sscanf(result, "%u,,%u", &stat, &length) == 2) + /* FIXME report which mailbox contains the message? */ + /* text mode support */ + if(sscanf(result, "\"%31[^\"]\",\"%31[^\"]\",,\"%31[^\"]\"", buf, + buf, date) == 3) /* FIXME really implement */ + { + date[sizeof(date) - 1] = '\0'; + if(strptime(date, "%y/%m/%d,%T", &t) == NULL) /* XXX timezone */ + localtime_r(NULL, &t); + gsm->event.message.date = mktime(&t); + *length = 0; + return 0; /* we need to wait for the next line */ + } + /* PDU mode support */ + if(sscanf(result, "%u,%u,%u", &mbox, &alpha, length) == 3 + || sscanf(result, "%u,,%u", &mbox, length) == 2) return 0; - /* FIXME actually parse the PDU */ - gsm->event.message.index = 0; /* FIXME implement */ - gsm->event.message.content = result; + /* message content */ + if(*length == 0) /* XXX assumes this is text mode */ + gsm->event.message.content = result; + else /* FIXME actually parse the PDU */ + gsm->event.message.content = result; return _gsm_event_send(gsm, GSM_EVENT_TYPE_MESSAGE); } diff --git a/src/gsm.h b/src/gsm.h index d4d2f2c..2505908 100644 --- a/src/gsm.h +++ b/src/gsm.h @@ -222,6 +222,8 @@ typedef union _GSMEvent { GSMEventType type; unsigned int index; + time_t date; + unsigned int length; /* XXX may be removed */ char const * content; } message; diff --git a/src/modem.c b/src/modem.c index 02f6fee..71a216e 100644 --- a/src/modem.c +++ b/src/modem.c @@ -286,7 +286,8 @@ int gsm_modem_get_message(GSMModem * gsmm, unsigned int index) { char cmd[32]; - if(gsm_modem_set_message_format(gsmm, GSM_MESSAGE_FORMAT_PDU) != 0) + /* FIXME should default to PDU mode */ + if(gsm_modem_set_message_format(gsmm, GSM_MESSAGE_FORMAT_TEXT) != 0) return 1; snprintf(cmd, sizeof(cmd), "%s%u", "AT+CMGR=", index); /* XXX race condition here if the user forces out of PDU mode */