1 /*
2 * Copyright (C) 2021 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 <map>
17
18 #include "bluetooth_ble_advertiser_stub.h"
19 #include "bluetooth_log.h"
20 #include "ipc_types.h"
21 #include "parcel_bt_uuid.h"
22
23 namespace OHOS {
24 namespace Bluetooth {
25 const std::map<uint32_t, std::function<ErrCode(BluetoothBleAdvertiserStub *, MessageParcel &, MessageParcel &)>>
26 BluetoothBleAdvertiserStub::interfaces_ = {
27 {IBluetoothBleAdvertiser::Code::BLE_REGISTER_BLE_ADVERTISER_CALLBACK,
28 std::bind(&BluetoothBleAdvertiserStub::RegisterBleAdvertiserCallbackInner, std::placeholders::_1,
29 std::placeholders::_2, std::placeholders::_3)},
30 {IBluetoothBleAdvertiser::Code::BLE_DE_REGISTER_BLE_ADVERTISER_CALLBACK,
31 std::bind(&BluetoothBleAdvertiserStub::DeregisterBleAdvertiserCallbackInner, std::placeholders::_1,
32 std::placeholders::_2, std::placeholders::_3)},
33 {IBluetoothBleAdvertiser::Code::BLE_START_ADVERTISING,
34 std::bind(&BluetoothBleAdvertiserStub::StartAdvertisingInner, std::placeholders::_1, std::placeholders::_2,
35 std::placeholders::_3)},
36 {IBluetoothBleAdvertiser::Code::BLE_STOP_ADVERTISING,
37 std::bind(&BluetoothBleAdvertiserStub::StopAdvertisingInner, std::placeholders::_1, std::placeholders::_2,
38 std::placeholders::_3)},
39 {IBluetoothBleAdvertiser::Code::BLE_CLOSE,
40 std::bind(&BluetoothBleAdvertiserStub::CloseInner, std::placeholders::_1, std::placeholders::_2,
41 std::placeholders::_3)},
42 {IBluetoothBleAdvertiser::Code::BLE_GET_ADVERTISER_HANDLE,
43 std::bind(&BluetoothBleAdvertiserStub::GetAdvertiserHandleInner, std::placeholders::_1,
44 std::placeholders::_2, std::placeholders::_3)},
45 };
46
BluetoothBleAdvertiserStub()47 BluetoothBleAdvertiserStub::BluetoothBleAdvertiserStub()
48 {}
49
~BluetoothBleAdvertiserStub()50 BluetoothBleAdvertiserStub::~BluetoothBleAdvertiserStub()
51 {}
52
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)53 int BluetoothBleAdvertiserStub::OnRemoteRequest(
54 uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
55 {
56 std::u16string descriptor = BluetoothBleAdvertiserStub::GetDescriptor();
57 std::u16string remoteDescriptor = data.ReadInterfaceToken();
58 if (descriptor != remoteDescriptor) {
59 HILOGW("[OnRemoteRequest] fail: invalid interface token!");
60 return OBJECT_NULL;
61 }
62
63 auto it = interfaces_.find(code);
64 if (it == interfaces_.end()) {
65 HILOGW("[OnRemoteRequest] fail: unknown code!");
66 return IRemoteStub<IBluetoothBleAdvertiser>::OnRemoteRequest(code, data, reply, option);
67 }
68
69 auto fun = it->second;
70 if (fun == nullptr) {
71 HILOGW("[OnRemoteRequest] fail: not find function!");
72 return IRemoteStub<IBluetoothBleAdvertiser>::OnRemoteRequest(code, data, reply, option);
73 }
74
75 ErrCode result = fun(this, data, reply);
76 if (SUCCEEDED(result)) {
77 return NO_ERROR;
78 }
79
80 HILOGW("[OnRemoteRequest] fail: Failed to call interface %{public}u, err:%{public}d", code, result);
81 return result;
82 }
83
RegisterBleAdvertiserCallbackInner(MessageParcel & data,MessageParcel & reply)84 ErrCode BluetoothBleAdvertiserStub::RegisterBleAdvertiserCallbackInner(MessageParcel &data, MessageParcel &reply)
85 {
86 sptr<IRemoteObject> remote = data.ReadRemoteObject();
87 const sptr<IBluetoothBleAdvertiseCallback> callBack = OHOS::iface_cast<IBluetoothBleAdvertiseCallback>(remote);
88 RegisterBleAdvertiserCallback(callBack);
89 return NO_ERROR;
90 }
91
DeregisterBleAdvertiserCallbackInner(MessageParcel & data,MessageParcel & reply)92 ErrCode BluetoothBleAdvertiserStub::DeregisterBleAdvertiserCallbackInner(MessageParcel &data, MessageParcel &reply)
93 {
94 sptr<IRemoteObject> remote = data.ReadRemoteObject();
95 const sptr<IBluetoothBleAdvertiseCallback> callBack = OHOS::iface_cast<IBluetoothBleAdvertiseCallback>(remote);
96 DeregisterBleAdvertiserCallback(callBack);
97 return NO_ERROR;
98 }
99
StartAdvertisingInner(MessageParcel & data,MessageParcel & reply)100 ErrCode BluetoothBleAdvertiserStub::StartAdvertisingInner(MessageParcel &data, MessageParcel &reply)
101 {
102 sptr<BluetoothBleAdvertiserSettings> settings = data.ReadParcelable<BluetoothBleAdvertiserSettings>();
103 if (settings == nullptr) {
104 HILOGW("[StartAdvertisingInner] fail: read settings failed");
105 return TRANSACTION_ERR;
106 }
107
108 sptr<BluetoothBleAdvertiserData> advData = data.ReadParcelable<BluetoothBleAdvertiserData>();
109 if (advData == nullptr) {
110 HILOGW("[StartAdvertisingInner] fail: read advData failed");
111 return TRANSACTION_ERR;
112 }
113 sptr<BluetoothBleAdvertiserData> scanResponse = data.ReadParcelable<BluetoothBleAdvertiserData>();
114 if (scanResponse == nullptr) {
115 HILOGW("[StartAdvertisingInner] fail: read scanResponse failed");
116 return TRANSACTION_ERR;
117 }
118
119 int32_t advHandle = data.ReadInt32();
120 bool isRawData = data.ReadBool();
121 StartAdvertising(*settings, *advData, *scanResponse, advHandle, isRawData);
122 return NO_ERROR;
123 }
124
StopAdvertisingInner(MessageParcel & data,MessageParcel & reply)125 ErrCode BluetoothBleAdvertiserStub::StopAdvertisingInner(MessageParcel &data, MessageParcel &reply)
126 {
127 int32_t advHandle = data.ReadInt32();
128 StopAdvertising(advHandle);
129 return NO_ERROR;
130 }
131
CloseInner(MessageParcel & data,MessageParcel & reply)132 ErrCode BluetoothBleAdvertiserStub::CloseInner(MessageParcel &data, MessageParcel &reply)
133 {
134 int32_t advHandle = data.ReadInt32();
135 Close(advHandle);
136 return NO_ERROR;
137 }
138
GetAdvertiserHandleInner(MessageParcel & data,MessageParcel & reply)139 ErrCode BluetoothBleAdvertiserStub::GetAdvertiserHandleInner(MessageParcel &data, MessageParcel &reply)
140 {
141 int result = GetAdvertiserHandle();
142 bool ret = reply.WriteInt32(result);
143 if (!ret) {
144 HILOGE("GetAdvertiserHandleInner: reply writing failed in: %{public}s.", __func__);
145 return TRANSACTION_ERR;
146 }
147 return NO_ERROR;
148 }
149 } // namespace Bluetooth
150 } // namespace OHOS
151