1 /*
2 * Copyright (c) 2021-2024 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 "online_task.h"
17
18 #include "anonymous_string.h"
19 #include "capability_info_manager.h"
20 #include "device_manager.h"
21 #include "dh_utils_tool.h"
22 #include "distributed_hardware_errno.h"
23 #include "distributed_hardware_log.h"
24 #include "local_capability_info_manager.h"
25 #include "meta_info_manager.h"
26 #include "task_board.h"
27 #include "task_executor.h"
28 #include "task_factory.h"
29 #include "version_info_manager.h"
30
31 namespace OHOS {
32 namespace DistributedHardware {
33 #undef DH_LOG_TAG
34 #define DH_LOG_TAG "OnLineTask"
35
OnLineTask(const std::string & networkId,const std::string & uuid,const std::string & udid,const std::string & dhId,const DHType dhType)36 OnLineTask::OnLineTask(const std::string &networkId, const std::string &uuid, const std::string &udid,
37 const std::string &dhId, const DHType dhType) : Task(networkId, uuid, udid, dhId, dhType)
38 {
39 SetTaskType(TaskType::ON_LINE);
40 SetTaskSteps(std::vector<TaskStep> { TaskStep::SYNC_ONLINE_INFO, TaskStep::REGISTER_ONLINE_DISTRIBUTED_HARDWARE,
41 TaskStep::META_ENABLE_TASK});
42 DHLOGD("OnLineTask id: %{public}s, networkId: %{public}s, uuid: %{public}s, udid: %{public}s",
43 GetId().c_str(), GetAnonyString(networkId).c_str(), GetAnonyString(uuid).c_str(),
44 GetAnonyString(udid).c_str());
45 }
46
~OnLineTask()47 OnLineTask::~OnLineTask()
48 {
49 DHLOGD("id = %{public}s, uuid = %{public}s", GetId().c_str(), GetAnonyString(GetUUID()).c_str());
50 }
51
DoTask()52 void OnLineTask::DoTask()
53 {
54 DHLOGD("start online task, id = %{public}s, networkId: %{public}s, uuid: %{public}s, udid: %{public}s",
55 GetId().c_str(), GetAnonyString(GetNetworkId()).c_str(), GetAnonyString(GetUUID()).c_str(),
56 GetAnonyString(GetUDID()).c_str());
57 this->SetTaskState(TaskState::RUNNING);
58 for (const auto& step : this->GetTaskSteps()) {
59 switch (step) {
60 case TaskStep::SYNC_ONLINE_INFO: {
61 DoSyncInfo();
62 break;
63 }
64 case TaskStep::REGISTER_ONLINE_DISTRIBUTED_HARDWARE: {
65 CreateEnableTask();
66 break;
67 }
68 case TaskStep::META_ENABLE_TASK: {
69 CreateMetaEnableTask();
70 break;
71 }
72 default: {
73 break;
74 }
75 }
76 }
77 SetTaskState(TaskState::SUCCESS);
78 DHLOGD("finish online task, remove it, id = %{public}s.", GetId().c_str());
79 TaskBoard::GetInstance().RemoveTask(this->GetId());
80 }
81
DoSyncInfo()82 void OnLineTask::DoSyncInfo()
83 {
84 std::string deviceId = GetDeviceIdByUUID(GetUUID());
85 std::string udidHash = Sha256(GetUDID());
86 DHLOGI("DoSyncInfo, networkId: %{public}s, deviceId: %{public}s, uuid: %{public}s,"
87 "udid: %{public}s, udidHash: %{public}s", GetAnonyString(GetNetworkId()).c_str(),
88 GetAnonyString(deviceId).c_str(), GetAnonyString(GetUUID()).c_str(), GetAnonyString(GetUDID()).c_str(),
89 GetAnonyString(udidHash).c_str());
90 auto ret = LocalCapabilityInfoManager::GetInstance()->SyncDeviceInfoFromDB(deviceId);
91 if (ret != DH_FWK_SUCCESS) {
92 DHLOGE("SyncLocalCapabilityInfoFromDB failed, deviceId = %{public}s, errCode = %{public}d",
93 GetAnonyString(deviceId).c_str(), ret);
94 }
95
96 ret = MetaInfoManager::GetInstance()->SyncMetaInfoFromDB(udidHash);
97 if (ret != DH_FWK_SUCCESS) {
98 DHLOGE("SyncMetaInfoFromDB failed, udidHash = %{public}s, errCode = %{public}d",
99 GetAnonyString(udidHash).c_str(), ret);
100 }
101 }
102
CreateEnableTask()103 void OnLineTask::CreateEnableTask()
104 {
105 DHLOGI("CreateEnableTask, networkId: %{public}s, uuid: %{public}s, udid: %{public}s",
106 GetAnonyString(GetNetworkId()).c_str(), GetAnonyString(GetUUID()).c_str(), GetAnonyString(GetUDID()).c_str());
107 std::string deviceId = GetDeviceIdByUUID(GetUUID());
108 std::vector<std::pair<std::string, DHType>> devDhInfos;
109 std::vector<std::shared_ptr<CapabilityInfo>> capabilityInfos;
110 CapabilityInfoManager::GetInstance()->GetCapabilitiesByDeviceId(deviceId, capabilityInfos);
111 std::for_each(capabilityInfos.begin(), capabilityInfos.end(), [&](std::shared_ptr<CapabilityInfo> cap) {
112 devDhInfos.push_back({cap->GetDHId(), cap->GetDHType()});
113 });
114
115 if (devDhInfos.empty()) {
116 DHLOGW("Can not get cap info from CapabilityInfo, try use local Capability info");
117 LocalCapabilityInfoManager::GetInstance()->GetCapabilitiesByDeviceId(deviceId, capabilityInfos);
118 std::for_each(capabilityInfos.begin(), capabilityInfos.end(), [&](std::shared_ptr<CapabilityInfo> cap) {
119 devDhInfos.push_back({cap->GetDHId(), cap->GetDHType()});
120 });
121 }
122
123 if (devDhInfos.empty()) {
124 DHLOGW("Can not get cap info from local Capbility, try use meta info");
125 std::string udidHash = Sha256(GetUDID());
126 std::vector<std::shared_ptr<MetaCapabilityInfo>> metaCapInfos;
127 MetaInfoManager::GetInstance()->GetMetaCapInfosByUdidHash(udidHash, metaCapInfos);
128 std::for_each(metaCapInfos.begin(), metaCapInfos.end(), [&](std::shared_ptr<MetaCapabilityInfo> cap) {
129 devDhInfos.push_back({cap->GetDHId(), cap->GetDHType()});
130 });
131 }
132
133 if (devDhInfos.empty()) {
134 DHLOGE("Can not get cap info, uuid = %{public}s, deviceId = %{public}s", GetAnonyString(GetUUID()).c_str(),
135 GetAnonyString(deviceId).c_str());
136 }
137
138 for (const auto &info : devDhInfos) {
139 TaskParam taskParam = {
140 .networkId = GetNetworkId(),
141 .uuid = GetUUID(),
142 .udid = GetUDID(),
143 .dhId = info.first,
144 .dhType = info.second
145 };
146 auto task = TaskFactory::GetInstance().CreateTask(TaskType::ENABLE, taskParam, shared_from_this());
147 TaskExecutor::GetInstance().PushTask(task);
148 }
149 }
150
CreateMetaEnableTask()151 void OnLineTask::CreateMetaEnableTask()
152 {
153 DHLOGI("CreateMetaEnableTask, networkId: %{public}s, uuid: %{public}s, udid: %{public}s",
154 GetAnonyString(GetNetworkId()).c_str(), GetAnonyString(GetUUID()).c_str(), GetAnonyString(GetUDID()).c_str());
155 int32_t deviceType = DmDeviceType::DEVICE_TYPE_UNKNOWN;
156 DeviceManager::GetInstance().GetDeviceType(DH_FWK_PKG_NAME, GetNetworkId(), deviceType);
157 if (deviceType != DmDeviceType::DEVICE_TYPE_PHONE) {
158 DHLOGI("CreateMetaEnableTask, online device not phone, deviceType = %{public}d", deviceType);
159 return;
160 }
161 TaskParam taskParam = {
162 .networkId = GetNetworkId(),
163 .uuid = GetUUID(),
164 .udid = GetUDID(),
165 .dhId = GetDhId(),
166 .dhType = GetDhType()
167 };
168 auto task = TaskFactory::GetInstance().CreateTask(TaskType::META_ENABLE, taskParam, shared_from_this());
169 TaskExecutor::GetInstance().PushTask(task);
170 }
171 } // namespace DistributedHardware
172 } // namespace OHOS
173