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