1 /*
2  * Copyright (c) 2021-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 #include "hisysevent.h"
17 
18 #include <cctype>
19 #include <chrono>
20 #include <ctime>
21 #include <iomanip>
22 #include <sys/time.h>
23 #include <unistd.h>
24 
25 #include "def.h"
26 #include "hilog/log.h"
27 #ifdef HIVIEWDFX_HITRACE_ENABLED
28 #include "hitrace/trace.h"
29 #endif
30 #include "securec.h"
31 #include "transport.h"
32 
33 #undef LOG_DOMAIN
34 #define LOG_DOMAIN 0xD002D08
35 
36 #undef LOG_TAG
37 #define LOG_TAG "HISYSEVENT"
38 
39 namespace OHOS {
40 namespace HiviewDFX {
EventBase(const std::string & domain,const std::string & eventName,int type,uint64_t timeStamp)41 HiSysEvent::EventBase::EventBase(const std::string& domain, const std::string& eventName, int type,
42     uint64_t timeStamp)
43 {
44     retCode_ = 0;
45     // append domain to header
46     auto ret = memcpy_s(header_.domain, MAX_DOMAIN_LENGTH, domain.c_str(), domain.length());
47     if (ret != EOK) {
48         SetRetCode(ERR_RAW_DATA_WROTE_EXCEPTION);
49         return;
50     }
51     header_.domain[domain.length()] = '\0';
52     // append name to header
53     ret = memcpy_s(header_.name, MAX_EVENT_NAME_LENGTH, eventName.c_str(), eventName.length());
54     if (ret != EOK) {
55         SetRetCode(ERR_RAW_DATA_WROTE_EXCEPTION);
56         return;
57     }
58     header_.name[eventName.length()] = '\0';
59     // append event type to header
60     header_.type = static_cast<uint8_t>(type - 1);
61     // append timestamp to header
62     header_.timestamp = timeStamp;
63 }
64 
GetRetCode()65 int HiSysEvent::EventBase::GetRetCode()
66 {
67     return retCode_;
68 }
69 
SetRetCode(int retCode)70 void HiSysEvent::EventBase::SetRetCode(int retCode)
71 {
72     retCode_ = retCode;
73 }
74 
AppendParam(std::shared_ptr<Encoded::EncodedParam> param)75 void HiSysEvent::EventBase::AppendParam(std::shared_ptr<Encoded::EncodedParam> param)
76 {
77     if (param == nullptr) {
78         return;
79     }
80     param->SetRawData(rawData_);
81     if (param->Encode()) {
82         paramCnt_++;
83     }
84 }
85 
WritebaseInfo()86 void HiSysEvent::EventBase::WritebaseInfo()
87 {
88     rawData_ = std::make_shared<RawData>();
89     if (rawData_ == nullptr) {
90         SetRetCode(ERR_RAW_DATA_WROTE_EXCEPTION);
91         return;
92     }
93     header_.timeZone = static_cast<uint8_t>(ParseTimeZone(timezone));
94     header_.pid = static_cast<uint32_t>(getprocpid());
95     header_.tid = static_cast<uint32_t>(getproctid());
96     header_.uid = static_cast<uint32_t>(getuid());
97 #ifdef HIVIEWDFX_HITRACE_ENABLED
98     HiTraceId hitraceId = HiTraceChain::GetId();
99     if (hitraceId.IsValid()) {
100         header_.isTraceOpened = 1; // 1: include trace info, 0: exclude trace info.
101         traceInfo_.traceId = hitraceId.GetChainId();
102         traceInfo_.spanId = hitraceId.GetSpanId();
103         traceInfo_.pSpanId = hitraceId.GetParentSpanId();
104         traceInfo_.traceFlag = hitraceId.GetFlags();
105     }
106 #else
107     header_.isTraceOpened = 0; // 1: include trace info, 0: exclude trace info.
108 #endif
109     int32_t blockSize = 0;
110     if (!rawData_->Append(reinterpret_cast<uint8_t*>(&blockSize), sizeof(int32_t))) {
111         SetRetCode(ERR_RAW_DATA_WROTE_EXCEPTION);
112         return;
113     }
114     // append header to data.
115     if (!rawData_->Append(reinterpret_cast<uint8_t*>(&header_), sizeof(struct HiSysEventHeader))) {
116         SetRetCode(ERR_RAW_DATA_WROTE_EXCEPTION);
117         return;
118     }
119     // append trace info to data.
120     if (header_.isTraceOpened == 1 &&
121         !rawData_->Append(reinterpret_cast<uint8_t*>(&traceInfo_), sizeof(struct TraceInfo))) {
122         SetRetCode(ERR_RAW_DATA_WROTE_EXCEPTION);
123         return;
124     }
125     paramCntWroteOffset_ = rawData_->GetDataLength();
126     // append param count to data.
127     if (!rawData_->Append(reinterpret_cast<uint8_t*>(&paramCnt_), sizeof(int32_t))) {
128         SetRetCode(ERR_RAW_DATA_WROTE_EXCEPTION);
129         return;
130     }
131 }
132 
GetParamCnt()133 size_t HiSysEvent::EventBase::GetParamCnt()
134 {
135     return paramCnt_;
136 }
137 
GetEventRawData()138 std::shared_ptr<Encoded::RawData> HiSysEvent::EventBase::GetEventRawData()
139 {
140     if (rawData_ != nullptr) {
141         auto blockSize = static_cast<int32_t>(rawData_->GetDataLength());
142         (void)rawData_->Update(reinterpret_cast<uint8_t*>(&blockSize), sizeof(int32_t), 0);
143         auto paramCnt = static_cast<int32_t>(paramCnt_);
144         (void)rawData_->Update(reinterpret_cast<uint8_t*>(&paramCnt), sizeof(int32_t), paramCntWroteOffset_);
145     }
146     return rawData_;
147 }
148 
CheckKey(const std::string & key)149 int HiSysEvent::CheckKey(const std::string& key)
150 {
151     if (!StringFilter::GetInstance().IsValidName(key, MAX_PARAM_NAME_LENGTH)) {
152         return ERR_KEY_NAME_INVALID;
153     }
154     return SUCCESS;
155 }
156 
CheckValue(const std::string & value)157 int HiSysEvent::CheckValue(const std::string& value)
158 {
159     if (value.length() > MAX_STRING_LENGTH) {
160         return ERR_VALUE_LENGTH_TOO_LONG;
161     }
162     return SUCCESS;
163 }
164 
CheckArraySize(const size_t size)165 int HiSysEvent::CheckArraySize(const size_t size)
166 {
167     if (size > MAX_ARRAY_SIZE) {
168         return ERR_ARRAY_TOO_MUCH;
169     }
170     return SUCCESS;
171 }
172 
ExplainThenReturnRetCode(const int retCode)173 int HiSysEvent::ExplainThenReturnRetCode(const int retCode)
174 {
175     if (retCode > SUCCESS) {
176         HILOG_DEBUG(LOG_CORE, "some value of param discard as invalid data, error=%{public}d, message=%{public}s",
177             retCode, ERR_MSG_LEVEL1[retCode - 1]);
178     } else if (retCode < SUCCESS) {
179         HILOG_DEBUG(LOG_CORE, "discard data, error=%{public}d, message=%{public}s",
180             retCode, ERR_MSG_LEVEL0[-retCode - 1]);
181     }
182     return retCode;
183 }
184 
IsError(EventBase & eventBase)185 bool HiSysEvent::IsError(EventBase& eventBase)
186 {
187     return (eventBase.GetRetCode() < SUCCESS);
188 }
189 
IsErrorAndUpdate(int retCode,EventBase & eventBase)190 bool HiSysEvent::IsErrorAndUpdate(int retCode, EventBase& eventBase)
191 {
192     if (retCode < SUCCESS) {
193         eventBase.SetRetCode(retCode);
194         return true;
195     }
196     return false;
197 }
198 
IsWarnAndUpdate(int retCode,EventBase & eventBase)199 bool HiSysEvent::IsWarnAndUpdate(int retCode, EventBase& eventBase)
200 {
201     if (retCode != SUCCESS) {
202         eventBase.SetRetCode(retCode);
203         return true;
204     }
205     return false;
206 }
207 
UpdateAndCheckKeyNumIsOver(EventBase & eventBase)208 bool HiSysEvent::UpdateAndCheckKeyNumIsOver(EventBase& eventBase)
209 {
210     if (eventBase.GetParamCnt() >= MAX_PARAM_NUMBER) {
211         eventBase.SetRetCode(ERR_KEY_NUMBER_TOO_MUCH);
212         return true;
213     }
214     return false;
215 }
216 
SendSysEvent(EventBase & eventBase)217 void HiSysEvent::SendSysEvent(EventBase& eventBase)
218 {
219     auto rawData = eventBase.GetEventRawData();
220     if (rawData == nullptr) {
221         eventBase.SetRetCode(ERR_RAW_DATA_WROTE_EXCEPTION);
222         (void)ExplainThenReturnRetCode(ERR_RAW_DATA_WROTE_EXCEPTION);
223         return;
224     }
225     int r = Transport::GetInstance().SendData(*(eventBase.GetEventRawData()));
226     if (r != SUCCESS) {
227         eventBase.SetRetCode(r);
228         (void)ExplainThenReturnRetCode(r);
229     }
230 }
231 
AppendHexData(EventBase & eventBase,const std::string & key,uint64_t value)232 void HiSysEvent::AppendHexData(EventBase& eventBase, const std::string& key, uint64_t value)
233 {
234     eventBase.AppendParam(std::make_shared<Encoded::UnsignedVarintEncodedParam<uint64_t>>(key, value));
235 }
236 
WritebaseInfo(EventBase & eventBase)237 void HiSysEvent::WritebaseInfo(EventBase& eventBase)
238 {
239     eventBase.WritebaseInfo();
240 }
241 
AppendInvalidParam(EventBase & eventBase,const HiSysEventParam & param)242 void HiSysEvent::AppendInvalidParam(EventBase& eventBase, const HiSysEventParam& param)
243 {
244     eventBase.SetRetCode(ERR_VALUE_INVALID);
245 }
246 
AppendBoolParam(EventBase & eventBase,const HiSysEventParam & param)247 void HiSysEvent::AppendBoolParam(EventBase& eventBase, const HiSysEventParam& param)
248 {
249     if (!CheckParamValidity(eventBase, param.name)) {
250         return;
251     }
252     eventBase.AppendParam(std::make_shared<Encoded::SignedVarintEncodedParam<bool>>(param.name, param.v.b));
253 }
254 
AppendInt8Param(EventBase & eventBase,const HiSysEventParam & param)255 void HiSysEvent::AppendInt8Param(EventBase& eventBase, const HiSysEventParam& param)
256 {
257     if (!CheckParamValidity(eventBase, param.name)) {
258         return;
259     }
260     eventBase.AppendParam(std::make_shared<Encoded::SignedVarintEncodedParam<int8_t>>(param.name, param.v.i8));
261 }
262 
AppendUint8Param(EventBase & eventBase,const HiSysEventParam & param)263 void HiSysEvent::AppendUint8Param(EventBase& eventBase, const HiSysEventParam& param)
264 {
265     if (!CheckParamValidity(eventBase, param.name)) {
266         return;
267     }
268     eventBase.AppendParam(std::make_shared<Encoded::UnsignedVarintEncodedParam<uint8_t>>(param.name, param.v.ui8));
269 }
270 
AppendInt16Param(EventBase & eventBase,const HiSysEventParam & param)271 void HiSysEvent::AppendInt16Param(EventBase& eventBase, const HiSysEventParam& param)
272 {
273     if (!CheckParamValidity(eventBase, param.name)) {
274         return;
275     }
276     eventBase.AppendParam(std::make_shared<Encoded::SignedVarintEncodedParam<int16_t>>(param.name, param.v.i16));
277 }
278 
AppendUint16Param(EventBase & eventBase,const HiSysEventParam & param)279 void HiSysEvent::AppendUint16Param(EventBase& eventBase, const HiSysEventParam& param)
280 {
281     if (!CheckParamValidity(eventBase, param.name)) {
282         return;
283     }
284     eventBase.AppendParam(std::make_shared<Encoded::UnsignedVarintEncodedParam<uint16_t>>(param.name, param.v.ui16));
285 }
286 
AppendInt32Param(EventBase & eventBase,const HiSysEventParam & param)287 void HiSysEvent::AppendInt32Param(EventBase& eventBase, const HiSysEventParam& param)
288 {
289     if (!CheckParamValidity(eventBase, param.name)) {
290         return;
291     }
292     eventBase.AppendParam(std::make_shared<Encoded::SignedVarintEncodedParam<int32_t>>(param.name, param.v.i32));
293 }
294 
AppendUint32Param(EventBase & eventBase,const HiSysEventParam & param)295 void HiSysEvent::AppendUint32Param(EventBase& eventBase, const HiSysEventParam& param)
296 {
297     if (!CheckParamValidity(eventBase, param.name)) {
298         return;
299     }
300     eventBase.AppendParam(std::make_shared<Encoded::UnsignedVarintEncodedParam<uint32_t>>(param.name, param.v.ui32));
301 }
302 
AppendInt64Param(EventBase & eventBase,const HiSysEventParam & param)303 void HiSysEvent::AppendInt64Param(EventBase& eventBase, const HiSysEventParam& param)
304 {
305     if (!CheckParamValidity(eventBase, param.name)) {
306         return;
307     }
308     eventBase.AppendParam(std::make_shared<Encoded::SignedVarintEncodedParam<int64_t>>(param.name, param.v.i64));
309 }
310 
AppendUint64Param(EventBase & eventBase,const HiSysEventParam & param)311 void HiSysEvent::AppendUint64Param(EventBase& eventBase, const HiSysEventParam& param)
312 {
313     if (!CheckParamValidity(eventBase, param.name)) {
314         return;
315     }
316     eventBase.AppendParam(std::make_shared<Encoded::UnsignedVarintEncodedParam<uint64_t>>(param.name, param.v.ui64));
317 }
318 
AppendFloatParam(EventBase & eventBase,const HiSysEventParam & param)319 void HiSysEvent::AppendFloatParam(EventBase& eventBase, const HiSysEventParam& param)
320 {
321     if (!CheckParamValidity(eventBase, param.name)) {
322         return;
323     }
324     eventBase.AppendParam(std::make_shared<Encoded::FloatingNumberEncodedParam<float>>(param.name, param.v.f));
325 }
326 
AppendDoubleParam(EventBase & eventBase,const HiSysEventParam & param)327 void HiSysEvent::AppendDoubleParam(EventBase& eventBase, const HiSysEventParam& param)
328 {
329     if (!CheckParamValidity(eventBase, param.name)) {
330         return;
331     }
332     eventBase.AppendParam(std::make_shared<Encoded::FloatingNumberEncodedParam<double>>(param.name, param.v.d));
333 }
334 
AppendStringParam(EventBase & eventBase,const HiSysEventParam & param)335 void HiSysEvent::AppendStringParam(EventBase& eventBase, const HiSysEventParam& param)
336 {
337     if (param.v.s == nullptr) {
338         eventBase.SetRetCode(ERR_VALUE_INVALID);
339         return;
340     }
341     if (!CheckParamValidity(eventBase, param.name)) {
342         return;
343     }
344     IsWarnAndUpdate(CheckValue(std::string(param.v.s)), eventBase);
345     auto rawStr = StringFilter::GetInstance().EscapeToRaw(std::string(param.v.s));
346     eventBase.AppendParam(std::make_shared<Encoded::StringEncodedParam>(param.name, rawStr));
347 }
348 
AppendBoolArrayParam(EventBase & eventBase,const HiSysEventParam & param)349 void HiSysEvent::AppendBoolArrayParam(EventBase& eventBase, const HiSysEventParam& param)
350 {
351     bool* array = reinterpret_cast<bool*>(param.v.array);
352     if (!CheckArrayValidity(eventBase, array)) {
353         return;
354     }
355     std::vector<bool> value(array, array + param.arraySize);
356     if (!CheckArrayParamsValidity(eventBase, param.name, value)) {
357         return;
358     }
359     eventBase.AppendParam(std::make_shared<Encoded::SignedVarintEncodedArrayParam<bool>>(param.name, value));
360 }
361 
AppendInt8ArrayParam(EventBase & eventBase,const HiSysEventParam & param)362 void HiSysEvent::AppendInt8ArrayParam(EventBase& eventBase, const HiSysEventParam& param)
363 {
364     int8_t* array = reinterpret_cast<int8_t*>(param.v.array);
365     if (!CheckArrayValidity(eventBase, array)) {
366         return;
367     }
368     std::vector<int8_t> value(array, array + param.arraySize);
369     if (!CheckArrayParamsValidity(eventBase, param.name, value)) {
370         return;
371     }
372     eventBase.AppendParam(std::make_shared<Encoded::SignedVarintEncodedArrayParam<int8_t>>(param.name, value));
373 }
374 
AppendUint8ArrayParam(EventBase & eventBase,const HiSysEventParam & param)375 void HiSysEvent::AppendUint8ArrayParam(EventBase& eventBase, const HiSysEventParam& param)
376 {
377     uint8_t* array = reinterpret_cast<uint8_t*>(param.v.array);
378     if (!CheckArrayValidity(eventBase, array)) {
379         return;
380     }
381     std::vector<uint8_t> value(array, array + param.arraySize);
382     if (!CheckArrayParamsValidity(eventBase, param.name, value)) {
383         return;
384     }
385     eventBase.AppendParam(std::make_shared<Encoded::UnsignedVarintEncodedArrayParam<uint8_t>>(param.name, value));
386 }
387 
AppendInt16ArrayParam(EventBase & eventBase,const HiSysEventParam & param)388 void HiSysEvent::AppendInt16ArrayParam(EventBase& eventBase, const HiSysEventParam& param)
389 {
390     int16_t* array = reinterpret_cast<int16_t*>(param.v.array);
391     if (!CheckArrayValidity(eventBase, array)) {
392         return;
393     }
394     std::vector<int16_t> value(array, array + param.arraySize);
395     if (!CheckArrayParamsValidity(eventBase, param.name, value)) {
396         return;
397     }
398     eventBase.AppendParam(std::make_shared<Encoded::SignedVarintEncodedArrayParam<int16_t>>(param.name, value));
399 }
400 
AppendUint16ArrayParam(EventBase & eventBase,const HiSysEventParam & param)401 void HiSysEvent::AppendUint16ArrayParam(EventBase& eventBase, const HiSysEventParam& param)
402 {
403     uint16_t* array = reinterpret_cast<uint16_t*>(param.v.array);
404     if (!CheckArrayValidity(eventBase, array)) {
405         return;
406     }
407     std::vector<uint16_t> value(array, array + param.arraySize);
408     if (!CheckArrayParamsValidity(eventBase, param.name, value)) {
409         return;
410     }
411     eventBase.AppendParam(std::make_shared<Encoded::UnsignedVarintEncodedArrayParam<uint16_t>>(param.name, value));
412 }
413 
AppendInt32ArrayParam(EventBase & eventBase,const HiSysEventParam & param)414 void HiSysEvent::AppendInt32ArrayParam(EventBase& eventBase, const HiSysEventParam& param)
415 {
416     int32_t* array = reinterpret_cast<int32_t*>(param.v.array);
417     if (!CheckArrayValidity(eventBase, array)) {
418         return;
419     }
420     std::vector<int32_t> value(array, array + param.arraySize);
421     if (!CheckArrayParamsValidity(eventBase, param.name, value)) {
422         return;
423     }
424     eventBase.AppendParam(std::make_shared<Encoded::SignedVarintEncodedArrayParam<int32_t>>(param.name, value));
425 }
426 
AppendUint32ArrayParam(EventBase & eventBase,const HiSysEventParam & param)427 void HiSysEvent::AppendUint32ArrayParam(EventBase& eventBase, const HiSysEventParam& param)
428 {
429     uint32_t* array = reinterpret_cast<uint32_t*>(param.v.array);
430     if (!CheckArrayValidity(eventBase, array)) {
431         return;
432     }
433     std::vector<uint32_t> value(array, array + param.arraySize);
434     if (!CheckArrayParamsValidity(eventBase, param.name, value)) {
435         return;
436     }
437     eventBase.AppendParam(std::make_shared<Encoded::UnsignedVarintEncodedArrayParam<uint32_t>>(param.name, value));
438 }
439 
AppendInt64ArrayParam(EventBase & eventBase,const HiSysEventParam & param)440 void HiSysEvent::AppendInt64ArrayParam(EventBase& eventBase, const HiSysEventParam& param)
441 {
442     int64_t* array = reinterpret_cast<int64_t*>(param.v.array);
443     if (!CheckArrayValidity(eventBase, array)) {
444         return;
445     }
446     std::vector<int64_t> value(array, array + param.arraySize);
447     if (!CheckArrayParamsValidity(eventBase, param.name, value)) {
448         return;
449     }
450     eventBase.AppendParam(std::make_shared<Encoded::SignedVarintEncodedArrayParam<int64_t>>(param.name, value));
451 }
452 
AppendUint64ArrayParam(EventBase & eventBase,const HiSysEventParam & param)453 void HiSysEvent::AppendUint64ArrayParam(EventBase& eventBase, const HiSysEventParam& param)
454 {
455     uint64_t* array = reinterpret_cast<uint64_t*>(param.v.array);
456     if (!CheckArrayValidity(eventBase, array)) {
457         return;
458     }
459     std::vector<uint64_t> value(array, array + param.arraySize);
460     if (!CheckArrayParamsValidity(eventBase, param.name, value)) {
461         return;
462     }
463     eventBase.AppendParam(std::make_shared<Encoded::UnsignedVarintEncodedArrayParam<uint64_t>>(param.name, value));
464 }
465 
AppendFloatArrayParam(EventBase & eventBase,const HiSysEventParam & param)466 void HiSysEvent::AppendFloatArrayParam(EventBase& eventBase, const HiSysEventParam& param)
467 {
468     float* array = reinterpret_cast<float*>(param.v.array);
469     if (!CheckArrayValidity(eventBase, array)) {
470         return;
471     }
472     std::vector<float> value(array, array + param.arraySize);
473     if (!CheckArrayParamsValidity(eventBase, param.name, value)) {
474         return;
475     }
476     eventBase.AppendParam(std::make_shared<Encoded::FloatingNumberEncodedArrayParam<float>>(param.name, value));
477 }
478 
AppendDoubleArrayParam(EventBase & eventBase,const HiSysEventParam & param)479 void HiSysEvent::AppendDoubleArrayParam(EventBase& eventBase, const HiSysEventParam& param)
480 {
481     double* array = reinterpret_cast<double*>(param.v.array);
482     if (!CheckArrayValidity(eventBase, array)) {
483         return;
484     }
485     std::vector<double> value(array, array + param.arraySize);
486     if (!CheckArrayParamsValidity(eventBase, param.name, value)) {
487         return;
488     }
489     eventBase.AppendParam(std::make_shared<Encoded::FloatingNumberEncodedArrayParam<double>>(param.name, value));
490 }
491 
AppendStringArrayParam(EventBase & eventBase,const HiSysEventParam & param)492 void HiSysEvent::AppendStringArrayParam(EventBase& eventBase, const HiSysEventParam& param)
493 {
494     auto array = reinterpret_cast<char**>(param.v.array);
495     if (array == nullptr) {
496         eventBase.SetRetCode(ERR_VALUE_INVALID);
497         return;
498     }
499     for (size_t i = 0; i < param.arraySize; ++i) {
500         if (auto temp = array + i; *temp == nullptr) {
501             eventBase.SetRetCode(ERR_VALUE_INVALID);
502             return;
503         }
504     }
505     std::vector<std::string> value(array, array + param.arraySize);
506     if (!CheckArrayParamsValidity(eventBase, param.name, value)) {
507         return;
508     }
509     std::vector<std::string> rawStrs;
510     for (auto& item : value) {
511         IsWarnAndUpdate(CheckValue(item), eventBase);
512         rawStrs.emplace_back(StringFilter::GetInstance().EscapeToRaw(item));
513     }
514     eventBase.AppendParam(std::make_shared<Encoded::StringEncodedArrayParam>(param.name, rawStrs));
515 }
516 
InnerWrite(EventBase & eventBase)517 void HiSysEvent::InnerWrite(EventBase& eventBase)
518 {
519     // do nothing.
520     HILOG_DEBUG(LOG_CORE, "hisysevent inner writer result: %{public}d.", eventBase.GetRetCode());
521 }
522 
InnerWrite(EventBase & eventBase,const HiSysEventParam params[],size_t size)523 void HiSysEvent::InnerWrite(EventBase& eventBase, const HiSysEventParam params[], size_t size)
524 {
525     if (params == nullptr || size == 0) {
526         return;
527     }
528     for (size_t i = 0; i < size; ++i) {
529         AppendParam(eventBase, params[i]);
530     }
531 }
532 
AppendParam(EventBase & eventBase,const HiSysEventParam & param)533 void HiSysEvent::AppendParam(EventBase& eventBase, const HiSysEventParam& param)
534 {
535     using AppendParamFunc = void (*)(EventBase&, const HiSysEventParam&);
536     constexpr int totalAppendFuncSize = 25;
537     const AppendParamFunc appendFuncs[totalAppendFuncSize] = {
538         &AppendInvalidParam, &AppendBoolParam, &AppendInt8Param, &AppendUint8Param,
539         &AppendInt16Param, &AppendUint16Param, &AppendInt32Param, &AppendUint32Param,
540         &AppendInt64Param, &AppendUint64Param, &AppendFloatParam, &AppendDoubleParam,
541         &AppendStringParam, &AppendBoolArrayParam, &AppendInt8ArrayParam, &AppendUint8ArrayParam,
542         &AppendInt16ArrayParam, &AppendUint16ArrayParam, &AppendInt32ArrayParam, &AppendUint32ArrayParam,
543         &AppendInt64ArrayParam, &AppendUint64ArrayParam, &AppendFloatArrayParam, &AppendDoubleArrayParam,
544         &AppendStringArrayParam,
545     };
546     if (size_t paramType = param.t; paramType < totalAppendFuncSize) {
547         appendFuncs[paramType](eventBase, param);
548     } else {
549         eventBase.SetRetCode(ERR_VALUE_INVALID);
550     }
551 }
552 } // namespace HiviewDFX
553 } // OHOS