X-Git-Url: http://git.code-monkey.de/?p=pulseview.git;a=blobdiff_plain;f=android%2Floghandler.cpp;h=c9953a6e2894e21e924e99d8ffa4fbefa2b8efb7;hp=b50242041bcc3a4171038defea48765eb440ee5e;hb=e2e4a66a86caf0b35ef526db54ac8034a7745a38;hpb=9137928c9a711ff6d7bf25c9627236d3c61f069e diff --git a/android/loghandler.cpp b/android/loghandler.cpp index b502420..c9953a6 100644 --- a/android/loghandler.cpp +++ b/android/loghandler.cpp @@ -23,13 +23,21 @@ #include -#include +#include #include -#include "android/loghandler.h" +#include "android/loghandler.hpp" namespace pv { +static sr_log_callback prev_sr_log_cb; +static void *prev_sr_log_cb_data; + +#ifdef ENABLE_DECODE +static srd_log_callback prev_srd_log_cb; +static void *prev_srd_log_cb_data; +#endif + int AndroidLogHandler::sr_callback(void *cb_data, int loglevel, const char *format, va_list args) { static const int prio[] = { @@ -40,19 +48,26 @@ int AndroidLogHandler::sr_callback(void *cb_data, int loglevel, const char *form [SR_LOG_DBG] = ANDROID_LOG_DEBUG, [SR_LOG_SPEW] = ANDROID_LOG_VERBOSE, }; + va_list args2; int ret; /* This specific log callback doesn't need the void pointer data. */ (void)cb_data; + /* Call the previously registered log callback (library's default). */ + va_copy(args2, args); + if (prev_sr_log_cb) + prev_sr_log_cb(prev_sr_log_cb_data, loglevel, format, args2); + va_end(args2); + /* Only output messages of at least the selected loglevel(s). */ if (loglevel > sr_log_loglevel_get()) - return SR_OK; /* TODO? */ + return SR_OK; if (loglevel < SR_LOG_NONE) - loglevel = SR_LOG_NONE; + loglevel = SR_LOG_NONE; else if (loglevel > SR_LOG_SPEW) - loglevel = SR_LOG_SPEW; + loglevel = SR_LOG_SPEW; ret = __android_log_vprint(prio[loglevel], "sr", format, args); @@ -70,19 +85,26 @@ int AndroidLogHandler::srd_callback(void *cb_data, int loglevel, const char *for [SRD_LOG_DBG] = ANDROID_LOG_DEBUG, [SRD_LOG_SPEW] = ANDROID_LOG_VERBOSE, }; + va_list args2; int ret; /* This specific log callback doesn't need the void pointer data. */ (void)cb_data; + /* Call the previously registered log callback (library's default). */ + va_copy(args2, args); + if (prev_srd_log_cb) + prev_srd_log_cb(prev_srd_log_cb_data, loglevel, format, args2); + va_end(args2); + /* Only output messages of at least the selected loglevel(s). */ if (loglevel > srd_log_loglevel_get()) - return SRD_OK; /* TODO? */ + return SRD_OK; if (loglevel < SRD_LOG_NONE) - loglevel = SRD_LOG_NONE; + loglevel = SRD_LOG_NONE; else if (loglevel > SRD_LOG_SPEW) - loglevel = SRD_LOG_SPEW; + loglevel = SRD_LOG_SPEW; ret = __android_log_vprint(prio[loglevel], "srd", format, args); @@ -94,11 +116,12 @@ int AndroidLogHandler::srd_callback(void *cb_data, int loglevel, const char *for void AndroidLogHandler::install_callbacks() { - sr_log_callback_set(sr_callback, NULL); + sr_log_callback_get(&prev_sr_log_cb, &prev_sr_log_cb_data); + sr_log_callback_set(sr_callback, nullptr); #ifdef ENABLE_DECODE - srd_log_callback_set(srd_callback, NULL); + srd_log_callback_get(&prev_srd_log_cb, &prev_srd_log_cb_data); + srd_log_callback_set(srd_callback, nullptr); #endif } } // namespace pv -