Return the actual length of the PDU decoded
This commit is contained in:
parent
684b10c9b0
commit
ecd286b522
28
src/gsm.c
28
src/gsm.c
@ -1422,14 +1422,14 @@ static int _gsm_trigger_cmgl(GSM * gsm, char const * result)
|
|||||||
|
|
||||||
/* gsm_trigger_cmgr */
|
/* gsm_trigger_cmgr */
|
||||||
static char * _cmgr_pdu_parse(char const * pdu, time_t * timestamp,
|
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,
|
static void _cmgr_pdu_parse_number(char const * number, size_t length,
|
||||||
char buf[32]);
|
char buf[32]);
|
||||||
static time_t _cmgr_pdu_parse_timestamp(char const * timestamp);
|
static time_t _cmgr_pdu_parse_timestamp(char const * timestamp);
|
||||||
static char * _cmgr_pdu_parse_encoding_default(char const * pdu, size_t len,
|
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,
|
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)
|
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;
|
char * p;
|
||||||
GSMCommand * gsmc;
|
GSMCommand * gsmc;
|
||||||
char * q;
|
char * q;
|
||||||
|
size_t l = 0;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr, "DEBUG: %s(\"%s\")\n", __func__, result);
|
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,
|
else if((p = _cmgr_pdu_parse(result, &gsm->event.message.date,
|
||||||
gsm->number,
|
gsm->number,
|
||||||
&gsm->event.message.encoding)) != NULL)
|
&gsm->event.message.encoding,
|
||||||
|
&l)) != NULL)
|
||||||
{
|
{
|
||||||
gsm->event.message.index = 0;
|
gsm->event.message.index = 0;
|
||||||
if((gsmc = g_slist_nth_data(gsm->queue, 0)) != NULL)
|
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);
|
free(p);
|
||||||
p = q;
|
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.number = gsm->number; /* XXX ugly */
|
||||||
gsm->event.message.content = p;
|
gsm->event.message.content = p;
|
||||||
_gsm_event_send(gsm, GSM_EVENT_TYPE_MESSAGE);
|
_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 */
|
/* XXX this function is fat and ugly */
|
||||||
static char * _cmgr_pdu_parse(char const * pdu, time_t * timestamp,
|
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;
|
size_t len;
|
||||||
unsigned int smscl;
|
unsigned int smscl;
|
||||||
@ -1567,15 +1569,15 @@ static char * _cmgr_pdu_parse(char const * pdu, time_t * timestamp,
|
|||||||
return NULL;
|
return NULL;
|
||||||
if(dcs == 0x00)
|
if(dcs == 0x00)
|
||||||
return _cmgr_pdu_parse_encoding_default(pdu, len, i, hdr,
|
return _cmgr_pdu_parse_encoding_default(pdu, len, i, hdr,
|
||||||
encoding);
|
encoding, length);
|
||||||
if(dcs == 0x04)
|
if(dcs == 0x04)
|
||||||
return _cmgr_pdu_parse_encoding_data(pdu, len, i, hdr,
|
return _cmgr_pdu_parse_encoding_data(pdu, len, i, hdr,
|
||||||
encoding);
|
encoding, length);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char * _cmgr_pdu_parse_encoding_default(char const * pdu, size_t len,
|
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;
|
unsigned char * p;
|
||||||
size_t j;
|
size_t j;
|
||||||
@ -1614,13 +1616,14 @@ static char * _cmgr_pdu_parse_encoding_default(char const * pdu, size_t len,
|
|||||||
rest = 0;
|
rest = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
p[j] = '\0';
|
|
||||||
*encoding = GSM_ENCODING_UTF8;
|
*encoding = GSM_ENCODING_UTF8;
|
||||||
|
*length = j;
|
||||||
|
p[j] = '\0';
|
||||||
return (char *)p;
|
return (char *)p;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char * _cmgr_pdu_parse_encoding_data(char const * pdu, size_t len,
|
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;
|
unsigned char * p;
|
||||||
size_t j;
|
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++] = u;
|
||||||
}
|
}
|
||||||
p[j] = '\0';
|
|
||||||
*encoding = GSM_ENCODING_RAW_DATA;
|
*encoding = GSM_ENCODING_RAW_DATA;
|
||||||
|
*length = j;
|
||||||
|
p[j] = '\0';
|
||||||
return (char *)p;
|
return (char *)p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user