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