1 /* ------------------------------------------------------------------ 2 * Copyright (C) 1998-2009 PacketVideo 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13 * express or implied. 14 * See the License for the specific language governing permissions 15 * and limitations under the License. 16 * ------------------------------------------------------------------- 17 */ 18 19 // test_pv_author_engine_logger.cpp: implementation of the PVAELogger class. 20 // 21 ////////////////////////////////////////////////////////////////////// 22 #ifndef PVLOGGER_FILE_APPENDER_H_INCLUDED 23 #include "pvlogger_file_appender.h" 24 #endif 25 #ifndef PVLOGGER_STDERR_APPENDER_H_INCLUDED 26 #include "pvlogger_stderr_appender.h" 27 #endif 28 #ifndef PVLOGGER_MEM_APPENDER_H_INCLUDED 29 #include "pvlogger_mem_appender.h" 30 #endif 31 #ifndef PVLOGGER_TIME_AND_ID_LAYOUT_H_INCLUDED 32 #include "pvlogger_time_and_id_layout.h" 33 #endif 34 #ifndef OSCL_MEM_H_INCLUDED 35 #include "oscl_mem.h" 36 #endif 37 #ifndef OSCL_STRING_CONTAINERS_H_INCLUDED 38 #include "oscl_string_containers.h" 39 #endif 40 #ifndef TEST_PV_AUTHOR_ENGINE_LOGGER_H_INCLUDED 41 #include "test_pv_author_engine_logger.h" 42 #endif 43 44 //////////////////////////////////////////////////////////////////////////////// 45 // Macro redefinition for typing convenience : define an 8-bit char* or 16-bit wchar 46 #define _CSTR(x) _STRLIT_CHAR(x) 47 #define _W(x) _STRLIT_WCHAR(x) 48 49 #define KLogFile ((OSCL_TCHAR*) _STRLIT("pvauthorlog.txt")) 50 51 typedef OSCL_HeapString<OsclMemAllocator> HeapString; 52 typedef OSCL_wHeapString<OsclMemAllocator> wHeapString; 53 54 // Open pwszConfigFile to read nodes (and levels) to log 55 // Returns true on success 56 OSCL_EXPORT_REF bool PVAELogger::ParseConfigFile(const oscl_wchar *pwszConfigFile) 57 { 58 OSCL_ASSERT(pwszConfigFile); 59 if (!pwszConfigFile) 60 return false; 61 62 int32 iStatus = 0; 63 PVLogger *loggernode = NULL; 64 65 bool bFileExists = false; 66 Oscl_FileServer fs; 67 Oscl_File filehandle; 68 69 // read configuration file pvaelogger.txt in working directory 70 fs.Connect(); 71 if (filehandle.Open(pwszConfigFile, Oscl_File::MODE_READ, fs) == 0) 72 bFileExists = true; 73 74 //If the file "pvaelogger.txt" does not exist in the working dir or 75 //is empty, set default: log "AuthorEngine", debug level to StdErr 76 if (!bFileExists || 0 == filehandle.Size()) 77 { 78 if (bFileExists) 79 filehandle.Close(); 80 fs.Close(); 81 return false; 82 } 83 84 int32 MAXLENGTH = filehandle.Size(); 85 uint32 lastlineterminator = 0, firstline = 0; 86 87 PVLoggerAppender *appender = NULL; 88 OsclRefCounter *refCounter = NULL; 89 OsclSharedPtr<PVLoggerAppender> sharedAppenderPtr; 90 91 bool bEof = false; 92 while (!bEof) 93 { 94 char *buf = (char *)OSCL_MALLOC(MAXLENGTH + 1); 95 filehandle.Seek(lastlineterminator, Oscl_File::SEEKSET); 96 if (filehandle.Read((void *)buf, 1, MAXLENGTH)) 97 { 98 //delibrately remove const-ness char* output from oscl_strstr to a modifiable char* for further operation 99 char *ptr = OSCL_CONST_CAST(char*, oscl_strstr(buf, _CSTR("\n"))); 100 if (ptr) 101 { 102 if (*(ptr - 1) == '\r') 103 { 104 *(ptr - 1) = '\0'; 105 } 106 else 107 { 108 *ptr = '\0'; 109 } 110 111 lastlineterminator += ptr - buf + 1; 112 113 } 114 else 115 { 116 bEof = true; 117 } 118 119 // Check if this is a commented line 120 if (*buf == '#') 121 { 122 firstline = lastlineterminator; 123 if (buf) 124 { 125 OSCL_FREE(buf); 126 buf = NULL; 127 } 128 continue; 129 } 130 131 //If the first uncommented line in the file is NO_LOGGING all logging will be disabled 132 //If the first uncommented line in the file is LOGTOFILE, a file appender shall be created 133 //If the first uncommented line in the file is LOGTOMEM, a memory appender shall be created 134 //otherwise all logs shall be dumped on the cmd wnd 135 136 if (appender == NULL && 137 ((lastlineterminator == 0) || (firstline == lastlineterminator - (ptr - buf + 1)))) 138 139 { 140 if (oscl_strstr(buf, _CSTR("NO_LOGGING"))) 141 { 142 filehandle.Close(); 143 fs.Close(); 144 if (buf) 145 { 146 OSCL_FREE(buf); 147 buf = NULL; 148 } 149 return true; 150 } 151 152 iStatus = PVAELogger::CreateTestAppender(buf, appender, refCounter, sharedAppenderPtr); 153 154 if (iStatus != OsclErrNone) 155 { 156 OSCL_ASSERT(!_CSTR("Author Engine Unittest: unable to create log appender")); 157 sharedAppenderPtr.Unbind(); 158 if (refCounter) 159 delete refCounter; 160 if (appender) 161 delete appender; 162 if (buf) 163 { 164 OSCL_FREE(buf); 165 buf = NULL; 166 } 167 return false; 168 } 169 } 170 171 //Extract the node 172 char *node = (char *)OSCL_MALLOC(MAXLENGTH + 1); 173 if (!node) 174 { 175 if (NULL != buf) 176 { 177 OSCL_FREE(buf); 178 buf = NULL; 179 } 180 return false; 181 } 182 183 const char *marker = oscl_strstr(buf, _CSTR(";")); 184 185 if (!marker) 186 { 187 OSCL_FREE(node); 188 if (buf) 189 { 190 OSCL_FREE(buf); 191 buf = NULL; 192 } 193 continue; 194 } 195 196 uint32 node_size = marker - buf; 197 198 oscl_strncpy(node, buf, node_size); 199 *(node + node_size) = '\0'; 200 201 //Extract the log level 202 HeapString *loglevel = OSCL_NEW(HeapString, (oscl_strstr(buf, _CSTR(";")) + 1)); 203 if (!loglevel) 204 { 205 OSCL_FREE(node); 206 if (buf) 207 { 208 OSCL_FREE(buf); 209 buf = NULL; 210 } 211 return false; 212 } 213 214 char *tmp = loglevel->get_str(); 215 bool logallnodes = false; 216 217 //If node = ALLNODES; enable logging for all 218 //ALLNODES should be written in the file before any other logger node 219 if (oscl_strstr(node, _CSTR("ALLNODES"))) 220 { 221 loggernode = PVLogger::GetLoggerObject(""); 222 logallnodes = true; 223 } 224 else 225 { 226 loggernode = PVLogger::GetLoggerObject(node); 227 } 228 229 loggernode->AddAppender(sharedAppenderPtr); 230 231 //Set log level 232 if (oscl_strstr(tmp, _CSTR("PVLOGMSG_EMERG"))) 233 loggernode->SetLogLevel(PVLOGMSG_EMERG); 234 else if (oscl_strstr(tmp, _CSTR("PVLOGMSG_ALERT"))) 235 loggernode->SetLogLevel(PVLOGMSG_ALERT); 236 else if (oscl_strstr(tmp, _CSTR("PVLOGMSG_CRIT"))) 237 loggernode->SetLogLevel(PVLOGMSG_CRIT); 238 else if (oscl_strstr(tmp, _CSTR("PVLOGMSG_ERR"))) 239 loggernode->SetLogLevel(PVLOGMSG_ERR); 240 else if (oscl_strstr(tmp, _CSTR("PVLOGMSG_WARNING"))) 241 loggernode->SetLogLevel(PVLOGMSG_WARNING); 242 else if (oscl_strstr(tmp, _CSTR("PVLOGMSG_NOTICE"))) 243 loggernode->SetLogLevel(PVLOGMSG_NOTICE); 244 else if (oscl_strstr(tmp, _CSTR("PVLOGMSG_INFO"))) 245 loggernode->SetLogLevel(PVLOGMSG_INFO); 246 else if (oscl_strstr(tmp, _CSTR("PVLOGMSG_STACK_TRACE"))) 247 loggernode->SetLogLevel(PVLOGMSG_STACK_TRACE); 248 else if (oscl_strstr(tmp, _CSTR("PVLOGMSG_DEBUG"))) 249 loggernode->SetLogLevel(PVLOGMSG_DEBUG); 250 251 if (logallnodes == true) 252 bEof = true; 253 254 if (node) 255 OSCL_FREE(node); 256 if (loglevel) 257 OSCL_DELETE(loglevel); 258 if (buf) 259 { 260 OSCL_FREE(buf); 261 buf = NULL; 262 } 263 264 } 265 else //file read returns 0 266 { 267 //We have reached the end of the file 268 bEof = true; 269 } 270 271 if (buf) 272 { 273 OSCL_FREE(buf); 274 buf = NULL; 275 } 276 277 }//end of while loop 278 279 filehandle.Close(); 280 fs.Close(); 281 return true; 282 } 283 284 // Attach a StdErrAppender to "PVAuthorEngine" at level PVLOGMSG_DEBUG 285 // Returns true on success 286 287 OSCL_EXPORT_REF bool PVAELogger::MakeStdErrAppender() 288 { 289 int32 iStatus; 290 PVLoggerAppender *appender = NULL; 291 OsclRefCounter *refCounter = NULL; 292 PVLogger *loggernode = NULL; 293 294 typedef StdErrAppender<TimeAndIdLayout, 1024> typeStdErrAppender; 295 OSCL_TRY(iStatus, 296 appender = new typeStdErrAppender() ; 297 OsclRefCounterSA<LogAppenderDestructDealloc<typeStdErrAppender > > *appenderRefCounter = 298 new OsclRefCounterSA<LogAppenderDestructDealloc<typeStdErrAppender > >(appender); 299 refCounter = appenderRefCounter; 300 ); 301 302 if (iStatus != OsclErrNone) 303 { 304 delete refCounter; 305 delete appender; 306 return false; 307 } 308 309 OsclSharedPtr<PVLoggerAppender> appenderPtr(appender, refCounter); 310 loggernode = PVLogger::GetLoggerObject(_CSTR("PVAuthorEngine")); 311 loggernode->AddAppender(appenderPtr); 312 loggernode->SetLogLevel(PVLOGMSG_DEBUG); 313 314 return true; 315 } 316 317 OSCL_EXPORT_REF int32 PVAELogger::CreateTestAppender(char* aBuf, PVLoggerAppender*& aAppender, OsclRefCounter*& aRefCounter, OsclSharedPtr<PVLoggerAppender> &aSharedAppenderPtr) 318 { 319 int32 err; 320 if (oscl_strstr(aBuf, _CSTR("LOGTOFILE"))) 321 { 322 typedef TextFileAppender<TimeAndIdLayout, 1024> typeAppender; 323 324 OSCL_TRY(err, 325 aAppender = (PVLoggerAppender*)typeAppender::CreateAppender(KLogFile); 326 aRefCounter = new OsclRefCounterSA<LogAppenderDestructDealloc<typeAppender> >(aAppender); 327 aSharedAppenderPtr.Bind(aAppender, aRefCounter); 328 ); 329 330 } 331 332 else if (oscl_strstr(aBuf, _CSTR("LOGTOMEM"))) 333 { 334 typedef MemAppender<TimeAndIdLayout, 1024> typeAppender; 335 OSCL_TRY(err, 336 aAppender = (PVLoggerAppender*)typeAppender::CreateAppender(KLogFile); 337 aRefCounter = new OsclRefCounterSA<LogAppenderDestructDealloc<typeAppender> >(aAppender); 338 aSharedAppenderPtr.Bind(aAppender, aRefCounter); 339 ); 340 } 341 else 342 { 343 typedef StdErrAppender<TimeAndIdLayout, 1024> typeAppender; 344 OSCL_TRY(err, 345 aAppender = new typeAppender() ; 346 aRefCounter = new OsclRefCounterSA<LogAppenderDestructDealloc<typeAppender> >(aAppender); 347 aSharedAppenderPtr.Bind(aAppender, aRefCounter); 348 ); 349 } 350 351 return err; 352 } 353