vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Tue Feb 26 22:05:57 2019 +0200| [03f96e27a8a8b524ac676e67c25519c3b7c398e4] | committer: Rémi Denis-Courmont
messages: create a logger also in vlc_LogSet() This removes the last "exception" not using vlc_logger, so the code can be harmonized. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=03f96e27a8a8b524ac676e67c25519c3b7c398e4 --- src/misc/messages.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/misc/messages.c b/src/misc/messages.c index 89609e402d..f27316c223 100644 --- a/src/misc/messages.c +++ b/src/misc/messages.c @@ -504,6 +504,51 @@ struct vlc_logger *vlc_LogHeaderCreate(struct vlc_logger *parent, } /** + * External custom log callback + */ +struct vlc_logger_external { + struct vlc_logger logger; + const struct vlc_logger_operations *ops; + void *opaque; +}; + +static void vlc_vaLogExternal(void *d, int type, const vlc_log_t *item, + const char *format, va_list ap) +{ + struct vlc_logger_external *ext = d; + + ext->ops->log(ext->opaque, type, item, format, ap); +} + +static void vlc_LogExternalClose(void *d) +{ + struct vlc_logger_external *ext = d; + + if (ext->ops->destroy != NULL) + ext->ops->destroy(ext->opaque); + free(ext); +} + +static const struct vlc_logger_operations external_ops = { + vlc_vaLogExternal, + vlc_LogExternalClose, +}; + +static struct vlc_logger * +vlc_LogExternalCreate(const struct vlc_logger_operations *ops, void *opaque) +{ + struct vlc_logger_external *ext = malloc(sizeof (*ext)); + if (unlikely(ext == NULL)) + return NULL; + + ext->logger.ops = &external_ops; + ext->logger.sys = ext; + ext->ops = ops; + ext->opaque = opaque; + return &ext->logger; +} + +/** * Sets the message logging callback. * \param ops message callback, or NULL to clear * \param data data pointer for the message callback @@ -511,6 +556,21 @@ struct vlc_logger *vlc_LogHeaderCreate(struct vlc_logger *parent, void vlc_LogSet(libvlc_int_t *vlc, const struct vlc_logger_operations *ops, void *opaque) { + struct vlc_logger *logger; + + if (ops != NULL) + logger = vlc_LogExternalCreate(ops, opaque); + else + logger = NULL; + + if (logger != NULL) { + ops = logger->ops; + opaque = logger->sys; + } else { + ops = &discard_ops; + opaque = NULL; + } + vlc_LogSwitch(vlc->obj.logger, ops, opaque); /* Announce who we are */ _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
