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}