• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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