Main Page | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

bb_alog.c File Reference

#include "gwlib/gwlib.h"
#include "msg.h"
#include "sms.h"
#include "bearerbox.h"
#include "smscconn.h"

Include dependency graph for bb_alog.c:

Include dependency graph

Go to the source code of this file.

Functions

Octstrget_pattern (SMSCConn *conn, Msg *msg, const char *message)
void bb_alog_init (const Octstr *format)
void bb_alog_shutdown (void)
void bb_alog_sms (SMSCConn *conn, Msg *msg, const char *message)

Variables

Octstrcustom_log_format = NULL


Function Documentation

void bb_alog_init const Octstr format  ) 
 

Definition at line 327 of file bb_alog.c.

References custom_log_format, gw_assert, and octstr_duplicate.

Referenced by init_bearerbox().

00328 {
00329     gw_assert(format != NULL);
00330 
00331     custom_log_format = octstr_duplicate(format);
00332 }

void bb_alog_shutdown void   ) 
 

Definition at line 335 of file bb_alog.c.

References custom_log_format, and octstr_destroy().

Referenced by main().

00336 {
00337     octstr_destroy(custom_log_format);
00338     custom_log_format = NULL;
00339 }

Here is the call graph for this function:

void bb_alog_sms SMSCConn conn,
Msg msg,
const char *  message
 

Definition at line 342 of file bb_alog.c.

References alog(), custom_log_format, DC_8BIT, get_pattern(), gw_assert, message, msg_type, octstr_binary_to_hex(), octstr_convert_printable(), octstr_create, octstr_destroy(), octstr_duplicate, octstr_get_cstr, octstr_imm(), octstr_len(), sms, SMSCConn, smscconn_id(), smscconn_name(), and text.

Referenced by bb_smscconn_receive(), bb_smscconn_send_failed(), bb_smscconn_sent(), and handle_pdu().

00343 {
00344     Octstr *text = NULL;
00345     
00346     gw_assert(msg_type(msg) == sms);
00347 
00348     /* if we don't have any custom log, then use our "default" one */
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 }

Here is the call graph for this function:

Octstr* get_pattern SMSCConn conn,
Msg msg,
const char *  message
[static]
 

Definition at line 112 of file bb_alog.c.

References custom_log_format, DC_8BIT, gw_assert, gw_gmtime(), gwlist_create, gwlist_destroy(), gwlist_get(), gwlist_len(), message, octstr_append(), octstr_append_char(), octstr_append_cstr(), octstr_append_data(), octstr_append_decimal(), octstr_binary_to_hex(), octstr_convert_printable(), octstr_create, octstr_destroy_item(), octstr_duplicate, octstr_format_append(), octstr_get_char(), octstr_get_cstr, octstr_len(), octstr_split_words(), result, SMSCConn, smscconn_id(), smscconn_name(), text, uuid_is_null(), UUID_STR_LEN, uuid_unparse(), and warning().

Referenced by bb_alog_sms().

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':  /* billing identifier/information */
00291         if (octstr_len(msg->sms.binfo)) {
00292                 octstr_append(result, msg->sms.binfo);
00293             }
00294             break;
00295 
00296     case 'A':  /* account */
00297         if (octstr_len(msg->sms.account)) {
00298                 octstr_append(result, msg->sms.account);
00299             }
00300             break;
00301 
00302         /* XXX add more here if needed */
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         } /* switch(...) */
00313     
00314         pattern++;
00315     } /* for ... */
00316 
00317     gwlist_destroy(word_list, octstr_destroy_item);
00318 
00319     return result;
00320 }

Here is the call graph for this function:


Variable Documentation

Octstr* custom_log_format = NULL [static]
 

Definition at line 70 of file bb_alog.c.

Referenced by bb_alog_init(), bb_alog_shutdown(), bb_alog_sms(), and get_pattern().

See file LICENSE for details about the license agreement for using, modifying, copying or deriving work from this software.