29#include "chartcatalog.h"
30#include <wx/tokenzr.h>
34bool ChartCatalog::LoadFromFile(wxString path,
bool headerOnly) {
35 dt_valid = wxInvalidDateTime;
36 date_created = dt_valid;
37 time_created = dt_valid;
38 date_valid = dt_valid;
39 title = _(
"Catalog is not valid.");
41 if (!wxFileExists(path))
return false;
44 bool ret = doc.load_file(path.mb_str());
46 ret = LoadFromXml(&doc, headerOnly);
53ChartCatalog::ChartCatalog() {}
55ChartCatalog::~ChartCatalog() {}
57wxDateTime ChartCatalog::GetReleaseDate() {
58 if (!dt_valid.IsValid()) {
62 if (date_created.IsValid() && time_created.IsValid()) {
63 dt_valid.ParseDate(date_created.FormatDate());
64 dt_valid.ParseTime(time_created.FormatTime());
65 dt_valid.MakeFromTimezone(wxDateTime::UTC);
68 wxASSERT(dt_valid.IsValid());
75 wxString rootName = wxString::FromUTF8(root.name());
77 if (rootName.StartsWith(_T(
"RncProductCatalog"))) {
78 if (!ParseNoaaHeader(root.first_child())) {
81 if (headerOnly)
return true;
84 element = element.next_sibling()) {
85 if (!strcmp(element.name(),
"chart")) {
86 charts.push_back(std::make_unique<RasterChart>(element));
89 }
else if (rootName.StartsWith(_T(
"EncProductCatalog"))) {
90 if (!ParseNoaaHeader(root.first_child())) {
93 if (headerOnly)
return true;
96 element = element.next_sibling()) {
97 if (!strcmp(element.name(),
"cell")) {
98 charts.push_back(std::make_unique<EncCell>(element));
104 else if (rootName.StartsWith(_T(
"IENCU37ProductCatalog")) ||
105 rootName.StartsWith(_T(
"IENCBuoyProductCatalog")) ||
106 rootName.StartsWith(_T(
"IENCSouthwestPassProductCatalog"))) {
107 if (!ParseNoaaHeader(root.first_child())) {
110 if (headerOnly)
return true;
113 element = element.next_sibling()) {
114 if (!strcmp(element.name(),
"Cell")) {
115 charts.push_back(std::make_unique<IEncCell>(element));
125bool ChartCatalog::ParseNoaaHeader(
const pugi::xml_node &xmldata) {
127 element = element.next_sibling()) {
128 if (!strcmp(element.name(),
"title")) {
129 title = wxString::FromUTF8(element.first_child().value());
130 }
else if (!strcmp(element.name(),
"date_created")) {
131 date_created.ParseDate(wxString::FromUTF8(element.first_child().value()));
132 wxASSERT(date_created.IsValid());
133 }
else if (!strcmp(element.name(),
"time_created")) {
134 time_created.ParseTime(wxString::FromUTF8(element.first_child().value()));
135 wxASSERT(time_created.IsValid());
136 }
else if (!strcmp(element.name(),
"date_valid")) {
137 date_valid.ParseDate(wxString::FromUTF8(element.first_child().value()));
138 wxASSERT(time_created.IsValid());
139 }
else if (!strcmp(element.name(),
"time_valid")) {
140 time_valid.ParseTime(wxString::FromUTF8(element.first_child().value()));
141 wxASSERT(time_created.IsValid());
142 }
else if (!strcmp(element.name(),
"dt_valid")) {
143 wxStringTokenizer tk(wxString::FromUTF8(element.first_child().value()),
145 dt_valid.ParseDate(tk.GetNextToken());
146 dt_valid.ParseTime(tk.GetNextToken());
147 dt_valid.MakeFromTimezone(wxDateTime::UTC);
148 wxASSERT(dt_valid.IsValid());
149 }
else if (!strcmp(element.name(),
"ref_spec")) {
150 ref_spec = wxString::FromUTF8(element.first_child().value());
151 }
else if (!strcmp(element.name(),
"ref_spec_vers")) {
152 ref_spec_vers = wxString::FromUTF8(element.first_child().value());
153 }
else if (!strcmp(element.name(),
"s62AgencyCode")) {
154 s62AgencyCode = wxString::FromUTF8(element.first_child().value());
162 coast_guard_districts->Clear();
163 wxDELETE(coast_guard_districts);
173 coast_guard_districts =
new wxArrayString();
174 states =
new wxArrayString();
175 regions =
new wxArrayString();
176 target_filename = wxEmptyString;
177 reference_file = wxEmptyString;
178 manual_download_url = wxEmptyString;
179 title = wxEmptyString;
180 zipfile_location = wxEmptyString;
182 zipfile_datetime = wxInvalidDateTime;
183 zipfile_datetime_iso8601 = wxInvalidDateTime;
184 uadt = wxInvalidDateTime;
185 isdt = wxInvalidDateTime;
192 element = element.next_sibling()) {
193 if (!strcmp(element.name(),
"title")) {
194 title = wxString::FromUTF8(element.first_child().value());
195 }
else if (!strcmp(element.name(),
"lname")) {
196 title = wxString::FromUTF8(element.first_child().value());
197 }
else if (!strcmp(element.name(),
"coast_guard_districts")) {
198 for (
pugi::xml_node subElement = element.first_child(); subElement;
199 subElement = subElement.next_sibling()) {
200 coast_guard_districts->Add(
201 wxString::FromUTF8(subElement.first_child().value()));
203 }
else if (!strcmp(element.name(),
"states")) {
204 for (
pugi::xml_node subElement = element.first_child(); subElement;
205 subElement = subElement.next_sibling()) {
206 states->Add(wxString::FromUTF8(subElement.first_child().value()));
208 }
else if (!strcmp(element.name(),
"regions")) {
209 for (
pugi::xml_node subElement = element.first_child(); subElement;
210 subElement = subElement.next_sibling()) {
211 regions->Add(wxString::FromUTF8(subElement.first_child().value()));
213 }
else if (!strcmp(element.name(),
"zipfile_location")) {
214 zipfile_location = wxString::FromUTF8(element.first_child().value());
215 }
else if (!strcmp(element.name(),
"zipfile_datetime")) {
216 if (zipfile_datetime.ParseFormat(
217 wxString::FromUTF8(element.first_child().value()),
218 _T(
"%Y%m%d_%H%M%S")))
219 zipfile_datetime.MakeFromTimezone(wxDateTime::UTC);
220 }
else if (!strcmp(element.name(),
"zipfile_datetime_iso8601")) {
221 wxStringTokenizer tk(wxString::FromUTF8(element.first_child().value()),
223 zipfile_datetime_iso8601.ParseDate(tk.GetNextToken());
224 zipfile_datetime_iso8601.ParseTime(tk.GetNextToken());
225 zipfile_datetime_iso8601.MakeFromTimezone(wxDateTime::UTC);
226 }
else if (!strcmp(element.name(),
"zipfile_size")) {
227 zipfile_size = wxAtoi(wxString::FromUTF8(element.first_child().value()));
228 }
else if (!strcmp(element.name(),
"edtn")) {
229 edtn = wxAtoi(wxString::FromUTF8(element.first_child().value()));
230 }
else if (!strcmp(element.name(),
"updn")) {
231 updn = wxAtoi(wxString::FromUTF8(element.first_child().value()));
232 }
else if (!strcmp(element.name(),
"uadt")) {
233 uadt.ParseFormat(wxString::FromUTF8(element.first_child().value()),
235 }
else if (!strcmp(element.name(),
"isdt")) {
236 isdt.ParseFormat(wxString::FromUTF8(element.first_child().value()),
238 }
else if (!strcmp(element.name(),
"cov")) {
239 for (
pugi::xml_node subElement = element.first_child(); subElement;
240 subElement = subElement.next_sibling()) {
241 coverage.push_back(std::make_unique<Panel>(subElement));
243 }
else if (!strcmp(element.name(),
"target_filename")) {
244 target_filename = wxString::FromUTF8(element.first_child().value());
245 }
else if (!strcmp(element.name(),
"reference_file")) {
246 reference_file = wxString::FromUTF8(element.first_child().value());
247 }
else if (!strcmp(element.name(),
"manual_download_url")) {
248 manual_download_url = wxString::FromUTF8(element.first_child().value());
249 }
else if (!strcmp(element.name(),
"nm")) {
252 }
else if (!strcmp(element.name(),
"lnm")) {
259wxString Chart::GetChartFilename(
bool to_check) {
260 if (to_check && reference_file != wxEmptyString)
return reference_file;
261 if (target_filename != wxEmptyString)
return target_filename;
263 wxStringTokenizer tk(zipfile_location, _T(
"/"));
265 file = tk.GetNextToken();
266 }
while (tk.HasMoreTokens());
271 number = wxEmptyString;
275 source_date = wxEmptyString;
276 ntm_date = wxEmptyString;
277 source_edition_last_correction = wxEmptyString;
278 raster_edition_last_correction = wxEmptyString;
279 ntm_edition_last_correction = wxEmptyString;
282 element = element.next_sibling()) {
283 if (!strcmp(element.name(),
"number")) {
284 number = wxString::FromUTF8(element.first_child().value());
285 }
else if (!strcmp(element.name(),
"source_edition")) {
287 wxAtoi(wxString::FromUTF8(element.first_child().value()));
288 }
else if (!strcmp(element.name(),
"raster_edition")) {
290 wxAtoi(wxString::FromUTF8(element.first_child().value()));
291 }
else if (!strcmp(element.name(),
"ntm_edition")) {
292 ntm_edition = wxAtoi(wxString::FromUTF8(element.first_child().value()));
293 }
else if (!strcmp(element.name(),
"source_date")) {
294 source_date = wxString::FromUTF8(element.first_child().value());
295 }
else if (!strcmp(element.name(),
"ntm_date")) {
296 ntm_date = wxString::FromUTF8(element.first_child().value());
297 }
else if (!strcmp(element.name(),
"source_edition_last_correction")) {
298 source_edition_last_correction =
299 wxString::FromUTF8(element.first_child().value());
300 }
else if (!strcmp(element.name(),
"raster_edition_last_correction")) {
301 raster_edition_last_correction =
302 wxString::FromUTF8(element.first_child().value());
303 }
else if (!strcmp(element.name(),
"ntm_edition_last_correction")) {
304 ntm_edition_last_correction =
305 wxString::FromUTF8(element.first_child().value());
311 number = wxEmptyString;
313 src_chart = wxEmptyString;
315 status = wxEmptyString;
318 uadt = wxInvalidDateTime;
319 isdt = wxInvalidDateTime;
322 element = element.next_sibling()) {
323 if (!strcmp(element.name(),
"name")) {
324 number = wxString::FromUTF8(element.first_child().value());
325 }
else if (!strcmp(element.name(),
"src_chart")) {
326 src_chart = wxString::FromUTF8(element.first_child().value());
327 }
else if (!strcmp(element.name(),
"cscale")) {
328 cscale = wxAtoi(wxString::FromUTF8(element.first_child().value()));
329 }
else if (!strcmp(element.name(),
"status")) {
330 status = wxString::FromUTF8(element.first_child().value());
331 }
else if (!strcmp(element.name(),
"edtn")) {
332 edtn = wxAtoi(wxString::FromUTF8(element.first_child().value()));
333 }
else if (!strcmp(element.name(),
"updn")) {
334 updn = wxAtoi(wxString::FromUTF8(element.first_child().value()));
335 }
else if (!strcmp(element.name(),
"uadt")) {
336 uadt.ParseDateTime(wxString::FromUTF8(element.first_child().value()));
337 }
else if (!strcmp(element.name(),
"isdt")) {
338 isdt.ParseDateTime(wxString::FromUTF8(element.first_child().value()));
345 number = wxEmptyString;
347 river_name = wxEmptyString;
350 edition = wxEmptyString;
356 element = element.next_sibling()) {
357 if (!strcmp(element.name(),
"name")) {
359 number = wxString::FromUTF8(element.first_child().value());
360 zipfile_location = wxString::Format(_T(
"%s.zip"), number.c_str());
361 }
else if (!strcmp(element.name(),
"location")) {
363 }
else if (!strcmp(element.name(),
"river_name")) {
364 river_name = wxString::FromUTF8(element.first_child().value());
365 }
else if (!strcmp(element.name(),
"river_miles")) {
367 }
else if (!strcmp(element.name(),
"river_miles")) {
369 }
else if (!strcmp(element.name(),
"area")) {
370 area =
new Area(element);
371 }
else if (!strcmp(element.name(),
"shp_file")) {
373 }
else if (!strcmp(element.name(),
"s57_file")) {
375 }
else if (!strcmp(element.name(),
"kml_file")) {
377 }
else if (!strcmp(element.name(),
"edition")) {
378 edition = wxString::FromUTF8(element.first_child().value());
383IEncCell::~IEncCell() {
385 wxDELETE(river_miles);
392wxString IEncCell::GetChartTitle()
396 if (river_name != wxEmptyString) {
399 return wxString::Format(_(
"%s (%s to %s), river miles %3.1f - %3.1f"),
400 river_name.c_str(), location->from.c_str(),
401 location->to.c_str(), river_miles->begin,
407 return wxString::Format(_(
"%s"), number.c_str());
411wxString IEncCell::GetDownloadLocation() {
return s57_file->location; }
413wxDateTime IEncCell::GetUpdateDatetime() {
return s57_file->date_posted; }
417 location = wxEmptyString;
418 date_posted = wxInvalidDateTime;
419 time_posted = wxInvalidDateTime;
422 element = element.next_sibling()) {
423 if (!strcmp(element.name(),
"location")) {
424 location = wxString::FromUTF8(element.first_child().value());
425 }
else if (!strcmp(element.name(),
"date_posted")) {
426 date_posted.ParseDate(wxString::FromUTF8(element.first_child().value()));
427 }
else if (!strcmp(element.name(),
"time_posted")) {
428 if (strlen(element.first_child().value()))
429 time_posted.ParseTime(
430 wxString::FromUTF8(element.first_child().value()));
432 time_posted.ParseTime(_T(
"00:00:00"));
433 }
else if (!strcmp(element.name(),
"file_size")) {
434 if (strlen(element.first_child().value()))
435 file_size = wxAtoi(wxString::FromUTF8(element.first_child().value()));
449 element = element.next_sibling()) {
450 if (!strcmp(element.name(),
"north")) {
451 north = wxAtof(wxString::FromUTF8(element.first_child().value()));
452 }
else if (!strcmp(element.name(),
"south")) {
453 south = wxAtof(wxString::FromUTF8(element.first_child().value()));
454 }
else if (!strcmp(element.name(),
"east")) {
455 east = wxAtof(wxString::FromUTF8(element.first_child().value()));
456 }
else if (!strcmp(element.name(),
"west")) {
457 west = wxAtof(wxString::FromUTF8(element.first_child().value()));
466 element = element.next_sibling()) {
467 if (!strcmp(element.name(),
"begin")) {
468 begin = wxAtof(wxString::FromUTF8(element.first_child().value()));
469 }
else if (!strcmp(element.name(),
"end")) {
470 end = wxAtof(wxString::FromUTF8(element.first_child().value()));
476 from = wxEmptyString;
479 element = element.next_sibling()) {
480 if (!strcmp(element.name(),
"from")) {
481 from = wxString::FromUTF8(element.first_child().value());
482 }
else if (!strcmp(element.name(),
"to")) {
483 to = wxString::FromUTF8(element.first_child().value());
489 agency = wxEmptyString;
491 date = wxInvalidDateTime;
494 element = element.next_sibling()) {
495 if (!strcmp(element.name(),
"nm_agency")) {
496 agency = wxString::FromUTF8(element.first_child().value());
497 }
else if (!strcmp(element.name(),
"lnm_agency")) {
498 agency = wxString::FromUTF8(element.first_child().value());
499 }
else if (!strcmp(element.name(),
"doc")) {
500 doc = wxString::FromUTF8(element.first_child().value());
501 }
else if (!strcmp(element.name(),
"date")) {
502 date.ParseDate(wxString::FromUTF8(element.first_child().value()));
511 element = element.next_sibling()) {
512 if (!strcmp(element.name(),
"panel_no")) {
513 panel_no = wxAtoi(wxString::FromUTF8(element.first_child().value()));
514 }
else if (!strcmp(element.name(),
"vertex")) {
524 panel_title = wxEmptyString;
525 file_name = wxEmptyString;
529 element = element.next_sibling()) {
530 if (!strcmp(element.name(),
"panel_title")) {
531 panel_title = wxString::FromUTF8(element.first_child().value());
532 }
else if (!strcmp(element.name(),
"file_name")) {
533 file_name = wxString::FromUTF8(element.first_child().value());
534 }
else if (!strcmp(element.name(),
"scale")) {
535 scale = wxAtoi(wxString::FromUTF8(element.first_child().value()));
541 type = wxEmptyString;
543 element = element.next_sibling()) {
544 if (!strcmp(element.name(),
"type")) {
545 type = wxString::FromUTF8(element.first_child().value());
555 element = element.next_sibling()) {
556 if (!strcmp(element.name(),
"lat")) {
557 wxString::FromUTF8(element.first_child().value()).ToDouble(&lat);
558 }
else if (!strcmp(element.name(),
"lon")) {
559 wxString::FromUTF8(element.first_child().value()).ToDouble(&lon);