1020a203aSopenharmony_ci/* 2020a203aSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3020a203aSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4020a203aSopenharmony_ci * you may not use this file except in compliance with the License. 5020a203aSopenharmony_ci * You may obtain a copy of the License at 6020a203aSopenharmony_ci * 7020a203aSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8020a203aSopenharmony_ci * 9020a203aSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10020a203aSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11020a203aSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12020a203aSopenharmony_ci * See the License for the specific language governing permissions and 13020a203aSopenharmony_ci * limitations under the License. 14020a203aSopenharmony_ci */ 15020a203aSopenharmony_ci 16020a203aSopenharmony_ci#include "decoded/decoded_event.h" 17020a203aSopenharmony_ci 18020a203aSopenharmony_ci#include <functional> 19020a203aSopenharmony_ci#include <securec.h> 20020a203aSopenharmony_ci#include <sstream> 21020a203aSopenharmony_ci#include <unordered_map> 22020a203aSopenharmony_ci 23020a203aSopenharmony_ci#include "base/raw_data_base_def.h" 24020a203aSopenharmony_ci#include "decoded/raw_data_decoder.h" 25020a203aSopenharmony_ci#include "hiview_logger.h" 26020a203aSopenharmony_ci 27020a203aSopenharmony_cinamespace OHOS { 28020a203aSopenharmony_cinamespace HiviewDFX { 29020a203aSopenharmony_cinamespace EventRaw { 30020a203aSopenharmony_ciDEFINE_LOG_TAG("HiView-DecodedEvent"); 31020a203aSopenharmony_cinamespace { 32020a203aSopenharmony_ciconstexpr size_t MAX_BLOCK_SIZE = 384 * 1024; // 384K 33020a203aSopenharmony_ciconstexpr size_t MAX_PARAM_CNT = 128 + 10; // 128 for Write, 10 for hiview 34020a203aSopenharmony_ci 35020a203aSopenharmony_cistd::string TransUInt64ToFixedLengthStr(uint64_t src) 36020a203aSopenharmony_ci{ 37020a203aSopenharmony_ci const size_t maxIdLen = 20; 38020a203aSopenharmony_ci std::string uint64Str = std::to_string(src); 39020a203aSopenharmony_ci if (uint64Str.size() >= maxIdLen) { 40020a203aSopenharmony_ci return uint64Str; 41020a203aSopenharmony_ci } 42020a203aSopenharmony_ci std::string dest(maxIdLen, '0'); 43020a203aSopenharmony_ci dest.replace(maxIdLen - uint64Str.size(), uint64Str.size(), uint64Str); 44020a203aSopenharmony_ci return dest; 45020a203aSopenharmony_ci} 46020a203aSopenharmony_ci} 47020a203aSopenharmony_ci 48020a203aSopenharmony_ciDecodedEvent::DecodedEvent(uint8_t* src) 49020a203aSopenharmony_ci{ 50020a203aSopenharmony_ci if (src == nullptr) { 51020a203aSopenharmony_ci return; 52020a203aSopenharmony_ci } 53020a203aSopenharmony_ci size_t blockSize = static_cast<size_t>(*(reinterpret_cast<int32_t*>(src))); 54020a203aSopenharmony_ci if (blockSize < GetValidDataMinimumByteCount() || blockSize > MAX_BLOCK_SIZE) { 55020a203aSopenharmony_ci HIVIEW_LOGE("size of raw data is %{public}zu, which is invalid.", blockSize); 56020a203aSopenharmony_ci return; 57020a203aSopenharmony_ci } 58020a203aSopenharmony_ci rawData_ = new(std::nothrow) uint8_t[blockSize]; 59020a203aSopenharmony_ci if (rawData_ == nullptr) { 60020a203aSopenharmony_ci return; 61020a203aSopenharmony_ci } 62020a203aSopenharmony_ci auto ret = memcpy_s(rawData_, blockSize, src, blockSize); 63020a203aSopenharmony_ci if (ret != EOK) { 64020a203aSopenharmony_ci HIVIEW_LOGE("Decode memory copy failed, ret is %{public}d.", ret); 65020a203aSopenharmony_ci delete[] rawData_; 66020a203aSopenharmony_ci return; 67020a203aSopenharmony_ci } 68020a203aSopenharmony_ci Parse(); 69020a203aSopenharmony_ci} 70020a203aSopenharmony_ci 71020a203aSopenharmony_ciDecodedEvent::~DecodedEvent() 72020a203aSopenharmony_ci{ 73020a203aSopenharmony_ci if (rawData_ != nullptr) { 74020a203aSopenharmony_ci delete[] rawData_; 75020a203aSopenharmony_ci rawData_ = nullptr; 76020a203aSopenharmony_ci } 77020a203aSopenharmony_ci} 78020a203aSopenharmony_ci 79020a203aSopenharmony_civoid DecodedEvent::AppendBaseInfo(std::stringstream& ss) 80020a203aSopenharmony_ci{ 81020a203aSopenharmony_ci char* domain = new(std::nothrow) char[MAX_DOMAIN_LENGTH + 1]; 82020a203aSopenharmony_ci if (domain == nullptr) { 83020a203aSopenharmony_ci return; 84020a203aSopenharmony_ci } 85020a203aSopenharmony_ci if (memcpy_s(domain, MAX_DOMAIN_LENGTH, header_.domain, MAX_DOMAIN_LENGTH) != EOK) { 86020a203aSopenharmony_ci delete[] domain; 87020a203aSopenharmony_ci return; 88020a203aSopenharmony_ci } 89020a203aSopenharmony_ci domain[MAX_DOMAIN_LENGTH] = '\0'; 90020a203aSopenharmony_ci auto eventDomain = std::string(domain); 91020a203aSopenharmony_ci AppendValue(ss, BASE_INFO_KEY_DOMAIN, eventDomain); 92020a203aSopenharmony_ci delete[] domain; 93020a203aSopenharmony_ci char* name = new(std::nothrow) char[MAX_EVENT_NAME_LENGTH + 1]; 94020a203aSopenharmony_ci if (name == nullptr) { 95020a203aSopenharmony_ci return; 96020a203aSopenharmony_ci } 97020a203aSopenharmony_ci if (memcpy_s(name, MAX_EVENT_NAME_LENGTH, header_.name, MAX_EVENT_NAME_LENGTH) != EOK) { 98020a203aSopenharmony_ci delete[] name; 99020a203aSopenharmony_ci return; 100020a203aSopenharmony_ci } 101020a203aSopenharmony_ci name[MAX_EVENT_NAME_LENGTH] = '\0'; 102020a203aSopenharmony_ci auto eventName = std::string(name); 103020a203aSopenharmony_ci AppendValue(ss, BASE_INFO_KEY_NAME, eventName); 104020a203aSopenharmony_ci delete[] name; 105020a203aSopenharmony_ci AppendValue(ss, BASE_INFO_KEY_TYPE, (static_cast<int>(header_.type) + 1)); // header_.type is only 2 bits which has 106020a203aSopenharmony_ci // been subtracted 1 before wrote. 107020a203aSopenharmony_ci AppendValue(ss, BASE_INFO_KEY_TIME_STAMP, header_.timestamp); 108020a203aSopenharmony_ci auto timeZone = ParseTimeZone(static_cast<size_t>(header_.timeZone)); 109020a203aSopenharmony_ci AppendValue(ss, BASE_INFO_KEY_TIME_ZONE, timeZone); 110020a203aSopenharmony_ci AppendValue(ss, BASE_INFO_KEY_PID, header_.pid); 111020a203aSopenharmony_ci AppendValue(ss, BASE_INFO_KEY_TID, header_.tid); 112020a203aSopenharmony_ci AppendValue(ss, BASE_INFO_KEY_UID, header_.uid); 113020a203aSopenharmony_ci AppendValue(ss, BASE_INFO_KEY_LOG, static_cast<uint32_t>(header_.log)); 114020a203aSopenharmony_ci AppendValue(ss, BASE_INFO_KEY_ID, TransUInt64ToFixedLengthStr(header_.id)); 115020a203aSopenharmony_ci if (header_.isTraceOpened == 1) { 116020a203aSopenharmony_ci AppendValue(ss, BASE_INFO_KEY_TRACE_FLAG, static_cast<int>(traceInfo_.traceFlag)); 117020a203aSopenharmony_ci AppendValue(ss, BASE_INFO_KEY_TRACE_ID, TransNumToHexStr(traceInfo_.traceId)); 118020a203aSopenharmony_ci AppendValue(ss, BASE_INFO_KEY_SPAN_ID, TransNumToHexStr(traceInfo_.spanId)); 119020a203aSopenharmony_ci AppendValue(ss, BASE_INFO_KEY_PARENT_SPAN_ID, TransNumToHexStr(traceInfo_.pSpanId)); 120020a203aSopenharmony_ci } 121020a203aSopenharmony_ci} 122020a203aSopenharmony_ci 123020a203aSopenharmony_civoid DecodedEvent::AppendCustomizedArrayParam(std::stringstream& ss, std::shared_ptr<DecodedParam> param) 124020a203aSopenharmony_ci{ 125020a203aSopenharmony_ci std::unordered_map<DataCodedType, std::function<void(std::shared_ptr<DecodedParam>)>> allFuncs = { 126020a203aSopenharmony_ci {DataCodedType::UNSIGNED_VARINT_ARRAY, [this, &ss](std::shared_ptr<DecodedParam> param) { 127020a203aSopenharmony_ci std::vector<uint64_t> u64Vec; 128020a203aSopenharmony_ci if (param->AsUint64Vec(u64Vec)) { 129020a203aSopenharmony_ci this->AppendValue(ss, param->GetKey(), u64Vec); 130020a203aSopenharmony_ci } 131020a203aSopenharmony_ci } 132020a203aSopenharmony_ci }, 133020a203aSopenharmony_ci {DataCodedType::SIGNED_VARINT_ARRAY, [this, &ss](std::shared_ptr<DecodedParam> param) { 134020a203aSopenharmony_ci std::vector<int64_t> i64Vec; 135020a203aSopenharmony_ci if (param->AsInt64Vec(i64Vec)) { 136020a203aSopenharmony_ci this->AppendValue(ss, param->GetKey(), i64Vec); 137020a203aSopenharmony_ci } 138020a203aSopenharmony_ci } 139020a203aSopenharmony_ci }, 140020a203aSopenharmony_ci {DataCodedType::FLOATING_ARRAY, [this, &ss](std::shared_ptr<DecodedParam> param) { 141020a203aSopenharmony_ci std::vector<double> dVec; 142020a203aSopenharmony_ci if (param->AsDoubleVec(dVec)) { 143020a203aSopenharmony_ci this->AppendValue(ss, param->GetKey(), dVec); 144020a203aSopenharmony_ci } 145020a203aSopenharmony_ci } 146020a203aSopenharmony_ci }, 147020a203aSopenharmony_ci {DataCodedType::DSTRING_ARRAY, [this, &ss](std::shared_ptr<DecodedParam> param) { 148020a203aSopenharmony_ci std::vector<std::string> strVec; 149020a203aSopenharmony_ci if (param->AsStringVec(strVec)) { 150020a203aSopenharmony_ci this->AppendValue(ss, param->GetKey(), strVec); 151020a203aSopenharmony_ci } 152020a203aSopenharmony_ci } 153020a203aSopenharmony_ci } 154020a203aSopenharmony_ci }; 155020a203aSopenharmony_ci auto iter = allFuncs.find(param->GetDataCodedType()); 156020a203aSopenharmony_ci if (iter == allFuncs.end()) { 157020a203aSopenharmony_ci return; 158020a203aSopenharmony_ci } 159020a203aSopenharmony_ci iter->second(param); 160020a203aSopenharmony_ci} 161020a203aSopenharmony_ci 162020a203aSopenharmony_civoid DecodedEvent::AppendCustomizedParam(std::stringstream& ss, std::shared_ptr<DecodedParam> param) 163020a203aSopenharmony_ci{ 164020a203aSopenharmony_ci std::unordered_map<DataCodedType, std::function<void(std::shared_ptr<DecodedParam>)>> allFuncs = { 165020a203aSopenharmony_ci {DataCodedType::UNSIGNED_VARINT, [this, &ss](std::shared_ptr<DecodedParam> param) { 166020a203aSopenharmony_ci uint64_t uint64DecodedVal; 167020a203aSopenharmony_ci if (param->AsUint64(uint64DecodedVal)) { 168020a203aSopenharmony_ci this->AppendValue(ss, param->GetKey(), uint64DecodedVal); 169020a203aSopenharmony_ci } 170020a203aSopenharmony_ci } 171020a203aSopenharmony_ci }, 172020a203aSopenharmony_ci {DataCodedType::SIGNED_VARINT, [this, &ss](std::shared_ptr<DecodedParam> param) { 173020a203aSopenharmony_ci int64_t int64DecodedVal; 174020a203aSopenharmony_ci if (param->AsInt64(int64DecodedVal)) { 175020a203aSopenharmony_ci this->AppendValue(ss, param->GetKey(), int64DecodedVal); 176020a203aSopenharmony_ci } 177020a203aSopenharmony_ci } 178020a203aSopenharmony_ci }, 179020a203aSopenharmony_ci {DataCodedType::FLOATING, [this, &ss](std::shared_ptr<DecodedParam> param) { 180020a203aSopenharmony_ci double dDecodedVal; 181020a203aSopenharmony_ci if (param->AsDouble(dDecodedVal)) { 182020a203aSopenharmony_ci this->AppendValue(ss, param->GetKey(), dDecodedVal); 183020a203aSopenharmony_ci } 184020a203aSopenharmony_ci } 185020a203aSopenharmony_ci }, 186020a203aSopenharmony_ci {DataCodedType::DSTRING, [this, &ss](std::shared_ptr<DecodedParam> param) { 187020a203aSopenharmony_ci std::string strDecodedVal; 188020a203aSopenharmony_ci if (param->AsString(strDecodedVal)) { 189020a203aSopenharmony_ci this->AppendValue(ss, param->GetKey(), strDecodedVal); 190020a203aSopenharmony_ci } 191020a203aSopenharmony_ci } 192020a203aSopenharmony_ci } 193020a203aSopenharmony_ci }; 194020a203aSopenharmony_ci auto iter = allFuncs.find(param->GetDataCodedType()); 195020a203aSopenharmony_ci if (iter == allFuncs.end()) { 196020a203aSopenharmony_ci return; 197020a203aSopenharmony_ci } 198020a203aSopenharmony_ci iter->second(param); 199020a203aSopenharmony_ci} 200020a203aSopenharmony_ci 201020a203aSopenharmony_civoid DecodedEvent::AppendCustomizedParams(std::stringstream& ss) 202020a203aSopenharmony_ci{ 203020a203aSopenharmony_ci for (auto param: allParams_) { 204020a203aSopenharmony_ci if (param == nullptr) { 205020a203aSopenharmony_ci continue; 206020a203aSopenharmony_ci } 207020a203aSopenharmony_ci std::vector<DataCodedType> noArrayEncodedTypes = { 208020a203aSopenharmony_ci DataCodedType::UNSIGNED_VARINT, 209020a203aSopenharmony_ci DataCodedType::SIGNED_VARINT, 210020a203aSopenharmony_ci DataCodedType::FLOATING, 211020a203aSopenharmony_ci DataCodedType::DSTRING, 212020a203aSopenharmony_ci }; 213020a203aSopenharmony_ci if (find(noArrayEncodedTypes.begin(), noArrayEncodedTypes.end(), param->GetDataCodedType()) != 214020a203aSopenharmony_ci noArrayEncodedTypes.end()) { 215020a203aSopenharmony_ci AppendCustomizedParam(ss, param); 216020a203aSopenharmony_ci continue; 217020a203aSopenharmony_ci } 218020a203aSopenharmony_ci AppendCustomizedArrayParam(ss, param); 219020a203aSopenharmony_ci } 220020a203aSopenharmony_ci} 221020a203aSopenharmony_ci 222020a203aSopenharmony_cistd::string DecodedEvent::AsJsonStr() 223020a203aSopenharmony_ci{ 224020a203aSopenharmony_ci std::stringstream jsonStream; 225020a203aSopenharmony_ci jsonStream << "{"; 226020a203aSopenharmony_ci AppendBaseInfo(jsonStream); 227020a203aSopenharmony_ci AppendCustomizedParams(jsonStream); 228020a203aSopenharmony_ci if (jsonStream.tellp() != 0) { 229020a203aSopenharmony_ci jsonStream.seekp(-1, std::ios_base::end); 230020a203aSopenharmony_ci } 231020a203aSopenharmony_ci jsonStream << "}"; 232020a203aSopenharmony_ci return jsonStream.str(); 233020a203aSopenharmony_ci} 234020a203aSopenharmony_ci 235020a203aSopenharmony_cistd::shared_ptr<RawData> DecodedEvent::GetRawData() 236020a203aSopenharmony_ci{ 237020a203aSopenharmony_ci return std::make_shared<RawData>(rawData_, pos_); 238020a203aSopenharmony_ci} 239020a203aSopenharmony_ci 240020a203aSopenharmony_cibool DecodedEvent::IsValid() 241020a203aSopenharmony_ci{ 242020a203aSopenharmony_ci return isValid_; 243020a203aSopenharmony_ci} 244020a203aSopenharmony_ci 245020a203aSopenharmony_ciconst struct HiSysEventHeader& DecodedEvent::GetHeader() 246020a203aSopenharmony_ci{ 247020a203aSopenharmony_ci return header_; 248020a203aSopenharmony_ci} 249020a203aSopenharmony_ci 250020a203aSopenharmony_ciconst struct TraceInfo& DecodedEvent::GetTraceInfo() 251020a203aSopenharmony_ci{ 252020a203aSopenharmony_ci return traceInfo_; 253020a203aSopenharmony_ci} 254020a203aSopenharmony_ci 255020a203aSopenharmony_ciconst std::vector<std::shared_ptr<DecodedParam>>& DecodedEvent::GetAllCustomizedValues() 256020a203aSopenharmony_ci{ 257020a203aSopenharmony_ci return allParams_; 258020a203aSopenharmony_ci} 259020a203aSopenharmony_ci 260020a203aSopenharmony_civoid DecodedEvent::Parse() 261020a203aSopenharmony_ci{ 262020a203aSopenharmony_ci isValid_ = true; 263020a203aSopenharmony_ci if (rawData_ == nullptr) { 264020a203aSopenharmony_ci isValid_ = false; 265020a203aSopenharmony_ci return; 266020a203aSopenharmony_ci } 267020a203aSopenharmony_ci pos_ = 0; // reset to 0 268020a203aSopenharmony_ci // decode block size 269020a203aSopenharmony_ci size_t blockSize = static_cast<size_t>(*(reinterpret_cast<int32_t*>(rawData_))); 270020a203aSopenharmony_ci pos_ += sizeof(int32_t); 271020a203aSopenharmony_ci ParseHeader(blockSize); 272020a203aSopenharmony_ci ParseCustomizedParams(blockSize); 273020a203aSopenharmony_ci} 274020a203aSopenharmony_ci 275020a203aSopenharmony_civoid DecodedEvent::ParseHeader(const size_t maxLen) 276020a203aSopenharmony_ci{ 277020a203aSopenharmony_ci // decode event header 278020a203aSopenharmony_ci if ((pos_ + sizeof(struct HiSysEventHeader)) > maxLen) { 279020a203aSopenharmony_ci isValid_ = false; 280020a203aSopenharmony_ci return; 281020a203aSopenharmony_ci } 282020a203aSopenharmony_ci header_ = *(reinterpret_cast<struct HiSysEventHeader*>(rawData_ + pos_)); 283020a203aSopenharmony_ci pos_ += sizeof(struct HiSysEventHeader); 284020a203aSopenharmony_ci // decode trace info 285020a203aSopenharmony_ci if (header_.isTraceOpened == 1) { // 1: include trace info, 0: exclude trace info 286020a203aSopenharmony_ci if (((pos_ + sizeof(struct TraceInfo)) > maxLen)) { 287020a203aSopenharmony_ci isValid_ = false; 288020a203aSopenharmony_ci return; 289020a203aSopenharmony_ci } 290020a203aSopenharmony_ci traceInfo_ = *(reinterpret_cast<struct TraceInfo*>(rawData_ + pos_)); 291020a203aSopenharmony_ci pos_ += sizeof(struct TraceInfo); 292020a203aSopenharmony_ci } 293020a203aSopenharmony_ci} 294020a203aSopenharmony_ci 295020a203aSopenharmony_civoid DecodedEvent::ParseCustomizedParams(const size_t maxLen) 296020a203aSopenharmony_ci{ 297020a203aSopenharmony_ci if ((pos_ + sizeof(int32_t)) > maxLen) { 298020a203aSopenharmony_ci isValid_ = false; 299020a203aSopenharmony_ci return; 300020a203aSopenharmony_ci } 301020a203aSopenharmony_ci auto paramCnt = static_cast<size_t>(*(reinterpret_cast<int32_t*>(rawData_ + pos_))); 302020a203aSopenharmony_ci if (paramCnt > MAX_PARAM_CNT) { 303020a203aSopenharmony_ci HIVIEW_LOGW("invalid param cnt=%{public}zu.", paramCnt); 304020a203aSopenharmony_ci isValid_ = false; 305020a203aSopenharmony_ci return; 306020a203aSopenharmony_ci } 307020a203aSopenharmony_ci pos_ += sizeof(int32_t); 308020a203aSopenharmony_ci while (paramCnt > 0) { 309020a203aSopenharmony_ci auto decodedParam = ParseCustomizedParam(maxLen); 310020a203aSopenharmony_ci if (decodedParam == nullptr || !(decodedParam->DecodeValue())) { 311020a203aSopenharmony_ci HIVIEW_LOGE("Value of customized parameter is decoded failed."); 312020a203aSopenharmony_ci isValid_ = false; 313020a203aSopenharmony_ci return; 314020a203aSopenharmony_ci } 315020a203aSopenharmony_ci pos_ = decodedParam->GetPosition(); 316020a203aSopenharmony_ci allParams_.emplace_back(decodedParam); 317020a203aSopenharmony_ci --paramCnt; 318020a203aSopenharmony_ci } 319020a203aSopenharmony_ci} 320020a203aSopenharmony_ci 321020a203aSopenharmony_cistd::shared_ptr<DecodedParam> DecodedEvent::CreateFloatingNumTypeDecodedParam(const size_t maxLen, 322020a203aSopenharmony_ci const std::string& key, bool isArray) 323020a203aSopenharmony_ci{ 324020a203aSopenharmony_ci if (isArray) { 325020a203aSopenharmony_ci return std::make_shared<FloatingNumberDecodedArrayParam>(rawData_, maxLen, pos_, key); 326020a203aSopenharmony_ci } 327020a203aSopenharmony_ci return std::make_shared<FloatingNumberDecodedParam>(rawData_, maxLen, pos_, key); 328020a203aSopenharmony_ci} 329020a203aSopenharmony_ci 330020a203aSopenharmony_cistd::shared_ptr<DecodedParam> DecodedEvent::CreateSignedVarintTypeDecodedParam(const size_t maxLen, 331020a203aSopenharmony_ci const std::string& key, bool isArray) 332020a203aSopenharmony_ci{ 333020a203aSopenharmony_ci if (isArray) { 334020a203aSopenharmony_ci return std::make_shared<SignedVarintDecodedArrayParam>(rawData_, maxLen, pos_, key); 335020a203aSopenharmony_ci } 336020a203aSopenharmony_ci return std::make_shared<SignedVarintDecodedParam>(rawData_, maxLen, pos_, key); 337020a203aSopenharmony_ci} 338020a203aSopenharmony_ci 339020a203aSopenharmony_cistd::shared_ptr<DecodedParam> DecodedEvent::CreateStringTypeDecodedParam(const size_t maxLen, 340020a203aSopenharmony_ci const std::string& key, bool isArray) 341020a203aSopenharmony_ci{ 342020a203aSopenharmony_ci if (isArray) { 343020a203aSopenharmony_ci return std::make_shared<StringDecodedArrayParam>(rawData_, maxLen, pos_, key); 344020a203aSopenharmony_ci } 345020a203aSopenharmony_ci return std::make_shared<StringDecodedParam>(rawData_, maxLen, pos_, key); 346020a203aSopenharmony_ci} 347020a203aSopenharmony_ci 348020a203aSopenharmony_cistd::shared_ptr<DecodedParam> DecodedEvent::CreateUnsignedVarintTypeDecodedParam(const size_t maxLen, 349020a203aSopenharmony_ci const std::string& key, bool isArray) 350020a203aSopenharmony_ci{ 351020a203aSopenharmony_ci if (isArray) { 352020a203aSopenharmony_ci return std::make_shared<UnsignedVarintDecodedArrayParam>(rawData_, maxLen, pos_, key); 353020a203aSopenharmony_ci } 354020a203aSopenharmony_ci return std::make_shared<UnsignedVarintDecodedParam>(rawData_, maxLen, pos_, key); 355020a203aSopenharmony_ci} 356020a203aSopenharmony_ci 357020a203aSopenharmony_cistd::shared_ptr<DecodedParam> DecodedEvent::ParseCustomizedParam(const size_t maxLen) 358020a203aSopenharmony_ci{ 359020a203aSopenharmony_ci std::string key; 360020a203aSopenharmony_ci if (!RawDataDecoder::StringValueDecoded(rawData_, maxLen, pos_, key)) { 361020a203aSopenharmony_ci isValid_ = false; 362020a203aSopenharmony_ci return nullptr; 363020a203aSopenharmony_ci } 364020a203aSopenharmony_ci struct ParamValueType valueType { 365020a203aSopenharmony_ci .isArray = 0, 366020a203aSopenharmony_ci .valueType = static_cast<uint8_t>(ValueType::UNKNOWN), 367020a203aSopenharmony_ci .valueByteCnt = 0, 368020a203aSopenharmony_ci }; 369020a203aSopenharmony_ci if (!RawDataDecoder::ValueTypeDecoded(rawData_, maxLen, pos_, valueType)) { 370020a203aSopenharmony_ci isValid_ = false; 371020a203aSopenharmony_ci return nullptr; 372020a203aSopenharmony_ci } 373020a203aSopenharmony_ci std::shared_ptr<DecodedParam> ret = nullptr; 374020a203aSopenharmony_ci switch (ValueType(valueType.valueType)) { 375020a203aSopenharmony_ci case ValueType::STRING: { 376020a203aSopenharmony_ci ret = CreateStringTypeDecodedParam(maxLen, key, valueType.isArray == 1); 377020a203aSopenharmony_ci break; 378020a203aSopenharmony_ci } 379020a203aSopenharmony_ci case ValueType::FLOAT: 380020a203aSopenharmony_ci case ValueType::DOUBLE: { 381020a203aSopenharmony_ci ret = CreateFloatingNumTypeDecodedParam(maxLen, key, valueType.isArray == 1); 382020a203aSopenharmony_ci break; 383020a203aSopenharmony_ci } 384020a203aSopenharmony_ci case ValueType::UINT8: 385020a203aSopenharmony_ci case ValueType::UINT16: 386020a203aSopenharmony_ci case ValueType::UINT32: 387020a203aSopenharmony_ci case ValueType::UINT64: { 388020a203aSopenharmony_ci ret = CreateUnsignedVarintTypeDecodedParam(maxLen, key, valueType.isArray == 1); 389020a203aSopenharmony_ci break; 390020a203aSopenharmony_ci } 391020a203aSopenharmony_ci case ValueType::BOOL: 392020a203aSopenharmony_ci case ValueType::INT8: 393020a203aSopenharmony_ci case ValueType::INT16: 394020a203aSopenharmony_ci case ValueType::INT32: 395020a203aSopenharmony_ci case ValueType::INT64: { 396020a203aSopenharmony_ci ret = CreateSignedVarintTypeDecodedParam(maxLen, key, valueType.isArray == 1); 397020a203aSopenharmony_ci break; 398020a203aSopenharmony_ci } 399020a203aSopenharmony_ci default: 400020a203aSopenharmony_ci break; 401020a203aSopenharmony_ci } 402020a203aSopenharmony_ci return ret; 403020a203aSopenharmony_ci} 404020a203aSopenharmony_ci} // namespace EventRaw 405020a203aSopenharmony_ci} // namespace HiviewDFX 406020a203aSopenharmony_ci} // namespace OHOS