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}