1 /*
2 * Copyright (C) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "account_multi_task_manager.h"
17 #include "device_auth.h"
18 #include "device_auth_defines.h"
19 #include "hc_log.h"
20 #include "hc_types.h"
21
22 static AccountMultiTaskManager g_taskManager;
23
IsManagerHasTaskId(int32_t taskId)24 static bool IsManagerHasTaskId(int32_t taskId)
25 {
26 for (uint32_t i = 0; i < ACCOUNT_MULTI_TASK_MAX_SIZE; ++i) {
27 if (g_taskManager.taskArray[i] != NULL && taskId == g_taskManager.taskArray[i]->taskId) {
28 LOGD("Task already exists, taskId: %d.", taskId);
29 return true;
30 }
31 }
32 LOGD("Multi auth manager do not has task id(%d).", taskId);
33 return false;
34 }
35
IsTaskNumUpToMax(void)36 static bool IsTaskNumUpToMax(void)
37 {
38 if (g_taskManager.count >= ACCOUNT_MULTI_TASK_MAX_SIZE) {
39 LOGD("The number of tasks reaches maximun.");
40 return true;
41 }
42 return false;
43 }
44
CanAddTaskInManager(int32_t taskId)45 static bool CanAddTaskInManager(int32_t taskId)
46 {
47 if (IsTaskNumUpToMax()) {
48 LOGE("Task number is up to limit.");
49 return false;
50 }
51 if (IsManagerHasTaskId(taskId)) {
52 LOGE("Task id is already in exist.");
53 return false;
54 }
55 return true;
56 }
57
AddTaskToManager(AccountTask * task)58 static int32_t AddTaskToManager(AccountTask *task)
59 {
60 if (task == NULL) {
61 LOGE("Task is null.");
62 return HC_ERR_NULL_PTR;
63 }
64
65 if (!CanAddTaskInManager(task->taskId)) {
66 LOGE("Can not add task into manager.");
67 return HC_ERR_ADD_ACCOUNT_TASK;
68 }
69 for (uint32_t i = 0; i < ACCOUNT_MULTI_TASK_MAX_SIZE; ++i) {
70 if (g_taskManager.taskArray[i] == NULL) {
71 g_taskManager.taskArray[i] = task;
72 g_taskManager.count++;
73 return HC_SUCCESS;
74 }
75 }
76 LOGE("There is no empty space in the task manager.");
77 return HC_ERR_OUT_OF_LIMIT;
78 }
79
GetTaskFromManager(int32_t taskId)80 static AccountTask *GetTaskFromManager(int32_t taskId)
81 {
82 for (uint32_t i = 0; i < ACCOUNT_MULTI_TASK_MAX_SIZE; ++i) {
83 if ((g_taskManager.taskArray[i] != NULL) && (g_taskManager.taskArray[i]->taskId == taskId)) {
84 return g_taskManager.taskArray[i];
85 }
86 }
87 LOGE("Task does not exist, taskId: %d.", taskId);
88 return NULL;
89 }
90
DeleteTaskFromManager(int32_t taskId)91 static void DeleteTaskFromManager(int32_t taskId)
92 {
93 for (uint32_t i = 0; i < ACCOUNT_MULTI_TASK_MAX_SIZE; ++i) {
94 if ((g_taskManager.taskArray[i] != NULL) && (g_taskManager.taskArray[i]->taskId == taskId)) {
95 g_taskManager.taskArray[i]->destroyTask(g_taskManager.taskArray[i]);
96 g_taskManager.taskArray[i] = NULL;
97 g_taskManager.count--;
98 }
99 }
100 }
101
InitAccountMultiTaskManager(void)102 void InitAccountMultiTaskManager(void)
103 {
104 DestroyAccountMultiTaskManager();
105 g_taskManager.count = 0;
106 g_taskManager.isTaskNumUpToMax = IsTaskNumUpToMax;
107 g_taskManager.addTaskToManager = AddTaskToManager;
108 g_taskManager.getTaskFromManager = GetTaskFromManager;
109 g_taskManager.deleteTaskFromManager = DeleteTaskFromManager;
110 }
111
GetAccountMultiTaskManager(void)112 AccountMultiTaskManager *GetAccountMultiTaskManager(void)
113 {
114 return &g_taskManager;
115 }
116
DestroyAccountMultiTaskManager(void)117 void DestroyAccountMultiTaskManager(void)
118 {
119 for (uint32_t i = 0; i < ACCOUNT_MULTI_TASK_MAX_SIZE; ++i) {
120 if (g_taskManager.taskArray[i] != NULL) {
121 if (g_taskManager.taskArray[i]->destroyTask != NULL) {
122 g_taskManager.taskArray[i]->destroyTask(g_taskManager.taskArray[i]);
123 }
124 g_taskManager.taskArray[i] = NULL;
125 }
126 }
127 (void)memset_s(&g_taskManager, sizeof(AccountMultiTaskManager), 0, sizeof(AccountMultiTaskManager));
128 }