17405867cSopenharmony_ci/*
27405867cSopenharmony_ci * Copyright (c) 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 <regex>
177405867cSopenharmony_ci#include <string>
187405867cSopenharmony_ci#include <unordered_set>
197405867cSopenharmony_ci#include <vector>
207405867cSopenharmony_ci
217405867cSopenharmony_ci#include "appevent_watcher_impl.h"
227405867cSopenharmony_ci#include "cj_ffi/cj_common_ffi.h"
237405867cSopenharmony_ci#include "ffi_remote_data.h"
247405867cSopenharmony_ci#include "hiappevent_ffi.h"
257405867cSopenharmony_ci#include "hiappevent_impl.h"
267405867cSopenharmony_ci#include "hiappevent_verify.h"
277405867cSopenharmony_ci#include "log.h"
287405867cSopenharmony_ci#include "error.h"
297405867cSopenharmony_ciusing namespace OHOS::HiviewDFX;
307405867cSopenharmony_ciusing namespace OHOS::CJSystemapi::HiAppEvent;
317405867cSopenharmony_ci
327405867cSopenharmony_cinamespace {
337405867cSopenharmony_ciconstexpr int ERR_CODE_PARAM_FORMAT = -1;
347405867cSopenharmony_ciconstexpr int ERR_CODE_PARAM_INVALID = -2;
357405867cSopenharmony_ciconst int8_t INT32_VALUE = 0;
367405867cSopenharmony_ciconst int8_t DOUBLE_VALUE = 1;
377405867cSopenharmony_ciconst int8_t STRING_VALUE = 2;
387405867cSopenharmony_ciconst int8_t BOOL_VALUE = 3;
397405867cSopenharmony_ciconst int8_t INT32_ARRAY_VALUE = 4;
407405867cSopenharmony_ciconst int8_t DOUBLE_ARRAY_VALUE = 5;
417405867cSopenharmony_ciconst int8_t STRING_ARRAY_VALUE = 6;
427405867cSopenharmony_ciconst int8_t BOOL_ARRAY_VALUE = 7;
437405867cSopenharmony_ciconstexpr int BIT_MASK = 1;
447405867cSopenharmony_ciconstexpr unsigned int BIT_ALL_TYPES = 0xff;
457405867cSopenharmony_ci
467405867cSopenharmony_ciint CheckCondition(TriggerCondition &cond, CTriggerCondition triggerCondition)
477405867cSopenharmony_ci{
487405867cSopenharmony_ci    int ret = ERR_PARAM;
497405867cSopenharmony_ci    cond.row = triggerCondition.row;
507405867cSopenharmony_ci    if (cond.row < 0) {
517405867cSopenharmony_ci        ret = ERR_INVALID_COND_ROW;
527405867cSopenharmony_ci        return ret;
537405867cSopenharmony_ci    }
547405867cSopenharmony_ci    cond.size = triggerCondition.size;
557405867cSopenharmony_ci    if (cond.size < 0) {
567405867cSopenharmony_ci        ret = ERR_INVALID_COND_SIZE;
577405867cSopenharmony_ci        return ret;
587405867cSopenharmony_ci    }
597405867cSopenharmony_ci    if (triggerCondition.timeOut * HiAppEvent::TIMEOUT_STEP < 0) {
607405867cSopenharmony_ci        ret = ERR_INVALID_COND_TIMEOUT;
617405867cSopenharmony_ci        return ret;
627405867cSopenharmony_ci    }
637405867cSopenharmony_ci    cond.timeout = triggerCondition.timeOut * HiAppEvent::TIMEOUT_STEP;
647405867cSopenharmony_ci    return ret;
657405867cSopenharmony_ci}
667405867cSopenharmony_ci
677405867cSopenharmony_civoid CharPtrToVector(char** charPtr, int size, std::vector<std::string> &result)
687405867cSopenharmony_ci{
697405867cSopenharmony_ci    for (int i = 0; i < size; i++) {
707405867cSopenharmony_ci        result.push_back(std::string(charPtr[i]));
717405867cSopenharmony_ci    }
727405867cSopenharmony_ci}
737405867cSopenharmony_ci
747405867cSopenharmony_cistd::unordered_set<std::string> genArrString2Set(const CArrString& str)
757405867cSopenharmony_ci{
767405867cSopenharmony_ci    std::vector<std::string> strVec;
777405867cSopenharmony_ci    CharPtrToVector(str.head, str.size, strVec);
787405867cSopenharmony_ci    std::unordered_set<std::string> res(strVec.begin(), strVec.end());
797405867cSopenharmony_ci    return res;
807405867cSopenharmony_ci}
817405867cSopenharmony_ci
827405867cSopenharmony_ciint ConvertConfigReportProp(const CAppEventReportConfig& config, EventConfig reportConf)
837405867cSopenharmony_ci{
847405867cSopenharmony_ci    if (config.domain != nullptr) {
857405867cSopenharmony_ci        reportConf.domain = config.domain;
867405867cSopenharmony_ci    }
877405867cSopenharmony_ci    if (config.name != nullptr) {
887405867cSopenharmony_ci        reportConf.name = config.name;
897405867cSopenharmony_ci    }
907405867cSopenharmony_ci    reportConf.isRealTime = config.isRealTime;
917405867cSopenharmony_ci    if (!IsValidEventConfig(reportConf)) {
927405867cSopenharmony_ci        return ERR_CODE_PARAM_INVALID;
937405867cSopenharmony_ci    }
947405867cSopenharmony_ci    return SUCCESS_CODE;
957405867cSopenharmony_ci}
967405867cSopenharmony_ci
977405867cSopenharmony_ciint ConvertReportConfig(const CProcessor& processor, ReportConfig& conf)
987405867cSopenharmony_ci{
997405867cSopenharmony_ci    if (processor.name != nullptr && IsValidProcessorName(std::string(processor.name))) {
1007405867cSopenharmony_ci        conf.name = processor.name;
1017405867cSopenharmony_ci    } else {
1027405867cSopenharmony_ci        return ERR_CODE_PARAM_FORMAT;
1037405867cSopenharmony_ci    }
1047405867cSopenharmony_ci    conf.debugMode = processor.debugMode;
1057405867cSopenharmony_ci    conf.routeInfo = processor.routeInfo;
1067405867cSopenharmony_ci    conf.appId = processor.appId;
1077405867cSopenharmony_ci    conf.triggerCond.onStartup = processor.onStartReport;
1087405867cSopenharmony_ci    conf.triggerCond.onBackground = processor.onBackgroundReport;
1097405867cSopenharmony_ci    if (!IsValidPeriodReport(processor.periodReport)) {
1107405867cSopenharmony_ci        conf.triggerCond.timeout = 0;
1117405867cSopenharmony_ci    } else {
1127405867cSopenharmony_ci        conf.triggerCond.timeout = processor.periodReport;
1137405867cSopenharmony_ci    }
1147405867cSopenharmony_ci    if (!IsValidBatchReport(processor.batchReport)) {
1157405867cSopenharmony_ci        conf.triggerCond.row = 0;
1167405867cSopenharmony_ci    } else {
1177405867cSopenharmony_ci        conf.triggerCond.row = processor.batchReport;
1187405867cSopenharmony_ci    }
1197405867cSopenharmony_ci    conf.userIdNames = genArrString2Set(processor.userIds);
1207405867cSopenharmony_ci    conf.userPropertyNames = genArrString2Set(processor.userProperties);
1217405867cSopenharmony_ci    std::vector<EventConfig> eventConfigs;
1227405867cSopenharmony_ci    CAppEventReportConfig* configPtr = processor.eventConfigs.head;
1237405867cSopenharmony_ci    for (int i = 0; i < processor.eventConfigs.size; i++) {
1247405867cSopenharmony_ci        EventConfig reportConf;
1257405867cSopenharmony_ci        int res =  ConvertConfigReportProp(configPtr[i], reportConf);
1267405867cSopenharmony_ci        if (res != 0) {
1277405867cSopenharmony_ci            return res;
1287405867cSopenharmony_ci        }
1297405867cSopenharmony_ci        eventConfigs.push_back(reportConf);
1307405867cSopenharmony_ci    }
1317405867cSopenharmony_ci    conf.eventConfigs = eventConfigs;
1327405867cSopenharmony_ci    return SUCCESS_CODE;
1337405867cSopenharmony_ci}
1347405867cSopenharmony_ci
1357405867cSopenharmony_civoid AddParams2EventPack(const CArrParameters& params, std::shared_ptr<AppEventPack> appEventPack_)
1367405867cSopenharmony_ci{
1377405867cSopenharmony_ci    for (int i = 0; i < params.size; i++) {
1387405867cSopenharmony_ci        auto head = params.head + i;
1397405867cSopenharmony_ci        switch (head->valueType) {
1407405867cSopenharmony_ci            case INT32_VALUE: // int32_t
1417405867cSopenharmony_ci                appEventPack_->AddParam(std::string(head->key), *(int32_t*)head->value);
1427405867cSopenharmony_ci                break;
1437405867cSopenharmony_ci            case DOUBLE_VALUE: // double
1447405867cSopenharmony_ci                appEventPack_->AddParam(std::string(head->key), *(double*)head->value);
1457405867cSopenharmony_ci                break;
1467405867cSopenharmony_ci            case STRING_VALUE: // std::string
1477405867cSopenharmony_ci                appEventPack_->AddParam(std::string(head->key), std::string((char*)head->value));
1487405867cSopenharmony_ci                break;
1497405867cSopenharmony_ci            case BOOL_VALUE: // bool
1507405867cSopenharmony_ci                appEventPack_->AddParam(std::string(head->key), *(bool*)head->value);
1517405867cSopenharmony_ci                break;
1527405867cSopenharmony_ci            case INT32_ARRAY_VALUE: { // int32_array
1537405867cSopenharmony_ci                int* intArr = (int*)head->value;
1547405867cSopenharmony_ci                std::vector<int> intVec(intArr, intArr + head->size);
1557405867cSopenharmony_ci                appEventPack_->AddParam(std::string(head->key), intVec);
1567405867cSopenharmony_ci                break;
1577405867cSopenharmony_ci            }
1587405867cSopenharmony_ci            case DOUBLE_ARRAY_VALUE: { // double_array
1597405867cSopenharmony_ci                double* doubleArr = (double*)head->value;
1607405867cSopenharmony_ci                std::vector<double> doubleVec(doubleArr, doubleArr + head->size);
1617405867cSopenharmony_ci                appEventPack_->AddParam(std::string(head->key), doubleVec);
1627405867cSopenharmony_ci                break;
1637405867cSopenharmony_ci            }
1647405867cSopenharmony_ci            case STRING_ARRAY_VALUE: { // string_array
1657405867cSopenharmony_ci                char** strPtr = (char**)head->value;
1667405867cSopenharmony_ci                std::vector<std::string> strVec;
1677405867cSopenharmony_ci                CharPtrToVector(strPtr, head->size, strVec);
1687405867cSopenharmony_ci                appEventPack_->AddParam(std::string(head->key), strVec);
1697405867cSopenharmony_ci                break;
1707405867cSopenharmony_ci            }
1717405867cSopenharmony_ci            case BOOL_ARRAY_VALUE: { // bool_array
1727405867cSopenharmony_ci                bool* boolArr = (bool*)head->value;
1737405867cSopenharmony_ci                std::vector<bool> boolVec(boolArr, boolArr + head->size);
1747405867cSopenharmony_ci                appEventPack_->AddParam(std::string(head->key), boolVec);
1757405867cSopenharmony_ci                break;
1767405867cSopenharmony_ci            }
1777405867cSopenharmony_ci            default:
1787405867cSopenharmony_ci                break;
1797405867cSopenharmony_ci        }
1807405867cSopenharmony_ci    }
1817405867cSopenharmony_ci}
1827405867cSopenharmony_ci}
1837405867cSopenharmony_ci
1847405867cSopenharmony_ciextern "C" {
1857405867cSopenharmony_ciint FfiOHOSHiAppEventConfigure(CConfigOption config)
1867405867cSopenharmony_ci{
1877405867cSopenharmony_ci    int code = HiAppEventImpl::Configure(config.disable, config.maxStorage);
1887405867cSopenharmony_ci    if (code != SUCCESS_CODE) {
1897405867cSopenharmony_ci        LOGE("FfiOHOSHiAppEventConfigure failed");
1907405867cSopenharmony_ci        return code;
1917405867cSopenharmony_ci    }
1927405867cSopenharmony_ci    return SUCCESS_CODE;
1937405867cSopenharmony_ci}
1947405867cSopenharmony_ci
1957405867cSopenharmony_ciint FfiOHOSHiAppEventWrite(CAppEventInfo info)
1967405867cSopenharmony_ci{
1977405867cSopenharmony_ci    auto appEventPack_ = std::make_shared<AppEventPack>(info.domain, info.name, info.event);
1987405867cSopenharmony_ci    AddParams2EventPack(info.cArrParamters, appEventPack_);
1997405867cSopenharmony_ci    int code = HiAppEventImpl::Write(appEventPack_);
2007405867cSopenharmony_ci    if (code != SUCCESS_CODE) {
2017405867cSopenharmony_ci        LOGE("HiAppEvent::FfiOHOSHiAppEventWrite failed");
2027405867cSopenharmony_ci        return GetErrorCode(code);
2037405867cSopenharmony_ci    }
2047405867cSopenharmony_ci    return code;
2057405867cSopenharmony_ci}
2067405867cSopenharmony_ci
2077405867cSopenharmony_ciRetDataBool FfiOHOSHiAppEventAddProcessor(CProcessor processor)
2087405867cSopenharmony_ci{
2097405867cSopenharmony_ci    RetDataBool ret = { .code = ErrorCode::ERROR_UNKNOWN, .data = false };
2107405867cSopenharmony_ci    ReportConfig conf;
2117405867cSopenharmony_ci    int res = ConvertReportConfig(processor, conf);
2127405867cSopenharmony_ci    if (res == ERR_CODE_PARAM_FORMAT) {
2137405867cSopenharmony_ci        LOGE("failed to add processor, params format error");
2147405867cSopenharmony_ci        ret.code = ERR_PARAM;
2157405867cSopenharmony_ci        ret.data = false;
2167405867cSopenharmony_ci        return ret;
2177405867cSopenharmony_ci    }
2187405867cSopenharmony_ci    if (HiAppEventImpl::Load(conf.name) != 0) {
2197405867cSopenharmony_ci        LOGE("failed to add processor=%{public}s, name no found", conf.name.c_str());
2207405867cSopenharmony_ci        return {ERR_CODE_PARAM_FORMAT, true};
2217405867cSopenharmony_ci    }
2227405867cSopenharmony_ci    int64_t processorId = HiAppEventImpl::AddProcessor(conf);
2237405867cSopenharmony_ci    if (processorId <= 0) {
2247405867cSopenharmony_ci        LOGE("HiAppEvent::FfiOHOSHiAppEventAddProcessor failed");
2257405867cSopenharmony_ci    }
2267405867cSopenharmony_ci    ret.code = processorId;
2277405867cSopenharmony_ci    ret.data = true;
2287405867cSopenharmony_ci    return ret;
2297405867cSopenharmony_ci}
2307405867cSopenharmony_ci
2317405867cSopenharmony_ciint FfiOHOSHiAppEventRemoveProcessor(int64_t id)
2327405867cSopenharmony_ci{
2337405867cSopenharmony_ci    int res = HiAppEventImpl::RemoveProcessor(id);
2347405867cSopenharmony_ci    return res;
2357405867cSopenharmony_ci}
2367405867cSopenharmony_ci
2377405867cSopenharmony_ciint FfiOHOSHiAppEventSetUserId(const char* name, const char* value)
2387405867cSopenharmony_ci{
2397405867cSopenharmony_ci    if (!IsValidUserIdName(std::string(name))) {
2407405867cSopenharmony_ci        return ERR_PARAM;
2417405867cSopenharmony_ci    }
2427405867cSopenharmony_ci    if (!IsValidUserIdValue(std::string(value))) {
2437405867cSopenharmony_ci        return ERR_PARAM;
2447405867cSopenharmony_ci    }
2457405867cSopenharmony_ci    int res = HiAppEventImpl::SetUserId(std::string(name), std::string(value));
2467405867cSopenharmony_ci    if (res != 0) {
2477405867cSopenharmony_ci        return ERR_PARAM;
2487405867cSopenharmony_ci    }
2497405867cSopenharmony_ci    return SUCCESS_CODE;
2507405867cSopenharmony_ci}
2517405867cSopenharmony_ci
2527405867cSopenharmony_ciRetDataCString FfiOHOSHiAppEventGetUserId(const char* name)
2537405867cSopenharmony_ci{
2547405867cSopenharmony_ci    RetDataCString ret = { .code = ERR_PARAM, .data = nullptr };
2557405867cSopenharmony_ci    if (!IsValidUserIdName(std::string(name))) {
2567405867cSopenharmony_ci        ret.code = ERR_PARAM;
2577405867cSopenharmony_ci        ret.data = nullptr;
2587405867cSopenharmony_ci        return ret;
2597405867cSopenharmony_ci    }
2607405867cSopenharmony_ci    auto [status, userId] = HiAppEventImpl::GetUserId(std::string(name));
2617405867cSopenharmony_ci    if (status != 0) {
2627405867cSopenharmony_ci        LOGE("HiAppEvent::FfiOHOSHiAppEventGetUserId error");
2637405867cSopenharmony_ci        ret.code = status;
2647405867cSopenharmony_ci        ret.data = nullptr;
2657405867cSopenharmony_ci        return ret;
2667405867cSopenharmony_ci    }
2677405867cSopenharmony_ci    ret.code = status;
2687405867cSopenharmony_ci    ret.data = MallocCString(userId);
2697405867cSopenharmony_ci    return ret;
2707405867cSopenharmony_ci}
2717405867cSopenharmony_ci
2727405867cSopenharmony_ciint FfiOHOSHiAppEventSetUserProperty(const char* name, const char* value)
2737405867cSopenharmony_ci{
2747405867cSopenharmony_ci    if (!IsValidUserPropName(name)) {
2757405867cSopenharmony_ci        return ERR_PARAM;
2767405867cSopenharmony_ci    }
2777405867cSopenharmony_ci    if (!IsValidUserPropValue(value)) {
2787405867cSopenharmony_ci        return ERR_PARAM;
2797405867cSopenharmony_ci    }
2807405867cSopenharmony_ci    int res = HiAppEventImpl::SetUserProperty(std::string(name), std::string(value));
2817405867cSopenharmony_ci    if (res != 0) {
2827405867cSopenharmony_ci        return ERR_PARAM;
2837405867cSopenharmony_ci    }
2847405867cSopenharmony_ci    return res;
2857405867cSopenharmony_ci}
2867405867cSopenharmony_ci
2877405867cSopenharmony_ciRetDataCString FfiOHOSHiAppEventgetUserProperty(const char* name)
2887405867cSopenharmony_ci{
2897405867cSopenharmony_ci    RetDataCString ret = { .code = ERR_PARAM, .data = nullptr };
2907405867cSopenharmony_ci    if (!IsValidUserPropName(std::string(name))) {
2917405867cSopenharmony_ci        ret.code = ERR_PARAM;
2927405867cSopenharmony_ci        ret.data = nullptr;
2937405867cSopenharmony_ci        return ret;
2947405867cSopenharmony_ci    }
2957405867cSopenharmony_ci    auto [status, propertyId] = HiAppEventImpl::GetUserProperty(std::string(name));
2967405867cSopenharmony_ci    if (status != 0) {
2977405867cSopenharmony_ci        LOGE("HiAppEvent::FfiOHOSHiAppEventgetUserProperty error");
2987405867cSopenharmony_ci        ret.code = status;
2997405867cSopenharmony_ci        ret.data = nullptr;
3007405867cSopenharmony_ci        return ret;
3017405867cSopenharmony_ci    }
3027405867cSopenharmony_ci    ret.code = status;
3037405867cSopenharmony_ci    ret.data = MallocCString(propertyId);
3047405867cSopenharmony_ci    return ret;
3057405867cSopenharmony_ci}
3067405867cSopenharmony_ci
3077405867cSopenharmony_civoid FfiOHOSHiAppEventclearData()
3087405867cSopenharmony_ci{
3097405867cSopenharmony_ci    HiAppEventImpl::ClearData();
3107405867cSopenharmony_ci}
3117405867cSopenharmony_ci
3127405867cSopenharmony_ciint64_t FfiOHOSHiAppEventConstructor(char* cWatcherName)
3137405867cSopenharmony_ci{
3147405867cSopenharmony_ci    auto nativeHolder = OHOS::FFI::FFIData::Create<AppEventPackageHolderImpl>(cWatcherName, -1L);
3157405867cSopenharmony_ci    if (nativeHolder == nullptr) {
3167405867cSopenharmony_ci        return -1;
3177405867cSopenharmony_ci    }
3187405867cSopenharmony_ci    return nativeHolder->GetID();
3197405867cSopenharmony_ci}
3207405867cSopenharmony_ci
3217405867cSopenharmony_ciint FfiOHOSHiAppEventSetSize(int64_t id, int size)
3227405867cSopenharmony_ci{
3237405867cSopenharmony_ci    auto nativeAppEventPackageHolder = OHOS::FFI::FFIData::GetData<AppEventPackageHolderImpl>(id);
3247405867cSopenharmony_ci    if (nativeAppEventPackageHolder == nullptr) {
3257405867cSopenharmony_ci        return -1;
3267405867cSopenharmony_ci    }
3277405867cSopenharmony_ci    int ret = SUCCESS_CODE;
3287405867cSopenharmony_ci    if (size >= 0) {
3297405867cSopenharmony_ci        nativeAppEventPackageHolder->SetSize(size);
3307405867cSopenharmony_ci    } else {
3317405867cSopenharmony_ci        ret = ERR_INVALID_SIZE;
3327405867cSopenharmony_ci    }
3337405867cSopenharmony_ci    return ret;
3347405867cSopenharmony_ci}
3357405867cSopenharmony_ci
3367405867cSopenharmony_ciReTakeNext FfiOHOSHiAppEventTakeNext(int64_t id)
3377405867cSopenharmony_ci{
3387405867cSopenharmony_ci    auto nativeAppEventPackageHolder = OHOS::FFI::FFIData::GetData<AppEventPackageHolderImpl>(id);
3397405867cSopenharmony_ci    if (nativeAppEventPackageHolder == nullptr) {
3407405867cSopenharmony_ci        return ReTakeNext{.status = -1, .event = RetAppEventPackage{0}};
3417405867cSopenharmony_ci    }
3427405867cSopenharmony_ci    auto [state, package] = nativeAppEventPackageHolder->TakeNext();
3437405867cSopenharmony_ci    ReTakeNext ret;
3447405867cSopenharmony_ci    ret.status = state;
3457405867cSopenharmony_ci    ret.event = package;
3467405867cSopenharmony_ci    return ret;
3477405867cSopenharmony_ci}
3487405867cSopenharmony_ci
3497405867cSopenharmony_ciRetDataI64 FfiOHOSHiAppEventAddWatcher(CWatcher watcher)
3507405867cSopenharmony_ci{
3517405867cSopenharmony_ci    RetDataI64 ret = { .code = ERR_PARAM, .data = 0 };
3527405867cSopenharmony_ci    // check isValid
3537405867cSopenharmony_ci    std::string name = std::string(watcher.name);
3547405867cSopenharmony_ci    if (!IsValidWatcherName(name)) {
3557405867cSopenharmony_ci        ret.code = ERR_INVALID_WATCHER_NAME;
3567405867cSopenharmony_ci        return ret;
3577405867cSopenharmony_ci    }
3587405867cSopenharmony_ci    TriggerCondition cond;
3597405867cSopenharmony_ci    ret.code = CheckCondition(cond, watcher.triggerCondition);
3607405867cSopenharmony_ci    if (ret.code != ERR_PARAM) {
3617405867cSopenharmony_ci        return ret;
3627405867cSopenharmony_ci    }
3637405867cSopenharmony_ci    std::vector<AppEventFilter> filters;
3647405867cSopenharmony_ci    std::unordered_set<std::string> names;
3657405867cSopenharmony_ci    for (int i = 0; i < watcher.appEventFilters.size; i++) {
3667405867cSopenharmony_ci        for (int j = 0; j < watcher.appEventFilters.head[i].names.size; j++) {
3677405867cSopenharmony_ci            names.insert(std::string(watcher.appEventFilters.head[i].names.head[j]));
3687405867cSopenharmony_ci        }
3697405867cSopenharmony_ci        std::string domain = std::string(watcher.appEventFilters.head[i].domain);
3707405867cSopenharmony_ci        if (!IsValidDomain(domain)) {
3717405867cSopenharmony_ci            ret.code = ERR_INVALID_FILTER_DOMAIN;
3727405867cSopenharmony_ci            return ret;
3737405867cSopenharmony_ci        }
3747405867cSopenharmony_ci        uint32_t types = 0;
3757405867cSopenharmony_ci        for (int k = 0; k < watcher.appEventFilters.head[i].eventTypes.size; k++) {
3767405867cSopenharmony_ci            types |= (BIT_MASK << watcher.appEventFilters.head[i].eventTypes.head[k]);
3777405867cSopenharmony_ci        }
3787405867cSopenharmony_ci        types = types > 0 ? types : BIT_ALL_TYPES;
3797405867cSopenharmony_ci        filters.emplace_back(AppEventFilter(domain, names, types));
3807405867cSopenharmony_ci    }
3817405867cSopenharmony_ci
3827405867cSopenharmony_ci    auto [status, holderId] = HiAppEventImpl::addWatcher(name, filters, cond,
3837405867cSopenharmony_ci                                                         watcher.callbackOnTriggerRef, watcher.callbackOnReceiveRef);
3847405867cSopenharmony_ci    if (status != 0) {
3857405867cSopenharmony_ci        ret.code = status;
3867405867cSopenharmony_ci        return ret;
3877405867cSopenharmony_ci    }
3887405867cSopenharmony_ci    if (holderId == -1) {
3897405867cSopenharmony_ci        ret.data = -1;
3907405867cSopenharmony_ci        return ret;
3917405867cSopenharmony_ci    }
3927405867cSopenharmony_ci    ret.code = status;
3937405867cSopenharmony_ci    ret.data = holderId;
3947405867cSopenharmony_ci    return ret;
3957405867cSopenharmony_ci}
3967405867cSopenharmony_ci
3977405867cSopenharmony_ciint FfiOHOSHiAppEventRemoveWatcher(CWatcher watcher)
3987405867cSopenharmony_ci{
3997405867cSopenharmony_ci    std::string name = std::string(watcher.name);
4007405867cSopenharmony_ci    if (!IsValidWatcherName(name)) {
4017405867cSopenharmony_ci        return ERR_INVALID_WATCHER_NAME;
4027405867cSopenharmony_ci    }
4037405867cSopenharmony_ci    HiAppEventImpl::removeWatcher(name);
4047405867cSopenharmony_ci    return SUCCESS_CODE;
4057405867cSopenharmony_ci}
4067405867cSopenharmony_ci}