mirror of git://git.sysmocom.de/ofono
Add SMS specific DCS decoding function
This commit is contained in:
parent
41071737d0
commit
4f0c149162
|
@ -105,6 +105,73 @@ static inline int to_semi_oct(char in)
|
||||||
return digit;
|
return digit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Returns whether the DCS could be parsed successfully, e.g. no reserved
|
||||||
|
* values were used
|
||||||
|
*/
|
||||||
|
gboolean sms_dcs_decode(guint8 dcs, enum sms_class *cls,
|
||||||
|
enum sms_charset *charset,
|
||||||
|
gboolean *compressed, gboolean *autodelete)
|
||||||
|
{
|
||||||
|
guint8 upper = (dcs & 0xf0) >> 4;
|
||||||
|
enum sms_charset ch;
|
||||||
|
enum sms_class cl;
|
||||||
|
gboolean comp;
|
||||||
|
gboolean autodel;
|
||||||
|
|
||||||
|
/* MWI DCS types are handled in sms_mwi_dcs_decode */
|
||||||
|
if (upper >= 0x8 && upper <= 0xE)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
upper = (dcs & 0xc0) >> 6;
|
||||||
|
|
||||||
|
switch (upper) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
autodel = upper;
|
||||||
|
comp = (dcs & 0x20) ? TRUE : FALSE;
|
||||||
|
|
||||||
|
if (dcs & 0x10)
|
||||||
|
cl = (enum sms_class)(dcs & 0x03);
|
||||||
|
else
|
||||||
|
cl = SMS_CLASS_UNSPECIFIED;
|
||||||
|
|
||||||
|
if (((dcs & 0x0c) >> 2) < 3)
|
||||||
|
ch = (enum sms_charset) ((dcs & 0x0c) >> 2);
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
comp = FALSE;
|
||||||
|
autodel = FALSE;
|
||||||
|
|
||||||
|
if (dcs & 0x4)
|
||||||
|
ch = SMS_CHARSET_8BIT;
|
||||||
|
else
|
||||||
|
ch = SMS_CHARSET_7BIT;
|
||||||
|
|
||||||
|
cl = (enum sms_class)(dcs & 0x03);
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (compressed)
|
||||||
|
*compressed = comp;
|
||||||
|
|
||||||
|
if (autodelete)
|
||||||
|
*autodelete = autodel;
|
||||||
|
|
||||||
|
if (cls)
|
||||||
|
*cls = cl;
|
||||||
|
|
||||||
|
if (charset)
|
||||||
|
*charset = ch;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
int ud_len_in_octets(guint8 ud_len, guint8 dcs)
|
int ud_len_in_octets(guint8 ud_len, guint8 dcs)
|
||||||
{
|
{
|
||||||
int len_7bit = (ud_len + 1) * 7 / 8;
|
int len_7bit = (ud_len + 1) * 7 / 8;
|
||||||
|
|
|
@ -140,6 +140,20 @@ enum sms_iei {
|
||||||
SMS_IEI_INVALID = 0xFFF
|
SMS_IEI_INVALID = 0xFFF
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum sms_class {
|
||||||
|
SMS_CLASS_0 = 0,
|
||||||
|
SMS_CLASS_1 = 1,
|
||||||
|
SMS_CLASS_2 = 2,
|
||||||
|
SMS_CLASS_3 = 3,
|
||||||
|
SMS_CLASS_UNSPECIFIED = 4,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum sms_charset {
|
||||||
|
SMS_CHARSET_7BIT = 0,
|
||||||
|
SMS_CHARSET_8BIT = 1,
|
||||||
|
SMS_CHARSET_UCS2 = 2,
|
||||||
|
};
|
||||||
|
|
||||||
struct sms_address {
|
struct sms_address {
|
||||||
enum sms_number_type number_type;
|
enum sms_number_type number_type;
|
||||||
enum sms_numbering_plan numbering_plan;
|
enum sms_numbering_plan numbering_plan;
|
||||||
|
@ -297,4 +311,7 @@ gboolean sms_udh_iter_has_next(struct sms_udh_iter *iter);
|
||||||
gboolean sms_udh_iter_next(struct sms_udh_iter *iter);
|
gboolean sms_udh_iter_next(struct sms_udh_iter *iter);
|
||||||
|
|
||||||
time_t sms_scts_to_time(struct sms_scts *scts, struct tm *remote);
|
time_t sms_scts_to_time(struct sms_scts *scts, struct tm *remote);
|
||||||
|
gboolean sms_dcs_decode(guint8 dcs, enum sms_class *cls,
|
||||||
|
enum sms_charset *charset,
|
||||||
|
gboolean *compressed, gboolean *autodelete);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue