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) const22bool 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)54BluetoothBleScanResult *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)64bool BluetoothBleScanResult::WriteToParcel(Parcel &parcel) 65 { 66 return Marshalling(parcel); 67 } 68 ReadFromParcel(Parcel & parcel)69bool 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) const104bool 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)117bool 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) const135bool 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)151bool 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) const172bool 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)188bool 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