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 int jack_verbose = 0;
00029
00030 using namespace Jack;
00031
00032 void change_thread_log_function(jack_log_function_t log_function)
00033 {
00034 if (!jack_tls_set(JackGlobals::fKeyLogFunction, (void*)log_function))
00035 {
00036 jack_error("failed to set thread log function");
00037 }
00038 }
00039
00040 SERVER_EXPORT void set_threaded_log_function()
00041 {
00042 change_thread_log_function(JackMessageBufferAdd);
00043 }
00044
00045 void jack_log_function(int level, const char *message)
00046 {
00047 void (* log_callback)(const char *);
00048
00049 switch (level)
00050 {
00051 case LOG_LEVEL_INFO:
00052 log_callback = jack_info_callback;
00053 break;
00054 case LOG_LEVEL_ERROR:
00055 log_callback = jack_error_callback;
00056 break;
00057 default:
00058 return;
00059 }
00060
00061 log_callback(message);
00062 }
00063
00064 static void jack_format_and_log(int level, const char *prefix, const char *fmt, va_list ap)
00065 {
00066 char buffer[300];
00067 size_t len;
00068 jack_log_function_t log_function;
00069
00070 if (prefix != NULL) {
00071 len = strlen(prefix);
00072 memcpy(buffer, prefix, len);
00073 } else {
00074 len = 0;
00075 }
00076
00077 vsnprintf(buffer + len, sizeof(buffer) - len, fmt, ap);
00078
00079 log_function = (jack_log_function_t)jack_tls_get(JackGlobals::fKeyLogFunction);
00080
00081
00082 if (log_function == NULL)
00083 {
00084 log_function = jack_log_function;
00085
00086 }
00087 else
00088 {
00089
00090 }
00091
00092 log_function(level, buffer);
00093 }
00094
00095 SERVER_EXPORT void jack_error(const char *fmt, ...)
00096 {
00097 va_list ap;
00098 va_start(ap, fmt);
00099 jack_format_and_log(LOG_LEVEL_ERROR, NULL, fmt, ap);
00100 va_end(ap);
00101 }
00102
00103 SERVER_EXPORT void jack_info(const char *fmt, ...)
00104 {
00105 va_list ap;
00106 va_start(ap, fmt);
00107 jack_format_and_log(LOG_LEVEL_INFO, NULL, fmt, ap);
00108 va_end(ap);
00109 }
00110
00111 SERVER_EXPORT void jack_log(const char *fmt,...)
00112 {
00113 if (jack_verbose) {
00114 va_list ap;
00115 va_start(ap, fmt);
00116 jack_format_and_log(LOG_LEVEL_INFO, "Jack: ", fmt, ap);
00117 va_end(ap);
00118 }
00119 }
00120
00121 SERVER_EXPORT void default_jack_error_callback(const char *desc)
00122 {
00123 fprintf(stderr, "%s\n", desc);
00124 fflush(stderr);
00125 }
00126
00127 SERVER_EXPORT void default_jack_info_callback(const char *desc)
00128 {
00129 fprintf(stdout, "%s\n", desc);
00130 fflush(stdout);
00131 }
00132
00133 SERVER_EXPORT void silent_jack_error_callback(const char *desc)
00134 {}
00135
00136 SERVER_EXPORT void silent_jack_info_callback(const char *desc)
00137 {}
00138
00139 SERVER_EXPORT void (*jack_error_callback)(const char *desc) = &default_jack_error_callback;
00140 SERVER_EXPORT void (*jack_info_callback)(const char *desc) = &default_jack_info_callback;