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 #include "gwlib/gwlib.h"
00065 #include "msg.h"
00066 #include "sms.h"
00067 #include "bearerbox.h"
00068 #include "smscconn.h"
00069
00070 static Octstr *custom_log_format = NULL;
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112 static Octstr *get_pattern(SMSCConn *conn, Msg *msg, const char *message)
00113 {
00114 int nextarg, j;
00115 struct tm tm;
00116 int num_words;
00117 List *word_list;
00118 Octstr *result;
00119 const char *pattern;
00120 Octstr *temp, *text, *udh;
00121 size_t n;
00122 long i;
00123
00124 text = msg->sms.msgdata ? octstr_duplicate(msg->sms.msgdata) : octstr_create("");
00125 udh = msg->sms.udhdata ? octstr_duplicate(msg->sms.udhdata) : octstr_create("");
00126 if ((msg->sms.coding == DC_8BIT || msg->sms.coding == DC_UCS2))
00127 octstr_binary_to_hex(text, 1);
00128 else
00129 octstr_convert_printable(text);
00130 octstr_binary_to_hex(udh, 1);
00131
00132 if (octstr_len(text)) {
00133 word_list = octstr_split_words(text);
00134 num_words = gwlist_len(word_list);
00135 } else {
00136 word_list = gwlist_create();
00137 num_words = 0;
00138 }
00139
00140 result = octstr_create("");
00141 pattern = octstr_get_cstr(custom_log_format);
00142
00143 nextarg = 1;
00144
00145 while(*pattern != '\0') {
00146 n = strcspn(pattern, "%");
00147 octstr_append_data(result, pattern, n);
00148 pattern += n;
00149 gw_assert(*pattern == '%' || *pattern == '\0');
00150 if (*pattern == '\0')
00151 break;
00152
00153 pattern++;
00154
00155 switch (*pattern) {
00156 case 'k':
00157 if (num_words <= 0)
00158 break;
00159 octstr_append(result, gwlist_get(word_list, 0));
00160 break;
00161
00162 case 's':
00163 if (nextarg >= num_words)
00164 break;
00165 octstr_append(result, gwlist_get(word_list, nextarg));
00166 ++nextarg;
00167 break;
00168
00169 case 'S':
00170 if (nextarg >= num_words)
00171 break;
00172 temp = gwlist_get(word_list, nextarg);
00173 for (i = 0; i < octstr_len(temp); ++i) {
00174 if (octstr_get_char(temp, i) == '*')
00175 octstr_append_char(result, '~');
00176 else
00177 octstr_append_char(result, octstr_get_char(temp, i));
00178 }
00179 ++nextarg;
00180 break;
00181
00182 case 'r':
00183 for (j = nextarg; j < num_words; ++j) {
00184 if (j != nextarg)
00185 octstr_append_char(result, '+');
00186 octstr_append(result, gwlist_get(word_list, j));
00187 }
00188 break;
00189
00190 case 'l':
00191 if (message)
00192 octstr_append_cstr(result, message);
00193 break;
00194
00195 case 'P':
00196 if (msg->sms.receiver)
00197 octstr_append(result, msg->sms.receiver);
00198 break;
00199
00200 case 'p':
00201 if (msg->sms.sender)
00202 octstr_append(result, msg->sms.sender);
00203 break;
00204
00205 case 'a':
00206 for (j = 0; j < num_words; ++j) {
00207 if (j > 0)
00208 octstr_append_char(result, ' ');
00209 octstr_append(result, gwlist_get(word_list, j));
00210 }
00211 break;
00212
00213 case 'b':
00214 if (text)
00215 octstr_append(result, text);
00216 break;
00217
00218 case 'L':
00219 octstr_append_decimal(result, octstr_len(msg->sms.msgdata));
00220 break;
00221
00222 case 't':
00223 tm = gw_gmtime(msg->sms.time);
00224 octstr_format_append(result, "%04d-%02d-%02d %02d:%02d:%02d",
00225 tm.tm_year + 1900,
00226 tm.tm_mon + 1,
00227 tm.tm_mday,
00228 tm.tm_hour,
00229 tm.tm_min,
00230 tm.tm_sec);
00231 break;
00232
00233 case 'T':
00234 if (msg->sms.time != MSG_PARAM_UNDEFINED)
00235 octstr_format_append(result, "%ld", msg->sms.time);
00236 break;
00237
00238 case 'i':
00239 if (conn && smscconn_id(conn))
00240 octstr_append(result, smscconn_id(conn));
00241 else if (conn && smscconn_name(conn))
00242 octstr_append(result, smscconn_name(conn));
00243 else if (msg->sms.smsc_id)
00244 octstr_append(result, msg->sms.smsc_id);
00245 break;
00246
00247 case 'I':
00248 if (!uuid_is_null(msg->sms.id)) {
00249 char id[UUID_STR_LEN + 1];
00250 uuid_unparse(msg->sms.id, id);
00251 octstr_append_cstr(result, id);
00252 }
00253 break;
00254
00255 case 'n':
00256 if (msg->sms.service != NULL)
00257 octstr_append(result, msg->sms.service);
00258 break;
00259
00260 case 'd':
00261 octstr_append_decimal(result, msg->sms.dlr_mask);
00262 break;
00263
00264 case 'c':
00265 octstr_append_decimal(result, msg->sms.coding);
00266 break;
00267
00268 case 'm':
00269 octstr_append_decimal(result, msg->sms.mclass);
00270 break;
00271
00272 case 'C':
00273 octstr_append_decimal(result, msg->sms.compress);
00274 break;
00275
00276 case 'M':
00277 octstr_append_decimal(result, msg->sms.mwi);
00278 break;
00279
00280 case 'u':
00281 if (octstr_len(udh)) {
00282 octstr_append(result, udh);
00283 }
00284 break;
00285
00286 case 'U':
00287 octstr_append_decimal(result, octstr_len(msg->sms.udhdata));
00288 break;
00289
00290 case 'B':
00291 if (octstr_len(msg->sms.binfo)) {
00292 octstr_append(result, msg->sms.binfo);
00293 }
00294 break;
00295
00296 case 'A':
00297 if (octstr_len(msg->sms.account)) {
00298 octstr_append(result, msg->sms.account);
00299 }
00300 break;
00301
00302
00303
00304 case '%':
00305 octstr_format_append(result, "%%");
00306 break;
00307
00308 default:
00309 warning(0, "Unknown escape code (%%%c) within custom-log-format, skipping!", *pattern);
00310 octstr_format_append(result, "%%%c", *pattern);
00311 break;
00312 }
00313
00314 pattern++;
00315 }
00316
00317 gwlist_destroy(word_list, octstr_destroy_item);
00318
00319 return result;
00320 }
00321
00322
00323
00324
00325
00326
00327 void bb_alog_init(const Octstr *format)
00328 {
00329 gw_assert(format != NULL);
00330
00331 custom_log_format = octstr_duplicate(format);
00332 }
00333
00334
00335 void bb_alog_shutdown(void)
00336 {
00337 octstr_destroy(custom_log_format);
00338 custom_log_format = NULL;
00339 }
00340
00341
00342 void bb_alog_sms(SMSCConn *conn, Msg *msg, const char *message)
00343 {
00344 Octstr *text = NULL;
00345
00346 gw_assert(msg_type(msg) == sms);
00347
00348
00349
00350 if (custom_log_format == NULL) {
00351 Octstr *udh;
00352 const Octstr *cid;
00353
00354 text = msg->sms.msgdata ? octstr_duplicate(msg->sms.msgdata) : octstr_create("");
00355 udh = msg->sms.udhdata ? octstr_duplicate(msg->sms.udhdata) : octstr_create("");
00356
00357 if (conn && smscconn_id(conn))
00358 cid = smscconn_id(conn);
00359 else if (conn && smscconn_name(conn))
00360 cid = smscconn_name(conn);
00361 else if (msg->sms.smsc_id)
00362 cid = msg->sms.smsc_id;
00363 else
00364 cid = octstr_imm("");
00365
00366 if ((msg->sms.coding == DC_8BIT || msg->sms.coding == DC_UCS2))
00367 octstr_binary_to_hex(text, 1);
00368 else
00369 octstr_convert_printable(text);
00370 octstr_binary_to_hex(udh, 1);
00371
00372 alog("%s [SMSC:%s] [SVC:%s] [ACT:%s] [BINF:%s] [from:%s] [to:%s] [flags:%ld:%ld:%ld:%ld:%ld] "
00373 "[msg:%ld:%s] [udh:%ld:%s]",
00374 message,
00375 octstr_get_cstr(cid),
00376 msg->sms.service ? octstr_get_cstr(msg->sms.service) : "",
00377 msg->sms.account ? octstr_get_cstr(msg->sms.account) : "",
00378 msg->sms.binfo ? octstr_get_cstr(msg->sms.binfo) : "",
00379 msg->sms.sender ? octstr_get_cstr(msg->sms.sender) : "",
00380 msg->sms.receiver ? octstr_get_cstr(msg->sms.receiver) : "",
00381 msg->sms.mclass, msg->sms.coding, msg->sms.mwi, msg->sms.compress,
00382 msg->sms.dlr_mask,
00383 octstr_len(msg->sms.msgdata), octstr_get_cstr(text),
00384 octstr_len(msg->sms.udhdata), octstr_get_cstr(udh)
00385 );
00386
00387 octstr_destroy(udh);
00388 } else {
00389 text = get_pattern(conn, msg, message);
00390 alog("%s", octstr_get_cstr(text));
00391 }
00392
00393 octstr_destroy(text);
00394 }
00395
00396
See file LICENSE for details about the license agreement for using,
modifying, copying or deriving work from this software.