diff --git a/examples/basic_logging.c b/examples/basic_logging.c index 0ad27a1..34dd4cf 100644 --- a/examples/basic_logging.c +++ b/examples/basic_logging.c @@ -16,16 +16,8 @@ #include -void log_handler(void * const userdata, - const xmpp_log_level_t level, - const char * const area, - const char * const msg) -{ - static const char * const log_level_name[4] = {"DEBUG", "INFO", "WARN", "ERROR"}; - - fprintf(stderr, "%s %s %s\n", area, log_level_name[level], msg); -} +/* define a handler for connection events */ void conn_handler(xmpp_conn_t * const conn, const xmpp_conn_event_t status, const int error, xmpp_stream_error_t * const stream_error, void * const userdata) @@ -46,10 +38,12 @@ int main(int argc, char **argv) { xmpp_ctx_t *ctx; xmpp_conn_t *conn; - xmpp_log_t log; + xmpp_log_t *log; char *jid, *pass; char *server; + /* take a jid and password on the command line, + with optional server to connect to */ if ((argc < 3) || (argc > 4)) { fprintf(stderr, "Usage: basic \n\n"); return 1; @@ -57,16 +51,18 @@ int main(int argc, char **argv) jid = argv[1]; pass = argv[2]; + server = NULL; + /* Normally we pass NULL for the connection domain, in which case + the library derives the target host from the jid, but we can + override this for testing. */ if (argc >= 4) server = argv[3]; - else server = NULL; /* init library */ xmpp_initialize(); /* create a context */ - log.handler = log_handler; - log.userdata = NULL; - ctx = xmpp_ctx_new(NULL, &log); + log = xmpp_get_default_logger(XMPP_LEVEL_DEBUG); /* pass NULL instead to silence output */ + ctx = xmpp_ctx_new(NULL, log); /* create a connection */ conn = xmpp_conn_new(ctx); diff --git a/src/ctx.c b/src/ctx.c index 4c05cb4..758e0c3 100644 --- a/src/ctx.c +++ b/src/ctx.c @@ -63,14 +63,36 @@ static xmpp_mem_t xmpp_default_mem = { realloc }; -static const char * const xmpp_log_level_name[4] = {"DEBUG", "INFO", "WARN", "ERROR"}; +static const char * const _xmpp_log_level_name[4] = {"DEBUG", "INFO", "WARN", "ERROR"}; +static const xmpp_log_level_t _xmpp_default_logger_levels[] = {XMPP_LEVEL_DEBUG, + XMPP_LEVEL_INFO, + XMPP_LEVEL_WARN, + XMPP_LEVEL_ERROR}; void xmpp_default_logger(void * const userdata, const xmpp_log_level_t level, const char * const area, const char * const msg) { - fprintf(stderr, "%s %s %s\n", area, xmpp_log_level_name[level], msg); + xmpp_log_level_t filter_level = * (xmpp_log_level_t*)userdata; + if (level >= filter_level) + fprintf(stderr, "%s %s %s\n", area, _xmpp_log_level_name[level], msg); +} + +static const xmpp_log_t _xmpp_default_loggers[] = { + {&xmpp_default_logger, (void*)&_xmpp_default_logger_levels[XMPP_LEVEL_DEBUG]}, + {&xmpp_default_logger, (void*)&_xmpp_default_logger_levels[XMPP_LEVEL_INFO]}, + {&xmpp_default_logger, (void*)&_xmpp_default_logger_levels[XMPP_LEVEL_WARN]}, + {&xmpp_default_logger, (void*)&_xmpp_default_logger_levels[XMPP_LEVEL_ERROR]} +}; + +xmpp_log_t *xmpp_get_default_logger(xmpp_log_level_t level) +{ + /* clamp to the known range */ + if (level > XMPP_LEVEL_ERROR) level = XMPP_LEVEL_ERROR; + if (level < XMPP_LEVEL_DEBUG) level = XMPP_LEVEL_DEBUG; + + return (xmpp_log_t*)&_xmpp_default_loggers[level]; } static xmpp_log_t xmpp_default_log = { NULL, NULL }; diff --git a/strophe.h b/strophe.h index f690b17..f8e135d 100644 --- a/strophe.h +++ b/strophe.h @@ -80,6 +80,9 @@ struct _xmpp_log_t { /* mutex_t lock; */ }; +/* return a default logger filtering at a given level */ +xmpp_log_t *xmpp_get_default_logger(xmpp_log_level_t level); + /** connection **/ /* opaque connection object */