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