00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 #include "sms.h"
00066 #include "dlr.h"
00067
00068
00069
00070
00071
00072
00073 int fields_to_dcs(Msg *msg, int mode)
00074 {
00075 int dcs=0;
00076
00077
00078 if (msg->sms.coding == DC_UNDEF) {
00079 if (octstr_len(msg->sms.udhdata))
00080 msg->sms.coding = DC_8BIT;
00081 else
00082 msg->sms.coding = DC_7BIT;
00083 }
00084
00085
00086
00087 if (msg->sms.mwi != MWI_UNDEF) {
00088 dcs = msg->sms.mwi;
00089
00090 if (dcs & 0x04)
00091 dcs = (dcs & 0x03) | 0xC0;
00092 else {
00093 dcs = (dcs & 0x03) | 0x08;
00094
00095 if (! octstr_len(msg->sms.msgdata))
00096 dcs |= 0xC0;
00097 else
00098 if (msg->sms.coding == DC_7BIT)
00099 dcs |= 0xD0;
00100 else
00101 dcs |= 0xE0;
00102
00103 }
00104 }
00105
00106
00107 else {
00108
00109 if (mode == 0 || mode == SMS_PARAM_UNDEFINED || msg->sms.coding == DC_UCS2
00110 || msg->sms.compress == COMPRESS_ON) {
00111
00112 if (msg->sms.compress == COMPRESS_ON)
00113 dcs |= 0x20;
00114 if (msg->sms.mclass != MC_UNDEF)
00115 dcs |= (0x10 | msg->sms.mclass);
00116 if (msg->sms.coding != DC_UNDEF)
00117 dcs |= (msg->sms.coding << 2);
00118 }
00119
00120
00121 else {
00122 dcs |= 0xF0;
00123 if(msg->sms.coding != DC_UNDEF)
00124 dcs |= (msg->sms.coding << 2);
00125 if (msg->sms.mclass == MC_UNDEF)
00126 dcs |= 1;
00127 else
00128 dcs |= msg->sms.mclass;
00129 }
00130 }
00131
00132 return dcs;
00133 }
00134
00135
00136
00137
00138
00139 int dcs_to_fields(Msg **msg, int dcs)
00140 {
00141
00142 if ((dcs & 0xF0) == 0xF0) {
00143 dcs &= 0x07;
00144 (*msg)->sms.coding = (dcs & 0x04) ? DC_8BIT : DC_7BIT;
00145 (*msg)->sms.mclass = dcs & 0x03;
00146 (*msg)->sms.alt_dcs = 1;
00147 }
00148
00149
00150 else if ((dcs & 0xC0) == 0x00) {
00151 (*msg)->sms.alt_dcs = 0;
00152 (*msg)->sms.compress = ((dcs & 0x20) == 0x20) ? 1 : 0;
00153 (*msg)->sms.mclass = ((dcs & 0x10) == 0x10) ? dcs & 0x03 : MC_UNDEF;
00154
00155 (*msg)->sms.coding = (dcs & 0x0C) >> 2;
00156 }
00157
00158
00159 else if ((dcs & 0xC0) == 0xC0) {
00160 (*msg)->sms.alt_dcs = 0;
00161 (*msg)->sms.coding = ((dcs & 0x30) == 0x30) ? DC_UCS2 : DC_7BIT;
00162 if (!(dcs & 0x08))
00163 dcs |= 0x04;
00164 dcs &= 0x07;
00165 (*msg)->sms.mwi = dcs ;
00166 }
00167
00168 else {
00169 return 0;
00170 }
00171
00172 return 1;
00173 }
00174
00175
00176
00177
00178
00179
00180 int sms_msgdata_len(Msg* msg)
00181 {
00182 int ret = 0;
00183 Octstr* msgdata = NULL;
00184
00185
00186 if (!msg || !msg->sms.msgdata)
00187 return -1;
00188
00189 if (msg->sms.coding == DC_7BIT) {
00190 msgdata = octstr_duplicate(msg->sms.msgdata);
00191 charset_utf8_to_gsm(msgdata);
00192 ret = octstr_len(msgdata);
00193 octstr_destroy(msgdata);
00194 } else
00195 ret = octstr_len(msg->sms.msgdata);
00196
00197 return ret;
00198 }
00199
00200
00201 int sms_swap(Msg *msg)
00202 {
00203 Octstr *sender = NULL;
00204
00205 if (msg->sms.sender != NULL && msg->sms.receiver != NULL) {
00206 sender = msg->sms.sender;
00207 msg->sms.sender = msg->sms.receiver;
00208 msg->sms.receiver = sender;
00209
00210 return 1;
00211 }
00212
00213 return 0;
00214 }
00215
00216
00217
00218
00219
00220
00221 #define CATENATE_UDH_LEN 5
00222
00223
00224 static void prepend_catenation_udh(Msg *sms, int part_no, int num_messages,
00225 int msg_sequence)
00226 {
00227 if (sms->sms.udhdata == NULL)
00228 sms->sms.udhdata = octstr_create("");
00229 if (octstr_len(sms->sms.udhdata) == 0)
00230 octstr_append_char(sms->sms.udhdata, CATENATE_UDH_LEN);
00231 octstr_format_append(sms->sms.udhdata, "%c\3%c%c%c",
00232 0, msg_sequence, num_messages, part_no);
00233
00234
00235 if (part_no < num_messages)
00236 sms->sms.msg_left = num_messages - part_no;
00237 else
00238 sms->sms.msg_left = 0;
00239
00240
00241
00242
00243 octstr_set_char(sms->sms.udhdata, 0, octstr_len(sms->sms.udhdata) - 1 );
00244 }
00245
00246
00247 static Octstr *extract_msgdata_part(Octstr *msgdata, Octstr *split_chars,
00248 int max_part_len)
00249 {
00250 long i, len;
00251 Octstr *part;
00252
00253 len = max_part_len;
00254 if (max_part_len < octstr_len(msgdata) && split_chars != NULL)
00255 for (i = max_part_len; i > 0; i--)
00256 if (octstr_search_char(split_chars,
00257 octstr_get_char(msgdata, i - 1), 0) != -1) {
00258 len = i;
00259 break;
00260 }
00261 part = octstr_copy(msgdata, 0, len);
00262 octstr_delete(msgdata, 0, len);
00263 return part;
00264 }
00265
00266
00267 static Octstr *extract_msgdata_part_by_coding(Msg *msg, Octstr *split_chars,
00268 int max_part_len)
00269 {
00270 Octstr *temp = NULL, *temp_utf;
00271
00272 if (msg->sms.coding == DC_8BIT || msg->sms.coding == DC_UCS2) {
00273
00274 return extract_msgdata_part(msg->sms.msgdata, split_chars, max_part_len);
00275 }
00276
00277
00278 charset_utf8_to_gsm(msg->sms.msgdata);
00279 charset_gsm_to_utf8(msg->sms.msgdata);
00280
00281
00282
00283
00284
00285 temp = octstr_duplicate(msg->sms.msgdata);
00286 charset_utf8_to_gsm(temp);
00287 charset_gsm_truncate(temp, max_part_len);
00288
00289
00290 temp_utf = octstr_duplicate(temp);
00291 charset_gsm_to_utf8(temp_utf);
00292 max_part_len = octstr_len(temp_utf);
00293
00294 octstr_destroy(temp);
00295 octstr_destroy(temp_utf);
00296
00297
00298 return extract_msgdata_part(msg->sms.msgdata, split_chars, max_part_len);
00299 }
00300
00301
00302 List *sms_split(Msg *orig, Octstr *header, Octstr *footer,
00303 Octstr *nonlast_suffix, Octstr *split_chars,
00304 int catenate, unsigned long msg_sequence,
00305 int max_messages, int max_octets)
00306 {
00307 long max_part_len, udh_len, hf_len, nlsuf_len;
00308 unsigned long total_messages, msgno;
00309 long last;
00310 List *list;
00311 Msg *part, *temp;
00312
00313 hf_len = octstr_len(header) + octstr_len(footer);
00314 nlsuf_len = octstr_len(nonlast_suffix);
00315 udh_len = octstr_len(orig->sms.udhdata);
00316
00317
00318 if (orig->sms.coding == DC_8BIT || orig->sms.coding == DC_UCS2)
00319 max_part_len = max_octets - udh_len - hf_len;
00320 else
00321 max_part_len = (max_octets - udh_len) * 8 / 7 - hf_len;
00322
00323 if (sms_msgdata_len(orig) > max_part_len && catenate) {
00324
00325 if (udh_len == 0)
00326 udh_len = 1;
00327 udh_len += CATENATE_UDH_LEN;
00328 if (orig->sms.coding == DC_8BIT || orig->sms.coding == DC_UCS2)
00329 max_part_len = max_octets - udh_len - hf_len;
00330 else
00331 max_part_len = (max_octets - udh_len) * 8 / 7 - hf_len;
00332 }
00333
00334
00335 max_part_len = max_part_len > 0 ? max_part_len : 0;
00336
00337 temp = msg_duplicate(orig);
00338 msgno = 0;
00339 list = gwlist_create();
00340
00341 last = 0;
00342 do {
00343 msgno++;
00344 part = msg_duplicate(orig);
00345
00346
00347
00348
00349
00350 if ((msgno > 1) && DLR_IS_ENABLED(part->sms.dlr_mask)) {
00351 octstr_destroy(part->sms.dlr_url);
00352 part->sms.dlr_url = NULL;
00353 part->sms.dlr_mask = 0;
00354 }
00355 octstr_destroy(part->sms.msgdata);
00356 if (sms_msgdata_len(temp) <= max_part_len || msgno == max_messages)
00357 last = 1;
00358
00359 part->sms.msgdata =
00360 extract_msgdata_part_by_coding(temp, split_chars,
00361 max_part_len - nlsuf_len);
00362
00363 if (!last)
00364 uuid_generate(part->sms.id);
00365
00366 if (header)
00367 octstr_insert(part->sms.msgdata, header, 0);
00368 if (footer)
00369 octstr_append(part->sms.msgdata, footer);
00370 if (!last && nonlast_suffix)
00371 octstr_append(part->sms.msgdata, nonlast_suffix);
00372 gwlist_append(list, part);
00373 } while (!last);
00374
00375 total_messages = msgno;
00376 msg_destroy(temp);
00377 if (catenate && total_messages > 1) {
00378 for (msgno = 1; msgno <= total_messages; msgno++) {
00379 part = gwlist_get(list, msgno - 1);
00380 prepend_catenation_udh(part, msgno, total_messages, msg_sequence);
00381 }
00382 }
00383
00384 return list;
00385 }
00386
00387
00388 int sms_priority_compare(const void *a, const void *b)
00389 {
00390 int ret;
00391 Msg *msg1 = (Msg*)a, *msg2 = (Msg*)b;
00392 gw_assert(msg_type(msg1) == sms);
00393 gw_assert(msg_type(msg2) == sms);
00394
00395 if (msg1->sms.priority > msg2->sms.priority)
00396 ret = 1;
00397 else if (msg1->sms.priority < msg2->sms.priority)
00398 ret = -1;
00399 else {
00400 if (msg1->sms.time > msg2->sms.time)
00401 ret = 1;
00402 else if (msg1->sms.time < msg2->sms.time)
00403 ret = -1;
00404 else
00405 ret = 0;
00406 }
00407
00408 return ret;
00409 }
00410
See file LICENSE for details about the license agreement for using,
modifying, copying or deriving work from this software.