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