17405867cSopenharmony_ci/*
27405867cSopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
37405867cSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
47405867cSopenharmony_ci * you may not use this file except in compliance with the License.
57405867cSopenharmony_ci * You may obtain a copy of the License at
67405867cSopenharmony_ci *
77405867cSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
87405867cSopenharmony_ci *
97405867cSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
107405867cSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
117405867cSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
127405867cSopenharmony_ci * See the License for the specific language governing permissions and
137405867cSopenharmony_ci * limitations under the License.
147405867cSopenharmony_ci */
157405867cSopenharmony_ci
167405867cSopenharmony_ci#include "hiappevent_c.h"
177405867cSopenharmony_ci
187405867cSopenharmony_ci#include <memory>
197405867cSopenharmony_ci#include <vector>
207405867cSopenharmony_ci
217405867cSopenharmony_ci#include "ffrt.h"
227405867cSopenharmony_ci#include "hiappevent_base.h"
237405867cSopenharmony_ci#include "hiappevent_clean.h"
247405867cSopenharmony_ci#include "hiappevent_config.h"
257405867cSopenharmony_ci#include "hiappevent_verify.h"
267405867cSopenharmony_ci#include "hiappevent_write.h"
277405867cSopenharmony_ci#include "hilog/log.h"
287405867cSopenharmony_ci
297405867cSopenharmony_ci#undef LOG_DOMAIN
307405867cSopenharmony_ci#define LOG_DOMAIN 0xD002D07
317405867cSopenharmony_ci
327405867cSopenharmony_ci#undef LOG_TAG
337405867cSopenharmony_ci#define LOG_TAG "AppEventC"
347405867cSopenharmony_ci
357405867cSopenharmony_ciusing namespace OHOS::HiviewDFX;
367405867cSopenharmony_ci
377405867cSopenharmony_cinamespace {
387405867cSopenharmony_ciconstexpr int MAX_SIZE_OF_LIST_PARAM = 100;
397405867cSopenharmony_ci
407405867cSopenharmony_citemplate<typename T>
417405867cSopenharmony_civoid AddArrayParam(std::shared_ptr<AppEventPack>& appEventPack, const char* name, const T* arr, int len)
427405867cSopenharmony_ci{
437405867cSopenharmony_ci    std::vector<T> params(arr, (len > MAX_SIZE_OF_LIST_PARAM) ? (arr + MAX_SIZE_OF_LIST_PARAM + 1) : (arr + len));
447405867cSopenharmony_ci    appEventPack->AddParam(name, params);
457405867cSopenharmony_ci}
467405867cSopenharmony_ci
477405867cSopenharmony_ciusing ParamAdder = void (*)(std::shared_ptr<AppEventPack>& appEventPack, const char* name, const ParamValue* value);
487405867cSopenharmony_ci
497405867cSopenharmony_civoid AddBoolParamValue(std::shared_ptr<AppEventPack>& appEventPack, const char* name, const ParamValue* value)
507405867cSopenharmony_ci{
517405867cSopenharmony_ci    appEventPack->AddParam(name, value->value.bool_v);
527405867cSopenharmony_ci}
537405867cSopenharmony_ci
547405867cSopenharmony_civoid AddBoolArrayParamValue(std::shared_ptr<AppEventPack>& appEventPack, const char* name, const ParamValue* value)
557405867cSopenharmony_ci{
567405867cSopenharmony_ci    AddArrayParam(appEventPack, name, value->value.bool_arr_v, value->arrSize);
577405867cSopenharmony_ci}
587405867cSopenharmony_ci
597405867cSopenharmony_civoid AddInt8ParamValue(std::shared_ptr<AppEventPack>& appEventPack, const char* name, const ParamValue* value)
607405867cSopenharmony_ci{
617405867cSopenharmony_ci    appEventPack->AddParam(name, value->value.int8_v);
627405867cSopenharmony_ci}
637405867cSopenharmony_ci
647405867cSopenharmony_civoid AddInt8ArrayParamValue(std::shared_ptr<AppEventPack>& appEventPack, const char* name, const ParamValue* value)
657405867cSopenharmony_ci{
667405867cSopenharmony_ci    AddArrayParam(appEventPack, name, value->value.int8_arr_v, value->arrSize);
677405867cSopenharmony_ci}
687405867cSopenharmony_ci
697405867cSopenharmony_civoid AddInt16ParamValue(std::shared_ptr<AppEventPack>& appEventPack, const char* name, const ParamValue* value)
707405867cSopenharmony_ci{
717405867cSopenharmony_ci    appEventPack->AddParam(name, value->value.int16_v);
727405867cSopenharmony_ci}
737405867cSopenharmony_ci
747405867cSopenharmony_civoid AddInt16ArrayParamValue(std::shared_ptr<AppEventPack>& appEventPack, const char* name, const ParamValue* value)
757405867cSopenharmony_ci{
767405867cSopenharmony_ci    AddArrayParam(appEventPack, name, value->value.int16_arr_v, value->arrSize);
777405867cSopenharmony_ci}
787405867cSopenharmony_ci
797405867cSopenharmony_civoid AddInt32ParamValue(std::shared_ptr<AppEventPack>& appEventPack, const char* name, const ParamValue* value)
807405867cSopenharmony_ci{
817405867cSopenharmony_ci    appEventPack->AddParam(name, value->value.int32_v);
827405867cSopenharmony_ci}
837405867cSopenharmony_ci
847405867cSopenharmony_civoid AddInt32ArrayParamValue(std::shared_ptr<AppEventPack>& appEventPack, const char* name, const ParamValue* value)
857405867cSopenharmony_ci{
867405867cSopenharmony_ci    AddArrayParam(appEventPack, name, value->value.int32_arr_v, value->arrSize);
877405867cSopenharmony_ci}
887405867cSopenharmony_ci
897405867cSopenharmony_civoid AddInt64ParamValue(std::shared_ptr<AppEventPack>& appEventPack, const char* name, const ParamValue* value)
907405867cSopenharmony_ci{
917405867cSopenharmony_ci    appEventPack->AddParam(name, value->value.int64_v);
927405867cSopenharmony_ci}
937405867cSopenharmony_ci
947405867cSopenharmony_civoid AddInt64ArrayParamValue(std::shared_ptr<AppEventPack>& appEventPack, const char* name, const ParamValue* value)
957405867cSopenharmony_ci{
967405867cSopenharmony_ci    AddArrayParam(appEventPack, name, value->value.int64_arr_v, value->arrSize);
977405867cSopenharmony_ci}
987405867cSopenharmony_ci
997405867cSopenharmony_civoid AddFloatParamValue(std::shared_ptr<AppEventPack>& appEventPack, const char* name, const ParamValue* value)
1007405867cSopenharmony_ci{
1017405867cSopenharmony_ci    appEventPack->AddParam(name, value->value.float_v);
1027405867cSopenharmony_ci}
1037405867cSopenharmony_ci
1047405867cSopenharmony_civoid AddFloatArrayParamValue(std::shared_ptr<AppEventPack>& appEventPack, const char* name, const ParamValue* value)
1057405867cSopenharmony_ci{
1067405867cSopenharmony_ci    AddArrayParam(appEventPack, name, value->value.float_arr_v, value->arrSize);
1077405867cSopenharmony_ci}
1087405867cSopenharmony_ci
1097405867cSopenharmony_civoid AddDoubleParamValue(std::shared_ptr<AppEventPack>& appEventPack, const char* name, const ParamValue* value)
1107405867cSopenharmony_ci{
1117405867cSopenharmony_ci    appEventPack->AddParam(name, value->value.double_v);
1127405867cSopenharmony_ci}
1137405867cSopenharmony_ci
1147405867cSopenharmony_civoid AddDoubleArrayParamValue(std::shared_ptr<AppEventPack>& appEventPack, const char* name, const ParamValue* value)
1157405867cSopenharmony_ci{
1167405867cSopenharmony_ci    AddArrayParam(appEventPack, name, value->value.double_arr_v, value->arrSize);
1177405867cSopenharmony_ci}
1187405867cSopenharmony_ci
1197405867cSopenharmony_civoid AddStringParamValue(std::shared_ptr<AppEventPack>& appEventPack, const char* name, const ParamValue* value)
1207405867cSopenharmony_ci{
1217405867cSopenharmony_ci    appEventPack->AddParam(name, value->value.str_v);
1227405867cSopenharmony_ci}
1237405867cSopenharmony_ci
1247405867cSopenharmony_civoid AddStringArrayParamValue(std::shared_ptr<AppEventPack>& appEventPack, const char* name, const ParamValue* value)
1257405867cSopenharmony_ci{
1267405867cSopenharmony_ci    AddArrayParam(appEventPack, name, value->value.str_arr_v, value->arrSize);
1277405867cSopenharmony_ci}
1287405867cSopenharmony_ci
1297405867cSopenharmony_ciconst ParamAdder PARAM_ADDERS[] = {
1307405867cSopenharmony_ci    &AddBoolParamValue,
1317405867cSopenharmony_ci    &AddBoolArrayParamValue,
1327405867cSopenharmony_ci    &AddInt8ParamValue,
1337405867cSopenharmony_ci    &AddInt8ArrayParamValue,
1347405867cSopenharmony_ci    &AddInt16ParamValue,
1357405867cSopenharmony_ci    &AddInt16ArrayParamValue,
1367405867cSopenharmony_ci    &AddInt32ParamValue,
1377405867cSopenharmony_ci    &AddInt32ArrayParamValue,
1387405867cSopenharmony_ci    &AddInt64ParamValue,
1397405867cSopenharmony_ci    &AddInt64ArrayParamValue,
1407405867cSopenharmony_ci    &AddFloatParamValue,
1417405867cSopenharmony_ci    &AddFloatArrayParamValue,
1427405867cSopenharmony_ci    &AddDoubleParamValue,
1437405867cSopenharmony_ci    &AddDoubleArrayParamValue,
1447405867cSopenharmony_ci    &AddStringParamValue,
1457405867cSopenharmony_ci    &AddStringArrayParamValue
1467405867cSopenharmony_ci};
1477405867cSopenharmony_ci
1487405867cSopenharmony_civoid AddParamValue(std::shared_ptr<AppEventPack>& appEventPack, const char* name, const ParamValue* value)
1497405867cSopenharmony_ci{
1507405867cSopenharmony_ci    if (name == nullptr || value == nullptr) {
1517405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "Failed to add the param because the name or value is null.");
1527405867cSopenharmony_ci        return;
1537405867cSopenharmony_ci    }
1547405867cSopenharmony_ci    unsigned int paramType = value->type;
1557405867cSopenharmony_ci    if (paramType < (sizeof(PARAM_ADDERS) / sizeof(PARAM_ADDERS[0]))) {
1567405867cSopenharmony_ci        PARAM_ADDERS[paramType](appEventPack, name, value);
1577405867cSopenharmony_ci    } else {
1587405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "Failed to add the param because the param type is unknown.");
1597405867cSopenharmony_ci    }
1607405867cSopenharmony_ci}
1617405867cSopenharmony_ci
1627405867cSopenharmony_civoid AddParamEntry(std::shared_ptr<AppEventPack>& appEventPack, const ParamEntry* entry)
1637405867cSopenharmony_ci{
1647405867cSopenharmony_ci    if (entry == nullptr) {
1657405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "Failed to add the param because the entry is null.");
1667405867cSopenharmony_ci        return;
1677405867cSopenharmony_ci    }
1687405867cSopenharmony_ci    AddParamValue(appEventPack, entry->name, entry->value);
1697405867cSopenharmony_ci}
1707405867cSopenharmony_ci
1717405867cSopenharmony_civoid AddParamList(std::shared_ptr<AppEventPack>& appEventPack, const ParamList list)
1727405867cSopenharmony_ci{
1737405867cSopenharmony_ci    ParamList curNode = list;
1747405867cSopenharmony_ci    while (curNode != nullptr) {
1757405867cSopenharmony_ci        AddParamEntry(appEventPack, curNode->entry);
1767405867cSopenharmony_ci        curNode = curNode->next;
1777405867cSopenharmony_ci    }
1787405867cSopenharmony_ci}
1797405867cSopenharmony_ci}
1807405867cSopenharmony_ci
1817405867cSopenharmony_cibool HiAppEventInnerConfigure(const char* name, const char* value)
1827405867cSopenharmony_ci{
1837405867cSopenharmony_ci    if (name == nullptr || value == nullptr) {
1847405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "Failed to configure, because the input params contain a null pointer.");
1857405867cSopenharmony_ci        return false;
1867405867cSopenharmony_ci    }
1877405867cSopenharmony_ci    return HiAppEventConfig::GetInstance().SetConfigurationItem(name, value);
1887405867cSopenharmony_ci}
1897405867cSopenharmony_ci
1907405867cSopenharmony_ciint HiAppEventInnerWrite(const char* domain, const char* name, EventType type, const ParamList list)
1917405867cSopenharmony_ci{
1927405867cSopenharmony_ci    if (domain == nullptr) {
1937405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "Failed to write event, domain is null");
1947405867cSopenharmony_ci        return ErrorCode::ERROR_INVALID_EVENT_DOMAIN;
1957405867cSopenharmony_ci    }
1967405867cSopenharmony_ci    if (name == nullptr) {
1977405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "Failed to write event, name is null");
1987405867cSopenharmony_ci        return ErrorCode::ERROR_INVALID_EVENT_NAME;
1997405867cSopenharmony_ci    }
2007405867cSopenharmony_ci
2017405867cSopenharmony_ci    std::shared_ptr<AppEventPack> appEventPack = std::make_shared<AppEventPack>(domain, name, type);
2027405867cSopenharmony_ci    AddParamList(appEventPack, list);
2037405867cSopenharmony_ci    int res = VerifyAppEvent(appEventPack);
2047405867cSopenharmony_ci    if (res >= 0) {
2057405867cSopenharmony_ci        ffrt::submit([appEventPack]() {
2067405867cSopenharmony_ci            WriteEvent(appEventPack);
2077405867cSopenharmony_ci            }, {}, {}, ffrt::task_attr().name("app_inner_event"));
2087405867cSopenharmony_ci    }
2097405867cSopenharmony_ci    return res;
2107405867cSopenharmony_ci}
2117405867cSopenharmony_ci
2127405867cSopenharmony_civoid ClearData()
2137405867cSopenharmony_ci{
2147405867cSopenharmony_ci    HiAppEventClean::ClearData(HiAppEventConfig::GetInstance().GetStorageDir());
2157405867cSopenharmony_ci}