1 /*
2 * Copyright (c) 2023 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 "dm_binding.h"
17
18 #include <string>
19
20 #include "device_manager.h"
21 #include "device_manager_callback.h"
22 #include "dm_device_info.h"
23
24 #include "devicestatus_define.h"
25 #include "dm_binding_internal.h"
26
27 namespace {
28 constexpr ::OHOS::HiviewDFX::HiLogLabel LABEL { LOG_CORE, ::OHOS::Msdp::MSDP_DOMAIN_ID, "DmBinding" };
29 #define DIS_HARDWARE OHOS::DistributedHardware::DeviceManager::GetInstance()
30 } // namespace
31
DeviceInitCallBack(void (* cb)())32 DeviceInitCallBack::DeviceInitCallBack(void (*cb)()) : callback_(cb)
33 {
34 }
35
OnRemoteDied()36 void DeviceInitCallBack::OnRemoteDied()
37 {
38 CALL_DEBUG_ENTER;
39 CHKPV(callback_);
40 callback_();
41 }
42
DmDeviceStateCallback(CRegisterDevStateCallback callbacks)43 DmDeviceStateCallback::DmDeviceStateCallback(CRegisterDevStateCallback callbacks)
44 {
45 CALL_DEBUG_ENTER;
46 InitCallback(callbacks);
47 }
48
OnDeviceOnline(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)49 void DmDeviceStateCallback::OnDeviceOnline(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo)
50 {
51 CALL_DEBUG_ENTER;
52 CHKPV(onlineCallback_);
53 CDmDeviceInfo* cDeviceInfo = CreateCDeviceInfo(deviceInfo);
54 CHKPV(cDeviceInfo);
55 onlineCallback_(cDeviceInfo);
56 }
57
OnDeviceChanged(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)58 void DmDeviceStateCallback::OnDeviceChanged(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo)
59 {
60 CALL_DEBUG_ENTER;
61 CHKPV(changedCallback_);
62 CDmDeviceInfo* cDeviceInfo = CreateCDeviceInfo(deviceInfo);
63 CHKPV(cDeviceInfo);
64 changedCallback_(cDeviceInfo);
65 }
66
OnDeviceReady(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)67 void DmDeviceStateCallback::OnDeviceReady(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo)
68 {
69 CALL_DEBUG_ENTER;
70 CHKPV(readyCallback_);
71 CDmDeviceInfo* cDeviceInfo = CreateCDeviceInfo(deviceInfo);
72 CHKPV(cDeviceInfo);
73 readyCallback_(cDeviceInfo);
74 }
75
OnDeviceOffline(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)76 void DmDeviceStateCallback::OnDeviceOffline(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo)
77 {
78 CALL_DEBUG_ENTER;
79 CHKPV(offlineCallback_);
80 CDmDeviceInfo* cDeviceInfo = CreateCDeviceInfo(deviceInfo);
81 CHKPV(cDeviceInfo);
82 offlineCallback_(cDeviceInfo);
83 }
84
InitCallback(CRegisterDevStateCallback callbacks)85 void DmDeviceStateCallback::InitCallback(CRegisterDevStateCallback callbacks)
86 {
87 CALL_DEBUG_ENTER;
88 CHKPV(callbacks.onDeviceOnline);
89 CHKPV(callbacks.onDeviceChanged);
90 CHKPV(callbacks.onDeviceReady);
91 CHKPV(callbacks.onDeviceOffline);
92 onlineCallback_ = callbacks.onDeviceOnline;
93 changedCallback_ = callbacks.onDeviceChanged;
94 readyCallback_ = callbacks.onDeviceReady;
95 offlineCallback_ = callbacks.onDeviceOffline;
96 }
97
CreateCDeviceInfo(const OHOS::DistributedHardware::DmDeviceInfo & deviceInfo)98 CDmDeviceInfo* DmDeviceStateCallback::CreateCDeviceInfo(const OHOS::DistributedHardware::DmDeviceInfo &deviceInfo)
99 {
100 CALL_DEBUG_ENTER;
101 CDmDeviceInfo* cDeviceInfo = new (std::nothrow) CDmDeviceInfo;
102 cDeviceInfo->deviceId = new (std::nothrow) char[sizeof(deviceInfo.deviceId)];
103 if (strcpy_s(cDeviceInfo->deviceId, sizeof(deviceInfo.deviceId), deviceInfo.deviceId) != EOK) {
104 FI_HILOGE("Invalid deviceId:\'%{public}s\'", deviceInfo.deviceId);
105 return nullptr;
106 }
107 cDeviceInfo->deviceName = new (std::nothrow) char[sizeof(deviceInfo.deviceName)];
108 if (strcpy_s(cDeviceInfo->deviceName, sizeof(deviceInfo.deviceName), deviceInfo.deviceName) != EOK) {
109 FI_HILOGE("Invalid deviceName");
110 return nullptr;
111 }
112 cDeviceInfo->deviceTypeId = deviceInfo.deviceTypeId;
113 cDeviceInfo->networkId = new (std::nothrow) char[sizeof(deviceInfo.networkId)];
114 if (strcpy_s(cDeviceInfo->networkId, sizeof(deviceInfo.networkId), deviceInfo.networkId) != EOK) {
115 FI_HILOGE("Invalid networkId");
116 return nullptr;
117 }
118 cDeviceInfo->range = deviceInfo.range;
119 cDeviceInfo->authForm = static_cast<CDmAuthForm>(deviceInfo.authForm);
120 return cDeviceInfo;
121 }
122
CInitDeviceManager(const char * pkgName,void (* callback)())123 bool CInitDeviceManager(const char* pkgName, void (*callback)())
124 {
125 CALL_DEBUG_ENTER;
126 CHKPF(callback);
127 auto initCallback = std::make_shared<DeviceInitCallBack>(callback);
128 std::string sPkgName(pkgName);
129 int32_t ret = DIS_HARDWARE.InitDeviceManager(sPkgName, initCallback);
130 if (ret != 0) {
131 FI_HILOGE("Init device manager failed, ret:%{public}d", ret);
132 return false;
133 }
134 return true;
135 }
136
CRegisterDevState(const char * pkgName,const char * extra,CRegisterDevStateCallback callbacks)137 bool CRegisterDevState(const char* pkgName, const char* extra, CRegisterDevStateCallback callbacks)
138 {
139 CALL_DEBUG_ENTER;
140 auto stateCallback = std::make_shared<DmDeviceStateCallback>(callbacks);
141 std::string sPkgName(pkgName);
142 std::string sExtra(extra);
143 int32_t ret = DIS_HARDWARE.RegisterDevStateCallback(sPkgName, sExtra, stateCallback);
144 if (ret != 0) {
145 FI_HILOGE("Register devStateCallback failed, ret:%{public}d", ret);
146 return false;
147 }
148 return true;
149 }
150
CUnRegisterDevState(const char * pkgName,const char * extra)151 bool CUnRegisterDevState(const char* pkgName, const char* extra)
152 {
153 CALL_DEBUG_ENTER;
154 std::string sPkgName(pkgName);
155 std::string sExtra(extra);
156 int32_t ret = DIS_HARDWARE.UnRegisterDevStateCallback(sPkgName, sExtra);
157 if (ret != 0) {
158 FI_HILOGE("UnRegister devStateCallback failed, ret:%{public}d", ret);
159 return false;
160 }
161 return true;
162 }
163
CDestroyDmDeviceInfo(CDmDeviceInfo * deviceInfo)164 void CDestroyDmDeviceInfo(CDmDeviceInfo* deviceInfo)
165 {
166 CALL_DEBUG_ENTER;
167 CHKPV(deviceInfo);
168 deviceInfo = nullptr;
169 delete deviceInfo;
170 }