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