1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef SOFTBUS_EVENT_CONVERTER_H
17 #define SOFTBUS_EVENT_CONVERTER_H
18
19 #include <securec.h>
20 #include <string.h>
21
22 #include "comm_log.h"
23 #include "form/softbus_event_form.h"
24 #include "hisysevent_c.h"
25 #include "anonymizer.h"
26
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30
31 #define INVALID_INT_VALUE 0
32 #define PARAM_STRING_VALUE_MAX_LEN 256
33 #define PARAM_LONG_STRING_VALUE_MAX_LEN (256 * 1024)
34
35 typedef struct {
36 char name[MAX_LENGTH_OF_PARAM_NAME];
37 HiSysEventParamType type;
38 bool (*Assign)(const char[], HiSysEventParamType, SoftbusEventForm *, HiSysEventParam *);
39 } HiSysEventParamAssigner;
40
InitString(char ** str,size_t maxLen)41 static inline bool InitString(char **str, size_t maxLen)
42 {
43 *str = (char *)malloc(maxLen);
44 if (*str == NULL) {
45 COMM_LOGE(COMM_DFX, "malloc param string fail");
46 return false;
47 }
48 if (memset_s(*str, maxLen, 0, maxLen) != EOK) {
49 COMM_LOGE(COMM_DFX, "memset_s param string fail");
50 return false;
51 }
52 return true;
53 }
54
CopyString(char * destName,const char * srcName,size_t maxLen)55 static inline bool CopyString(char *destName, const char *srcName, size_t maxLen)
56 {
57 if (strcpy_s(destName, maxLen, srcName) != EOK) {
58 COMM_LOGE(COMM_DFX, "strcpy_s fail, srcName=%{public}s, maxLen=%{public}zu", srcName, maxLen);
59 return false;
60 }
61 return true;
62 }
63
64 /* Used by ASSIGNER macros */
AssignerInt32(int32_t value,HiSysEventParam ** param)65 static inline bool AssignerInt32(int32_t value, HiSysEventParam **param)
66 {
67 if (value <= INVALID_INT_VALUE) {
68 (*param)->v.i32 = INVALID_INT_VALUE;
69 return false;
70 }
71 (*param)->v.i32 = value;
72 return true;
73 }
74
75 /* Used by ASSIGNER macros */
AssignerInt64(int64_t value,HiSysEventParam ** param)76 static inline bool AssignerInt64(int64_t value, HiSysEventParam **param)
77 {
78 (*param)->v.i64 = value;
79 return true;
80 }
81
82 /* Used by ASSIGNER macros */
AssignerString(const char * value,HiSysEventParam ** param)83 static inline bool AssignerString(const char *value, HiSysEventParam **param)
84 {
85 if (value == NULL || value[0] == '\0' || strnlen(value, PARAM_STRING_VALUE_MAX_LEN) == PARAM_STRING_VALUE_MAX_LEN) {
86 (*param)->v.s = NULL;
87 return false;
88 }
89 return InitString(&(*param)->v.s, PARAM_STRING_VALUE_MAX_LEN) &&
90 CopyString((*param)->v.s, value, PARAM_STRING_VALUE_MAX_LEN);
91 }
92
93 /* Used by ASSIGNER macros */
AssignerLongString(const char * value,HiSysEventParam ** param)94 static inline bool AssignerLongString(const char *value, HiSysEventParam **param)
95 {
96 if (value == NULL || value[0] == '\0' || strnlen(value,
97 PARAM_LONG_STRING_VALUE_MAX_LEN) == PARAM_LONG_STRING_VALUE_MAX_LEN) {
98 (*param)->v.s = NULL;
99 return false;
100 }
101 return InitString(&(*param)->v.s, PARAM_LONG_STRING_VALUE_MAX_LEN) &&
102 CopyString((*param)->v.s, value, PARAM_LONG_STRING_VALUE_MAX_LEN);
103 }
104
105 /* Used by ASSIGNER macros */
AssignerAnonymizeString(const char * value,HiSysEventParam ** param)106 static inline bool AssignerAnonymizeString(const char *value, HiSysEventParam **param)
107 {
108 if (value == NULL || value[0] == '\0' || strnlen(value, PARAM_STRING_VALUE_MAX_LEN) == PARAM_STRING_VALUE_MAX_LEN) {
109 (*param)->v.s = NULL;
110 return false;
111 }
112 if (!InitString(&(*param)->v.s, PARAM_STRING_VALUE_MAX_LEN)) {
113 return false;
114 }
115 char *anonyStr = NULL;
116 Anonymize(value, &anonyStr);
117 bool status = CopyString((*param)->v.s, anonyStr, PARAM_STRING_VALUE_MAX_LEN);
118 AnonymizeFree(anonyStr);
119 return status;
120 }
121
122 /* Used by ASSIGNER macros */
AssignerErrcode(int32_t value,HiSysEventParam ** param)123 static inline bool AssignerErrcode(int32_t value, HiSysEventParam **param)
124 {
125 (*param)->v.i32 = (value < 0) ? (-value) : value;
126 return true;
127 }
128
129 /* Used by ASSIGNER macros */
AssignerUint64(uint64_t value,HiSysEventParam ** param)130 static inline bool AssignerUint64(uint64_t value, HiSysEventParam **param)
131 {
132 (*param)->v.ui64 = value;
133 return true;
134 }
135
136 /* Used by ASSIGNER macros */
AssignerUint32(uint32_t value,HiSysEventParam ** param)137 static inline bool AssignerUint32(uint32_t value, HiSysEventParam **param)
138 {
139 (*param)->v.ui32 = value;
140 return true;
141 }
142
143 /* Used by ASSIGNER macros */
AssignerUint8(uint8_t value,HiSysEventParam ** param)144 static inline bool AssignerUint8(uint8_t value, HiSysEventParam **param)
145 {
146 (*param)->v.ui8 = value;
147 return true;
148 }
149
150 #define SOFTBUS_ASSIGNER(type, fieldName, field) \
151 static inline bool SoftbusAssigner##fieldName( \
152 const char *eventName, HiSysEventParamType paramType, SoftbusEventForm *form, HiSysEventParam *param) \
153 { \
154 if (Assigner##type(form->field, ¶m) && CopyString(param->name, eventName, MAX_LENGTH_OF_PARAM_NAME)) { \
155 param->t = paramType; \
156 return true; \
157 } \
158 return false; \
159 }
160
161 SOFTBUS_ASSIGNER(Int32, Scene, scene)
162 SOFTBUS_ASSIGNER(Int32, Stage, stage)
163 SOFTBUS_ASSIGNER(String, OrgPkg, orgPkg)
164 SOFTBUS_ASSIGNER(String, Func, func)
165
166 #define SOFTBUS_ASSIGNER_SIZE 4 // Size of g_softbusAssigners
167 static HiSysEventParamAssigner g_softbusAssigners[] = {
168 { "BIZ_SCENE", HISYSEVENT_INT32, SoftbusAssignerScene },
169 { "BIZ_STAGE", HISYSEVENT_INT32, SoftbusAssignerStage },
170 { "ORG_PKG", HISYSEVENT_STRING, SoftbusAssignerOrgPkg},
171 { "FUNC", HISYSEVENT_STRING, SoftbusAssignerFunc },
172 // Modification Note: remember updating SOFTBUS_ASSIGNER_SIZE
173 };
174
ConvertSoftbusForm2Param(HiSysEventParam params[],size_t size,SoftbusEventForm * form)175 static inline size_t ConvertSoftbusForm2Param(HiSysEventParam params[], size_t size, SoftbusEventForm *form)
176 {
177 size_t validSize = 0;
178 if (form == NULL) {
179 return validSize;
180 }
181 for (size_t i = 0; i < size; ++i) {
182 HiSysEventParamAssigner assigner = g_softbusAssigners[i];
183 if (assigner.Assign(assigner.name, assigner.type, form, ¶ms[validSize])) {
184 ++validSize;
185 }
186 }
187 return validSize;
188 }
189
190 #ifdef __cplusplus
191 }
192 #endif /* __cplusplus */
193 #endif // SOFTBUS_EVENT_CONVERTER_H
194