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