1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#include "pool.h" 17094332d3Sopenharmony_ci 18094332d3Sopenharmony_ci#include "securec.h" 19094332d3Sopenharmony_ci 20094332d3Sopenharmony_ci#include "adaptor_algorithm.h" 21094332d3Sopenharmony_ci#include "adaptor_log.h" 22094332d3Sopenharmony_ci#include "adaptor_memory.h" 23094332d3Sopenharmony_ci 24094332d3Sopenharmony_ci#define MAX_DUPLICATE_CHECK 100 25094332d3Sopenharmony_ci#ifdef IAM_TEST_ENABLE 26094332d3Sopenharmony_ci#define IAM_STATIC 27094332d3Sopenharmony_ci#else 28094332d3Sopenharmony_ci#define IAM_STATIC static 29094332d3Sopenharmony_ci#endif 30094332d3Sopenharmony_ci 31094332d3Sopenharmony_ci// Resource pool list, which caches registered executor information. 32094332d3Sopenharmony_ciIAM_STATIC LinkedList *g_poolList = NULL; 33094332d3Sopenharmony_ci 34094332d3Sopenharmony_ciIAM_STATIC void DestroyExecutorInfo(void *data) 35094332d3Sopenharmony_ci{ 36094332d3Sopenharmony_ci if (data == NULL) { 37094332d3Sopenharmony_ci LOG_ERROR("data is null"); 38094332d3Sopenharmony_ci return; 39094332d3Sopenharmony_ci } 40094332d3Sopenharmony_ci Free(data); 41094332d3Sopenharmony_ci} 42094332d3Sopenharmony_ci 43094332d3Sopenharmony_ciIAM_STATIC bool IsExecutorIdMatchById(const void *data, const void *condition) 44094332d3Sopenharmony_ci{ 45094332d3Sopenharmony_ci if ((condition == NULL) || (data == NULL)) { 46094332d3Sopenharmony_ci LOG_ERROR("input para is null"); 47094332d3Sopenharmony_ci return false; 48094332d3Sopenharmony_ci } 49094332d3Sopenharmony_ci uint64_t executorIndex = *(const uint64_t *)condition; 50094332d3Sopenharmony_ci const ExecutorInfoHal *executorInfo = (const ExecutorInfoHal *)data; 51094332d3Sopenharmony_ci return (executorInfo->executorIndex == executorIndex); 52094332d3Sopenharmony_ci} 53094332d3Sopenharmony_ci 54094332d3Sopenharmony_ciIAM_STATIC bool IsExecutorNodeMatch(const void *data, const void *condition) 55094332d3Sopenharmony_ci{ 56094332d3Sopenharmony_ci if ((condition == NULL) || (data == NULL)) { 57094332d3Sopenharmony_ci LOG_ERROR("get null data"); 58094332d3Sopenharmony_ci return false; 59094332d3Sopenharmony_ci } 60094332d3Sopenharmony_ci const ExecutorInfoHal *executorIndex = (const ExecutorInfoHal *)condition; 61094332d3Sopenharmony_ci const ExecutorInfoHal *executorInfo = (const ExecutorInfoHal *)data; 62094332d3Sopenharmony_ci return (executorInfo->executorRole == executorIndex->executorRole && 63094332d3Sopenharmony_ci executorInfo->authType == executorIndex->authType && 64094332d3Sopenharmony_ci executorInfo->executorSensorHint == executorIndex->executorSensorHint) && 65094332d3Sopenharmony_ci memcmp(executorInfo->deviceUdid, executorIndex->deviceUdid, UDID_LEN) == 0; 66094332d3Sopenharmony_ci} 67094332d3Sopenharmony_ci 68094332d3Sopenharmony_ciIAM_STATIC bool IsInit(void) 69094332d3Sopenharmony_ci{ 70094332d3Sopenharmony_ci return g_poolList != NULL; 71094332d3Sopenharmony_ci} 72094332d3Sopenharmony_ci 73094332d3Sopenharmony_ciResultCode InitResourcePool(void) 74094332d3Sopenharmony_ci{ 75094332d3Sopenharmony_ci if (!IsInit()) { 76094332d3Sopenharmony_ci g_poolList = CreateLinkedList(DestroyExecutorInfo); 77094332d3Sopenharmony_ci } 78094332d3Sopenharmony_ci if (g_poolList == NULL) { 79094332d3Sopenharmony_ci return RESULT_GENERAL_ERROR; 80094332d3Sopenharmony_ci } 81094332d3Sopenharmony_ci return RESULT_SUCCESS; 82094332d3Sopenharmony_ci} 83094332d3Sopenharmony_ci 84094332d3Sopenharmony_civoid DestroyResourcePool(void) 85094332d3Sopenharmony_ci{ 86094332d3Sopenharmony_ci DestroyLinkedList(g_poolList); 87094332d3Sopenharmony_ci g_poolList = NULL; 88094332d3Sopenharmony_ci} 89094332d3Sopenharmony_ci 90094332d3Sopenharmony_ciIAM_STATIC bool IsExecutorValid(const ExecutorInfoHal *executorInfo) 91094332d3Sopenharmony_ci{ 92094332d3Sopenharmony_ci if (executorInfo == NULL) { 93094332d3Sopenharmony_ci LOG_ERROR("get null data"); 94094332d3Sopenharmony_ci return false; 95094332d3Sopenharmony_ci } 96094332d3Sopenharmony_ci return true; 97094332d3Sopenharmony_ci} 98094332d3Sopenharmony_ci 99094332d3Sopenharmony_ciIAM_STATIC bool IsExecutorIdDuplicate(uint64_t executorIndex) 100094332d3Sopenharmony_ci{ 101094332d3Sopenharmony_ci LinkedListNode *temp = g_poolList->head; 102094332d3Sopenharmony_ci ExecutorInfoHal *executorInfo = NULL; 103094332d3Sopenharmony_ci while (temp != NULL) { 104094332d3Sopenharmony_ci executorInfo = (ExecutorInfoHal *)temp->data; 105094332d3Sopenharmony_ci if (executorInfo != NULL && executorInfo->executorIndex == executorIndex) { 106094332d3Sopenharmony_ci return true; 107094332d3Sopenharmony_ci } 108094332d3Sopenharmony_ci temp = temp->next; 109094332d3Sopenharmony_ci } 110094332d3Sopenharmony_ci 111094332d3Sopenharmony_ci return false; 112094332d3Sopenharmony_ci} 113094332d3Sopenharmony_ci 114094332d3Sopenharmony_ciIAM_STATIC ResultCode GenerateValidExecutorId(uint64_t *executorIndex) 115094332d3Sopenharmony_ci{ 116094332d3Sopenharmony_ci if (g_poolList == NULL) { 117094332d3Sopenharmony_ci LOG_ERROR("g_poolList is null"); 118094332d3Sopenharmony_ci return RESULT_BAD_PARAM; 119094332d3Sopenharmony_ci } 120094332d3Sopenharmony_ci 121094332d3Sopenharmony_ci for (uint32_t i = 0; i < MAX_DUPLICATE_CHECK; ++i) { 122094332d3Sopenharmony_ci uint64_t tempRandom; 123094332d3Sopenharmony_ci if (SecureRandom((uint8_t *)&tempRandom, sizeof(uint64_t)) != RESULT_SUCCESS) { 124094332d3Sopenharmony_ci LOG_ERROR("get random failed"); 125094332d3Sopenharmony_ci return RESULT_GENERAL_ERROR; 126094332d3Sopenharmony_ci } 127094332d3Sopenharmony_ci if (!IsExecutorIdDuplicate(tempRandom)) { 128094332d3Sopenharmony_ci *executorIndex = tempRandom; 129094332d3Sopenharmony_ci return RESULT_SUCCESS; 130094332d3Sopenharmony_ci } 131094332d3Sopenharmony_ci } 132094332d3Sopenharmony_ci 133094332d3Sopenharmony_ci LOG_ERROR("a rare failure"); 134094332d3Sopenharmony_ci return RESULT_GENERAL_ERROR; 135094332d3Sopenharmony_ci} 136094332d3Sopenharmony_ci 137094332d3Sopenharmony_ciIAM_STATIC LinkedList *QueryRepeatExecutor(ExecutorInfoHal *executorInfo) 138094332d3Sopenharmony_ci{ 139094332d3Sopenharmony_ci ExecutorCondition condition = {}; 140094332d3Sopenharmony_ci SetExecutorConditionAuthType(&condition, executorInfo->authType); 141094332d3Sopenharmony_ci SetExecutorConditionSensorHint(&condition, executorInfo->executorSensorHint); 142094332d3Sopenharmony_ci SetExecutorConditionExecutorRole(&condition, executorInfo->executorRole); 143094332d3Sopenharmony_ci const Uint8Array udid = { executorInfo->deviceUdid, UDID_LEN }; 144094332d3Sopenharmony_ci SetExecutorConditionDeviceUdid(&condition, udid); 145094332d3Sopenharmony_ci return QueryExecutor(&condition); 146094332d3Sopenharmony_ci} 147094332d3Sopenharmony_ci 148094332d3Sopenharmony_ciResultCode RegisterExecutorToPool(ExecutorInfoHal *executorInfo) 149094332d3Sopenharmony_ci{ 150094332d3Sopenharmony_ci if (!IsInit()) { 151094332d3Sopenharmony_ci LOG_ERROR("pool not init"); 152094332d3Sopenharmony_ci return RESULT_NEED_INIT; 153094332d3Sopenharmony_ci } 154094332d3Sopenharmony_ci if (!IsExecutorValid(executorInfo)) { 155094332d3Sopenharmony_ci LOG_ERROR("get invalid executorInfo"); 156094332d3Sopenharmony_ci return RESULT_BAD_PARAM; 157094332d3Sopenharmony_ci } 158094332d3Sopenharmony_ci LinkedList *executors = QueryRepeatExecutor(executorInfo); 159094332d3Sopenharmony_ci if (executors == NULL) { 160094332d3Sopenharmony_ci LOG_ERROR("query executor failed"); 161094332d3Sopenharmony_ci return RESULT_NO_MEMORY; 162094332d3Sopenharmony_ci } 163094332d3Sopenharmony_ci ResultCode result = RESULT_UNKNOWN; 164094332d3Sopenharmony_ci if (executors->getSize(executors) != 0) { 165094332d3Sopenharmony_ci if (executors->head == NULL || executors->head->data == NULL) { 166094332d3Sopenharmony_ci LOG_ERROR("list node is invalid"); 167094332d3Sopenharmony_ci goto EXIT; 168094332d3Sopenharmony_ci } 169094332d3Sopenharmony_ci executorInfo->executorIndex = ((ExecutorInfoHal *)(executors->head->data))->executorIndex; 170094332d3Sopenharmony_ci if (g_poolList->remove(g_poolList, (void *)executorInfo, IsExecutorNodeMatch, true) != RESULT_SUCCESS) { 171094332d3Sopenharmony_ci LOG_INFO("remove executor failed"); 172094332d3Sopenharmony_ci goto EXIT; 173094332d3Sopenharmony_ci } 174094332d3Sopenharmony_ci } else { 175094332d3Sopenharmony_ci result = GenerateValidExecutorId(&executorInfo->executorIndex); 176094332d3Sopenharmony_ci if (result != RESULT_SUCCESS) { 177094332d3Sopenharmony_ci LOG_ERROR("get executorId failed"); 178094332d3Sopenharmony_ci goto EXIT; 179094332d3Sopenharmony_ci } 180094332d3Sopenharmony_ci } 181094332d3Sopenharmony_ci ExecutorInfoHal *executorCopy = CopyExecutorInfo(executorInfo); 182094332d3Sopenharmony_ci if (executorCopy == NULL) { 183094332d3Sopenharmony_ci LOG_ERROR("copy executor failed"); 184094332d3Sopenharmony_ci result = RESULT_BAD_COPY; 185094332d3Sopenharmony_ci goto EXIT; 186094332d3Sopenharmony_ci } 187094332d3Sopenharmony_ci result = g_poolList->insert(g_poolList, (void *)executorCopy); 188094332d3Sopenharmony_ci if (result != RESULT_SUCCESS) { 189094332d3Sopenharmony_ci LOG_ERROR("insert failed"); 190094332d3Sopenharmony_ci DestroyExecutorInfo(executorCopy); 191094332d3Sopenharmony_ci } 192094332d3Sopenharmony_ci 193094332d3Sopenharmony_ciEXIT: 194094332d3Sopenharmony_ci DestroyLinkedList(executors); 195094332d3Sopenharmony_ci return result; 196094332d3Sopenharmony_ci} 197094332d3Sopenharmony_ci 198094332d3Sopenharmony_ciResultCode UnregisterExecutorToPool(uint64_t executorIndex) 199094332d3Sopenharmony_ci{ 200094332d3Sopenharmony_ci if (!IsInit()) { 201094332d3Sopenharmony_ci LOG_ERROR("pool not init"); 202094332d3Sopenharmony_ci return RESULT_NEED_INIT; 203094332d3Sopenharmony_ci } 204094332d3Sopenharmony_ci return g_poolList->remove(g_poolList, (void *)&executorIndex, IsExecutorIdMatchById, true); 205094332d3Sopenharmony_ci} 206094332d3Sopenharmony_ci 207094332d3Sopenharmony_ciExecutorInfoHal *CopyExecutorInfo(ExecutorInfoHal *src) 208094332d3Sopenharmony_ci{ 209094332d3Sopenharmony_ci if (src == NULL) { 210094332d3Sopenharmony_ci LOG_ERROR("get null data"); 211094332d3Sopenharmony_ci return NULL; 212094332d3Sopenharmony_ci } 213094332d3Sopenharmony_ci ExecutorInfoHal *dest = (ExecutorInfoHal *)Malloc(sizeof(ExecutorInfoHal)); 214094332d3Sopenharmony_ci if (dest == NULL) { 215094332d3Sopenharmony_ci LOG_ERROR("no memory"); 216094332d3Sopenharmony_ci return NULL; 217094332d3Sopenharmony_ci } 218094332d3Sopenharmony_ci if (memcpy_s(dest, sizeof(ExecutorInfoHal), src, sizeof(ExecutorInfoHal)) != EOK) { 219094332d3Sopenharmony_ci LOG_ERROR("copy executor info failed"); 220094332d3Sopenharmony_ci Free(dest); 221094332d3Sopenharmony_ci return NULL; 222094332d3Sopenharmony_ci } 223094332d3Sopenharmony_ci return dest; 224094332d3Sopenharmony_ci} 225094332d3Sopenharmony_ci 226094332d3Sopenharmony_ciIAM_STATIC bool IsExecutorMatch(const ExecutorCondition *condition, const ExecutorInfoHal *credentialInfo) 227094332d3Sopenharmony_ci{ 228094332d3Sopenharmony_ci if ((condition->conditonFactor & EXECUTOR_CONDITION_INDEX) != 0 && 229094332d3Sopenharmony_ci condition->executorIndex != credentialInfo->executorIndex) { 230094332d3Sopenharmony_ci return false; 231094332d3Sopenharmony_ci } 232094332d3Sopenharmony_ci if ((condition->conditonFactor & EXECUTOR_CONDITION_AUTH_TYPE) != 0 && 233094332d3Sopenharmony_ci condition->authType != credentialInfo->authType) { 234094332d3Sopenharmony_ci return false; 235094332d3Sopenharmony_ci } 236094332d3Sopenharmony_ci if ((condition->conditonFactor & EXECUTOR_CONDITION_SENSOR_HINT) != 0 && 237094332d3Sopenharmony_ci condition->executorSensorHint != INVALID_SENSOR_HINT && 238094332d3Sopenharmony_ci condition->executorSensorHint != credentialInfo->executorSensorHint) { 239094332d3Sopenharmony_ci return false; 240094332d3Sopenharmony_ci } 241094332d3Sopenharmony_ci if ((condition->conditonFactor & EXECUTOR_CONDITION_ROLE) != 0 && 242094332d3Sopenharmony_ci condition->executorRole != credentialInfo->executorRole) { 243094332d3Sopenharmony_ci return false; 244094332d3Sopenharmony_ci } 245094332d3Sopenharmony_ci if ((condition->conditonFactor & EXECUTOR_CONDITION_MATCHER) != 0 && 246094332d3Sopenharmony_ci condition->executorMatcher != credentialInfo->executorMatcher) { 247094332d3Sopenharmony_ci return false; 248094332d3Sopenharmony_ci } 249094332d3Sopenharmony_ci if ((condition->conditonFactor & EXECUTOR_CONDITION_UDID) != 0 && 250094332d3Sopenharmony_ci memcmp(condition->deviceUdid, credentialInfo->deviceUdid, UDID_LEN) != 0) { 251094332d3Sopenharmony_ci return false; 252094332d3Sopenharmony_ci } 253094332d3Sopenharmony_ci return true; 254094332d3Sopenharmony_ci} 255094332d3Sopenharmony_ci 256094332d3Sopenharmony_ciLinkedList *QueryExecutor(const ExecutorCondition *condition) 257094332d3Sopenharmony_ci{ 258094332d3Sopenharmony_ci if (!IsInit()) { 259094332d3Sopenharmony_ci LOG_ERROR("pool not init"); 260094332d3Sopenharmony_ci return NULL; 261094332d3Sopenharmony_ci } 262094332d3Sopenharmony_ci LinkedList *result = CreateLinkedList(DestroyExecutorInfo); 263094332d3Sopenharmony_ci if (result == NULL) { 264094332d3Sopenharmony_ci LOG_ERROR("create result list failed"); 265094332d3Sopenharmony_ci return NULL; 266094332d3Sopenharmony_ci } 267094332d3Sopenharmony_ci LinkedListIterator *iterator = g_poolList->createIterator(g_poolList); 268094332d3Sopenharmony_ci if (iterator == NULL) { 269094332d3Sopenharmony_ci LOG_ERROR("create iterator failed"); 270094332d3Sopenharmony_ci DestroyLinkedList(result); 271094332d3Sopenharmony_ci return NULL; 272094332d3Sopenharmony_ci } 273094332d3Sopenharmony_ci 274094332d3Sopenharmony_ci while (iterator->hasNext(iterator)) { 275094332d3Sopenharmony_ci ExecutorInfoHal *executorInfo = (ExecutorInfoHal *)iterator->next(iterator); 276094332d3Sopenharmony_ci if (!IsExecutorValid(executorInfo)) { 277094332d3Sopenharmony_ci LOG_ERROR("get invalid executor info"); 278094332d3Sopenharmony_ci continue; 279094332d3Sopenharmony_ci } 280094332d3Sopenharmony_ci if (!IsExecutorMatch(condition, executorInfo)) { 281094332d3Sopenharmony_ci continue; 282094332d3Sopenharmony_ci } 283094332d3Sopenharmony_ci ExecutorInfoHal *copy = CopyExecutorInfo(executorInfo); 284094332d3Sopenharmony_ci if (copy == NULL) { 285094332d3Sopenharmony_ci LOG_ERROR("copy executor info failed"); 286094332d3Sopenharmony_ci continue; 287094332d3Sopenharmony_ci } 288094332d3Sopenharmony_ci if (result->insert(result, copy) != RESULT_SUCCESS) { 289094332d3Sopenharmony_ci LOG_ERROR("insert executor info failed"); 290094332d3Sopenharmony_ci DestroyExecutorInfo(copy); 291094332d3Sopenharmony_ci continue; 292094332d3Sopenharmony_ci } 293094332d3Sopenharmony_ci } 294094332d3Sopenharmony_ci g_poolList->destroyIterator(iterator); 295094332d3Sopenharmony_ci return result; 296094332d3Sopenharmony_ci} 297094332d3Sopenharmony_ci 298094332d3Sopenharmony_ciResultCode QueryCollecterMatcher(uint32_t authType, uint32_t executorSensorHint, uint32_t *matcher) 299094332d3Sopenharmony_ci{ 300094332d3Sopenharmony_ci if (!IsInit()) { 301094332d3Sopenharmony_ci LOG_ERROR("pool not init"); 302094332d3Sopenharmony_ci return RESULT_NEED_INIT; 303094332d3Sopenharmony_ci } 304094332d3Sopenharmony_ci if (matcher == NULL) { 305094332d3Sopenharmony_ci LOG_ERROR("matcher is null"); 306094332d3Sopenharmony_ci return RESULT_BAD_PARAM; 307094332d3Sopenharmony_ci } 308094332d3Sopenharmony_ci LinkedListIterator *iterator = g_poolList->createIterator(g_poolList); 309094332d3Sopenharmony_ci if (iterator == NULL) { 310094332d3Sopenharmony_ci LOG_ERROR("create iterator failed"); 311094332d3Sopenharmony_ci return RESULT_NO_MEMORY; 312094332d3Sopenharmony_ci } 313094332d3Sopenharmony_ci 314094332d3Sopenharmony_ci while (iterator->hasNext(iterator)) { 315094332d3Sopenharmony_ci ExecutorInfoHal *executorInfo = (ExecutorInfoHal *)(iterator->next(iterator)); 316094332d3Sopenharmony_ci if (!IsExecutorValid(executorInfo)) { 317094332d3Sopenharmony_ci LOG_ERROR("get invalid executor info"); 318094332d3Sopenharmony_ci continue; 319094332d3Sopenharmony_ci } 320094332d3Sopenharmony_ci if (executorInfo->authType == authType && executorInfo->executorSensorHint == executorSensorHint && 321094332d3Sopenharmony_ci (executorInfo->executorRole == COLLECTOR || executorInfo->executorRole == ALL_IN_ONE)) { 322094332d3Sopenharmony_ci *matcher = executorInfo->executorMatcher; 323094332d3Sopenharmony_ci g_poolList->destroyIterator(iterator); 324094332d3Sopenharmony_ci return RESULT_SUCCESS; 325094332d3Sopenharmony_ci } 326094332d3Sopenharmony_ci } 327094332d3Sopenharmony_ci LOG_ERROR("can't found executor, sensor hint is %{public}u", executorSensorHint); 328094332d3Sopenharmony_ci g_poolList->destroyIterator(iterator); 329094332d3Sopenharmony_ci return RESULT_NOT_FOUND; 330094332d3Sopenharmony_ci} 331094332d3Sopenharmony_ci 332094332d3Sopenharmony_ci 333094332d3Sopenharmony_ciuint64_t QueryCredentialExecutorIndex(uint32_t authType, uint32_t executorSensorHint) 334094332d3Sopenharmony_ci{ 335094332d3Sopenharmony_ci if (!IsInit()) { 336094332d3Sopenharmony_ci LOG_ERROR("pool not init"); 337094332d3Sopenharmony_ci return INVALID_EXECUTOR_INDEX; 338094332d3Sopenharmony_ci } 339094332d3Sopenharmony_ci LinkedListIterator *iterator = g_poolList->createIterator(g_poolList); 340094332d3Sopenharmony_ci if (iterator == NULL) { 341094332d3Sopenharmony_ci LOG_ERROR("create iterator failed"); 342094332d3Sopenharmony_ci return INVALID_EXECUTOR_INDEX; 343094332d3Sopenharmony_ci } 344094332d3Sopenharmony_ci 345094332d3Sopenharmony_ci while (iterator->hasNext(iterator)) { 346094332d3Sopenharmony_ci ExecutorInfoHal *executorInfo = (ExecutorInfoHal *)(iterator->next(iterator)); 347094332d3Sopenharmony_ci if (!IsExecutorValid(executorInfo)) { 348094332d3Sopenharmony_ci LOG_ERROR("get invalid executor info"); 349094332d3Sopenharmony_ci continue; 350094332d3Sopenharmony_ci } 351094332d3Sopenharmony_ci if (executorInfo->authType == authType && executorInfo->executorSensorHint == executorSensorHint && 352094332d3Sopenharmony_ci executorInfo->executorRole == ALL_IN_ONE) { 353094332d3Sopenharmony_ci g_poolList->destroyIterator(iterator); 354094332d3Sopenharmony_ci return executorInfo->executorIndex; 355094332d3Sopenharmony_ci } 356094332d3Sopenharmony_ci } 357094332d3Sopenharmony_ci LOG_ERROR("can't found executor, sensor hint is %{public}u", executorSensorHint); 358094332d3Sopenharmony_ci g_poolList->destroyIterator(iterator); 359094332d3Sopenharmony_ci return INVALID_EXECUTOR_INDEX; 360094332d3Sopenharmony_ci} 361094332d3Sopenharmony_ci 362094332d3Sopenharmony_ci 363094332d3Sopenharmony_civoid SetExecutorConditionExecutorIndex(ExecutorCondition *condition, uint64_t executorIndex) 364094332d3Sopenharmony_ci{ 365094332d3Sopenharmony_ci if (condition == NULL) { 366094332d3Sopenharmony_ci LOG_ERROR("condition is null"); 367094332d3Sopenharmony_ci return; 368094332d3Sopenharmony_ci } 369094332d3Sopenharmony_ci condition->executorIndex = executorIndex; 370094332d3Sopenharmony_ci condition->conditonFactor |= EXECUTOR_CONDITION_INDEX; 371094332d3Sopenharmony_ci} 372094332d3Sopenharmony_ci 373094332d3Sopenharmony_civoid SetExecutorConditionAuthType(ExecutorCondition *condition, uint32_t authType) 374094332d3Sopenharmony_ci{ 375094332d3Sopenharmony_ci if (condition == NULL) { 376094332d3Sopenharmony_ci LOG_ERROR("condition is null"); 377094332d3Sopenharmony_ci return; 378094332d3Sopenharmony_ci } 379094332d3Sopenharmony_ci condition->authType = authType; 380094332d3Sopenharmony_ci condition->conditonFactor |= EXECUTOR_CONDITION_AUTH_TYPE; 381094332d3Sopenharmony_ci} 382094332d3Sopenharmony_ci 383094332d3Sopenharmony_civoid SetExecutorConditionSensorHint(ExecutorCondition *condition, uint32_t executorSensorHint) 384094332d3Sopenharmony_ci{ 385094332d3Sopenharmony_ci if (condition == NULL) { 386094332d3Sopenharmony_ci LOG_ERROR("condition is null"); 387094332d3Sopenharmony_ci return; 388094332d3Sopenharmony_ci } 389094332d3Sopenharmony_ci condition->executorSensorHint = executorSensorHint; 390094332d3Sopenharmony_ci condition->conditonFactor |= EXECUTOR_CONDITION_SENSOR_HINT; 391094332d3Sopenharmony_ci} 392094332d3Sopenharmony_ci 393094332d3Sopenharmony_civoid SetExecutorConditionExecutorRole(ExecutorCondition *condition, uint32_t executorRole) 394094332d3Sopenharmony_ci{ 395094332d3Sopenharmony_ci if (condition == NULL) { 396094332d3Sopenharmony_ci LOG_ERROR("condition is null"); 397094332d3Sopenharmony_ci return; 398094332d3Sopenharmony_ci } 399094332d3Sopenharmony_ci condition->executorRole = executorRole; 400094332d3Sopenharmony_ci condition->conditonFactor |= EXECUTOR_CONDITION_ROLE; 401094332d3Sopenharmony_ci} 402094332d3Sopenharmony_ci 403094332d3Sopenharmony_civoid SetExecutorConditionExecutorMatcher(ExecutorCondition *condition, uint32_t executorMatcher) 404094332d3Sopenharmony_ci{ 405094332d3Sopenharmony_ci if (condition == NULL) { 406094332d3Sopenharmony_ci LOG_ERROR("condition is null"); 407094332d3Sopenharmony_ci return; 408094332d3Sopenharmony_ci } 409094332d3Sopenharmony_ci condition->executorMatcher = executorMatcher; 410094332d3Sopenharmony_ci condition->conditonFactor |= EXECUTOR_CONDITION_MATCHER; 411094332d3Sopenharmony_ci} 412094332d3Sopenharmony_ci 413094332d3Sopenharmony_civoid SetExecutorConditionDeviceUdid(ExecutorCondition *condition, Uint8Array deviceUdid) 414094332d3Sopenharmony_ci{ 415094332d3Sopenharmony_ci if (condition == NULL || IS_ARRAY_NULL(deviceUdid)) { 416094332d3Sopenharmony_ci LOG_ERROR("condition is null"); 417094332d3Sopenharmony_ci return; 418094332d3Sopenharmony_ci } 419094332d3Sopenharmony_ci if (memcpy_s(condition->deviceUdid, UDID_LEN, deviceUdid.data, deviceUdid.len) != EOK) { 420094332d3Sopenharmony_ci LOG_ERROR("copy udid failed"); 421094332d3Sopenharmony_ci return; 422094332d3Sopenharmony_ci } 423094332d3Sopenharmony_ci condition->conditonFactor |= EXECUTOR_CONDITION_UDID; 424094332d3Sopenharmony_ci}