]> git.vomp.tv Git - vompclient.git/blob - log.cc
Preparations for dynamic mode switching
[vompclient.git] / log.cc
1 /*\r
2     Copyright 2004-2005 Chris Tallon\r
3     Copyright 2003-2004 University Of Bradford\r
4 \r
5     This file is part of VOMP.\r
6 \r
7     VOMP is free software; you can redistribute it and/or modify\r
8     it under the terms of the GNU General Public License as published by\r
9     the Free Software Foundation; either version 2 of the License, or\r
10     (at your option) any later version.\r
11 \r
12     VOMP is distributed in the hope that it will be useful,\r
13     but WITHOUT ANY WARRANTY; without even the implied warranty of\r
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
15     GNU General Public License for more details.\r
16 \r
17     You should have received a copy of the GNU General Public License\r
18     along with VOMP; if not, write to the Free Software\r
19     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\r
20 */\r
21 \r
22 #include "log.h"\r
23 \r
24 #include "vdr.h"\r
25 \r
26 #ifdef __ANDROID__\r
27 #include <android/log.h>\r
28 #endif\r
29 \r
30 Log* Log::instance = NULL;\r
31 \r
32 Log::Log()\r
33 {\r
34   if (instance) return;\r
35   instance = this;\r
36   logfile = NULL;\r
37   initted = 0;\r
38   logLevel = 0;\r
39   extlog = NULL;\r
40 }\r
41 \r
42 Log::~Log()\r
43 {\r
44   instance = NULL;\r
45 }\r
46 \r
47 Log* Log::getInstance()\r
48 {\r
49   return instance;\r
50 }\r
51 \r
52 void Log::upLogLevel()\r
53 {\r
54   if (logLevel == Log::DEBUG)\r
55   {\r
56     log("Log", logLevel, "Log level is at its highest already");\r
57     return;\r
58   }\r
59 \r
60   logLevel++;\r
61   log("Log", logLevel, "Log level is now %i", logLevel);\r
62 }\r
63 \r
64 void Log::downLogLevel()\r
65 {\r
66   if (logLevel == Log::CRAZY)\r
67   {\r
68     log("Log", logLevel, "Log level is at its lowest already");\r
69     return;\r
70   }\r
71 \r
72   logLevel--;\r
73   log("Log", logLevel, "Log level is now %i", logLevel);\r
74 }\r
75 \r
76 int Log::init(int startLogLevel,const char* fileName, int tenabled)\r
77 {\r
78   initted = 1;\r
79   logLevel = startLogLevel;\r
80   enabled = tenabled;\r
81 //  logfile = fopen(fileName, "a");\r
82 //  logfile = fopen(stdout, "a");\r
83   logfile = stdout;\r
84 //  logfile = fopen("/log", "a");\r
85 \r
86   if (logfile) return 1;\r
87   else return 0;\r
88 }\r
89 \r
90 int Log::shutdown()\r
91 {\r
92   if (!initted) return 1;\r
93   if (enabled) fclose(logfile);\r
94   return 1;\r
95 }\r
96 \r
97 int Log::log(const char *fromModule, int level,const char* message, ...)\r
98 {\r
99   if (!instance || !logfile) return 0;\r
100 \r
101   if (!enabled && !extlog) return 1;\r
102   if (level > logLevel) return 1;\r
103 \r
104   char buffer[151];\r
105   int spaceLeft = 150;\r
106 \r
107 #ifndef _MSC_VER\r
108   struct timeval tv;\r
109   gettimeofday(&tv, NULL);\r
110   struct tm* tms = localtime(&tv.tv_sec);\r
111 #else\r
112   struct _timeb tb;\r
113   _ftime(&tb);\r
114   struct tm* tms = localtime(&tb.time);\r
115 #endif\r
116   spaceLeft -= strftime(buffer, spaceLeft, "%H:%M:%S.", tms);\r
117 #ifndef _MSC_VER\r
118   spaceLeft -= SNPRINTF(&buffer[150-spaceLeft], spaceLeft, "%06lu ", (unsigned long)tv.tv_usec);\r
119 #else\r
120   spaceLeft -= SNPRINTF(&buffer[150-spaceLeft], spaceLeft, "%06lu ", (unsigned long)tb.millitm);\r
121 #endif\r
122 \r
123   char levelString[10];\r
124   if (level == CRAZY)   strcpy(levelString, "[CRAZY] ");\r
125   if (level == EMERG)   strcpy(levelString, "[EMERG] ");\r
126   if (level == ALERT)   strcpy(levelString, "[ALERT] ");\r
127   if (level == CRIT)    strcpy(levelString, "[CRIT]  ");\r
128   if (level == ERR)     strcpy(levelString, "[ERR]   ");\r
129   if (level == WARN)    strcpy(levelString, "[WARN]  ");\r
130   if (level == NOTICE)  strcpy(levelString, "[notice]");\r
131   if (level == INFO)    strcpy(levelString, "[info]  ");\r
132   if (level == DEBUG)   strcpy(levelString, "[debug] ");\r
133 \r
134 #ifndef WIN32\r
135   spaceLeft -= SNPRINTF(&buffer[150-spaceLeft], spaceLeft, "%s %d %s - ", levelString, getpid(), fromModule);\r
136 #else\r
137   spaceLeft -= SNPRINTF(&buffer[150-spaceLeft], spaceLeft, "%s %s - ", levelString,  fromModule);\r
138 #endif\r
139 \r
140   va_list ap;\r
141   va_start(ap, message);\r
142   spaceLeft = VSNPRINTF(&buffer[150-spaceLeft], spaceLeft, message, ap);\r
143   va_end(ap);\r
144 \r
145   int messageLength = strlen(buffer);\r
146   if (messageLength < 150)\r
147   {\r
148     buffer[messageLength] = '\n';\r
149     buffer[messageLength+1] = '\0';\r
150   }\r
151   else\r
152   {\r
153     buffer[149] = '\n';\r
154     buffer[150] = '\0';\r
155   }\r
156   \r
157   int success = 1;\r
158   if (enabled)\r
159   {\r
160 #ifndef __ANDROID__\r
161     success = fputs(buffer, logfile);\r
162     fflush(NULL);\r
163 #else\r
164     int and_level=0;\r
165     switch (level) {\r
166     case CRAZY:\r
167     case ALERT:\r
168     case EMERG :\r
169     case CRIT:{\r
170         and_level=ANDROID_LOG_FATAL;\r
171     } break;\r
172     case ERR: {\r
173        and_level=ANDROID_LOG_ERROR;\r
174     } break;\r
175     case WARN: {\r
176        and_level=ANDROID_LOG_WARN;\r
177     } break;\r
178     case NOTICE:\r
179     case INFO: {\r
180         and_level=ANDROID_LOG_INFO;\r
181     } break;\r
182     case DEBUG :{\r
183         and_level=ANDROID_LOG_DEBUG;\r
184     } break;\r
185     };\r
186     __android_log_vprint(and_level, fromModule,\r
187                              message,  ap);\r
188 #endif\r
189   }\r
190 \r
191   if (extlog) extlog->LogExtern(buffer); //Replacement for network logging\r
192 \r
193 \r
194   if (success != EOF)\r
195     return 1;\r
196   else\r
197     return 0;\r
198 \r
199 }\r
200 \r
201 void Log::logLongString(const char *fromModule, int level,const char *message)\r
202 {\r
203         int string_size=strlen(message);\r
204         char buffer[100];\r
205         const char * pointer=message;\r
206         for (int str_written=0; str_written<string_size;str_written+=99) {\r
207                 strncpy(buffer,pointer,99);\r
208                 buffer[99]=0;\r
209                 pointer+=99;\r
210                 log(fromModule,level,"%s",buffer);\r
211         }\r
212 \r
213 }\r
214 \r
215 int Log::status()\r
216 {\r
217   if (instance && logfile) return 1;\r
218   else return 0;\r
219 }\r
220 \r
221 void Log::setExternLogger(ExternLogger* login) {\r
222         extlog=login;\r
223     log("Log", Log::DEBUG, "Extern logging started");\r
224 }\r
225 \r
226 \r
227 \r
228 \r