1 /*
2 * Copyright (C) 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 "satellite_status.h"
17 #include <parcel.h>
18 #include "common_utils.h"
19
20 namespace OHOS {
21 namespace Location {
SatelliteStatus()22 SatelliteStatus::SatelliteStatus()
23 {
24 satellitesNumber_ = 0;
25 }
26
SatelliteStatus(SatelliteStatus & satelliteStatus)27 SatelliteStatus::SatelliteStatus(SatelliteStatus& satelliteStatus)
28 {
29 satellitesNumber_ = satelliteStatus.GetSatellitesNumber();
30 satelliteIds_ = satelliteStatus.GetSatelliteIds();
31 carrierToNoiseDensitys_ = satelliteStatus.GetCarrierToNoiseDensitys();
32 altitudes_ = satelliteStatus.GetAltitudes();
33 azimuths_ = satelliteStatus.GetAzimuths();
34 carrierFrequencies_ = satelliteStatus.GetCarrierFrequencies();
35 constellationTypes_ = satelliteStatus.GetConstellationTypes();
36 additionalInfoList_ = satelliteStatus.GetSatelliteAdditionalInfoList();
37 }
38
ReadFromParcel(Parcel & parcel)39 void SatelliteStatus::ReadFromParcel(Parcel& parcel)
40 {
41 std::unique_lock<std::mutex> lock(mutex_);
42 satellitesNumber_ = parcel.ReadInt64();
43 satellitesNumber_ = satellitesNumber_ > MAXIMUM_INTERATION ? MAXIMUM_INTERATION : satellitesNumber_;
44 for (int i = 0; i < satellitesNumber_; i++) {
45 satelliteIds_.push_back(parcel.ReadInt64());
46 carrierToNoiseDensitys_.push_back(parcel.ReadDouble());
47 altitudes_.push_back(parcel.ReadDouble());
48 azimuths_.push_back(parcel.ReadDouble());
49 carrierFrequencies_.push_back(parcel.ReadDouble());
50 constellationTypes_.push_back(parcel.ReadInt64());
51 additionalInfoList_.push_back(parcel.ReadInt64());
52 }
53 }
54
Marshalling(Parcel & parcel) const55 bool SatelliteStatus::Marshalling(Parcel& parcel) const
56 {
57 bool isValid = IsValidityDatas();
58 if (!isValid) {
59 return false;
60 }
61 CHK_PARCEL_RETURN_VALUE(parcel.WriteInt64(satellitesNumber_));
62 for (int i = 0; i < satellitesNumber_; i++) {
63 CHK_PARCEL_RETURN_VALUE(parcel.WriteInt64(satelliteIds_[i]));
64 CHK_PARCEL_RETURN_VALUE(parcel.WriteDouble(carrierToNoiseDensitys_[i]));
65 CHK_PARCEL_RETURN_VALUE(parcel.WriteDouble(altitudes_[i]));
66 CHK_PARCEL_RETURN_VALUE(parcel.WriteDouble(azimuths_[i]));
67 CHK_PARCEL_RETURN_VALUE(parcel.WriteDouble(carrierFrequencies_[i]));
68 CHK_PARCEL_RETURN_VALUE(parcel.WriteInt64(constellationTypes_[i]));
69 CHK_PARCEL_RETURN_VALUE(parcel.WriteInt64(additionalInfoList_[i]));
70 }
71 return true;
72 }
73
IsValidityDatas() const74 bool SatelliteStatus::IsValidityDatas() const
75 {
76 if (satellitesNumber_ != satelliteIds_.size()) {
77 LBSLOGE(GNSS, "%{public}s: satelliteIds data length is incorrect.", __func__);
78 return false;
79 }
80 if (satellitesNumber_ != carrierToNoiseDensitys_.size()) {
81 LBSLOGE(GNSS, "%{public}s: carrierToNoiseDensitys data length is incorrect.", __func__);
82 return false;
83 }
84 if (satellitesNumber_ != altitudes_.size()) {
85 LBSLOGE(GNSS, "%{public}s: altitudes data length is incorrect.", __func__);
86 return false;
87 }
88 if (satellitesNumber_ != azimuths_.size()) {
89 LBSLOGE(GNSS, "%{public}s: azimuths data length is incorrect.", __func__);
90 return false;
91 }
92 if (satellitesNumber_ != carrierFrequencies_.size()) {
93 LBSLOGE(GNSS, "%{public}s: carrierFrequencies data length is incorrect.", __func__);
94 return false;
95 }
96 if (satellitesNumber_ != constellationTypes_.size()) {
97 LBSLOGE(GNSS, "%{public}s: constellationTypes data length is incorrect.", __func__);
98 return false;
99 }
100 if (satellitesNumber_ != additionalInfoList_.size()) {
101 LBSLOGE(GNSS, "%{public}s: additionalInfoList data length is incorrect.", __func__);
102 return false;
103 }
104 return true;
105 }
106
Unmarshalling(Parcel & parcel)107 std::unique_ptr<SatelliteStatus> SatelliteStatus::Unmarshalling(Parcel& parcel)
108 {
109 std::unique_ptr<SatelliteStatus> status = std::make_unique<SatelliteStatus>();
110 status->ReadFromParcel(parcel);
111 return status;
112 }
113 } // namespace Location
114 } // namespace OHOS