• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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         if (additionString.size() == 0) {
107             continue;
108         }
109         additions_.push_back(additionString);
110         auto pos = additionString.find(":");
111         auto key = additionString.substr(0, pos);
112         auto value = additionString.substr(pos + 1, additionString.size() - 1);
113         additionsMap_[key] = value;
114     }
115 }
116 
UnmarshallingShared(Parcel & parcel)117 std::shared_ptr<Location> Location::UnmarshallingShared(Parcel& parcel)
118 {
119     std::shared_ptr<Location> location = std::make_shared<Location>();
120     location->ReadFromParcel(parcel);
121     return location;
122 }
123 
Unmarshalling(Parcel & parcel)124 std::unique_ptr<Location> Location::Unmarshalling(Parcel& parcel)
125 {
126     std::unique_ptr<Location> location = std::make_unique<Location>();
127     location->ReadFromParcel(parcel);
128     return location;
129 }
130 
UnmarshallingMakeUnique(Parcel & parcel)131 std::unique_ptr<Location> Location::UnmarshallingMakeUnique(Parcel& parcel)
132 {
133     std::unique_ptr<Location> location = std::make_unique<Location>();
134     location->ReadFromParcel(parcel);
135     return location;
136 }
137 
Marshalling(Parcel & parcel) const138 bool Location::Marshalling(Parcel& parcel) const
139 {
140     auto additions = VectorString8ToVectorString16();
141     return parcel.WriteDouble(latitude_) &&
142            parcel.WriteDouble(longitude_) &&
143            parcel.WriteDouble(altitude_) &&
144            parcel.WriteDouble(accuracy_) &&
145            parcel.WriteDouble(speed_) &&
146            parcel.WriteDouble(direction_) &&
147            parcel.WriteInt64(timeStamp_) &&
148            parcel.WriteInt64(timeSinceBoot_) &&
149            parcel.WriteInt64(additionSize_) &&
150            parcel.WriteString16Vector(additions) &&
151            parcel.WriteBool(isFromMock_) &&
152            parcel.WriteInt32(isSystemApp_) &&
153            parcel.WriteDouble(altitudeAccuracy_) &&
154            parcel.WriteDouble(speedAccuracy_) &&
155            parcel.WriteDouble(directionAccuracy_) &&
156            parcel.WriteDouble(uncertaintyOfTimeSinceBoot_) &&
157            parcel.WriteInt32(locationSourceType_) &&
158            parcel.WriteString16(Str8ToStr16(uuid_)) &&
159            parcel.WriteInt32(fieldValidity_);
160 }
161 
VectorString8ToVectorString16() const162 std::vector<std::u16string> Location::VectorString8ToVectorString16() const
163 {
164     std::vector<std::u16string> additions;
165     for (auto &addition : additions_) {
166         auto additionString = Str8ToStr16(addition);
167         additions.push_back(additionString);
168     }
169     return additions;
170 }
171 
ToString() const172 std::string Location::ToString() const
173 {
174     std::string str =
175         ", altitude : " + std::to_string(altitude_) +
176         ", accuracy : " + std::to_string(accuracy_) +
177         ", speed : " + std::to_string(speed_) +
178         ", direction : " + std::to_string(direction_) +
179         ", timeStamp : " + std::to_string(timeStamp_) +
180         ", timeSinceBoot : " + std::to_string(timeSinceBoot_) +
181         ", additionSize : " + std::to_string(additionSize_) +
182         ", isFromMock : " + std::to_string(isFromMock_) +
183         ", isSystemApp : " + std::to_string(isSystemApp_) +
184         ", altitudeAccuracy : " + std::to_string(altitudeAccuracy_) +
185         ", speedAccuracy : " + std::to_string(speedAccuracy_) +
186         ", directionAccuracy : " + std::to_string(directionAccuracy_) +
187         ", uncertaintyOfTimeSinceBoot : " + std::to_string(uncertaintyOfTimeSinceBoot_) +
188         ", locationSourceType : " + std::to_string(locationSourceType_) +
189         ", uuid : " + uuid_ +
190         ", fieldValidity : " + std::to_string(fieldValidity_);
191     return str;
192 }
193 
LocationEqual(const std::unique_ptr<Location> & location)194 bool Location::LocationEqual(const std::unique_ptr<Location>& location)
195 {
196     if (location == nullptr) {
197         return false;
198     }
199     if (this->GetLatitude() == location->GetLatitude() &&
200         this->GetLongitude() == location->GetLongitude() &&
201         this->GetAltitude() == location->GetAltitude() &&
202         this->GetAccuracy() == location->GetAccuracy() &&
203         this->GetSpeed() == location->GetSpeed() &&
204         this->GetDirection() == location->GetDirection() &&
205         this->GetTimeStamp() == location->GetTimeStamp() &&
206         this->GetTimeSinceBoot() == location->GetTimeSinceBoot() &&
207         this->AdditionEqual(location) &&
208         this->GetAdditionSize() == location->GetAdditionSize() &&
209         this->GetIsFromMock() == location->GetIsFromMock()) {
210         return true;
211     }
212     return false;
213 }
214 
AdditionEqual(const std::unique_ptr<Location> & location)215 bool Location::AdditionEqual(const std::unique_ptr<Location>& location)
216 {
217     if (location == nullptr) {
218         return false;
219     }
220     std::vector<std::string> additionA = this->GetAdditions();
221     std::vector<std::string> additionB = location->GetAdditions();
222     if (additionA.size() != additionB.size()) {
223         return false;
224     }
225     for (size_t i = 0; i < additionA.size(); i++) {
226         if (additionA[i].compare(additionB[i]) != 0) {
227             return false;
228         }
229     }
230     return true;
231 }
232 } // namespace Location
233 } // namespace OHOS