1 /* ------------------------------------------------------------------
2 * Copyright (C) 2009 PacketVideo
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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
14 * See the License for the specific language governing permissions
15 * and limitations under the License.
16 * -------------------------------------------------------------------
19 #ifndef ANDROID_LOGGER_CONFIG_H
20 #define ANDROID_LOGGER_CONFIG_H
22 #include "author/authordriver.h"
23 #include "android_log_appender.h"
25 #define MAX_STRING_LEN 255
27 class PVLoggerConfigFile{
29 * - An Instrumentation level (defined by PVLOGGER_INST_LEVEL in external/opencore/oscl/oscl/config/android/osclconfig.h) is set to 1.
30 * - Logging in all components is enabled.
33 /* To enable debug level logs for all components, change PVLOGGER_INST_LEVEL to 5.
35 To configure logging at runtime, a file pvlogger.txt must be located in the sdcard.
36 The format for log level and logger tag in the file should be: "level,node".
37 For example, pvlogger.txt can look like:
40 Above example means log the message level PVLOGMSG_ALERT for PVPlayerEngine and PVLOGMSG_DEBUG for PVSocketNode. See pvlogger.h for log level values.
41 NOTE: There should be no space between log level and logger tag.
44 PVLoggerConfigFile():iLogFileRead(false)
46 iFileServer.Connect();
47 iLogFileName[MAX_STRING_LEN] = '\0';
48 oscl_strncpy(iLogFileName,"/sdcard/pvlogger.txt", MAX_STRING_LEN);
49 oscl_memset(ibuffer, 0, sizeof(ibuffer));
57 //Read and parse the config file
58 //retval = -1 if the config file doesnt exist
59 void ReadAndParseLoggerConfigFile()
61 bool isRTSAvailable = false;
63 if(0 != iLogFile.Open(iLogFileName,Oscl_File::MODE_READ, iFileServer))
65 isRTSAvailable = false;
71 int32 nCharRead = iLogFile.Read(ibuffer,1, sizeof(ibuffer));
72 //Parse the buffer for \n chars
73 Oscl_Vector<char*,OsclMemAllocator> LogConfigStrings;
75 //Get the logger strings
76 const char* const lnFd = "\n";
77 const int8 lnFdLen = oscl_strlen(lnFd);
79 char* lastValidBffrAddr = ibuffer + oscl_strlen(ibuffer);
80 const char* lnFdIndx = oscl_strstr(ibuffer, lnFd);
81 while(lnFdIndx!=NULL && lnFdIndx < lastValidBffrAddr)
83 oscl_memset((char*)lnFdIndx, '\0', lnFdLen);
84 LogConfigStrings.push_back(ibuffer + offset);
85 offset = (lnFdIndx + lnFdLen) - ibuffer;
86 lnFdIndx = oscl_strstr(ibuffer + offset, lnFd);
88 if(NULL == lnFdIndx && ((ibuffer + offset) < lastValidBffrAddr))
90 LogConfigStrings.push_back(ibuffer + offset);
93 //Populate the LoggerConfigElements vector
95 if(!LogConfigStrings.empty())
97 Oscl_Vector<char*,OsclMemAllocator>::iterator it;
98 if(LogConfigStrings.size() > 0)
100 for (it = LogConfigStrings.begin(); it!= LogConfigStrings.end(); it++)
102 char* hashIndex = OSCL_CONST_CAST(char*, oscl_strstr(*it, "#"));
103 char* CommaIndex = OSCL_CONST_CAST(char*, oscl_strstr(*it, ","));
104 // Skip lines with hash
105 if (hashIndex == NULL)
107 if(CommaIndex != NULL)
110 LoggerConfigElement obj;
112 PV_atoi(*it,'d',oscl_strlen(*it),logLevel);
113 obj.iLogLevel = logLevel;
114 obj.iLoggerString= CommaIndex +1;
115 iLoggerConfigElements.push_back(obj);
119 //Add the config element for logging all the modules with specified log level
120 LoggerConfigElement obj;
122 PV_atoi(*it,'d',oscl_strlen(*it),logLevel);
123 obj.iLoggerString = "";
124 obj.iLogLevel = logLevel;
125 iLoggerConfigElements.push_back(obj);
133 //Add the config element for complete logging for all the modules
134 LoggerConfigElement obj;
135 obj.iLoggerString = "";
137 iLoggerConfigElements.push_back(obj);
142 isRTSAvailable = true;
145 SetLoggerSettings(isRTSAvailable);
148 void SetLoggerSettings(bool isRTSAvailable)
150 PVLoggerAppender *appender=NULL;
151 OsclRefCounter *refCounter=NULL;
153 appender = new AndroidLogAppender<TimeAndIdLayout,1024>();
154 OsclRefCounterSA<LogAppenderDestructDealloc<AndroidLogAppender<TimeAndIdLayout,1024> > > *appenderRefCounter =
155 new OsclRefCounterSA<LogAppenderDestructDealloc<AndroidLogAppender<TimeAndIdLayout,1024> > >(appender);
156 refCounter = appenderRefCounter;
158 OsclSharedPtr<PVLoggerAppender> appenderPtr(appender,refCounter);
160 if (isRTSAvailable == false) {
161 PVLogger *node = NULL;
162 node = PVLogger::GetLoggerObject(""); // All modules
163 node->AddAppender(appenderPtr); // Using AndroidLogAppender
164 node->SetLogLevel(PVLOGMSG_DEBUG); // Debug level
167 Oscl_Vector<LoggerConfigElement, OsclMemAllocator>::iterator it;
169 if(iLoggerConfigElements.empty())
174 for (it = iLoggerConfigElements.begin(); it!= iLoggerConfigElements.end(); it++)
176 PVLogger *node = NULL;
177 node = PVLogger::GetLoggerObject(it->iLoggerString);
178 node->AddAppender(appenderPtr);
179 node->SetLogLevel(it->iLogLevel);
185 class LoggerConfigElement{
187 LoggerConfigElement()
189 iLoggerString = NULL;
192 const char *iLoggerString;
197 Oscl_FileServer iFileServer;
198 char iLogFileName[MAX_STRING_LEN+1];
200 Oscl_Vector<LoggerConfigElement, OsclMemAllocator> iLoggerConfigElements;