| @@ -0,0 +1,145 @@ | |||||
| /* | |||||
| Copyright 2012 David Robillard <http://drobilla.net> | |||||
| Permission to use, copy, modify, and/or distribute this software for any | |||||
| purpose with or without fee is hereby granted, provided that the above | |||||
| copyright notice and this permission notice appear in all copies. | |||||
| THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |||||
| WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |||||
| MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |||||
| ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |||||
| WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |||||
| ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |||||
| OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||||
| */ | |||||
| /** | |||||
| @file logger.h Convenience API for easy logging in plugin code. | |||||
| This file provides simple wrappers for the most common log operations for | |||||
| use in plugin implementations. If host support for logging is not | |||||
| available, then these functions will print to stderr instead. | |||||
| This header is non-normative, it is provided for convenience. | |||||
| */ | |||||
| #ifndef LV2_ATOM_LOGGER_H | |||||
| #define LV2_ATOM_LOGGER_H | |||||
| #include <stdio.h> | |||||
| #include "log.h" | |||||
| #ifdef __cplusplus | |||||
| extern "C" { | |||||
| #endif | |||||
| /** | |||||
| Logger convenience API state. | |||||
| */ | |||||
| typedef struct { | |||||
| LV2_Log_Log* log; | |||||
| LV2_URID Error; | |||||
| LV2_URID Note; | |||||
| LV2_URID Trace; | |||||
| LV2_URID Warning; | |||||
| } LV2_Log_Logger; | |||||
| /** | |||||
| Initialise @p logger. | |||||
| URIs will be mapped using @p map and stored, a reference to @p map itself is | |||||
| not held. Both @p map and @p log may be NULL when unsupported by the host, | |||||
| in which case the implementation will fall back to printing to stderr. | |||||
| */ | |||||
| static inline void | |||||
| lv2_log_logger_init(LV2_Log_Logger* logger, | |||||
| LV2_URID_Map* map, | |||||
| LV2_Log_Log* log) | |||||
| { | |||||
| memset(logger, 0, sizeof(LV2_Log_Logger)); | |||||
| logger->log = log; | |||||
| if (map) { | |||||
| logger->Error = map->map(map->handle, LV2_LOG__Error); | |||||
| logger->Note = map->map(map->handle, LV2_LOG__Note); | |||||
| logger->Trace = map->map(map->handle, LV2_LOG__Trace); | |||||
| logger->Warning = map->map(map->handle, LV2_LOG__Warning); | |||||
| } | |||||
| } | |||||
| /** | |||||
| Log a message to the host, or stderr if support is unavailable. | |||||
| */ | |||||
| LV2_LOG_FUNC(3, 0) | |||||
| static inline int | |||||
| lv2_log_vprintf(LV2_Log_Logger* logger, | |||||
| LV2_URID type, | |||||
| const char* fmt, | |||||
| va_list args) | |||||
| { | |||||
| if (logger->log) { | |||||
| return logger->log->vprintf(logger->log->handle, type, fmt, args); | |||||
| } else { | |||||
| return vfprintf(stderr, fmt, args); | |||||
| } | |||||
| } | |||||
| /** Log an error via lv2_log_vprintf(). */ | |||||
| LV2_LOG_FUNC(2, 3) | |||||
| static inline int | |||||
| lv2_log_error(LV2_Log_Logger* logger, const char* fmt, ...) | |||||
| { | |||||
| va_list args; | |||||
| va_start(args, fmt); | |||||
| const int ret = lv2_log_vprintf(logger, logger->Error, fmt, args); | |||||
| va_end(args); | |||||
| return ret; | |||||
| } | |||||
| /** Log a note via lv2_log_vprintf(). */ | |||||
| LV2_LOG_FUNC(2, 3) | |||||
| static inline int | |||||
| lv2_log_note(LV2_Log_Logger* logger, const char* fmt, ...) | |||||
| { | |||||
| va_list args; | |||||
| va_start(args, fmt); | |||||
| const int ret = lv2_log_vprintf(logger, logger->Note, fmt, args); | |||||
| va_end(args); | |||||
| return ret; | |||||
| } | |||||
| /** Log a trace via lv2_log_vprintf(). */ | |||||
| LV2_LOG_FUNC(2, 3) | |||||
| static inline int | |||||
| lv2_log_trace(LV2_Log_Logger* logger, const char* fmt, ...) | |||||
| { | |||||
| va_list args; | |||||
| va_start(args, fmt); | |||||
| const int ret = lv2_log_vprintf(logger, logger->Trace, fmt, args); | |||||
| va_end(args); | |||||
| return ret; | |||||
| } | |||||
| /** Log a warning via lv2_log_vprintf(). */ | |||||
| LV2_LOG_FUNC(2, 3) | |||||
| static inline int | |||||
| lv2_log_warning(LV2_Log_Logger* logger, const char* fmt, ...) | |||||
| { | |||||
| va_list args; | |||||
| va_start(args, fmt); | |||||
| const int ret = lv2_log_vprintf(logger, logger->Warning, fmt, args); | |||||
| va_end(args); | |||||
| return ret; | |||||
| } | |||||
| /** | |||||
| @} | |||||
| */ | |||||
| #ifdef __cplusplus | |||||
| } /* extern "C" */ | |||||
| #endif | |||||
| #endif /* LV2_LOG_LOGGER_H */ | |||||