1 /**
2 * Copyright (C) 2022 The Android Open Source Project
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 express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include <ImsMediaTrace.h>
18 #include <string.h>
19 #include <utils/Log.h>
20 #include <sys/time.h>
21
22 #ifdef IM_FILE_LOG
23 #include <stdio.h>
24 #include <stdlib.h>
25 #define IM_LOG_FILE "/data/IM.txt"
26 static uint IM_remove_log = 1;
27 #endif
28
29 #define TRACEMAXSTRING 1024
30 #define IM_TAG "libimsmedia"
31 #define IM_DEBUG_TAG "libimsmedia_d"
32
33 #ifdef IM_FILE_LOG
34 #define __IMLOG__(IMLOGTYPE, TAG) \
35 do \
36 { \
37 va_list args; \
38 char szBuffer[TRACEMAXSTRING]; \
39 va_start(args, format); \
40 vsnprintf(szBuffer, TRACEMAXSTRING, format, args); \
41 va_end(args); \
42 android_printLog(IMLOGTYPE, TAG, "%s", szBuffer); \
43 FILE* fp_IM_log = nullptr; \
44 if (IM_remove_log) \
45 { \
46 remove(IM_LOG_FILE); \
47 IM_remove_log = 0; \
48 } \
49 fp_IM_log = fopen(IM_LOG_FILE, "a+"); \
50 if (fp_IM_log != nullptr) \
51 { \
52 fprintf(fp_IM_log, "%s", szBuffer); \
53 fclose(fp_IM_log); \
54 } \
55 } while (0)
56 #else
57 #define __IMLOG__(IMLOGTYPE, TAG) \
58 do \
59 { \
60 va_list args; \
61 char szBuffer[TRACEMAXSTRING]; \
62 va_start(args, format); \
63 vsnprintf(szBuffer, TRACEMAXSTRING, format, args); \
64 va_end(args); \
65 android_printLog(IMLOGTYPE, TAG, "%s", szBuffer); \
66 } while (0)
67 #endif
68
69 static uint gLogMode = kLogEnableDebug;
70 static uint gDebugLogMode = 0;
71
IMLOGD_PACKET_ARG(IM_PACKET_LOG_TYPE type,const char * format,...)72 void ImsMediaTrace::IMLOGD_PACKET_ARG(IM_PACKET_LOG_TYPE type, const char* format, ...)
73 {
74 if (gDebugLogMode & type && gLogMode <= kLogEnableDebug)
75 {
76 __IMLOG__(ANDROID_LOG_DEBUG, IM_DEBUG_TAG);
77 }
78 }
79
IMSetLogMode(uint mode)80 void ImsMediaTrace::IMSetLogMode(uint mode)
81 {
82 gLogMode = mode;
83 }
84
IMSetDebugLogMode(uint type)85 void ImsMediaTrace::IMSetDebugLogMode(uint type)
86 {
87 gDebugLogMode = type;
88 }
89
IMGetDebugLog()90 uint ImsMediaTrace::IMGetDebugLog()
91 {
92 return gDebugLogMode;
93 }
94
IMLOGD_ARG(const char * format,...)95 void ImsMediaTrace::IMLOGD_ARG(const char* format, ...)
96 {
97 if (gLogMode <= kLogEnableDebug)
98 {
99 __IMLOG__(ANDROID_LOG_DEBUG, IM_TAG);
100 }
101 }
102
IMLOGI_ARG(const char * format,...)103 void ImsMediaTrace::IMLOGI_ARG(const char* format, ...)
104 {
105 if (gLogMode <= kLogEnableInfo)
106 {
107 __IMLOG__(ANDROID_LOG_INFO, IM_TAG);
108 }
109 }
110
IMLOGW_ARG(const char * format,...)111 void ImsMediaTrace::IMLOGW_ARG(const char* format, ...)
112 {
113 if (gLogMode <= kLogEnableWarning)
114 {
115 __IMLOG__(ANDROID_LOG_WARN, IM_TAG);
116 }
117 }
118
IMLOGE_ARG(const char * format,...)119 void ImsMediaTrace::IMLOGE_ARG(const char* format, ...)
120 {
121 if (gLogMode <= kLogEnableError)
122 {
123 __IMLOG__(ANDROID_LOG_ERROR, IM_TAG);
124 }
125 }
126
127 #define MAX_PRINT_STRING_LEN 2048
128 static char buffer[MAX_PRINT_STRING_LEN];
129
hex_char(char nibble)130 static char hex_char(char nibble)
131 {
132 const static char buf[16] = {
133 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
134 return buf[nibble & 0xF];
135 }
136
IMTrace_Bin2String(const char * s,int length)137 char* ImsMediaTrace::IMTrace_Bin2String(const char* s, int length)
138 {
139 const char* input = s;
140 char* output = buffer;
141 int i;
142
143 if (length < 0)
144 return 0;
145 if (length * 4 > (MAX_PRINT_STRING_LEN - 5))
146 length = (MAX_PRINT_STRING_LEN / 4) - 5;
147
148 for (i = 0; i < length; i++)
149 {
150 *output++ = hex_char(*input >> 4);
151 *output++ = hex_char(*input++ & 0xF);
152 *output++ = ' ';
153 if ((i & 0x03) == 0x03)
154 *output++ = ' ';
155 }
156
157 *output = 0;
158 return buffer;
159 }
160
IMLOGD_BINARY(const char * msg,const char * s,int length)161 void ImsMediaTrace::IMLOGD_BINARY(const char* msg, const char* s, int length)
162 {
163 #define IMLOG_BIN_LINE_WIDTH 32
164 const char* curr = s;
165 if (msg)
166 IMLOGD1("%s", msg);
167 while (length > 0)
168 {
169 int curr_len = length < IMLOG_BIN_LINE_WIDTH ? length : IMLOG_BIN_LINE_WIDTH;
170 IMLOGD1("\t%s", IMTrace_Bin2String(curr, curr_len));
171 length -= curr_len;
172 curr += curr_len;
173 }
174 }
175
IM_StripFileName(char * pcFileName)176 char* ImsMediaTrace::IM_StripFileName(char* pcFileName)
177 {
178 char* pcTemp = nullptr;
179 pcTemp = strrchr(pcFileName, '/');
180
181 (pcTemp != nullptr) ? pcTemp++ : pcTemp = pcFileName;
182
183 return pcTemp;
184 }
185