1 /*
2 * Copyright (C) 2021-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 #ifndef LOG_TAG
16 #define LOG_TAG "bt_ipc_remote_device_obser_stub"
17 #endif
18
19 #include "bluetooth_remote_device_observer_stub.h"
20 #include "bluetooth_bt_uuid.h"
21 #include "bluetooth_log.h"
22 #include "bluetooth_errorcode.h"
23
24 namespace OHOS {
25 namespace Bluetooth {
26 constexpr uint16_t UUID_SIZE_MAX = 1024;
27
BluetoothRemoteDeviceObserverstub()28 BluetoothRemoteDeviceObserverstub::BluetoothRemoteDeviceObserverstub()
29 {
30 HILOGD("start.");
31 memberFuncMap_[static_cast<uint32_t>(
32 BluetoothRemoteDeviceObserverInterfaceCode::BT_REMOTE_DEVICE_OBSERVER_ACL_STATE)] =
33 BluetoothRemoteDeviceObserverstub::OnAclStateChangedInner;
34 memberFuncMap_[static_cast<uint32_t>(
35 BluetoothRemoteDeviceObserverInterfaceCode::BT_REMOTE_DEVICE_OBSERVER_PAIR_STATUS)] =
36 BluetoothRemoteDeviceObserverstub::OnPairStatusChangedInner;
37 memberFuncMap_[static_cast<uint32_t>(
38 BluetoothRemoteDeviceObserverInterfaceCode::BT_REMOTE_DEVICE_OBSERVER_REMOTE_UUID)] =
39 BluetoothRemoteDeviceObserverstub::OnRemoteNameUuidChangedInner;
40 memberFuncMap_[static_cast<uint32_t>(
41 BluetoothRemoteDeviceObserverInterfaceCode::BT_REMOTE_DEVICE_OBSERVER_REMOTE_NAME)] =
42 BluetoothRemoteDeviceObserverstub::OnRemoteNameChangedInner;
43 memberFuncMap_[static_cast<uint32_t>(
44 BluetoothRemoteDeviceObserverInterfaceCode::BT_REMOTE_DEVICE_OBSERVER_REMOTE_ALIAS)] =
45 BluetoothRemoteDeviceObserverstub::OnRemoteAliasChangedInner;
46 memberFuncMap_[static_cast<uint32_t>(
47 BluetoothRemoteDeviceObserverInterfaceCode::BT_REMOTE_DEVICE_OBSERVER_REMOTE_COD)] =
48 BluetoothRemoteDeviceObserverstub::OnRemoteCodChangedInner;
49 memberFuncMap_[static_cast<uint32_t>(
50 BluetoothRemoteDeviceObserverInterfaceCode::BT_REMOTE_DEVICE_OBSERVER_REMOTE_BATTERY_LEVEL)] =
51 BluetoothRemoteDeviceObserverstub::OnRemoteBatteryChangedInner;
52 memberFuncMap_[static_cast<uint32_t>(
53 BluetoothRemoteDeviceObserverInterfaceCode::BT_REMOTE_DEVICE_OBSERVER_REMOTE_BATTERY_INFO_REPORT)] =
54 BluetoothRemoteDeviceObserverstub::OnRemoteDeviceCommonInfoReportInner;
55 }
56
~BluetoothRemoteDeviceObserverstub()57 BluetoothRemoteDeviceObserverstub::~BluetoothRemoteDeviceObserverstub()
58 {
59 HILOGD("start.");
60 memberFuncMap_.clear();
61 }
62
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)63 int BluetoothRemoteDeviceObserverstub::OnRemoteRequest(
64 uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
65 {
66 HILOGD("OnRemoteRequest, cmd = %{public}d, flags= %{public}d", code, option.GetFlags());
67 if (BluetoothRemoteDeviceObserverstub::GetDescriptor() != data.ReadInterfaceToken()) {
68 HILOGE("BluetoothHostStub::OnRemoteRequest, local descriptor is not equal to remote");
69 return ERR_INVALID_STATE;
70 }
71 auto itFunc = memberFuncMap_.find(code);
72 if (itFunc != memberFuncMap_.end()) {
73 auto memberFunc = itFunc->second;
74 if (memberFunc != nullptr) {
75 return memberFunc(this, data, reply);
76 }
77 }
78 return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
79 }
80
OnAclStateChangedInner(BluetoothRemoteDeviceObserverstub * stub,MessageParcel & data,MessageParcel & reply)81 int32_t BluetoothRemoteDeviceObserverstub::OnAclStateChangedInner(BluetoothRemoteDeviceObserverstub *stub,
82 MessageParcel &data, MessageParcel &reply)
83 {
84 std::shared_ptr<BluetoothRawAddress> result(data.ReadParcelable<BluetoothRawAddress>());
85 if (!result) {
86 return TRANSACTION_ERR;
87 }
88 int32_t state = data.ReadInt32();
89 uint32_t reason = data.ReadUint32();
90 stub->OnAclStateChanged(*result, state, reason);
91 return NO_ERROR;
92 }
93
OnPairStatusChangedInner(BluetoothRemoteDeviceObserverstub * stub,MessageParcel & data,MessageParcel & reply)94 int32_t BluetoothRemoteDeviceObserverstub::OnPairStatusChangedInner(BluetoothRemoteDeviceObserverstub *stub,
95 MessageParcel &data, MessageParcel &reply)
96 {
97 int32_t transport = data.ReadInt32();
98 std::shared_ptr<BluetoothRawAddress> result(data.ReadParcelable<BluetoothRawAddress>());
99 if (!result) {
100 return TRANSACTION_ERR;
101 }
102 int32_t status = data.ReadInt32();
103 int32_t cause = data.ReadInt32();
104 stub->OnPairStatusChanged(transport, *result, status, cause);
105 return NO_ERROR;
106 }
107
OnRemoteNameUuidChangedInner(BluetoothRemoteDeviceObserverstub * stub,MessageParcel & data,MessageParcel & reply)108 int32_t BluetoothRemoteDeviceObserverstub::OnRemoteNameUuidChangedInner(BluetoothRemoteDeviceObserverstub *stub,
109 MessageParcel &data, MessageParcel &reply)
110 {
111 std::shared_ptr<BluetoothRawAddress> result(data.ReadParcelable<BluetoothRawAddress>());
112 if (!result) {
113 return TRANSACTION_ERR;
114 }
115 uint16_t uuidSize = data.ReadUint16();
116 if (uuidSize > UUID_SIZE_MAX) {
117 HILOGE("uuidSize = %{public}hu exceeds the maximum 1024.", uuidSize);
118 return INVALID_DATA;
119 }
120 std::vector<bluetooth::Uuid> uuids;
121 for (uint16_t i = 0; i < uuidSize; ++i) {
122 std::shared_ptr<BluetoothUuid> uuid(data.ReadParcelable<BluetoothUuid>());
123 if (!uuid) {
124 return TRANSACTION_ERR;
125 }
126 uuids.push_back(*uuid);
127 }
128 stub->OnRemoteUuidChanged(*result, uuids);
129 return NO_ERROR;
130 }
131
OnRemoteNameChangedInner(BluetoothRemoteDeviceObserverstub * stub,MessageParcel & data,MessageParcel & reply)132 int32_t BluetoothRemoteDeviceObserverstub::OnRemoteNameChangedInner(BluetoothRemoteDeviceObserverstub *stub,
133 MessageParcel &data, MessageParcel &reply)
134 {
135 std::shared_ptr<BluetoothRawAddress> result(data.ReadParcelable<BluetoothRawAddress>());
136 if (!result) {
137 return TRANSACTION_ERR;
138 }
139 std::string deviceName = data.ReadString();
140 stub->OnRemoteNameChanged(*result, deviceName);
141 return NO_ERROR;
142 }
143
OnRemoteAliasChangedInner(BluetoothRemoteDeviceObserverstub * stub,MessageParcel & data,MessageParcel & reply)144 int32_t BluetoothRemoteDeviceObserverstub::OnRemoteAliasChangedInner(BluetoothRemoteDeviceObserverstub *stub,
145 MessageParcel &data, MessageParcel &reply)
146 {
147 std::shared_ptr<BluetoothRawAddress> result(data.ReadParcelable<BluetoothRawAddress>());
148 if (!result) {
149 return TRANSACTION_ERR;
150 }
151 std::string alias = data.ReadString();
152 stub->OnRemoteAliasChanged(*result, alias);
153 return NO_ERROR;
154 }
155
OnRemoteCodChangedInner(BluetoothRemoteDeviceObserverstub * stub,MessageParcel & data,MessageParcel & reply)156 int32_t BluetoothRemoteDeviceObserverstub::OnRemoteCodChangedInner(BluetoothRemoteDeviceObserverstub *stub,
157 MessageParcel &data, MessageParcel &reply)
158 {
159 std::shared_ptr<BluetoothRawAddress> result(data.ReadParcelable<BluetoothRawAddress>());
160 if (!result) {
161 return TRANSACTION_ERR;
162 }
163 int32_t cod = data.ReadInt32();
164 stub->OnRemoteCodChanged(*result, cod);
165 return NO_ERROR;
166 }
167
OnRemoteBatteryChangedInner(BluetoothRemoteDeviceObserverstub * stub,MessageParcel & data,MessageParcel & reply)168 int32_t BluetoothRemoteDeviceObserverstub::OnRemoteBatteryChangedInner(BluetoothRemoteDeviceObserverstub *stub,
169 MessageParcel &data, MessageParcel &reply)
170 {
171 std::shared_ptr<BluetoothRawAddress> device(data.ReadParcelable<BluetoothRawAddress>());
172 CHECK_AND_RETURN_LOG_RET((device != nullptr), BT_ERR_INTERNAL_ERROR, "Read device error");
173 std::shared_ptr<BluetoothBatteryInfo> batteryInfo(data.ReadParcelable<BluetoothBatteryInfo>());
174 CHECK_AND_RETURN_LOG_RET((batteryInfo != nullptr), BT_ERR_INTERNAL_ERROR, "Read batteryInfo error");
175
176 stub->OnRemoteBatteryChanged(*device, *batteryInfo);
177 return BT_NO_ERROR;
178 }
179
OnRemoteDeviceCommonInfoReportInner(BluetoothRemoteDeviceObserverstub * stub,MessageParcel & data,MessageParcel & reply)180 int32_t BluetoothRemoteDeviceObserverstub::OnRemoteDeviceCommonInfoReportInner(BluetoothRemoteDeviceObserverstub *stub,
181 MessageParcel &data,
182 MessageParcel &reply)
183 {
184 std::shared_ptr<BluetoothRawAddress> device(data.ReadParcelable<BluetoothRawAddress>());
185 CHECK_AND_RETURN_LOG_RET((device != nullptr), BT_ERR_INTERNAL_ERROR, "Read device error");
186 std::vector<uint8_t> dataValue;
187 CHECK_AND_RETURN_LOG_RET(data.ReadUInt8Vector(&dataValue), BT_ERR_INTERNAL_ERROR, "Read dataValue error");
188
189 stub->OnRemoteDeviceCommonInfoReport(*device, dataValue);
190 return NO_ERROR;
191 }
192 } // namespace Bluetooth
193 } // namespace OHOS