• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "bluetooth_ble_scan_result.h"
17 #include "bluetooth_log.h"
18 
19 namespace OHOS {
20 namespace Bluetooth {
21 const int32_t BLE_SCAN_READ_DATA_SIZE_MAX_LEN = 0x400;
Marshalling(Parcel & parcel) const22 bool BluetoothBleScanResult::Marshalling(Parcel &parcel) const
23 {
24     if (!WirteServiceUuidsToParcel(parcel)) {
25         return false;
26     }
27     if (!WirteManufacturerDataToParcel(parcel)) {
28         return false;
29     }
30     if (!WirteServiceDataToParcel(parcel)) {
31         return false;
32     }
33     if (!parcel.WriteString(addr_.GetAddress())) {
34         return false;
35     }
36     if (!parcel.WriteInt8(rssi_)) {
37         return false;
38     }
39     if (!parcel.WriteBool(connectable_)) {
40         return false;
41     }
42     if (!parcel.WriteUint8(advertiseFlag_)) {
43         return false;
44     }
45     if (!parcel.WriteString(payload_)) {
46         return false;
47     }
48     if (!parcel.WriteString(name_)) {
49         return false;
50     }
51     return true;
52 }
53 
Unmarshalling(Parcel & parcel)54 BluetoothBleScanResult *BluetoothBleScanResult::Unmarshalling(Parcel &parcel)
55 {
56     BluetoothBleScanResult *settings = new BluetoothBleScanResult();
57     if (settings != nullptr && !settings->ReadFromParcel(parcel)) {
58         delete settings;
59         settings = nullptr;
60     }
61     return settings;
62 }
63 
WriteToParcel(Parcel & parcel)64 bool BluetoothBleScanResult::WriteToParcel(Parcel &parcel)
65 {
66     return Marshalling(parcel);
67 }
68 
ReadFromParcel(Parcel & parcel)69 bool BluetoothBleScanResult::ReadFromParcel(Parcel &parcel)
70 {
71     if (!ReadServiceUuidsFromParcel(parcel)) {
72         return false;
73     }
74     if (!ReadManufacturerDataFromParcel(parcel)) {
75         return false;
76     }
77     if (!ReadServiceDataFromParcel(parcel)) {
78         return false;
79     }
80     std::string address = "";
81     if (parcel.ReadString(address)) {
82         addr_ = bluetooth::RawAddress(address);
83     } else {
84         return false;
85     }
86     if (!parcel.ReadInt8(rssi_)) {
87         return false;
88     }
89     if (!parcel.ReadBool(connectable_)) {
90         return false;
91     }
92     if (!parcel.ReadUint8(advertiseFlag_)) {
93         return false;
94     }
95     if (!parcel.ReadString(payload_)) {
96         return false;
97     }
98     if (!parcel.ReadString(name_)) {
99         return false;
100     }
101     return true;
102 }
103 
WirteServiceUuidsToParcel(Parcel & parcel) const104 bool BluetoothBleScanResult::WirteServiceUuidsToParcel(Parcel &parcel) const
105 {
106     if (!parcel.WriteInt32(serviceUuids_.size())) {
107         return false;
108     }
109     for (auto iter : serviceUuids_) {
110         if (!parcel.WriteUint32(iter.ConvertTo32Bits())) {
111             return false;
112         }
113     }
114     return true;
115 }
116 
ReadServiceUuidsFromParcel(Parcel & parcel)117 bool BluetoothBleScanResult::ReadServiceUuidsFromParcel(Parcel &parcel)
118 {
119     int32_t uuidSize = 0;
120     if (!parcel.ReadInt32(uuidSize) || uuidSize > BLE_SCAN_READ_DATA_SIZE_MAX_LEN) {
121         HILOGE("read Parcelable size failed.");
122         return false;
123     }
124     for (int i = 0; i < uuidSize; ++i) {
125         uint32_t uuid;
126         if (parcel.ReadUint32(uuid)) {
127             serviceUuids_.push_back(bluetooth::Uuid::ConvertFrom32Bits(uuid));
128         } else {
129             return false;
130         }
131     }
132     return true;
133 }
134 
WirteManufacturerDataToParcel(Parcel & parcel) const135 bool BluetoothBleScanResult::WirteManufacturerDataToParcel(Parcel &parcel) const
136 {
137     if (!parcel.WriteInt32(manufacturerSpecificData_.size())) {
138         return false;
139     }
140     for (auto iter = manufacturerSpecificData_.begin(); iter != manufacturerSpecificData_.end(); ++iter) {
141         if (!parcel.WriteUint16(iter->first)) {
142             return false;
143         }
144         if (!parcel.WriteString(iter->second)) {
145             return false;
146         }
147     }
148     return true;
149 }
150 
ReadManufacturerDataFromParcel(Parcel & parcel)151 bool BluetoothBleScanResult::ReadManufacturerDataFromParcel(Parcel &parcel)
152 {
153     int32_t manuSize = 0;
154     if (!parcel.ReadInt32(manuSize) || manuSize > BLE_SCAN_READ_DATA_SIZE_MAX_LEN) {
155         HILOGE("read Parcelable size failed.");
156         return false;
157     }
158     for (int i = 0; i < manuSize; i++) {
159         uint16_t manufacturerId = 0;
160         std::string manufacturedData;
161         if (!parcel.ReadUint16(manufacturerId)) {
162             return false;
163         }
164         if (!parcel.ReadString(manufacturedData)) {
165             return false;
166         }
167         manufacturerSpecificData_.emplace(manufacturerId, manufacturedData);
168     }
169     return true;
170 }
171 
WirteServiceDataToParcel(Parcel & parcel) const172 bool BluetoothBleScanResult::WirteServiceDataToParcel(Parcel &parcel) const
173 {
174     if (!parcel.WriteInt32(serviceData_.size())) {
175         return false;
176     }
177     for (auto iter = serviceData_.begin(); iter != serviceData_.end(); ++iter) {
178         if (!parcel.WriteUint32(iter->first.ConvertTo32Bits())) {
179             return false;
180         }
181         if (!parcel.WriteString(iter->second)) {
182             return false;
183         }
184     }
185     return true;
186 }
187 
ReadServiceDataFromParcel(Parcel & parcel)188 bool BluetoothBleScanResult::ReadServiceDataFromParcel(Parcel &parcel)
189 {
190     int32_t serviceDataSize = 0;
191     if (!parcel.ReadInt32(serviceDataSize) || serviceDataSize > BLE_SCAN_READ_DATA_SIZE_MAX_LEN) {
192         HILOGE("read Parcelable size failed.");
193         return false;
194     }
195     for (int i = 0; i < serviceDataSize; i++) {
196         uint32_t serviceId;
197         std::string serviceData;
198         if (!parcel.ReadUint32(serviceId)) {
199             return false;
200         }
201         if (!parcel.ReadString(serviceData)) {
202             return false;
203         }
204         serviceData_.emplace(bluetooth::Uuid::ConvertFrom32Bits(serviceId), serviceData);
205     }
206     return true;
207 }
208 }  // namespace Bluetooth
209 }  // namespace OHOS