00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <stdarg.h>
00023 #include <stdio.h>
00024 #include "JackError.h"
00025 #include "JackGlobals.h"
00026 #include "JackMessageBuffer.h"
00027
00028 using namespace Jack;
00029
00030 static bool change_thread_log_function(jack_log_function_t log_function)
00031 {
00032 return (jack_tls_get(JackGlobals::fKeyLogFunction) == NULL
00033 && jack_tls_set(JackGlobals::fKeyLogFunction, (void*)log_function));
00034 }
00035
00036 EXPORT int set_threaded_log_function()
00037 {
00038 return change_thread_log_function(JackMessageBufferAdd);
00039 }
00040
00041 void jack_log_function(int level, const char *message)
00042 {
00043 void (* log_callback)(const char *);
00044
00045 switch (level)
00046 {
00047 case LOG_LEVEL_INFO:
00048 log_callback = jack_info_callback;
00049 break;
00050 case LOG_LEVEL_ERROR:
00051 log_callback = jack_error_callback;
00052 break;
00053 default:
00054 return;
00055 }
00056
00057 log_callback(message);
00058 }
00059
00060 static void jack_format_and_log(int level, const char *prefix, const char *fmt, va_list ap)
00061 {
00062 char buffer[300];
00063 size_t len;
00064 jack_log_function_t log_function;
00065
00066 if (prefix != NULL) {
00067 len = strlen(prefix);
00068 memcpy(buffer, prefix, len);
00069 } else {
00070 len = 0;
00071 }
00072
00073 vsnprintf(buffer + len, sizeof(buffer) - len, fmt, ap);
00074
00075 log_function = (jack_log_function_t)jack_tls_get(JackGlobals::fKeyLogFunction);
00076
00077
00078 if (log_function == NULL)
00079 {
00080 log_function = jack_log_function;
00081
00082 }
00083 else
00084 {
00085
00086 }
00087
00088 log_function(level, buffer);
00089 }
00090
00091 EXPORT void jack_error(const char *fmt, ...)
00092 {
00093 va_list ap;
00094 va_start(ap, fmt);
00095 jack_format_and_log(LOG_LEVEL_ERROR, NULL, fmt, ap);
00096 va_end(ap);
00097 }
00098
00099 EXPORT void jack_info(const char *fmt, ...)
00100 {
00101 va_list ap;
00102 va_start(ap, fmt);
00103 jack_format_and_log(LOG_LEVEL_INFO, NULL, fmt, ap);
00104 va_end(ap);
00105 }
00106
00107 EXPORT void jack_log(const char *fmt,...)
00108 {
00109 if (JackGlobals::fVerbose) {
00110 va_list ap;
00111 va_start(ap, fmt);
00112 jack_format_and_log(LOG_LEVEL_INFO, "Jack: ", fmt, ap);
00113 va_end(ap);
00114 }
00115 }
00116
00117 EXPORT void default_jack_error_callback(const char *desc)
00118 {
00119 fprintf(stderr, "%s\n", desc);
00120 fflush(stderr);
00121 }
00122
00123 EXPORT void default_jack_info_callback(const char *desc)
00124 {
00125 fprintf(stdout, "%s\n", desc);
00126 fflush(stdout);
00127 }
00128
00129 EXPORT void silent_jack_error_callback(const char *desc)
00130 {}
00131
00132 EXPORT void silent_jack_info_callback(const char *desc)
00133 {}
00134
00135 EXPORT void (*jack_error_callback)(const char *desc) = &default_jack_error_callback;
00136 EXPORT void (*jack_info_callback)(const char *desc) = &default_jack_info_callback;