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