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 "location.h"
17
18 #include <parcel.h>
19 #include <string>
20 #include "string_ex.h"
21
22 namespace OHOS {
23 namespace Location {
24 static constexpr double MIN_LATITUDE = -90.0;
25 static constexpr double MIN_LONGITUDE = -180.0;
26
Location()27 Location::Location()
28 {
29 latitude_ = MIN_LATITUDE - 1;
30 longitude_ = MIN_LONGITUDE - 1;
31 altitude_ = 0.0;
32 accuracy_ = 0.0;
33 speed_ = 0.0;
34 direction_ = 0.0;
35 timeStamp_ = 0;
36 timeSinceBoot_ = 0;
37 additionSize_ = 0;
38 isFromMock_ = false;
39 isSystemApp_ = 0;
40 floorNo_ = 0;
41 floorAccuracy_ = 0.0;
42 altitudeAccuracy_ = 0.0;
43 speedAccuracy_ = 0.0;
44 directionAccuracy_ = 0.0;
45 uncertaintyOfTimeSinceBoot_ = 0;
46 locationSourceType_ = 0;
47 uuid_ = "";
48 fieldValidity_ = 0;
49 }
50
Location(Location & location)51 Location::Location(Location& location)
52 {
53 latitude_ = location.GetLatitude();
54 longitude_ = location.GetLongitude();
55 altitude_ = location.GetAltitude();
56 accuracy_ = location.GetAccuracy();
57 speed_ = location.GetSpeed();
58 direction_ = location.GetDirection();
59 timeStamp_ = location.GetTimeStamp();
60 timeSinceBoot_ = location.GetTimeSinceBoot();
61 floorNo_ = location.GetFloorNo();
62 floorAccuracy_ = location.GetFloorAccuracy();
63 additions_ = location.GetAdditions();
64 additionsMap_ = location.GetAdditionsMap();
65 additionSize_ = location.GetAdditionSize();
66 isFromMock_ = location.GetIsFromMock();
67 isSystemApp_ = location.GetIsSystemApp();
68 altitudeAccuracy_ = location.GetAltitudeAccuracy();
69 speedAccuracy_ = location.GetSpeedAccuracy();
70 directionAccuracy_ = location.GetDirectionAccuracy();
71 uncertaintyOfTimeSinceBoot_ = location.GetUncertaintyOfTimeSinceBoot();
72 locationSourceType_ = location.GetLocationSourceType();
73 uuid_ = location.GetUuid();
74 fieldValidity_ = location.GetFieldValidity();
75 }
76
ReadFromParcel(Parcel & parcel)77 void Location::ReadFromParcel(Parcel& parcel)
78 {
79 latitude_ = parcel.ReadDouble();
80 longitude_ = parcel.ReadDouble();
81 altitude_ = parcel.ReadDouble();
82 accuracy_ = parcel.ReadDouble();
83 speed_ = parcel.ReadDouble();
84 direction_ = parcel.ReadDouble();
85 timeStamp_ = parcel.ReadInt64();
86 timeSinceBoot_ = parcel.ReadInt64();
87 additionSize_ = parcel.ReadInt64();
88 std::vector<std::u16string> additions;
89 parcel.ReadString16Vector(&additions);
90 isFromMock_ = parcel.ReadBool();
91 isSystemApp_ = parcel.ReadInt32();
92 altitudeAccuracy_ = parcel.ReadDouble();
93 speedAccuracy_ = parcel.ReadDouble();
94 directionAccuracy_ = parcel.ReadDouble();
95 uncertaintyOfTimeSinceBoot_ = parcel.ReadInt64();
96 locationSourceType_ = parcel.ReadInt32();
97 uuid_ = Str16ToStr8(parcel.ReadString16());
98 fieldValidity_ = parcel.ReadInt32();
99 VectorString16ToVectorString8(additions);
100 }
101
VectorString16ToVectorString8(const std::vector<std::u16string> & additions)102 void Location::VectorString16ToVectorString8(const std::vector<std::u16string>& additions)
103 {
104 for (auto &addition : additions) {
105 auto additionString = Str16ToStr8(addition);
106 additions_.push_back(additionString);
107 auto pos = additionString.find(":");
108 auto key = additionString.substr(0, pos);
109 auto value = additionString.substr(pos + 1, additionString.size() - 1);
110 additionsMap_[key] = value;
111 }
112 }
113
UnmarshallingShared(Parcel & parcel)114 std::shared_ptr<Location> Location::UnmarshallingShared(Parcel& parcel)
115 {
116 std::shared_ptr<Location> location = std::make_shared<Location>();
117 location->ReadFromParcel(parcel);
118 return location;
119 }
120
Unmarshalling(Parcel & parcel)121 std::unique_ptr<Location> Location::Unmarshalling(Parcel& parcel)
122 {
123 std::unique_ptr<Location> location = std::make_unique<Location>();
124 location->ReadFromParcel(parcel);
125 return location;
126 }
127
Marshalling(Parcel & parcel) const128 bool Location::Marshalling(Parcel& parcel) const
129 {
130 auto additions = VectorString8ToVectorString16();
131 return parcel.WriteDouble(latitude_) &&
132 parcel.WriteDouble(longitude_) &&
133 parcel.WriteDouble(altitude_) &&
134 parcel.WriteDouble(accuracy_) &&
135 parcel.WriteDouble(speed_) &&
136 parcel.WriteDouble(direction_) &&
137 parcel.WriteInt64(timeStamp_) &&
138 parcel.WriteInt64(timeSinceBoot_) &&
139 parcel.WriteInt64(additionSize_) &&
140 parcel.WriteString16Vector(additions) &&
141 parcel.WriteBool(isFromMock_) &&
142 parcel.WriteInt32(isSystemApp_) &&
143 parcel.WriteDouble(altitudeAccuracy_) &&
144 parcel.WriteDouble(speedAccuracy_) &&
145 parcel.WriteDouble(directionAccuracy_) &&
146 parcel.WriteDouble(uncertaintyOfTimeSinceBoot_) &&
147 parcel.WriteInt32(locationSourceType_) &&
148 parcel.WriteString16(Str8ToStr16(uuid_)) &&
149 parcel.WriteInt32(fieldValidity_);
150 }
151
VectorString8ToVectorString16() const152 std::vector<std::u16string> Location::VectorString8ToVectorString16() const
153 {
154 std::vector<std::u16string> additions;
155 for (auto &addition : additions_) {
156 auto additionString = Str8ToStr16(addition);
157 additions.push_back(additionString);
158 }
159 return additions;
160 }
161
ToString() const162 std::string Location::ToString() const
163 {
164 std::string str =
165 ", altitude : " + std::to_string(altitude_) +
166 ", accuracy : " + std::to_string(accuracy_) +
167 ", speed : " + std::to_string(speed_) +
168 ", direction : " + std::to_string(direction_) +
169 ", timeStamp : " + std::to_string(timeStamp_) +
170 ", timeSinceBoot : " + std::to_string(timeSinceBoot_) +
171 ", additionSize : " + std::to_string(additionSize_) +
172 ", isFromMock : " + std::to_string(isFromMock_) +
173 ", isSystemApp : " + std::to_string(isSystemApp_) +
174 ", altitudeAccuracy : " + std::to_string(altitudeAccuracy_) +
175 ", speedAccuracy : " + std::to_string(speedAccuracy_) +
176 ", directionAccuracy : " + std::to_string(directionAccuracy_) +
177 ", uncertaintyOfTimeSinceBoot : " + std::to_string(uncertaintyOfTimeSinceBoot_) +
178 ", locationSourceType : " + std::to_string(locationSourceType_) +
179 ", uuid : " + uuid_ +
180 ", fieldValidity : " + std::to_string(fieldValidity_);
181 return str;
182 }
183
LocationEqual(const std::unique_ptr<Location> & location)184 bool Location::LocationEqual(const std::unique_ptr<Location>& location)
185 {
186 if (location == nullptr) {
187 return false;
188 }
189 if (this->GetLatitude() == location->GetLatitude() &&
190 this->GetLongitude() == location->GetLongitude() &&
191 this->GetAltitude() == location->GetAltitude() &&
192 this->GetAccuracy() == location->GetAccuracy() &&
193 this->GetSpeed() == location->GetSpeed() &&
194 this->GetDirection() == location->GetDirection() &&
195 this->GetTimeStamp() == location->GetTimeStamp() &&
196 this->GetTimeSinceBoot() == location->GetTimeSinceBoot() &&
197 this->AdditionEqual(location) &&
198 this->GetAdditionSize() == location->GetAdditionSize() &&
199 this->GetIsFromMock() == location->GetIsFromMock()) {
200 return true;
201 }
202 return false;
203 }
204
AdditionEqual(const std::unique_ptr<Location> & location)205 bool Location::AdditionEqual(const std::unique_ptr<Location>& location)
206 {
207 if (location == nullptr) {
208 return false;
209 }
210 std::vector<std::string> additionA = this->GetAdditions();
211 std::vector<std::string> additionB = location->GetAdditions();
212 if (additionA.size() != additionB.size()) {
213 return false;
214 }
215 for (size_t i = 0; i < additionA.size(); i++) {
216 if (additionA[i].compare(additionB[i]) != 0) {
217 return false;
218 }
219 }
220 return true;
221 }
222 } // namespace Location
223 } // namespace OHOS