29#include <wx/tokenzr.h>
32bool ChartCatalog::LoadFromFile(
const wxString &path,
bool headerOnly) {
33 dt_valid = wxInvalidDateTime;
34 date_created = dt_valid;
35 time_created = dt_valid;
36 date_valid = dt_valid;
37 title = _(
"Catalog is not valid.");
39 if (!wxFileExists(path))
return false;
42 bool ret = doc.load_file(path.mb_str());
44 ret = LoadFromXml(&doc, headerOnly);
51wxDateTime ChartCatalog::GetReleaseDate() {
52 if (!dt_valid.IsValid()) {
56 if (date_created.IsValid() && time_created.IsValid()) {
57 dt_valid.ParseDate(date_created.FormatDate());
58 dt_valid.ParseTime(time_created.FormatTime());
59 dt_valid.MakeFromTimezone(wxDateTime::UTC);
62 wxASSERT(dt_valid.IsValid());
69 wxString rootName = wxString::FromUTF8(root.name());
71 if (rootName.StartsWith(
"RncProductCatalog")) {
72 if (!ParseNoaaHeader(root.first_child())) {
75 if (headerOnly)
return true;
78 element = element.next_sibling()) {
79 if (!strcmp(element.name(),
"chart")) {
80 charts.push_back(std::make_unique<RasterChart>(element));
83 }
else if (rootName.StartsWith(
"EncProductCatalog")) {
84 if (!ParseNoaaHeader(root.first_child())) {
87 if (headerOnly)
return true;
90 element = element.next_sibling()) {
91 if (!strcmp(element.name(),
"cell")) {
92 charts.push_back(std::make_unique<EncCell>(element));
98 else if (rootName.StartsWith(
"IENCU37ProductCatalog") ||
99 rootName.StartsWith(
"IENCBuoyProductCatalog") ||
100 rootName.StartsWith(
"IENCSouthwestPassProductCatalog")) {
101 if (!ParseNoaaHeader(root.first_child())) {
104 if (headerOnly)
return true;
107 element = element.next_sibling()) {
108 if (!strcmp(element.name(),
"Cell")) {
109 charts.push_back(std::make_unique<IEncCell>(element));
119bool ChartCatalog::ParseNoaaHeader(
const pugi::xml_node &xmldata) {
121 element = element.next_sibling()) {
122 if (!strcmp(element.name(),
"title")) {
123 title = wxString::FromUTF8(element.first_child().value());
124 }
else if (!strcmp(element.name(),
"date_created")) {
125 date_created.ParseDate(wxString::FromUTF8(element.first_child().value()));
126 wxASSERT(date_created.IsValid());
127 }
else if (!strcmp(element.name(),
"time_created")) {
128 time_created.ParseTime(wxString::FromUTF8(element.first_child().value()));
129 wxASSERT(time_created.IsValid());
130 }
else if (!strcmp(element.name(),
"date_valid")) {
131 date_valid.ParseDate(wxString::FromUTF8(element.first_child().value()));
132 wxASSERT(time_created.IsValid());
133 }
else if (!strcmp(element.name(),
"time_valid")) {
134 time_valid.ParseTime(wxString::FromUTF8(element.first_child().value()));
135 wxASSERT(time_created.IsValid());
136 }
else if (!strcmp(element.name(),
"dt_valid")) {
137 wxStringTokenizer tk(wxString::FromUTF8(element.first_child().value()),
139 dt_valid.ParseDate(tk.GetNextToken());
140 dt_valid.ParseTime(tk.GetNextToken());
141 dt_valid.MakeFromTimezone(wxDateTime::UTC);
142 wxASSERT(dt_valid.IsValid());
143 }
else if (!strcmp(element.name(),
"ref_spec")) {
144 ref_spec = wxString::FromUTF8(element.first_child().value());
145 }
else if (!strcmp(element.name(),
"ref_spec_vers")) {
146 ref_spec_vers = wxString::FromUTF8(element.first_child().value());
147 }
else if (!strcmp(element.name(),
"s62AgencyCode")) {
148 s62AgencyCode = wxString::FromUTF8(element.first_child().value());
156 coast_guard_districts->Clear();
157 wxDELETE(coast_guard_districts);
167 coast_guard_districts =
new wxArrayString();
168 states =
new wxArrayString();
169 regions =
new wxArrayString();
170 target_filename =
"";
172 manual_download_url =
"";
174 zipfile_location =
"";
176 zipfile_datetime = wxInvalidDateTime;
177 zipfile_datetime_iso8601 = wxInvalidDateTime;
178 uadt = wxInvalidDateTime;
179 isdt = wxInvalidDateTime;
186 element = element.next_sibling()) {
187 if (!strcmp(element.name(),
"title")) {
188 title = wxString::FromUTF8(element.first_child().value());
189 }
else if (!strcmp(element.name(),
"lname")) {
190 title = wxString::FromUTF8(element.first_child().value());
191 }
else if (!strcmp(element.name(),
"coast_guard_districts")) {
192 for (
pugi::xml_node subElement = element.first_child(); subElement;
193 subElement = subElement.next_sibling()) {
194 coast_guard_districts->Add(
195 wxString::FromUTF8(subElement.first_child().value()));
197 }
else if (!strcmp(element.name(),
"states")) {
198 for (
pugi::xml_node subElement = element.first_child(); subElement;
199 subElement = subElement.next_sibling()) {
200 states->Add(wxString::FromUTF8(subElement.first_child().value()));
202 }
else if (!strcmp(element.name(),
"regions")) {
203 for (
pugi::xml_node subElement = element.first_child(); subElement;
204 subElement = subElement.next_sibling()) {
205 regions->Add(wxString::FromUTF8(subElement.first_child().value()));
207 }
else if (!strcmp(element.name(),
"zipfile_location")) {
208 zipfile_location = wxString::FromUTF8(element.first_child().value());
209 }
else if (!strcmp(element.name(),
"zipfile_datetime")) {
210 if (zipfile_datetime.ParseFormat(
211 wxString::FromUTF8(element.first_child().value()),
213 zipfile_datetime.MakeFromTimezone(wxDateTime::UTC);
214 }
else if (!strcmp(element.name(),
"zipfile_datetime_iso8601")) {
215 wxStringTokenizer tk(wxString::FromUTF8(element.first_child().value()),
217 zipfile_datetime_iso8601.ParseDate(tk.GetNextToken());
218 zipfile_datetime_iso8601.ParseTime(tk.GetNextToken());
219 zipfile_datetime_iso8601.MakeFromTimezone(wxDateTime::UTC);
220 }
else if (!strcmp(element.name(),
"zipfile_size")) {
221 zipfile_size = wxAtoi(wxString::FromUTF8(element.first_child().value()));
222 }
else if (!strcmp(element.name(),
"edtn")) {
223 edtn = wxAtoi(wxString::FromUTF8(element.first_child().value()));
224 }
else if (!strcmp(element.name(),
"updn")) {
225 updn = wxAtoi(wxString::FromUTF8(element.first_child().value()));
226 }
else if (!strcmp(element.name(),
"uadt")) {
227 uadt.ParseFormat(wxString::FromUTF8(element.first_child().value()),
229 }
else if (!strcmp(element.name(),
"isdt")) {
230 isdt.ParseFormat(wxString::FromUTF8(element.first_child().value()),
232 }
else if (!strcmp(element.name(),
"cov")) {
233 for (
pugi::xml_node subElement = element.first_child(); subElement;
234 subElement = subElement.next_sibling()) {
235 coverage.push_back(std::make_unique<Panel>(subElement));
237 }
else if (!strcmp(element.name(),
"target_filename")) {
238 target_filename = wxString::FromUTF8(element.first_child().value());
239 }
else if (!strcmp(element.name(),
"reference_file")) {
240 reference_file = wxString::FromUTF8(element.first_child().value());
241 }
else if (!strcmp(element.name(),
"manual_download_url")) {
242 manual_download_url = wxString::FromUTF8(element.first_child().value());
243 }
else if (!strcmp(element.name(),
"nm")) {
246 }
else if (!strcmp(element.name(),
"lnm")) {
253wxString Chart::GetChartFilename(
bool to_check) {
254 if (to_check && reference_file !=
"")
return reference_file;
255 if (target_filename !=
"")
return target_filename;
257 wxStringTokenizer tk(zipfile_location,
"/");
259 file = tk.GetNextToken();
260 }
while (tk.HasMoreTokens());
271 source_edition_last_correction =
"";
272 raster_edition_last_correction =
"";
273 ntm_edition_last_correction =
"";
276 element = element.next_sibling()) {
277 if (!strcmp(element.name(),
"number")) {
278 number = wxString::FromUTF8(element.first_child().value());
279 }
else if (!strcmp(element.name(),
"source_edition")) {
281 wxAtoi(wxString::FromUTF8(element.first_child().value()));
282 }
else if (!strcmp(element.name(),
"raster_edition")) {
284 wxAtoi(wxString::FromUTF8(element.first_child().value()));
285 }
else if (!strcmp(element.name(),
"ntm_edition")) {
286 ntm_edition = wxAtoi(wxString::FromUTF8(element.first_child().value()));
287 }
else if (!strcmp(element.name(),
"source_date")) {
288 source_date = wxString::FromUTF8(element.first_child().value());
289 }
else if (!strcmp(element.name(),
"ntm_date")) {
290 ntm_date = wxString::FromUTF8(element.first_child().value());
291 }
else if (!strcmp(element.name(),
"source_edition_last_correction")) {
292 source_edition_last_correction =
293 wxString::FromUTF8(element.first_child().value());
294 }
else if (!strcmp(element.name(),
"raster_edition_last_correction")) {
295 raster_edition_last_correction =
296 wxString::FromUTF8(element.first_child().value());
297 }
else if (!strcmp(element.name(),
"ntm_edition_last_correction")) {
298 ntm_edition_last_correction =
299 wxString::FromUTF8(element.first_child().value());
312 uadt = wxInvalidDateTime;
313 isdt = wxInvalidDateTime;
316 element = element.next_sibling()) {
317 if (!strcmp(element.name(),
"name")) {
318 number = wxString::FromUTF8(element.first_child().value());
319 }
else if (!strcmp(element.name(),
"src_chart")) {
320 src_chart = wxString::FromUTF8(element.first_child().value());
321 }
else if (!strcmp(element.name(),
"cscale")) {
322 cscale = wxAtoi(wxString::FromUTF8(element.first_child().value()));
323 }
else if (!strcmp(element.name(),
"status")) {
324 status = wxString::FromUTF8(element.first_child().value());
325 }
else if (!strcmp(element.name(),
"edtn")) {
326 edtn = wxAtoi(wxString::FromUTF8(element.first_child().value()));
327 }
else if (!strcmp(element.name(),
"updn")) {
328 updn = wxAtoi(wxString::FromUTF8(element.first_child().value()));
329 }
else if (!strcmp(element.name(),
"uadt")) {
330 uadt.ParseDateTime(wxString::FromUTF8(element.first_child().value()));
331 }
else if (!strcmp(element.name(),
"isdt")) {
332 isdt.ParseDateTime(wxString::FromUTF8(element.first_child().value()));
342 river_miles =
nullptr;
350 element = element.next_sibling()) {
351 if (!strcmp(element.name(),
"name")) {
353 number = wxString::FromUTF8(element.first_child().value());
354 zipfile_location = wxString::Format(
"%s.zip", number.c_str());
355 }
else if (!strcmp(element.name(),
"location")) {
357 }
else if (!strcmp(element.name(),
"river_name")) {
358 river_name = wxString::FromUTF8(element.first_child().value());
359 }
else if (!strcmp(element.name(),
"river_miles")) {
361 }
else if (!strcmp(element.name(),
"river_miles")) {
363 }
else if (!strcmp(element.name(),
"area")) {
364 area =
new Area(element);
365 }
else if (!strcmp(element.name(),
"shp_file")) {
367 }
else if (!strcmp(element.name(),
"s57_file")) {
369 }
else if (!strcmp(element.name(),
"kml_file")) {
371 }
else if (!strcmp(element.name(),
"edition")) {
372 edition = wxString::FromUTF8(element.first_child().value());
377IEncCell::~IEncCell() {
379 wxDELETE(river_miles);
386wxString IEncCell::GetChartTitle()
390 if (river_name !=
"") {
393 return wxString::Format(_(
"%s (%s to %s), river miles %3.1f - %3.1f"),
394 river_name.c_str(), location->from.c_str(),
395 location->to.c_str(), river_miles->begin,
401 return wxString::Format(_(
"%s"), number.c_str());
405wxString IEncCell::GetDownloadLocation() {
return s57_file->location; }
407wxDateTime IEncCell::GetUpdateDatetime() {
return s57_file->date_posted; }
412 date_posted = wxInvalidDateTime;
413 time_posted = wxInvalidDateTime;
416 element = element.next_sibling()) {
417 if (!strcmp(element.name(),
"location")) {
418 location = wxString::FromUTF8(element.first_child().value());
419 }
else if (!strcmp(element.name(),
"date_posted")) {
420 date_posted.ParseDate(wxString::FromUTF8(element.first_child().value()));
421 }
else if (!strcmp(element.name(),
"time_posted")) {
422 if (strlen(element.first_child().value()))
423 time_posted.ParseTime(
424 wxString::FromUTF8(element.first_child().value()));
426 time_posted.ParseTime(
"00:00:00");
427 }
else if (!strcmp(element.name(),
"file_size")) {
428 if (strlen(element.first_child().value()))
429 file_size = wxAtoi(wxString::FromUTF8(element.first_child().value()));
443 element = element.next_sibling()) {
444 if (!strcmp(element.name(),
"north")) {
445 north = wxAtof(wxString::FromUTF8(element.first_child().value()));
446 }
else if (!strcmp(element.name(),
"south")) {
447 south = wxAtof(wxString::FromUTF8(element.first_child().value()));
448 }
else if (!strcmp(element.name(),
"east")) {
449 east = wxAtof(wxString::FromUTF8(element.first_child().value()));
450 }
else if (!strcmp(element.name(),
"west")) {
451 west = wxAtof(wxString::FromUTF8(element.first_child().value()));
460 element = element.next_sibling()) {
461 if (!strcmp(element.name(),
"begin")) {
462 begin = wxAtof(wxString::FromUTF8(element.first_child().value()));
463 }
else if (!strcmp(element.name(),
"end")) {
464 end = wxAtof(wxString::FromUTF8(element.first_child().value()));
473 element = element.next_sibling()) {
474 if (!strcmp(element.name(),
"from")) {
475 from = wxString::FromUTF8(element.first_child().value());
476 }
else if (!strcmp(element.name(),
"to")) {
477 to = wxString::FromUTF8(element.first_child().value());
485 date = wxInvalidDateTime;
488 element = element.next_sibling()) {
489 if (!strcmp(element.name(),
"nm_agency")) {
490 agency = wxString::FromUTF8(element.first_child().value());
491 }
else if (!strcmp(element.name(),
"lnm_agency")) {
492 agency = wxString::FromUTF8(element.first_child().value());
493 }
else if (!strcmp(element.name(),
"doc")) {
494 doc = wxString::FromUTF8(element.first_child().value());
495 }
else if (!strcmp(element.name(),
"date")) {
496 date.ParseDate(wxString::FromUTF8(element.first_child().value()));
505 element = element.next_sibling()) {
506 if (!strcmp(element.name(),
"panel_no")) {
507 panel_no = wxAtoi(wxString::FromUTF8(element.first_child().value()));
508 }
else if (!strcmp(element.name(),
"vertex")) {
521 element = element.next_sibling()) {
522 if (!strcmp(element.name(),
"panel_title")) {
523 panel_title = wxString::FromUTF8(element.first_child().value());
524 }
else if (!strcmp(element.name(),
"file_name")) {
525 file_name = wxString::FromUTF8(element.first_child().value());
526 }
else if (!strcmp(element.name(),
"scale")) {
527 scale = wxAtoi(wxString::FromUTF8(element.first_child().value()));
535 element = element.next_sibling()) {
536 if (!strcmp(element.name(),
"type")) {
537 type = wxString::FromUTF8(element.first_child().value());
547 element = element.next_sibling()) {
548 if (!strcmp(element.name(),
"lat")) {
549 wxString::FromUTF8(element.first_child().value()).ToDouble(&lat);
550 }
else if (!strcmp(element.name(),
"lon")) {
551 wxString::FromUTF8(element.first_child().value()).ToDouble(&lon);
Chart Downloader Plugin chart classes.