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 SERVER_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[256];
00063 size_t len;
00064 jack_log_function_t log_function;
00065
00066 if (prefix != NULL) {
00067 len = strlen(prefix);
00068 assert(len < 256);
00069 memcpy(buffer, prefix, len);
00070 } else {
00071 len = 0;
00072 }
00073
00074 vsnprintf(buffer + len, sizeof(buffer) - len, fmt, ap);
00075
00076 log_function = (jack_log_function_t)jack_tls_get(JackGlobals::fKeyLogFunction);
00077
00078
00079 if (log_function == NULL)
00080 {
00081 log_function = jack_log_function;
00082
00083 }
00084 else
00085 {
00086
00087 }
00088
00089 log_function(level, buffer);
00090 }
00091
00092 SERVER_EXPORT void jack_error(const char *fmt, ...)
00093 {
00094 va_list ap;
00095 va_start(ap, fmt);
00096 jack_format_and_log(LOG_LEVEL_ERROR, NULL, fmt, ap);
00097 va_end(ap);
00098 }
00099
00100 SERVER_EXPORT void jack_info(const char *fmt, ...)
00101 {
00102 va_list ap;
00103 va_start(ap, fmt);
00104 jack_format_and_log(LOG_LEVEL_INFO, NULL, fmt, ap);
00105 va_end(ap);
00106 }
00107
00108 SERVER_EXPORT void jack_log(const char *fmt,...)
00109 {
00110 if (JackGlobals::fVerbose) {
00111 va_list ap;
00112 va_start(ap, fmt);
00113 jack_format_and_log(LOG_LEVEL_INFO, "Jack: ", fmt, ap);
00114 va_end(ap);
00115 }
00116 }
00117
00118 SERVER_EXPORT void default_jack_error_callback(const char *desc)
00119 {
00120 fprintf(stderr, "%s\n", desc);
00121 fflush(stderr);
00122 }
00123
00124 SERVER_EXPORT void default_jack_info_callback(const char *desc)
00125 {
00126 fprintf(stdout, "%s\n", desc);
00127 fflush(stdout);
00128 }
00129
00130 SERVER_EXPORT void silent_jack_error_callback(const char *desc)
00131 {}
00132
00133 SERVER_EXPORT void silent_jack_info_callback(const char *desc)
00134 {}
00135
00136 SERVER_EXPORT void (*jack_error_callback)(const char *desc) = &default_jack_error_callback;
00137 SERVER_EXPORT void (*jack_info_callback)(const char *desc) = &default_jack_info_callback;