• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "adapter/dnetwork_adapter.h"
17 
18 #include <chrono>
19 #include <functional>
20 #include <thread>
21 #include <unistd.h>
22 
23 #include "errors.h"
24 #include "dtbschedmgr_device_info_storage.h"
25 #include "dtbschedmgr_log.h"
26 #include "event_runner.h"
27 
28 namespace OHOS {
29 namespace DistributedSchedule {
30 using namespace std::chrono_literals;
31 using namespace DistributedHardware;
32 
33 namespace {
34 constexpr int32_t RETRY_REGISTER_CALLBACK_TIMES = 5;
35 constexpr int32_t RETRY_REGISTER_CALLBACK_DELAY_TIME = 1000; // 1s
36 const std::string PKG_NAME = "DBinderBus_Dms_" + std::to_string(getpid());
37 
38 constexpr int32_t NON_ANONYMIZED_LENGTH = 6;
39 const std::string EMPTY_DEVICE_ID = "";
40 const std::string TAG = "DnetworkAdapter";
41 }
42 
43 std::shared_ptr<AppExecFwk::EventHandler> DnetworkAdapter::dnetworkHandler_;
44 std::mutex DnetworkAdapter::listenerSetMutex_;
45 std::set<std::shared_ptr<DeviceListener>> DnetworkAdapter::listenerSet_;
46 
GetInstance()47 std::shared_ptr<DnetworkAdapter> DnetworkAdapter::GetInstance()
48 {
49     static auto instance = std::make_shared<DnetworkAdapter>();
50     return instance;
51 }
52 
Init()53 void DnetworkAdapter::Init()
54 {
55     initCallback_ = std::make_shared<DeviceInitCallBack>();
56     stateCallback_ = std::make_shared<DmsDeviceStateCallback>();
57     auto runner = AppExecFwk::EventRunner::Create("dmsDnetwork");
58     dnetworkHandler_ = std::make_shared<AppExecFwk::EventHandler>(runner);
59 }
60 
OnRemoteDied()61 void DnetworkAdapter::DeviceInitCallBack::OnRemoteDied()
62 {
63     HILOGI("DeviceInitCallBack OnRemoteDied");
64     DtbschedmgrDeviceInfoStorage::GetInstance().Init();
65 }
66 
OnDeviceOnline(const DmDeviceInfo & deviceInfo)67 void DnetworkAdapter::DmsDeviceStateCallback::OnDeviceOnline(const DmDeviceInfo& deviceInfo)
68 {
69     std::string networkId = deviceInfo.networkId;
70     HILOGI("OnNodeOnline netwokId = %{public}s", AnonymizeNetworkId(networkId).c_str());
71     auto onlineNotifyTask = [deviceInfo]() {
72         std::lock_guard<std::mutex> autoLock(listenerSetMutex_);
73         for (auto& listener : listenerSet_) {
74             listener->OnDeviceOnline(deviceInfo);
75         }
76     };
77     if (!dnetworkHandler_->PostTask(onlineNotifyTask)) {
78         HILOGE("OnNodeOnline post task failed");
79         return;
80     }
81 }
82 
OnDeviceOffline(const DmDeviceInfo & deviceInfo)83 void DnetworkAdapter::DmsDeviceStateCallback::OnDeviceOffline(const DmDeviceInfo& deviceInfo)
84 {
85     HILOGI("OnNodeOffline networkId = %{public}s", AnonymizeNetworkId(deviceInfo.networkId).c_str());
86     auto offlineNotifyTask = [deviceInfo]() {
87         std::lock_guard<std::mutex> autoLock(listenerSetMutex_);
88         for (auto& listener : listenerSet_) {
89             listener->OnDeviceOffline(deviceInfo);
90         }
91     };
92     if (!dnetworkHandler_->PostTask(offlineNotifyTask)) {
93         HILOGE("OnNodeOffline post task failed");
94         return;
95     }
96 }
97 
OnDeviceChanged(const DmDeviceInfo & deviceInfo)98 void DnetworkAdapter::DmsDeviceStateCallback::OnDeviceChanged(const DmDeviceInfo& deviceInfo)
99 {
100     HILOGI("called");
101     std::string networkId = deviceInfo.networkId;
102     HILOGI("OnDeviceChanged netwokId = %{public}s", AnonymizeNetworkId(networkId).c_str());
103     auto onlineNotifyTask = [deviceInfo]() {
104         std::lock_guard<std::mutex> autoLock(listenerSetMutex_);
105         for (auto& listener : listenerSet_) {
106             listener->OnDeviceOnline(deviceInfo);
107         }
108     };
109     if (!dnetworkHandler_->PostTask(onlineNotifyTask)) {
110         HILOGE("OnNodeOnline post task failed");
111         return;
112     }
113 }
114 
OnDeviceReady(const DmDeviceInfo & deviceInfo)115 void DnetworkAdapter::DmsDeviceStateCallback::OnDeviceReady(const DmDeviceInfo& deviceInfo)
116 {
117     HILOGD("called");
118 }
119 
AddDeviceChangeListener(const std::shared_ptr<DeviceListener> & listener)120 bool DnetworkAdapter::AddDeviceChangeListener(const std::shared_ptr<DeviceListener>& listener)
121 {
122     HILOGD("AddDeviceChangeListener called");
123     if (dnetworkHandler_ == nullptr) {
124         HILOGE("handler is null");
125         return false;
126     }
127     {
128         std::lock_guard<std::mutex> autoLock(listenerSetMutex_);
129         if (listenerSet_.find(listener) == listenerSet_.end()) {
130             listenerSet_.insert(listener);
131         }
132         if (listenerSet_.size() > 1) {
133             return true;
134         }
135     }
136     auto registerTask = [this]() {
137         HILOGD("AddDeviceChangeListener register mission...");
138         int32_t retryTimes = 0;
139         int32_t errCode = ERR_OK;
140         while (retryTimes++ < RETRY_REGISTER_CALLBACK_TIMES) {
141             int32_t ret = DeviceManager::GetInstance().InitDeviceManager(PKG_NAME, initCallback_);
142             if (ret != ERR_OK) {
143                 HILOGE("init device manager failed, ret:%{public}d", ret);
144                 std::this_thread::sleep_for(std::chrono::milliseconds(RETRY_REGISTER_CALLBACK_DELAY_TIME));
145                 continue;
146             }
147             errCode = DeviceManager::GetInstance().RegisterDevStateCallback(PKG_NAME, "", stateCallback_);
148             if (errCode != ERR_OK) {
149                 HILOGD("AddDeviceChangeListener Reg errCode = %{public}d, retrying...", errCode);
150                 errCode = DeviceManager::GetInstance().UnRegisterDevStateCallback(PKG_NAME);
151                 HILOGD("AddDeviceChangeListener Unreg errCode = %{public}d", errCode);
152                 std::this_thread::sleep_for(std::chrono::milliseconds(RETRY_REGISTER_CALLBACK_DELAY_TIME));
153                 continue;
154             }
155             if (UpdateDeviceInfoStorage()) {
156                 break;
157             }
158         }
159         HILOGI("AddDeviceChangeListener %{public}s", (errCode == ERR_OK) ? "success" : "timeout");
160     };
161     if (!dnetworkHandler_->PostTask(registerTask)) {
162         HILOGE("AddDeviceChangeListener post task failed");
163         return false;
164     }
165     return true;
166 }
167 
UpdateDeviceInfoStorage()168 bool DnetworkAdapter::UpdateDeviceInfoStorage()
169 {
170     std::vector<DistributedHardware::DmDeviceInfo> dmDeviceInfoList;
171     int32_t errCode = DeviceManager::GetInstance().GetTrustedDeviceList(PKG_NAME, "", dmDeviceInfoList);
172     if (errCode != ERR_OK) {
173         HILOGE("GetTrustedDeviceList failed, errCode = %{public}d", errCode);
174         return false;
175     }
176     DtbschedmgrDeviceInfoStorage::GetInstance().UpdateDeviceInfoStorage(dmDeviceInfoList);
177     HILOGI("UpdateDeviceInfoStorage success");
178     return true;
179 }
180 
RemoveDeviceChangeListener(const std::shared_ptr<DeviceListener> & listener)181 void DnetworkAdapter::RemoveDeviceChangeListener(const std::shared_ptr<DeviceListener>& listener)
182 {
183     HILOGD("RemoveDeviceChangeListener called");
184     {
185         std::lock_guard<std::mutex> autoLock(listenerSetMutex_);
186         listenerSet_.erase(listener);
187         if (listenerSet_.size() > 0) {
188             return;
189         }
190     }
191 
192     int32_t errCode = DeviceManager::GetInstance().UnRegisterDevStateCallback(PKG_NAME);
193     if (errCode != ERR_OK) {
194         HILOGE("RemoveDeviceChangeListener remove failed, errCode = %{public}d", errCode);
195     }
196     HILOGD("RemoveDeviceChangeListener remove ok");
197 }
198 
GetLocalBasicInfo(DmDeviceInfo & dmDeviceInfo)199 bool DnetworkAdapter::GetLocalBasicInfo(DmDeviceInfo& dmDeviceInfo)
200 {
201     int32_t errCode = DeviceManager::GetInstance().GetLocalDeviceInfo(PKG_NAME, dmDeviceInfo);
202     if (errCode != ERR_OK) {
203         HILOGE("GetLocalBasicInfo errCode = %{public}d", errCode);
204         return false;
205     }
206     return true;
207 }
208 
GetUdidByNetworkId(const std::string & networkId)209 std::string DnetworkAdapter::GetUdidByNetworkId(const std::string& networkId)
210 {
211     if (networkId.empty()) {
212         HILOGE("networkId is empty");
213         return "";
214     }
215     std::string udid = "";
216     int32_t errCode = DeviceManager::GetInstance().GetUdidByNetworkId(PKG_NAME, networkId, udid);
217     if (errCode != ERR_OK) {
218         HILOGE("GetUdidByNetworkId errCode = %{public}d", errCode);
219         return "";
220     }
221     return udid;
222 }
223 
GetUuidByNetworkId(const std::string & networkId)224 std::string DnetworkAdapter::GetUuidByNetworkId(const std::string& networkId)
225 {
226     if (networkId.empty()) {
227         HILOGE("networkId is empty");
228         return "";
229     }
230     std::string uuid = "";
231     int32_t errCode = DeviceManager::GetInstance().GetUuidByNetworkId(PKG_NAME, networkId, uuid);
232     if (errCode != ERR_OK) {
233         HILOGE("GetUuidByNetworkId errCode = %{public}d", errCode);
234         return "";
235     }
236     return uuid;
237 }
238 
AnonymizeNetworkId(const std::string & networkId)239 std::string DnetworkAdapter::AnonymizeNetworkId(const std::string& networkId)
240 {
241     if (networkId.length() < NON_ANONYMIZED_LENGTH) {
242         return EMPTY_DEVICE_ID;
243     }
244     std::string anonNetworkId = networkId.substr(0, NON_ANONYMIZED_LENGTH);
245     anonNetworkId.append("******");
246     return anonNetworkId;
247 }
248 } // namespace DistributedSchedule
249 } // namespace OHOS
250