1 /* ------------------------------------------------------------------ 2 * Copyright (C) 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 #ifndef ANDROID_LOGGER_CONFIG_H 20 #define ANDROID_LOGGER_CONFIG_H 21 22 #include "author/authordriver.h" 23 #include "android_log_appender.h" 24 25 #define MAX_STRING_LEN 255 26 27 FILE *file; 28 29 class PVLoggerConfigFile{ 30 /* 31 To configure logging at runtime, a file pvlogger.txt must be located in the sdcard. 32 The format for log level and logger tag in the file should be: "level,node". Note that there should be no space between log level and logger tag. 33 For example, pvlogger.txt can look like: 34 1,PVPlayerEngine 35 8,PVSocketNode 36 Above example means log the message level PVLOGMSG_ALERT for PVPlayerEngine and PVLOGMSG_DEBUG for PVSocketNode. See pvlogger.h for log level values. 37 */ 38 public: PVLoggerConfigFile()39 PVLoggerConfigFile():iLogFileRead(false) 40 { 41 iFileServer.Connect(); 42 iLogFileName[MAX_STRING_LEN] = '\0'; 43 oscl_strncpy(iLogFileName,"/sdcard/pvlogger.txt", MAX_STRING_LEN); 44 oscl_memset(ibuffer, 0, sizeof(ibuffer)); 45 } 46 ~PVLoggerConfigFile()47 ~PVLoggerConfigFile() 48 { 49 iFileServer.Close(); 50 } 51 IsLoggerConfigFilePresent()52 bool IsLoggerConfigFilePresent() 53 { 54 if(-1 != ReadAndParseLoggerConfigFile()) 55 return true; 56 return false; 57 } 58 59 //Read and parse the config file 60 //retval = -1 if the config file doesnt exist ReadAndParseLoggerConfigFile()61 int8 ReadAndParseLoggerConfigFile() 62 { 63 int8 retval = 1; 64 65 if(0 != iLogFile.Open(iLogFileName,Oscl_File::MODE_READ, iFileServer)) 66 { 67 retval = -1; 68 } 69 else 70 { 71 if(!iLogFileRead) 72 { 73 int32 nCharRead = iLogFile.Read(ibuffer,1, sizeof(ibuffer)); 74 //Parse the buffer for \n chars 75 Oscl_Vector<char*,OsclMemAllocator> LogConfigStrings; 76 77 //Get the logger strings 78 const char* const lnFd = "\n"; 79 const int8 lnFdLen = oscl_strlen(lnFd); 80 int16 offset = 0; 81 char* lastValidBffrAddr = ibuffer + oscl_strlen(ibuffer); 82 const char* lnFdIndx = oscl_strstr(ibuffer, lnFd); 83 while(lnFdIndx!=NULL && lnFdIndx < lastValidBffrAddr) 84 { 85 oscl_memset((char*)lnFdIndx, '\0', lnFdLen); 86 LogConfigStrings.push_back(ibuffer + offset); 87 offset = (lnFdIndx + lnFdLen) - ibuffer; 88 lnFdIndx = oscl_strstr(ibuffer + offset, lnFd); 89 } 90 if(NULL == lnFdIndx && ((ibuffer + offset) < lastValidBffrAddr)) 91 { 92 LogConfigStrings.push_back(ibuffer + offset); 93 } 94 95 //Populate the LoggerConfigElements vector 96 { 97 if(!LogConfigStrings.empty()) 98 { 99 Oscl_Vector<char*,OsclMemAllocator>::iterator it; 100 if(LogConfigStrings.size() > 0) 101 { 102 for (it = LogConfigStrings.begin(); it!= LogConfigStrings.end(); it++) 103 { 104 char* hashIndex = OSCL_CONST_CAST(char*, oscl_strstr(*it, "#")); 105 char* CommaIndex = OSCL_CONST_CAST(char*, oscl_strstr(*it, ",")); 106 // Skip lines with hash 107 if (hashIndex == NULL) 108 { 109 if(CommaIndex != NULL) 110 { 111 *CommaIndex = '\0'; 112 LoggerConfigElement obj; 113 uint32 logLevel; 114 PV_atoi(*it,'d',oscl_strlen(*it),logLevel); 115 obj.iLogLevel = logLevel; 116 obj.iLoggerString= CommaIndex +1; 117 iLoggerConfigElements.push_back(obj); 118 } 119 else 120 { 121 //Add the config element for logging all the modules with specified log level 122 LoggerConfigElement obj; 123 uint32 logLevel; 124 PV_atoi(*it,'d',oscl_strlen(*it),logLevel); 125 obj.iLoggerString = ""; 126 obj.iLogLevel = logLevel; 127 iLoggerConfigElements.push_back(obj); 128 } 129 } 130 } 131 } 132 } 133 else 134 { 135 //Add the config element for complete logging for all the modules 136 LoggerConfigElement obj; 137 obj.iLoggerString = ""; 138 obj.iLogLevel = 8; 139 iLoggerConfigElements.push_back(obj); 140 } 141 } 142 iLogFile.Close(); 143 iLogFileRead = true; 144 } 145 } 146 return retval; 147 } 148 SetLoggerSettings()149 void SetLoggerSettings() 150 { 151 Oscl_Vector<LoggerConfigElement, OsclMemAllocator>::iterator it; 152 153 PVLoggerAppender *appender=NULL; 154 OsclRefCounter *refCounter=NULL; 155 if(iLoggerConfigElements.empty()) 156 { 157 return; 158 } 159 160 appender = new AndroidLogAppender<TimeAndIdLayout,1024>(); 161 OsclRefCounterSA<LogAppenderDestructDealloc<AndroidLogAppender<TimeAndIdLayout,1024> > > *appenderRefCounter = 162 new OsclRefCounterSA<LogAppenderDestructDealloc<AndroidLogAppender<TimeAndIdLayout,1024> > >(appender); 163 refCounter = appenderRefCounter; 164 165 OsclSharedPtr<PVLoggerAppender> appenderPtr(appender,refCounter); 166 167 for (it = iLoggerConfigElements.begin(); it!= iLoggerConfigElements.end(); it++) 168 { 169 PVLogger *node = NULL; 170 node = PVLogger::GetLoggerObject(it->iLoggerString); 171 node->AddAppender(appenderPtr); 172 node->SetLogLevel(it->iLogLevel); 173 } 174 } 175 176 private: 177 class LoggerConfigElement{ 178 public: LoggerConfigElement()179 LoggerConfigElement() 180 { 181 iLoggerString = NULL; 182 iLogLevel = 8; 183 } 184 char *iLoggerString; 185 int8 iLogLevel; 186 }; 187 bool iLogFileRead; 188 Oscl_File iLogFile; 189 Oscl_FileServer iFileServer; 190 char iLogFileName[MAX_STRING_LEN+1]; 191 char ibuffer[1024]; 192 Oscl_Vector<LoggerConfigElement, OsclMemAllocator> iLoggerConfigElements; 193 }; 194 195 #endif 196 197