3
* oFono - Open Source Telephony
5
* Copyright (C) 2008-2009 Intel Corporation. All rights reserved.
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License version 2 as
9
* published by the Free Software Foundation.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22
#define CBS_MAX_GSM_CHARS 93
26
SMS_TYPE_DELIVER_REPORT_ACK,
27
SMS_TYPE_DELIVER_REPORT_ERROR,
28
SMS_TYPE_STATUS_REPORT,
30
SMS_TYPE_SUBMIT_REPORT_ACK,
31
SMS_TYPE_SUBMIT_REPORT_ERROR,
35
/* 23.040 Section 9.1.2.5 */
36
enum sms_number_type {
37
SMS_NUMBER_TYPE_UNKNOWN = 0,
38
SMS_NUMBER_TYPE_INTERNATIONAL = 1,
39
SMS_NUMBER_TYPE_NATIONAL = 2,
40
SMS_NUMBER_TYPE_NETWORK_SPECIFIC = 3,
41
SMS_NUMBER_TYPE_SUBSCRIBER = 4,
42
SMS_NUMBER_TYPE_ALPHANUMERIC = 5,
43
SMS_NUMBER_TYPE_ABBREVIATED = 6,
44
SMS_NUMBER_TYPE_RESERVED = 7
47
/* 23.040 Section 9.1.2.5 */
48
enum sms_numbering_plan {
49
SMS_NUMBERING_PLAN_UNKNOWN = 0,
50
SMS_NUMBERING_PLAN_ISDN = 1,
51
SMS_NUMBERING_PLAN_DATA = 3,
52
SMS_NUMBERING_PLAN_TELEX = 4,
53
SMS_NUMBERING_PLAN_SC1 = 5,
54
SMS_NUMBERING_PLAN_SC2 = 6,
55
SMS_NUMBERING_PLAN_NATIONAL = 8,
56
SMS_NUMBERING_PLAN_PRIVATE = 9,
57
SMS_NUMBERING_PLAN_ERMES = 10,
58
SMS_NUMBERING_PLAN_RESERVED = 15
61
enum sms_validity_period_format {
62
SMS_VALIDITY_PERIOD_FORMAT_ABSENT = 0,
63
SMS_VALIDITY_PERIOD_FORMAT_ENHANCED = 1,
64
SMS_VALIDITY_PERIOD_FORMAT_RELATIVE = 2,
65
SMS_VALIDITY_PERIOD_FORMAT_ABSOLUTE = 3,
69
SMS_ST_COMPLETED_RECEIVED = 0x0,
70
SMS_ST_COMPLETED_UNABLE_TO_CONFIRM = 0x1,
71
SMS_ST_COMPLETED_REPLACED = 0x2,
72
SMS_ST_COMPLETED_LAST = 0x1F,
73
SMS_ST_TEMPORARY_CONGESTION = 0x20,
74
SMS_ST_TEMPORARY_SME_BUSY = 0x21,
75
SMS_ST_TEMPORARY_NO_RESPONSE = 0x22,
76
SMS_ST_TEMPORARY_SERVICE_REJECTED = 0x23,
77
SMS_ST_TEMPORARY_QOS_UNAVAILABLE = 0x24,
78
SMS_ST_TEMPORARY_SME_ERROR = 0x25,
79
SMS_ST_TEMPORARY_LAST = 0x2F,
80
SMS_ST_PERMANENT_RP_ERROR = 0x40,
81
SMS_ST_PERMANENT_INVALID_DESTINATION = 0x41,
82
SMS_ST_PERMANENT_CONNECTION_REJECTED = 0x42,
83
SMS_ST_PERMANENT_NOT_OBTAINABLE = 0x43,
84
SMS_ST_PERMANENT_QOS_UNAVAILABLE = 0x44,
85
SMS_ST_PERMANENT_INTERWORKING_UNAVAILABLE = 0x45,
86
SMS_ST_PERMANENT_VALIDITY_PERIOD_EXPIRED = 0x46,
87
SMS_ST_PERMANENT_DELETED = 0x47,
88
SMS_ST_PERMANENT_SC_ADMIN_DELETED = 0x48,
89
SMS_ST_PERMANENT_SM_DOES_NOT_EXIST = 0x49,
90
SMS_ST_PERMANENT_LAST = 0x4F,
91
SMS_ST_TEMPFINAL_CONGESTION = 0x60,
92
SMS_ST_TEMPFINAL_SME_BUSY = 0x61,
93
SMS_ST_TEMPFINAL_NO_RESPONSE = 0x62,
94
SMS_ST_TEMPFINAL_SERVICE_REJECTED = 0x63,
95
SMS_ST_TEMPFINAL_QOS_UNAVAILABLE = 0x64,
96
SMS_ST_TEMPFINAL_SME_ERROR = 0x65,
97
SMS_ST_TEMPFINAL_LAST = 0x6F,
102
SMS_CT_CANCEL_SRR = 1,
103
SMS_CT_DELETE_SM = 2,
104
SMS_CT_ENABLE_SRR = 3
108
SMS_IEI_CONCATENATED_8BIT = 0x00,
109
SMS_IEI_SPECIAL_MESSAGE_INDICATION = 0x01,
110
SMS_IEI_APPLICATION_ADDRESS_8BIT = 0x04,
111
SMS_IEI_APPLICATION_ADDRESS_16BIT = 0x05,
112
SMS_IEI_SMSC_CONTROL_PARAMETERS = 0x06,
113
SMS_IEI_UDH_SOURCE_INDICATOR = 0x07,
114
SMS_IEI_CONCATENATED_16BIT = 0x08,
116
SMS_IEI_TEXT_FORMAT = 0x0A,
117
SMS_IEI_PREDEFINED_SOUND = 0x0B,
118
SMS_IEI_USER_DEFINED_SOUND = 0x0C,
119
SMS_IEI_PREDEFINED_ANIMATION = 0x0D,
120
SMS_IEI_LARGE_ANIMATION = 0x0E,
121
SMS_IEI_SMALL_ANIMATION = 0x0F,
122
SMS_IEI_LARGE_PICTURE = 0x10,
123
SMS_IEI_SMALL_PICTURE = 0x11,
124
SMS_IEI_VARIABLE_PICTURE = 0x12,
125
SMS_IEI_USER_PROMPT_INDICATOR = 0x13,
126
SMS_IEI_EXTENDED_OBJECT = 0x14,
127
SMS_IEI_REUSED_EXTENDED_OBJECT = 0x15,
128
SMS_IEI_COMPRESSION_CONTROL = 0x16,
129
SMS_IEI_OBJECT_DISTRIBUTION_INDICATOR = 0x17,
130
SMS_IEI_STANDARD_WVG_OBJECT = 0x18,
131
SMS_IEI_CHARACTER_SIZE_WVG_OBJECT = 0x19,
132
SMS_IEI_EXTENDED_OBJECT_DATA_REQUEST_COMMAND = 0x1A,
133
SMS_IEI_RFC822_EMAIL_HEADER = 0x20,
134
SMS_IEI_HYPERLINK_ELEMENT = 0x21,
135
SMS_IEI_REPLY_ADDRESS_ELEMENT = 0x22,
136
SMS_IEI_ENHANCED_VOICE_MAIL_INFORMATION = 0x23,
137
SMS_IEI_NATIONAL_LANGUAGE_SINGLE_SHIFT = 0x24,
138
SMS_IEI_NATIONAL_LANGUAGE_LOCKING_SHIFT = 0x25,
139
SMS_IEI_INVALID = 0xFFF
147
SMS_CLASS_UNSPECIFIED = 4,
151
SMS_CHARSET_7BIT = 0,
152
SMS_CHARSET_8BIT = 1,
153
SMS_CHARSET_UCS2 = 2,
157
SMS_MWI_TYPE_VOICE = 0,
158
SMS_MWI_TYPE_FAX = 1,
159
SMS_MWI_TYPE_EMAIL = 2,
160
SMS_MWI_TYPE_OTHER = 3,
161
SMS_MWI_TYPE_VIDEO = 4,
165
SMS_PID_TYPE_SM_TYPE_0 = 0x40,
166
SMS_PID_TYPE_REPLACE_SM_TYPE_1 = 0x41,
167
SMS_PID_TYPE_REPLACE_SM_TYPE_2 = 0x42,
168
SMS_PID_TYPE_REPLACE_SM_TYPE_3 = 0x43,
169
SMS_PID_TYPE_REPLACE_SM_TYPE_4 = 0x44,
170
SMS_PID_TYPE_REPLACE_SM_TYPE_5 = 0x45,
171
SMS_PID_TYPE_REPLACE_SM_TYPE_6 = 0x46,
172
SMS_PID_TYPE_REPLACE_SM_TYPE_7 = 0x47,
173
SMS_PID_TYPE_ENHANCED_MESSAGE_SERVICE = 0x5e,
174
SMS_PID_TYPE_RETURN_CALL = 0x5f,
175
SMS_PID_TYPE_ANSI136 = 0x7c,
176
SMS_PID_TYPE_ME_DOWNLOAD = 0x7d,
177
SMS_PID_TYPE_ME_DEPERSONALIZATION = 0x7e,
178
SMS_PID_TYPE_USIM_DOWNLOAD = 0x7f,
182
CBS_LANGUAGE_GERMAN = 0x0,
183
CBS_LANGUAGE_ENGLISH = 0x1,
184
CBS_LANGUAGE_ITALIAN = 0x2,
185
CBS_LANGUAGE_FRENCH = 0x3,
186
CBS_LANGUAGE_SPANISH = 0x4,
187
CBS_LANGUAGE_DUTCH = 0x5,
188
CBS_LANGUAGE_SWEDISH = 0x6,
189
CBS_LANGUAGE_DANISH = 0x7,
190
CBS_LANGUAGE_PORTUGESE = 0x8,
191
CBS_LANGUAGE_FINNISH = 0x9,
192
CBS_LANGUAGE_NORWEGIAN = 0xA,
193
CBS_LANGUAGE_GREEK = 0xB,
194
CBS_LANGUAGE_TURKISH = 0xC,
195
CBS_LANGUAGE_HUNGARIAN = 0xD,
196
CBS_LANGUAGE_POLISH = 0xE,
197
CBS_LANGUAGE_UNSPECIFIED = 0xF,
198
CBS_LANGUAGE_CZECH = 0x20,
199
CBS_LANGUAGE_HEBREW = 0x21,
200
CBS_LANGUAGE_ARABIC = 0x22,
201
CBS_LANGUAGE_RUSSIAN = 0x23,
202
CBS_LANGUAGE_ICELANDIC = 0x24
206
CBS_GEO_SCOPE_CELL_IMMEDIATE,
208
CBS_GEO_SCOPE_SERVICE_AREA,
209
CBS_GEO_SCOPE_CELL_NORMAL
213
enum sms_number_type number_type;
214
enum sms_numbering_plan numbering_plan;
215
char address[21]; /* Max 20 in semi-octet, 11 in alnum */
228
struct sms_validity_period {
231
struct sms_scts absolute;
241
struct sms_address oaddr;
244
struct sms_scts scts;
249
struct sms_deliver_err_report {
259
struct sms_deliver_ack_report {
275
struct sms_address daddr;
280
struct sms_status_report {
285
struct sms_address raddr;
286
struct sms_scts scts;
298
enum sms_validity_period_format vpf;
303
struct sms_address daddr;
306
struct sms_validity_period vp;
311
struct sms_submit_ack_report {
314
struct sms_scts scts;
321
struct sms_submit_err_report {
325
struct sms_scts scts;
333
struct sms_address sc_addr;
336
struct sms_deliver deliver;
337
struct sms_deliver_ack_report deliver_ack_report;
338
struct sms_deliver_err_report deliver_err_report;
339
struct sms_submit submit;
340
struct sms_submit_ack_report submit_ack_report;
341
struct sms_submit_err_report submit_err_report;
342
struct sms_command command;
343
struct sms_status_report status_report;
347
struct sms_udh_iter {
352
struct sms_assembly_node {
353
struct sms_address addr;
355
GSList *fragment_list;
357
guint8 max_fragments;
358
guint8 num_fragments;
359
unsigned int bitmap[8];
362
struct sms_assembly {
363
GSList *assembly_list;
367
enum cbs_geo_scope gs; /* 2 bits */
368
guint16 message_code; /* 10 bits */
369
guint8 update_number; /* 4 bits */
370
guint16 message_identifier; /* 16 bits */
371
guint8 dcs; /* 8 bits */
372
guint8 max_pages; /* 4 bits */
373
guint8 page; /* 4 bits */
377
struct cbs_assembly_node {
383
struct cbs_assembly {
384
GSList *assembly_list;
390
static inline gboolean is_bit_set(unsigned char oct, int bit)
392
int mask = 0x1 << bit;
393
return oct & mask ? TRUE : FALSE;
396
static inline unsigned char bit_field(unsigned char oct, int start, int num)
398
unsigned char mask = (0x1 << num) - 1;
400
return (oct >> start) & mask;
403
void extract_bcd_number(const unsigned char *buf, int len, char *out);
404
void encode_bcd_number(const char *number, unsigned char *out);
406
gboolean sms_decode(const unsigned char *pdu, int len, gboolean outgoing,
407
int tpdu_len, struct sms *out);
409
gboolean sms_encode(const struct sms *in, int *len, int *tpdu_len,
412
gboolean sms_decode_address_field(const unsigned char *pdu, int len,
413
int *offset, gboolean sc,
414
struct sms_address *out);
416
gboolean sms_encode_address_field(const struct sms_address *in, gboolean sc,
417
unsigned char *pdu, int *offset);
419
int sms_udl_in_bytes(guint8 ud_len, guint8 dcs);
421
time_t sms_scts_to_time(const struct sms_scts *scts, struct tm *remote);
423
const char *sms_address_to_string(const struct sms_address *addr);
424
void sms_address_from_string(struct sms_address *addr, const char *str);
426
const guint8 *sms_extract_common(const struct sms *sms, gboolean *out_udhi,
427
guint8 *out_dcs, guint8 *out_udl,
430
gboolean sms_udh_iter_init(const struct sms *sms, struct sms_udh_iter *iter);
431
gboolean sms_udh_iter_init_from_cbs(const struct cbs *cbs,
432
struct sms_udh_iter *iter);
433
guint8 sms_udh_iter_get_udh_length(struct sms_udh_iter *iter);
434
const guint8 *sms_udh_iter_get_ud_after_header(struct sms_udh_iter *iter);
435
enum sms_iei sms_udh_iter_get_ie_type(struct sms_udh_iter *iter);
436
guint8 sms_udh_iter_get_ie_length(struct sms_udh_iter *iter);
437
void sms_udh_iter_get_ie_data(struct sms_udh_iter *iter, guint8 *data);
438
gboolean sms_udh_iter_has_next(struct sms_udh_iter *iter);
439
gboolean sms_udh_iter_next(struct sms_udh_iter *iter);
441
gboolean sms_dcs_decode(guint8 dcs, enum sms_class *cls,
442
enum sms_charset *charset,
443
gboolean *compressed, gboolean *autodelete);
445
gboolean sms_mwi_dcs_decode(guint8 dcs, enum sms_mwi_type *type,
446
enum sms_charset *charset,
447
gboolean *active, gboolean *discard);
449
gboolean sms_extract_app_port(const struct sms *sms, int *dst, int *src,
451
gboolean sms_extract_concatenation(const struct sms *sms, guint16 *ref_num,
452
guint8 *max_msgs, guint8 *seq_num);
454
unsigned char *sms_decode_datagram(GSList *sms_list, long *out_len);
455
char *sms_decode_text(GSList *sms_list);
457
struct sms_assembly *sms_assembly_new();
458
void sms_assembly_free(struct sms_assembly *assembly);
459
GSList *sms_assembly_add_fragment(struct sms_assembly *assembly,
460
const struct sms *sms, time_t ts,
461
const struct sms_address *addr,
462
guint16 ref, guint8 max, guint8 seq);
463
void sms_assembly_expire(struct sms_assembly *assembly, time_t before);
465
GSList *sms_text_prepare(const char *utf8, guint16 ref,
466
gboolean use_16bit, int *ref_offset);
468
gboolean cbs_dcs_decode(guint8 dcs, gboolean *udhi, enum sms_class *cls,
469
enum sms_charset *charset, gboolean *compressed,
470
enum cbs_language *language, gboolean *iso639);
472
gboolean cbs_decode(const unsigned char *pdu, int len, struct cbs *out);
473
gboolean cbs_encode(const struct cbs *cbs, int *len, unsigned char *pdu);
474
gboolean cbs_extract_app_port(const struct cbs *cbs, int *dst, int *src,
477
char *cbs_decode_text(GSList *cbs_list, char *iso639_lang);
479
struct cbs_assembly *cbs_assembly_new();
480
void cbs_assembly_free(struct cbs_assembly *assembly);
481
GSList *cbs_assembly_add_page(struct cbs_assembly *assembly,
482
const struct cbs *cbs);
483
void cbs_assembly_location_changed(struct cbs_assembly *assembly,
484
gboolean lac, gboolean ci);