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