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