Return the actual length of the PDU decoded

This commit is contained in:
Pierre Pronchery 2010-06-03 13:13:28 +00:00
parent 684b10c9b0
commit ecd286b522

View File

@ -1422,14 +1422,14 @@ static int _gsm_trigger_cmgl(GSM * gsm, char const * result)
/* gsm_trigger_cmgr */
static char * _cmgr_pdu_parse(char const * pdu, time_t * timestamp,
char number[32], GSMEncoding * encoding);
char number[32], GSMEncoding * encoding, size_t * length);
static void _cmgr_pdu_parse_number(char const * number, size_t length,
char buf[32]);
static time_t _cmgr_pdu_parse_timestamp(char const * timestamp);
static char * _cmgr_pdu_parse_encoding_default(char const * pdu, size_t len,
size_t i, size_t hdr, GSMEncoding * encoding);
size_t i, size_t hdr, GSMEncoding * encoding, size_t * length);
static char * _cmgr_pdu_parse_encoding_data(char const * pdu, size_t len,
size_t i, size_t hdr, GSMEncoding * encoding);
size_t i, size_t hdr, GSMEncoding * encoding, size_t * length);
static int _gsm_trigger_cmgr(GSM * gsm, char const * result)
{
@ -1442,6 +1442,7 @@ static int _gsm_trigger_cmgr(GSM * gsm, char const * result)
char * p;
GSMCommand * gsmc;
char * q;
size_t l = 0;
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s(\"%s\")\n", __func__, result);
@ -1475,7 +1476,8 @@ static int _gsm_trigger_cmgr(GSM * gsm, char const * result)
}
else if((p = _cmgr_pdu_parse(result, &gsm->event.message.date,
gsm->number,
&gsm->event.message.encoding)) != NULL)
&gsm->event.message.encoding,
&l)) != NULL)
{
gsm->event.message.index = 0;
if((gsmc = g_slist_nth_data(gsm->queue, 0)) != NULL)
@ -1487,7 +1489,7 @@ static int _gsm_trigger_cmgr(GSM * gsm, char const * result)
free(p);
p = q;
}
*length = strlen(p); /* FIXME get it from _cmgr_pdu_parse() */
*length = l;
gsm->event.message.number = gsm->number; /* XXX ugly */
gsm->event.message.content = p;
_gsm_event_send(gsm, GSM_EVENT_TYPE_MESSAGE);
@ -1498,7 +1500,7 @@ static int _gsm_trigger_cmgr(GSM * gsm, char const * result)
/* XXX this function is fat and ugly */
static char * _cmgr_pdu_parse(char const * pdu, time_t * timestamp,
char number[32], GSMEncoding * encoding)
char number[32], GSMEncoding * encoding, size_t * length)
{
size_t len;
unsigned int smscl;
@ -1567,15 +1569,15 @@ static char * _cmgr_pdu_parse(char const * pdu, time_t * timestamp,
return NULL;
if(dcs == 0x00)
return _cmgr_pdu_parse_encoding_default(pdu, len, i, hdr,
encoding);
encoding, length);
if(dcs == 0x04)
return _cmgr_pdu_parse_encoding_data(pdu, len, i, hdr,
encoding);
encoding, length);
return NULL;
}
static char * _cmgr_pdu_parse_encoding_default(char const * pdu, size_t len,
size_t i, size_t hdr, GSMEncoding * encoding)
size_t i, size_t hdr, GSMEncoding * encoding, size_t * length)
{
unsigned char * p;
size_t j;
@ -1614,13 +1616,14 @@ static char * _cmgr_pdu_parse_encoding_default(char const * pdu, size_t len,
rest = 0;
}
}
p[j] = '\0';
*encoding = GSM_ENCODING_UTF8;
*length = j;
p[j] = '\0';
return (char *)p;
}
static char * _cmgr_pdu_parse_encoding_data(char const * pdu, size_t len,
size_t i, size_t hdr, GSMEncoding * encoding)
size_t i, size_t hdr, GSMEncoding * encoding, size_t * length)
{
unsigned char * p;
size_t j;
@ -1639,8 +1642,9 @@ static char * _cmgr_pdu_parse_encoding_data(char const * pdu, size_t len,
}
p[j++] = u;
}
p[j] = '\0';
*encoding = GSM_ENCODING_RAW_DATA;
*length = j;
p[j] = '\0';
return (char *)p;
}