00001 #include "stdafx.h"
00002 #include "clog.h"
00003
00004 static FILE *logFile = NULL;
00005 CPhidgetLog_level logging_level = 0;
00006
00007
00008 int logLockInitialized = PFALSE;
00009 CThread_mutex_t logLock;
00010
00011 static const char *
00012 logLevelToStr(CPhidgetLog_level l)
00013 {
00014 switch (l) {
00015 case PHIDGET_LOG_CRITICAL:
00016 return "CRIT";
00017 case PHIDGET_LOG_ERROR:
00018 return "ERR";
00019 case PHIDGET_LOG_WARNING:
00020 return "WARN";
00021 case PHIDGET_LOG_DEBUG:
00022 return "DEBUG";
00023 case PHIDGET_LOG_INFO:
00024 return "INFO";
00025 case PHIDGET_LOG_VERBOSE:
00026 return "VERBOSE";
00027 }
00028 return "???";
00029 }
00030
00031 PHIDGET21_API int CCONV CPhidget_enableLogging(CPhidgetLog_level level, const char *outputFile)
00032 {
00033 if(!logLockInitialized)
00034 {
00035 CThread_mutex_init(&logLock);
00036 logLockInitialized = PTRUE;
00037 }
00038 CThread_mutex_lock(&logLock);
00039 logging_level = level;
00040 if(outputFile == NULL)
00041 logFile = NULL;
00042 else
00043 {
00044 logFile = fopen(outputFile,"a");
00045 #ifndef _WINDOWS
00046 if(!logFile)
00047 {
00048 CThread_mutex_unlock(&logLock);
00049 switch(errno)
00050 {
00051 case EACCES:
00052 LOG(PHIDGET_LOG_WARNING, "Permission denied for specified logfile. Logging to stdout.");
00053 break;
00054 defualt:
00055 LOG(PHIDGET_LOG_WARNING, "Logfile fopen failed with code: %d",errno);
00056 }
00057 CThread_mutex_lock(&logLock);
00058 }
00059 #endif
00060 }
00061 CThread_mutex_unlock(&logLock);
00062 LOG(PHIDGET_LOG_INFO, "Enabling logging");
00063 return EPHIDGET_OK;
00064 }
00065
00066 PHIDGET21_API int CCONV CPhidget_disableLogging()
00067 {
00068 if(!logLockInitialized)
00069 {
00070 CThread_mutex_init(&logLock);
00071 logLockInitialized = PTRUE;
00072 }
00073 LOG(PHIDGET_LOG_INFO, "Disabling logging");
00074 CThread_mutex_lock(&logLock);
00075 if(logFile!=NULL && logFile!=stdout && logFile!=stderr)
00076 fclose(logFile);
00077 logFile = NULL;
00078 logging_level = 0;
00079 CThread_mutex_unlock(&logLock);
00080 return EPHIDGET_OK;
00081 }
00082
00083
00084
00085 PHIDGET21_API int CCONV CPhidget_log(CPhidgetLog_level level, const char *msg, const char *fmt, ...)
00086 {
00087 size_t threadID = 0;
00088 int logToStderr = (int)level & LOG_TO_STDERR;
00089 va_list va;
00090 level = level & 0xFF;
00091 #ifdef DEBUG
00092 if(level <= logging_level || level == PHIDGET_LOG_DEBUG || logToStderr)
00093 #else
00094 if((level <= logging_level && level != PHIDGET_LOG_DEBUG) || logToStderr)
00095 #endif
00096 {
00097 if(!logLockInitialized)
00098 {
00099 CThread_mutex_init(&logLock);
00100 logLockInitialized = PTRUE;
00101 }
00102 CThread_mutex_lock(&logLock);
00103 if (!logFile)
00104 logFile = stdout;
00105 #ifdef WINCE
00106 if(logToStderr)
00107 fprintf(stderr, "%s: ",logLevelToStr(level));
00108 else if(logFile==stdout)
00109 fprintf(logFile, "%s: ",logLevelToStr(level));
00110 else
00111 fprintf(logFile, "%d,\"%s\",%s,\"", threadID, msg, logLevelToStr(level));
00112 va_start(va, fmt);
00113 if(logToStderr)
00114 {
00115 vfprintf(stderr, fmt, va);
00116 va_end(va);
00117 fprintf(stderr, "\n");
00118 fflush(stderr);
00119 }
00120 else
00121 {
00122 vfprintf(logFile, fmt, va);
00123 va_end(va);
00124 if(logFile==stdout)
00125 fprintf(logFile, "\n");
00126 else
00127 fprintf(logFile, "\"\n");
00128 fflush(logFile);
00129 }
00130 #else //!WINCE
00131 {
00132 char date[50];
00133 struct tm *tmp;
00134 time_t t;
00135 time(&t);
00136 #ifndef _WINDOWS
00137 struct tm tm;
00138 localtime_r(&t, &tm);
00139 tmp = &tm;
00140 threadID = (size_t)pthread_self();
00141 #else
00142 tmp = localtime(&t);
00143 threadID = (size_t)GetCurrentThreadId();
00144 #endif
00145 if (!strftime(date, sizeof (date), "%c", tmp))
00146 strncpy(date, "?", sizeof (date));
00147 if(logToStderr)
00148 fprintf(stderr, "%s: ",logLevelToStr(level));
00149 else if(logFile==stdout)
00150 fprintf(logFile, "%s: ",logLevelToStr(level));
00151 else
00152 fprintf(logFile, "%s,%d,\"%s\",%s,\"", date, (int)threadID, msg, logLevelToStr(level));
00153 va_start(va, fmt);
00154 if(logToStderr)
00155 {
00156 vfprintf(stderr, fmt, va);
00157 va_end(va);
00158 fprintf(stderr, "\n");
00159 fflush(stderr);
00160 }
00161 else
00162 {
00163 vfprintf(logFile, fmt, va);
00164 va_end(va);
00165 if(logFile==stdout)
00166 fprintf(logFile, "\n");
00167 else
00168 fprintf(logFile, "\"\n");
00169 fflush(logFile);
00170 }
00171 }
00172 #endif
00173 CThread_mutex_unlock(&logLock);
00174 }
00175 return EPHIDGET_OK;
00176 }