Skip to content

Commit 128023d

Browse files
committed
Rewrite all parsing for UTF16 and test on Windows #1968
1 parent db66759 commit 128023d

File tree

3 files changed

+217
-215
lines changed

3 files changed

+217
-215
lines changed

src/geotools.cpp

Lines changed: 53 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -80,25 +80,26 @@ bool GeoTools::GeocodeGoogle(const wxString& address, double* lat, double* lon,
8080
return false;
8181
}
8282

83-
rapidjson::Document reader;
83+
// change from UTF8 to UTF16 encoding to address unicode characters per SAM GitHub issue 1848
84+
rapidjson::GenericDocument < rapidjson::UTF16<> > reader;
8485
wxString str = curl.GetDataAsString();
8586
reader.Parse(str.c_str());
8687

8788
if (!reader.HasParseError()) {
88-
if (reader.HasMember("results")) {
89-
if (reader["results"].IsArray()) {
90-
if (reader["results"][0].HasMember("geometry")) {
91-
if (reader["results"][0]["geometry"].IsArray()) {
92-
if (reader["results"][0]["geometry"][0].HasMember("location")) {
93-
if (reader["results"][0]["geometry"][0]["location"].HasMember("lat")) {
94-
if (reader["results"][0]["geometry"][0]["location"]["lat"].IsNumber()) {
95-
*lat = reader["results"][0]["geometry"][0]["location"]["lat"].GetDouble();
89+
if (reader.HasMember(L"results")) {
90+
if (reader[L"results"].IsArray()) {
91+
if (reader[L"results"][0].HasMember(L"geometry")) {
92+
if (reader[L"results"][0][L"geometry"].IsArray()) {
93+
if (reader[L"results"][0][L"geometry"][0].HasMember(L"location")) {
94+
if (reader[L"results"][0][L"geometry"][0][L"location"].HasMember(L"lat")) {
95+
if (reader[L"results"][0][L"geometry"][0][L"location"][L"lat"].IsNumber()) {
96+
*lat = reader[L"results"][0][L"geometry"][0][L"location"][L"lat"].GetDouble();
9697
success = true;
9798
}
9899
}
99-
if (reader["results"][0]["geometry"][0]["location"].HasMember("lng")) {
100-
if (reader["results"][0]["geometry"][0]["location"]["lng"].IsNumber()) {
101-
*lon = reader["results"][0]["geometry"][0]["location"]["lng"].GetDouble();
100+
if (reader[L"results"][0][L"geometry"][0][L"location"].HasMember(L"lng")) {
101+
if (reader[L"results"][0][L"geometry"][0][L"location"][L"lng"].IsNumber()) {
102+
*lon = reader[L"results"][0][L"geometry"][0][L"location"][L"lng"].GetDouble();
102103
success &= true;
103104
}
104105
}
@@ -112,9 +113,9 @@ bool GeoTools::GeocodeGoogle(const wxString& address, double* lat, double* lon,
112113

113114
success = false;//overrides success of retrieving data
114115

115-
if (reader.HasMember("status")) {
116-
if (reader["status"].IsString()) {
117-
str = reader["status"].GetString();
116+
if (reader.HasMember(L"status")) {
117+
if (reader[L"status"].IsString()) {
118+
str = reader[L"status"].GetString();
118119
success = str.Lower() == "ok";
119120
}
120121
}
@@ -142,13 +143,13 @@ bool GeoTools::GeocodeGoogle(const wxString& address, double* lat, double* lon,
142143
reader.Parse(str.c_str());
143144

144145
if (!reader.HasParseError()) {
145-
if (reader.HasMember("rawOffset")) {
146-
if (reader["rawOffset"].IsNumber()) {
147-
*tz = reader["rawOffset"].GetDouble() / 3600.0;
146+
if (reader.HasMember(L"rawOffset")) {
147+
if (reader[L"rawOffset"].IsNumber()) {
148+
*tz = reader[L"rawOffset"].GetDouble() / 3600.0;
148149
success = true;
149150
}
150-
else if (reader["rawOffset"].IsInt()) {
151-
*tz = reader["rawOffset"].GetInt() / 3600.0;
151+
else if (reader[L"rawOffset"].IsInt()) {
152+
*tz = reader[L"rawOffset"].GetInt() / 3600.0;
152153
success = true;
153154
}
154155
}
@@ -157,9 +158,9 @@ bool GeoTools::GeocodeGoogle(const wxString& address, double* lat, double* lon,
157158
// check status code
158159
success = false;//overrides success of retrieving data
159160

160-
if (reader.HasMember("status")) {
161-
if (reader["status"].IsString()) {
162-
str = reader["status"].GetString();
161+
if (reader.HasMember(L"status")) {
162+
if (reader[L"status"].IsString()) {
163+
str = reader[L"status"].GetString();
163164
success = str.Lower() == "ok";
164165
}
165166
}
@@ -207,7 +208,8 @@ bool GeoTools::GeocodeDeveloper(const wxString& address, double* lat, double* lo
207208
return false;
208209
}
209210

210-
rapidjson::Document reader;
211+
// change from UTF8 to UTF16 encoding to address unicode characters per SAM GitHub issue 1848
212+
rapidjson::GenericDocument < rapidjson::UTF16<> > reader;
211213
wxString str = curl.GetDataAsString();
212214

213215
// str.Replace("\"", "\\\"");
@@ -224,7 +226,7 @@ bool GeoTools::GeocodeDeveloper(const wxString& address, double* lat, double* lo
224226

225227
// rapidjson::ParseResult ok = reader.Parse((const char*)str.c_str());
226228
// rapidjson::ParseResult ok = reader.ParseStream(is);
227-
rapidjson::ParseResult ok = reader.Parse<0>(str.c_str());
229+
rapidjson::ParseResult ok = reader.Parse(str.c_str());
228230

229231

230232
/*
@@ -250,20 +252,20 @@ bool GeoTools::GeocodeDeveloper(const wxString& address, double* lat, double* lo
250252
*/
251253

252254
if (!reader.HasParseError()) {
253-
if (reader.HasMember("results")) {
254-
if (reader["results"].IsArray()) {
255-
if (reader["results"][0].HasMember("locations")) {
256-
if (reader["results"][0]["locations"].IsArray()) {
257-
if (reader["results"][0]["locations"][0].HasMember("latLng")) {
258-
if (reader["results"][0]["locations"][0]["latLng"].HasMember("lat")) {
259-
if (reader["results"][0]["locations"][0]["latLng"]["lat"].IsNumber()) {
260-
*lat = reader["results"][0]["locations"][0]["latLng"]["lat"].GetDouble();
255+
if (reader.HasMember(L"results")) {
256+
if (reader[L"results"].IsArray()) {
257+
if (reader[L"results"][0].HasMember(L"locations")) {
258+
if (reader[L"results"][0][L"locations"].IsArray()) {
259+
if (reader[L"results"][0][L"locations"][0].HasMember(L"latLng")) {
260+
if (reader[L"results"][0][L"locations"][0][L"latLng"].HasMember(L"lat")) {
261+
if (reader[L"results"][0][L"locations"][0][L"latLng"][L"lat"].IsNumber()) {
262+
*lat = reader[L"results"][0][L"locations"][0][L"latLng"][L"lat"].GetDouble();
261263
success = true;
262264
}
263265
}
264-
if (reader["results"][0]["locations"][0]["latLng"].HasMember("lng")) {
265-
if (reader["results"][0]["locations"][0]["latLng"]["lng"].IsNumber()) {
266-
*lon = reader["results"][0]["locations"][0]["latLng"]["lng"].GetDouble();
266+
if (reader[L"results"][0][L"locations"][0][L"latLng"].HasMember(L"lng")) {
267+
if (reader[L"results"][0][L"locations"][0][L"latLng"][L"lng"].IsNumber()) {
268+
*lon = reader[L"results"][0][L"locations"][0][L"latLng"][L"lng"].GetDouble();
267269
success &= true;
268270
}
269271
}
@@ -276,10 +278,10 @@ bool GeoTools::GeocodeDeveloper(const wxString& address, double* lat, double* lo
276278
success = false;//overrides success of retrieving data
277279
wxMessageBox(str, "geocode developer reset status code ");
278280

279-
if (reader.HasMember("info")) {
280-
if (reader["info"].HasMember("statuscode")) {
281-
if (reader["info"]["statuscode"].IsInt()) {
282-
success = reader["info"]["statuscode"].GetInt() == 0;
281+
if (reader.HasMember(L"info")) {
282+
if (reader[L"info"].HasMember(L"statuscode")) {
283+
if (reader[L"info"][L"statuscode"].IsInt()) {
284+
success = reader[L"info"][L"statuscode"].GetInt() == 0;
283285
}
284286
}
285287
}
@@ -331,14 +333,14 @@ bool GeoTools::GeocodeDeveloper(const wxString& address, double* lat, double* lo
331333
reader.Parse(str.c_str());
332334

333335
if (!reader.HasParseError()) {
334-
if (reader.HasMember("resourceSets")) {
335-
if (reader["resourceSets"].IsArray()) {
336-
if (reader["resourceSets"][0].HasMember("resources")) {
337-
if (reader["resourceSets"][0]["resources"].IsArray()) {
338-
if (reader["resourceSets"][0]["resources"][0].HasMember("timeZone")) {
339-
if (reader["resourceSets"][0]["resources"][0]["timeZone"].HasMember("utcOffset")) {
340-
if (reader["resourceSets"][0]["resources"][0]["timeZone"]["utcOffset"].IsString()) {
341-
wxString stz = reader["resourceSets"][0]["resources"][0]["timeZone"]["utcOffset"].GetString();
336+
if (reader.HasMember(L"resourceSets")) {
337+
if (reader[L"resourceSets"].IsArray()) {
338+
if (reader[L"resourceSets"][0].HasMember(L"resources")) {
339+
if (reader[L"resourceSets"][0][L"resources"].IsArray()) {
340+
if (reader[L"resourceSets"][0][L"resources"][0].HasMember(L"timeZone")) {
341+
if (reader[L"resourceSets"][0][L"resources"][0][L"timeZone"].HasMember(L"utcOffset")) {
342+
if (reader[L"resourceSets"][0][L"resources"][0][L"timeZone"][L"utcOffset"].IsString()) {
343+
wxString stz = reader[L"resourceSets"][0][L"resources"][0][L"timeZone"][L"utcOffset"].GetString();
342344
wxArrayString as = wxSplit(stz, ':');
343345
if (as.Count() != 2) return false;
344346
if (!as[0].ToDouble(tz)) return false;
@@ -359,9 +361,9 @@ bool GeoTools::GeocodeDeveloper(const wxString& address, double* lat, double* lo
359361
// check status code
360362
success = false;//overrides success of retrieving data
361363

362-
if (reader.HasMember("statusDescription")) {
363-
if (reader["statusDescription"].IsString()) {
364-
wxString str = reader["statusDescription"].GetString();
364+
if (reader.HasMember(L"statusDescription")) {
365+
if (reader[L"statusDescription"].IsString()) {
366+
wxString str = reader[L"statusDescription"].GetString();
365367
success = str.Lower() == "ok";
366368
}
367369
}

0 commit comments

Comments
 (0)