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