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*>(¶mCnt_), 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*>(¶mCnt), 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