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