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 #define LOG_TAG "DeviceManagerAdapter"
17 #include "device_manager_adapter.h"
18 
19 #include <thread>
20 
21 #include "kvstore_utils.h"
22 #include "log_print.h"
23 #include "net_conn_callback_stub.h"
24 #include "net_conn_client.h"
25 #include "net_handle.h"
26 #include "serializable/serializable.h"
27 
28 namespace OHOS::DistributedData {
29 using namespace OHOS::DistributedHardware;
30 using namespace OHOS::AppDistributedKv;
31 using namespace OHOS::NetManagerStandard;
32 using KvStoreUtils = OHOS::DistributedKv::KvStoreUtils;
33 constexpr int32_t DM_OK = 0;
34 constexpr const char *PKG_NAME = "ohos.distributeddata.service";
Convert(NetManagerStandard::NetBearType bearType)35 static DeviceManagerAdapter::NetworkType Convert(NetManagerStandard::NetBearType bearType)
36 {
37     switch (bearType) {
38         case NetManagerStandard::BEARER_WIFI:
39             return DeviceManagerAdapter::WIFI;
40         case NetManagerStandard::BEARER_CELLULAR:
41             return DeviceManagerAdapter::CELLULAR;
42         case NetManagerStandard::BEARER_ETHERNET:
43             return DeviceManagerAdapter::ETHERNET;
44         default:
45             return DeviceManagerAdapter::OTHER;
46     }
47 }
48 class DataMgrDmStateCall final : public DistributedHardware::DeviceStateCallback {
49 public:
DataMgrDmStateCall(DeviceManagerAdapter & dmAdapter)50     explicit DataMgrDmStateCall(DeviceManagerAdapter &dmAdapter) : dmAdapter_(dmAdapter) {}
51     void OnDeviceOnline(const DmDeviceInfo &info) override;
52     void OnDeviceOffline(const DmDeviceInfo &info) override;
53     void OnDeviceChanged(const DmDeviceInfo &info) override;
54     void OnDeviceReady(const DmDeviceInfo &info) override;
55 
56 private:
57     DeviceManagerAdapter &dmAdapter_;
58 };
59 
OnDeviceOnline(const DmDeviceInfo & info)60 void DataMgrDmStateCall::OnDeviceOnline(const DmDeviceInfo &info)
61 {
62     dmAdapter_.Online(info);
63 }
64 
OnDeviceOffline(const DmDeviceInfo & info)65 void DataMgrDmStateCall::OnDeviceOffline(const DmDeviceInfo &info)
66 {
67     dmAdapter_.Offline(info);
68 }
69 
OnDeviceChanged(const DmDeviceInfo & info)70 void DataMgrDmStateCall::OnDeviceChanged(const DmDeviceInfo &info)
71 {
72     dmAdapter_.OnChanged(info);
73 }
74 
OnDeviceReady(const DmDeviceInfo & info)75 void DataMgrDmStateCall::OnDeviceReady(const DmDeviceInfo &info)
76 {
77     dmAdapter_.OnReady(info);
78 }
79 
80 class DataMgrDmInitCall final : public DistributedHardware::DmInitCallback {
81 public:
DataMgrDmInitCall(DeviceManagerAdapter & dmAdapter,std::shared_ptr<ExecutorPool> executors)82     explicit DataMgrDmInitCall(DeviceManagerAdapter &dmAdapter, std::shared_ptr<ExecutorPool> executors)
83         : dmAdapter_(dmAdapter), executors_(executors) {}
84     void OnRemoteDied() override;
85 
86 private:
87     DeviceManagerAdapter &dmAdapter_;
88     std::shared_ptr<ExecutorPool> executors_;
89 };
90 
OnRemoteDied()91 void DataMgrDmInitCall::OnRemoteDied()
92 {
93     ZLOGI("device manager died, init again");
94     dmAdapter_.Init(executors_);
95 }
96 
97 class NetConnCallbackObserver : public NetConnCallbackStub {
98 public:
NetConnCallbackObserver(DeviceManagerAdapter & dmAdapter)99     explicit NetConnCallbackObserver(DeviceManagerAdapter &dmAdapter) : dmAdapter_(dmAdapter) {}
100     ~NetConnCallbackObserver() override = default;
101     int32_t NetAvailable(sptr<NetHandle> &netHandle) override;
102     int32_t NetCapabilitiesChange(sptr<NetHandle> &netHandle, const sptr<NetAllCapabilities> &netAllCap) override;
103     int32_t NetConnectionPropertiesChange(sptr<NetHandle> &netHandle, const sptr<NetLinkInfo> &info) override;
104     int32_t NetLost(sptr<NetHandle> &netHandle) override;
105     int32_t NetUnavailable() override;
106     int32_t NetBlockStatusChange(sptr<NetHandle> &netHandle, bool blocked) override;
107 
108 private:
109     DeviceManagerAdapter &dmAdapter_;
110 };
111 
NetAvailable(sptr<NetManagerStandard::NetHandle> & netHandle)112 int32_t NetConnCallbackObserver::NetAvailable(sptr<NetManagerStandard::NetHandle> &netHandle)
113 {
114     ZLOGI("OnNetworkAvailable");
115     return DistributedKv::SUCCESS;
116 }
117 
NetUnavailable()118 int32_t NetConnCallbackObserver::NetUnavailable()
119 {
120     ZLOGI("OnNetworkUnavailable");
121     dmAdapter_.SetNet(DeviceManagerAdapter::NONE);
122     return 0;
123 }
124 
NetCapabilitiesChange(sptr<NetHandle> & netHandle,const sptr<NetAllCapabilities> & netAllCap)125 int32_t NetConnCallbackObserver::NetCapabilitiesChange(sptr<NetHandle> &netHandle,
126     const sptr<NetAllCapabilities> &netAllCap)
127 {
128     ZLOGI("OnNetCapabilitiesChange");
129     if (netHandle == nullptr || netAllCap == nullptr) {
130         return 0;
131     }
132     if (netAllCap->netCaps_.count(NetManagerStandard::NET_CAPABILITY_VALIDATED) && !netAllCap->bearerTypes_.empty()) {
133         dmAdapter_.SetNet(Convert(*netAllCap->bearerTypes_.begin()));
134     } else {
135         dmAdapter_.SetNet(DeviceManagerAdapter::NONE);
136     }
137     return 0;
138 }
139 
NetConnectionPropertiesChange(sptr<NetHandle> & netHandle,const sptr<NetLinkInfo> & info)140 int32_t NetConnCallbackObserver::NetConnectionPropertiesChange(sptr<NetHandle> &netHandle,
141     const sptr<NetLinkInfo> &info)
142 {
143     ZLOGI("OnNetConnectionPropertiesChange");
144     return 0;
145 }
146 
NetLost(sptr<NetHandle> & netHandle)147 int32_t NetConnCallbackObserver::NetLost(sptr<NetHandle> &netHandle)
148 {
149     ZLOGI("OnNetLost");
150     dmAdapter_.SetNet(DeviceManagerAdapter::NONE);
151     return 0;
152 }
153 
NetBlockStatusChange(sptr<NetHandle> & netHandle,bool blocked)154 int32_t NetConnCallbackObserver::NetBlockStatusChange(sptr<NetHandle> &netHandle, bool blocked)
155 {
156     ZLOGI("OnNetBlockStatusChange");
157     return 0;
158 }
159 
160 struct DeviceExtraInfo final : public Serializable {
161     static constexpr int32_t OH_OS_TYPE = 10;
162 
163     int32_t OS_TYPE = OH_OS_TYPE;
164 
DeviceExtraInfoOHOS::DistributedData::DeviceExtraInfo165     DeviceExtraInfo() {};
~DeviceExtraInfoOHOS::DistributedData::DeviceExtraInfo166     ~DeviceExtraInfo() {};
MarshalOHOS::DistributedData::DeviceExtraInfo167     bool Marshal(json &node) const override
168     {
169         return SetValue(node[GET_NAME(OS_TYPE)], OS_TYPE);
170     };
UnmarshalOHOS::DistributedData::DeviceExtraInfo171     bool Unmarshal(const json &node) override
172     {
173         return GetValue(node, GET_NAME(OS_TYPE), OS_TYPE);
174     };
175 };
176 
DeviceManagerAdapter()177 DeviceManagerAdapter::DeviceManagerAdapter()
178     : cloudDmInfo({ "cloudDeviceId", "cloudDeviceName", 0, "cloudNetworkId", 0 })
179 {
180     ZLOGI("construct");
181 }
182 
~DeviceManagerAdapter()183 DeviceManagerAdapter::~DeviceManagerAdapter()
184 {
185     ZLOGI("Destruct");
186 }
187 
GetInstance()188 DeviceManagerAdapter &DeviceManagerAdapter::GetInstance()
189 {
190     static DeviceManagerAdapter dmAdapter;
191     return dmAdapter;
192 }
193 
Init(std::shared_ptr<ExecutorPool> executors)194 void DeviceManagerAdapter::Init(std::shared_ptr<ExecutorPool> executors)
195 {
196     ZLOGI("begin");
197     if (executors_ == nullptr) {
198         executors_ = std::move(executors);
199     }
200     RegDevCallback()();
201 }
202 
RegDevCallback()203 std::function<void()> DeviceManagerAdapter::RegDevCallback()
204 {
205     return [this]() {
206         auto &devManager = DeviceManager::GetInstance();
207         auto dmStateCall = std::make_shared<DataMgrDmStateCall>(*this);
208         auto dmInitCall = std::make_shared<DataMgrDmInitCall>(*this, executors_);
209         auto resultInit = devManager.InitDeviceManager(PKG_NAME, dmInitCall);
210         auto resultState = devManager.RegisterDevStateCallback(PKG_NAME, "", dmStateCall);
211         auto resultNet = RegOnNetworkChange();
212         if (resultInit == DM_OK && resultState == DM_OK && resultNet) {
213             InitDeviceInfo(false);
214             return;
215         }
216         constexpr int32_t INTERVAL = 500;
217         executors_->Schedule(std::chrono::milliseconds(INTERVAL), RegDevCallback());
218     };
219 }
220 
StartWatchDeviceChange(const AppDeviceChangeListener * observer,const PipeInfo & pipeInfo)221 Status DeviceManagerAdapter::StartWatchDeviceChange(const AppDeviceChangeListener *observer,
222     __attribute__((unused)) const PipeInfo &pipeInfo)
223 {
224     if (observer == nullptr) {
225         ZLOGE("observer is nullptr");
226         return Status::INVALID_ARGUMENT;
227     }
228     if (!observers_.Insert(observer, observer)) {
229         ZLOGE("insert observer fail");
230         return Status::ERROR;
231     }
232     return Status::SUCCESS;
233 }
234 
StopWatchDeviceChange(const AppDeviceChangeListener * observer,const PipeInfo & pipeInfo)235 Status DeviceManagerAdapter::StopWatchDeviceChange(const AppDeviceChangeListener *observer,
236     __attribute__((unused)) const PipeInfo &pipeInfo)
237 {
238     if (observer == nullptr) {
239         ZLOGE("observer is nullptr");
240         return Status::INVALID_ARGUMENT;
241     }
242     if (!observers_.Erase(observer)) {
243         ZLOGE("erase observer fail");
244         return Status::ERROR;
245     }
246     return Status::SUCCESS;
247 }
248 
Online(const DmDeviceInfo & info)249 void DeviceManagerAdapter::Online(const DmDeviceInfo &info)
250 {
251     DeviceInfo dvInfo;
252     if (!GetDeviceInfo(info, dvInfo)) {
253         ZLOGE("get device info fail");
254         return;
255     }
256     ZLOGI("[online] uuid:%{public}s, name:%{public}s, type:%{public}d, authForm:%{public}d, osType:%{public}d",
257         KvStoreUtils::ToBeAnonymous(dvInfo.uuid).c_str(), dvInfo.deviceName.c_str(), dvInfo.deviceType,
258         static_cast<int32_t>(dvInfo.authForm), dvInfo.osType);
259     SaveDeviceInfo(dvInfo, DeviceChangeType::DEVICE_ONLINE);
260     syncTask_.Insert(dvInfo.uuid, dvInfo.uuid);
261     auto observers = GetObservers();
262     for (const auto &item : observers) { // notify db
263         if (item == nullptr) {
264             continue;
265         }
266         if (item->GetChangeLevelType() == ChangeLevelType::HIGH) {
267             item->OnDeviceChanged(dvInfo, DeviceChangeType::DEVICE_OFFLINE);
268             item->OnDeviceChanged(dvInfo, DeviceChangeType::DEVICE_ONLINE);
269         }
270     }
271     for (const auto &item : observers) { // judge water version, get device security level
272         if (item == nullptr) {
273             continue;
274         }
275         if (item->GetChangeLevelType() == ChangeLevelType::LOW) {
276             item->OnDeviceChanged(dvInfo, DeviceChangeType::DEVICE_ONLINE);
277         }
278     }
279     for (const auto &item : observers) { // set compatible identify, sync service meta
280         if (item == nullptr) {
281             continue;
282         }
283         if (item->GetChangeLevelType() == ChangeLevelType::MIN) {
284             item->OnDeviceChanged(dvInfo, DeviceChangeType::DEVICE_ONLINE);
285         }
286     }
287 }
288 
NotifyReadyEvent(const std::string & uuid)289 void DeviceManagerAdapter::NotifyReadyEvent(const std::string &uuid)
290 {
291     if (uuid.empty() || !syncTask_.Contains(uuid)) {
292         return;
293     }
294 
295     syncTask_.Erase(uuid);
296     if (uuid == CLOUD_DEVICE_UUID) {
297         return;
298     }
299     ZLOGI("[NotifyReadyEvent] uuid:%{public}s", KvStoreUtils::ToBeAnonymous(uuid).c_str());
300     std::string event = R"({"extra": {"deviceId":")" + uuid + R"(" } })";
301     DeviceManager::GetInstance().NotifyEvent(PKG_NAME, DmNotifyEvent::DM_NOTIFY_EVENT_ONDEVICEREADY, event);
302 }
303 
GetObservers()304 std::vector<const AppDeviceChangeListener *> DeviceManagerAdapter::GetObservers()
305 {
306     std::vector<const AppDeviceChangeListener *> observers;
307     observers.reserve(observers_.Size());
308     observers_.ForEach([&observers](const auto &key, auto &value) {
309         observers.emplace_back(value);
310         return false;
311     });
312     return observers;
313 }
314 
Offline(const DmDeviceInfo & info)315 void DeviceManagerAdapter::Offline(const DmDeviceInfo &info)
316 {
317     DeviceInfo dvInfo;
318     if (!GetDeviceInfo(info, dvInfo)) {
319         ZLOGE("get device info fail");
320         return;
321     }
322     syncTask_.Erase(dvInfo.uuid);
323     ZLOGI("[offline] uuid:%{public}s, name:%{public}s, type:%{public}d, authForm:%{public}d, osType:%{public}d",
324         KvStoreUtils::ToBeAnonymous(dvInfo.uuid).c_str(), dvInfo.deviceName.c_str(), dvInfo.deviceType,
325         static_cast<int32_t>(dvInfo.authForm), dvInfo.osType);
326     SaveDeviceInfo(dvInfo, DeviceChangeType::DEVICE_OFFLINE);
327     auto task = [this, dvInfo]() {
328         observers_.ForEachCopies([&dvInfo](const auto &key, auto &value) {
329             if (value != nullptr) {
330                 value->OnDeviceChanged(dvInfo, DeviceChangeType::DEVICE_OFFLINE);
331             }
332             return false;
333         });
334     };
335     executors_->Execute(std::move(task));
336 }
337 
OnChanged(const DmDeviceInfo & info)338 void DeviceManagerAdapter::OnChanged(const DmDeviceInfo &info)
339 {
340     DeviceInfo dvInfo;
341     if (!GetDeviceInfo(info, dvInfo)) {
342         ZLOGE("get device info fail");
343         return;
344     }
345     ZLOGI("[OnChanged] uuid:%{public}s, name:%{public}s, type:%{public}d",
346         KvStoreUtils::ToBeAnonymous(dvInfo.uuid).c_str(), dvInfo.deviceName.c_str(), dvInfo.deviceType);
347 }
348 
OnReady(const DmDeviceInfo & info)349 void DeviceManagerAdapter::OnReady(const DmDeviceInfo &info)
350 {
351     DeviceInfo dvInfo;
352     if (!GetDeviceInfo(info, dvInfo)) {
353         ZLOGE("get device info fail");
354         return;
355     }
356     readyDevices_.InsertOrAssign(dvInfo.uuid, std::make_pair(DeviceState::DEVICE_ONREADY, dvInfo));
357     ZLOGI("[OnReady] uuid:%{public}s, name:%{public}s, type:%{public}d",
358         KvStoreUtils::ToBeAnonymous(dvInfo.uuid).c_str(), dvInfo.deviceName.c_str(), dvInfo.deviceType);
359     auto task = [this, dvInfo]() {
360         observers_.ForEachCopies([&dvInfo](const auto &key, auto &value) {
361             if (value != nullptr) {
362                 value->OnDeviceChanged(dvInfo, DeviceChangeType::DEVICE_ONREADY);
363             }
364             return false;
365         });
366     };
367     executors_->Execute(std::move(task));
368 }
369 
GetDeviceInfo(const DmDeviceInfo & dmInfo,DeviceInfo & dvInfo)370 bool DeviceManagerAdapter::GetDeviceInfo(const DmDeviceInfo &dmInfo, DeviceInfo &dvInfo)
371 {
372     std::string networkId = std::string(dmInfo.networkId);
373     if (networkId.empty()) {
374         return false;
375     }
376     auto uuid = GetUuidByNetworkId(networkId);
377     auto udid = GetUdidByNetworkId(networkId);
378     if (uuid.empty() || udid.empty()) {
379         ZLOGW("uuid or udid empty");
380         return false;
381     }
382     if (uuid == CLOUD_DEVICE_UUID) {
383         dvInfo = { uuid, udid, networkId, std::string(dmInfo.deviceName), dmInfo.deviceTypeId, OH_OS_TYPE,
384             static_cast<int32_t>(dmInfo.authForm)};
385         return true;
386     }
387     DeviceExtraInfo deviceExtraInfo;
388     if (!DistributedData::Serializable::Unmarshall(dmInfo.extraData, deviceExtraInfo)) {
389         ZLOGE("Unmarshall failed, deviceExtraInfo:%{public}s", dmInfo.extraData.c_str());
390         return false;
391     }
392     dvInfo = { uuid, udid, networkId, std::string(dmInfo.deviceName), dmInfo.deviceTypeId, deviceExtraInfo.OS_TYPE,
393         static_cast<int32_t>(dmInfo.authForm)};
394     return true;
395 }
396 
SaveDeviceInfo(const DeviceInfo & dvInfo,const DeviceChangeType & type)397 void DeviceManagerAdapter::SaveDeviceInfo(const DeviceInfo &dvInfo, const DeviceChangeType &type)
398 {
399     if (dvInfo.networkId == DeviceManagerAdapter::cloudDmInfo.networkId) {
400         return;
401     }
402     switch (type) {
403         case DeviceChangeType::DEVICE_ONLINE: {
404             deviceInfos_.Set(dvInfo.networkId, dvInfo);
405             deviceInfos_.Set(dvInfo.uuid, dvInfo);
406             deviceInfos_.Set(dvInfo.udid, dvInfo);
407             readyDevices_.InsertOrAssign(dvInfo.uuid, std::make_pair(DeviceState::DEVICE_ONLINE, dvInfo));
408             break;
409         }
410         case DeviceChangeType::DEVICE_OFFLINE: {
411             deviceInfos_.Delete(dvInfo.networkId);
412             deviceInfos_.Delete(dvInfo.uuid);
413             deviceInfos_.Delete(dvInfo.udid);
414             readyDevices_.Erase(dvInfo.uuid);
415             break;
416         }
417         default: {
418             ZLOGW("unknown type.");
419             break;
420         }
421     }
422 }
423 
GetLocalDevice()424 DeviceInfo DeviceManagerAdapter::GetLocalDevice()
425 {
426     std::lock_guard<decltype(devInfoMutex_)> lock(devInfoMutex_);
427     if (!localInfo_.uuid.empty() && !localInfo_.udid.empty()) {
428         return localInfo_;
429     }
430     localInfo_ = GetLocalDeviceInfo();
431     return localInfo_;
432 }
433 
GetRemoteDevices()434 std::vector<DeviceInfo> DeviceManagerAdapter::GetRemoteDevices()
435 {
436     std::vector<DmDeviceInfo> dmInfos;
437     auto ret = DeviceManager::GetInstance().GetTrustedDeviceList(PKG_NAME, "", dmInfos);
438     if (ret != DM_OK) {
439         ZLOGE("get trusted device:%{public}d", ret);
440         return {};
441     }
442 
443     std::vector<DeviceInfo> dvInfos;
444     for (const auto &dmInfo : dmInfos) {
445         auto networkId = std::string(dmInfo.networkId);
446         auto uuid = GetUuidByNetworkId(networkId);
447         auto udid = GetUdidByNetworkId(networkId);
448         DeviceExtraInfo deviceExtraInfo;
449         if (!DistributedData::Serializable::Unmarshall(dmInfo.extraData, deviceExtraInfo)) {
450             ZLOGE("Unmarshall failed, deviceExtraInfo:%{public}s", dmInfo.extraData.c_str());
451             continue;
452         }
453         DeviceInfo dvInfo = { std::move(uuid), std::move(udid), std::move(networkId),
454                               std::string(dmInfo.deviceName), dmInfo.deviceTypeId, deviceExtraInfo.OS_TYPE,
455                               static_cast<int32_t>(dmInfo.authForm) };
456         dvInfos.emplace_back(std::move(dvInfo));
457     }
458     return dvInfos;
459 }
460 
GetOnlineDevices()461 std::vector<DeviceInfo> DeviceManagerAdapter::GetOnlineDevices()
462 {
463     std::vector<DeviceInfo> devices;
464     devices.reserve(readyDevices_.Size());
465     readyDevices_.ForEach([&devices](auto &, auto &info) {
466         devices.push_back(info.second);
467         return false;
468     });
469     return devices;
470 }
471 
IsDeviceReady(const std::string & id)472 bool DeviceManagerAdapter::IsDeviceReady(const std::string& id)
473 {
474     auto it = readyDevices_.Find(id);
475     return (it.first && it.second.first == DeviceState::DEVICE_ONREADY);
476 }
477 
IsOHOSType(const std::string & id)478 bool DeviceManagerAdapter::IsOHOSType(const std::string &id)
479 {
480     DeviceInfo dvInfo;
481     if (!deviceInfos_.Get(id, dvInfo)) {
482         InitDeviceInfo();
483         deviceInfos_.Get(id, dvInfo);
484     }
485     return dvInfo.osType == OH_OS_TYPE;
486 }
487 
GetAuthType(const std::string & id)488 int32_t DeviceManagerAdapter::GetAuthType(const std::string &id)
489 {
490     DeviceInfo dvInfo;
491     if (!deviceInfos_.Get(id, dvInfo)) {
492         InitDeviceInfo();
493         deviceInfos_.Get(id, dvInfo);
494     }
495     return static_cast<int32_t>(dvInfo.authForm);
496 }
497 
GetOnlineSize()498 size_t DeviceManagerAdapter::GetOnlineSize()
499 {
500     return readyDevices_.Size();
501 }
502 
GetDeviceInfo(const std::string & id)503 DeviceInfo DeviceManagerAdapter::GetDeviceInfo(const std::string &id)
504 {
505     return GetDeviceInfoFromCache(id);
506 }
507 
GetDeviceInfoFromCache(const std::string & id)508 DeviceInfo DeviceManagerAdapter::GetDeviceInfoFromCache(const std::string &id)
509 {
510     DeviceInfo dvInfo;
511     if (!deviceInfos_.Get(id, dvInfo)) {
512         InitDeviceInfo();
513         deviceInfos_.Get(id, dvInfo);
514     }
515     if (dvInfo.uuid.empty()) {
516         ZLOGE("invalid id:%{public}s", KvStoreUtils::ToBeAnonymous(id).c_str());
517     }
518     return dvInfo;
519 }
520 
InitDeviceInfo(bool onlyCache)521 void DeviceManagerAdapter::InitDeviceInfo(bool onlyCache)
522 {
523     std::vector<DeviceInfo> dvInfos = GetRemoteDevices();
524     if (dvInfos.empty()) {
525         ZLOGW("there is no trusted device!");
526     }
527     if (!onlyCache) {
528         readyDevices_.Clear();
529     }
530     for (const auto &info : dvInfos) {
531         if (info.networkId.empty() || info.uuid.empty() || info.udid.empty()) {
532             ZLOGE("networkId:%{public}s, uuid:%{public}d, udid:%{public}d",
533                 KvStoreUtils::ToBeAnonymous(info.networkId).c_str(), info.uuid.empty(), info.udid.empty());
534             continue;
535         }
536         deviceInfos_.Set(info.networkId, info);
537         deviceInfos_.Set(info.uuid, info);
538         deviceInfos_.Set(info.udid, info);
539         if (!onlyCache) {
540             readyDevices_.InsertOrAssign(info.uuid, std::make_pair(DeviceState::DEVICE_ONREADY, info));
541         }
542     }
543     auto local = GetLocalDeviceInfo();
544     deviceInfos_.Set(local.networkId, local);
545     deviceInfos_.Set(local.uuid, local);
546     deviceInfos_.Set(local.udid, local);
547 }
548 
GetLocalDeviceInfo()549 DeviceInfo DeviceManagerAdapter::GetLocalDeviceInfo()
550 {
551     DmDeviceInfo info;
552     auto ret = DeviceManager::GetInstance().GetLocalDeviceInfo(PKG_NAME, info);
553     if (ret != DM_OK) {
554         ZLOGE("get local device info fail");
555         return {};
556     }
557     auto networkId = std::string(info.networkId);
558     auto uuid = GetUuidByNetworkId(networkId);
559     auto udid = GetUdidByNetworkId(networkId);
560     if (uuid.empty()) {
561         return {};
562     }
563     DeviceExtraInfo deviceExtraInfo;
564     if (!DistributedData::Serializable::Unmarshall(info.extraData, deviceExtraInfo)) {
565         ZLOGE("Unmarshall failed, deviceExtraInfo:%{public}s", info.extraData.c_str());
566         return {};
567     }
568     ZLOGI("[LocalDevice] uuid:%{public}s, name:%{public}s, type:%{public}d, osType:%{public}d",
569         KvStoreUtils::ToBeAnonymous(uuid).c_str(), info.deviceName, info.deviceTypeId, deviceExtraInfo.OS_TYPE);
570     return { std::move(uuid), std::move(udid), std::move(networkId), std::string(info.deviceName), info.deviceTypeId,
571         deviceExtraInfo.OS_TYPE, static_cast<int32_t>(info.authForm) };
572 }
573 
GetUuidByNetworkId(const std::string & networkId)574 std::string DeviceManagerAdapter::GetUuidByNetworkId(const std::string &networkId)
575 {
576     if (networkId.empty()) {
577         return "";
578     }
579     if (networkId == DeviceManagerAdapter::cloudDmInfo.networkId) {
580         return CLOUD_DEVICE_UUID;
581     }
582     DeviceInfo dvInfo;
583     if (deviceInfos_.Get(networkId, dvInfo)) {
584         return dvInfo.uuid;
585     }
586     std::string uuid;
587     auto ret = DeviceManager::GetInstance().GetUuidByNetworkId(PKG_NAME, networkId, uuid);
588     if (ret != DM_OK || uuid.empty()) {
589         ZLOGE("failed, result:%{public}d, networkId:%{public}s", ret, KvStoreUtils::ToBeAnonymous(networkId).c_str());
590         return "";
591     }
592     return uuid;
593 }
594 
GetUdidByNetworkId(const std::string & networkId)595 std::string DeviceManagerAdapter::GetUdidByNetworkId(const std::string &networkId)
596 {
597     if (networkId.empty()) {
598         return "";
599     }
600     if (networkId == DeviceManagerAdapter::cloudDmInfo.networkId) {
601         return CLOUD_DEVICE_UDID;
602     }
603     DeviceInfo dvInfo;
604     if (deviceInfos_.Get(networkId, dvInfo)) {
605         return dvInfo.udid;
606     }
607     std::string udid;
608     auto ret = DeviceManager::GetInstance().GetUdidByNetworkId(PKG_NAME, networkId, udid);
609     if (ret != DM_OK || udid.empty()) {
610         ZLOGE("failed, result:%{public}d, networkId:%{public}s", ret, KvStoreUtils::ToBeAnonymous(networkId).c_str());
611         return "";
612     }
613     return udid;
614 }
615 
ToUUID(const std::string & id)616 std::string DeviceManagerAdapter::ToUUID(const std::string &id)
617 {
618     return GetDeviceInfoFromCache(id).uuid;
619 }
620 
ToUDID(const std::string & id)621 std::string DeviceManagerAdapter::ToUDID(const std::string &id)
622 {
623     return GetDeviceInfoFromCache(id).udid;
624 }
625 
ToUUID(const std::vector<std::string> & devices)626 std::vector<std::string> DeviceManagerAdapter::ToUUID(const std::vector<std::string> &devices)
627 {
628     std::vector<std::string> uuids;
629     for (auto &device : devices) {
630         auto uuid = DeviceManagerAdapter::GetInstance().ToUUID(device);
631         if (uuid.empty()) {
632             continue;
633         }
634         uuids.push_back(std::move(uuid));
635     }
636     return uuids;
637 }
638 
ToUUID(std::vector<DeviceInfo> devices)639 std::vector<std::string> DeviceManagerAdapter::ToUUID(std::vector<DeviceInfo> devices)
640 {
641     std::vector<std::string> uuids;
642     for (auto &device : devices) {
643         if (device.uuid.empty()) {
644             continue;
645         }
646         uuids.push_back(std::move(device.uuid));
647     }
648     return uuids;
649 }
650 
ToNetworkID(const std::string & id)651 std::string DeviceManagerAdapter::ToNetworkID(const std::string &id)
652 {
653     return GetDeviceInfoFromCache(id).networkId;
654 }
655 
CalcClientUuid(const std::string & appId,const std::string & uuid)656 std::string DeviceManagerAdapter::CalcClientUuid(const std::string &appId, const std::string &uuid)
657 {
658     if (uuid.empty()) {
659         return "";
660     }
661     std::string encryptedUuid;
662     auto ret = DeviceManager::GetInstance().GenerateEncryptedUuid(PKG_NAME, uuid, appId, encryptedUuid);
663     if (ret != DM_OK) {
664         ZLOGE("failed, result:%{public}d", ret);
665         return "";
666     }
667     return encryptedUuid;
668 }
669 
RegOnNetworkChange()670 bool DeviceManagerAdapter::RegOnNetworkChange()
671 {
672     sptr<NetConnCallbackObserver> observer = new (std::nothrow) NetConnCallbackObserver(*this);
673     if (observer == nullptr) {
674         ZLOGE("new operator error.observer is nullptr");
675         return false;
676     }
677     int nRet = NetConnClient::GetInstance().RegisterNetConnCallback(observer);
678     if (nRet != NETMANAGER_SUCCESS) {
679         ZLOGE("RegisterNetConnCallback failed, ret = %{public}d", nRet);
680         return false;
681     }
682     return true;
683 }
684 
IsNetworkAvailable()685 bool DeviceManagerAdapter::IsNetworkAvailable()
686 {
687     if (defaultNetwork_ != NONE || expireTime_ > GetTimeStamp()) {
688         return defaultNetwork_ != NONE;
689     }
690     return RefreshNet() != NONE;
691 }
692 
SetNet(NetworkType netWorkType)693 DeviceManagerAdapter::NetworkType DeviceManagerAdapter::SetNet(NetworkType netWorkType)
694 {
695     auto oldNet = defaultNetwork_;
696     bool ready = oldNet == NONE && netWorkType != NONE && (GetTimeStamp() - netLostTime_) > NET_LOST_DURATION;
697     bool offline = oldNet != NONE && netWorkType == NONE;
698     if (offline) {
699         netLostTime_ = GetTimeStamp();
700     }
701     defaultNetwork_ = netWorkType;
702     expireTime_ = GetTimeStamp() + EFFECTIVE_DURATION;
703     if (ready) {
704         OnReady(cloudDmInfo);
705     }
706     if (offline) {
707         Offline(cloudDmInfo);
708     }
709     return netWorkType;
710 }
711 
GetNetworkType(bool retrieve)712 DeviceManagerAdapter::NetworkType DeviceManagerAdapter::GetNetworkType(bool retrieve)
713 {
714     if (!retrieve) {
715         return defaultNetwork_;
716     }
717     return RefreshNet();
718 }
719 
RefreshNet()720 DeviceManagerAdapter::NetworkType DeviceManagerAdapter::RefreshNet()
721 {
722     NetHandle handle;
723     auto status = NetConnClient::GetInstance().GetDefaultNet(handle);
724     if (status != 0 || handle.GetNetId() == 0) {
725         return SetNet(NONE);
726     }
727     NetAllCapabilities capabilities;
728     status = NetConnClient::GetInstance().GetNetCapabilities(handle, capabilities);
729     if (status != 0 || !capabilities.netCaps_.count(NetManagerStandard::NET_CAPABILITY_VALIDATED) ||
730         capabilities.bearerTypes_.empty()) {
731         return SetNet(NONE);
732     }
733     return SetNet(Convert(*capabilities.bearerTypes_.begin()));
734 }
735 
GetEncryptedUuidByNetworkId(const std::string & networkId)736 std::string DeviceManagerAdapter::GetEncryptedUuidByNetworkId(const std::string &networkId)
737 {
738     if (networkId.empty()) {
739         ZLOGE("failed! networkId empty");
740         return "";
741     }
742     std::string encryptedUuid;
743     auto ret = DeviceManager::GetInstance().GetEncryptedUuidByNetworkId(PKG_NAME, networkId, encryptedUuid);
744     if (ret != DM_OK) {
745         ZLOGE("failed, result:%{public}d", ret);
746         return "";
747     }
748     return encryptedUuid;
749 }
750 
IsSameAccount(const std::string & id)751 bool DeviceManagerAdapter::IsSameAccount(const std::string &id)
752 {
753     if (id.empty()) {
754         ZLOGE("params id is empty");
755         return false;
756     }
757     auto networkId = DeviceManagerAdapter::GetInstance().ToNetworkID(id);
758     return DeviceManager::GetInstance().IsSameAccount(networkId);
759 }
760 } // namespace OHOS::DistributedData
761