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}