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;
188 element = element.next_sibling()) {
189 if (!strcmp(element.name(),
"title")) {
190 title = wxString::FromUTF8(element.first_child().value());
191 }
else if (!strcmp(element.name(),
"lname")) {
192 title = wxString::FromUTF8(element.first_child().value());
193 }
else if (!strcmp(element.name(),
"coast_guard_districts")) {
194 for (
pugi::xml_node subElement = element.first_child(); subElement;
195 subElement = subElement.next_sibling()) {
196 coast_guard_districts->Add(
197 wxString::FromUTF8(subElement.first_child().value()));
199 }
else if (!strcmp(element.name(),
"states")) {
200 for (
pugi::xml_node subElement = element.first_child(); subElement;
201 subElement = subElement.next_sibling()) {
202 states->Add(wxString::FromUTF8(subElement.first_child().value()));
204 }
else if (!strcmp(element.name(),
"regions")) {
205 for (
pugi::xml_node subElement = element.first_child(); subElement;
206 subElement = subElement.next_sibling()) {
207 regions->Add(wxString::FromUTF8(subElement.first_child().value()));
209 }
else if (!strcmp(element.name(),
"zipfile_location")) {
210 zipfile_location = wxString::FromUTF8(element.first_child().value());
211 }
else if (!strcmp(element.name(),
"zipfile_datetime")) {
212 if (zipfile_datetime.ParseFormat(
213 wxString::FromUTF8(element.first_child().value()),
214 _T(
"%Y%m%d_%H%M%S")))
215 zipfile_datetime.MakeFromTimezone(wxDateTime::UTC);
216 }
else if (!strcmp(element.name(),
"zipfile_datetime_iso8601")) {
217 wxStringTokenizer tk(wxString::FromUTF8(element.first_child().value()),
219 zipfile_datetime_iso8601.ParseDate(tk.GetNextToken());
220 zipfile_datetime_iso8601.ParseTime(tk.GetNextToken());
221 zipfile_datetime_iso8601.MakeFromTimezone(wxDateTime::UTC);
222 }
else if (!strcmp(element.name(),
"zipfile_size")) {
223 zipfile_size = wxAtoi(wxString::FromUTF8(element.first_child().value()));
224 }
else if (!strcmp(element.name(),
"cov")) {
225 for (
pugi::xml_node subElement = element.first_child(); subElement;
226 subElement = subElement.next_sibling()) {
227 coverage.push_back(std::make_unique<Panel>(subElement));
229 }
else if (!strcmp(element.name(),
"target_filename")) {
230 target_filename = wxString::FromUTF8(element.first_child().value());
231 }
else if (!strcmp(element.name(),
"reference_file")) {
232 reference_file = wxString::FromUTF8(element.first_child().value());
233 }
else if (!strcmp(element.name(),
"manual_download_url")) {
234 manual_download_url = wxString::FromUTF8(element.first_child().value());
235 }
else if (!strcmp(element.name(),
"nm")) {
238 }
else if (!strcmp(element.name(),
"lnm")) {
245wxString Chart::GetChartFilename(
bool to_check) {
246 if (to_check && reference_file != wxEmptyString)
return reference_file;
247 if (target_filename != wxEmptyString)
return target_filename;
249 wxStringTokenizer tk(zipfile_location, _T(
"/"));
251 file = tk.GetNextToken();
252 }
while (tk.HasMoreTokens());
257 number = wxEmptyString;
261 source_date = wxEmptyString;
262 ntm_date = wxEmptyString;
263 source_edition_last_correction = wxEmptyString;
264 raster_edition_last_correction = wxEmptyString;
265 ntm_edition_last_correction = wxEmptyString;
268 element = element.next_sibling()) {
269 if (!strcmp(element.name(),
"number")) {
270 number = wxString::FromUTF8(element.first_child().value());
271 }
else if (!strcmp(element.name(),
"source_edition")) {
273 wxAtoi(wxString::FromUTF8(element.first_child().value()));
274 }
else if (!strcmp(element.name(),
"raster_edition")) {
276 wxAtoi(wxString::FromUTF8(element.first_child().value()));
277 }
else if (!strcmp(element.name(),
"ntm_edition")) {
278 ntm_edition = wxAtoi(wxString::FromUTF8(element.first_child().value()));
279 }
else if (!strcmp(element.name(),
"source_date")) {
280 source_date = wxString::FromUTF8(element.first_child().value());
281 }
else if (!strcmp(element.name(),
"ntm_date")) {
282 ntm_date = wxString::FromUTF8(element.first_child().value());
283 }
else if (!strcmp(element.name(),
"source_edition_last_correction")) {
284 source_edition_last_correction =
285 wxString::FromUTF8(element.first_child().value());
286 }
else if (!strcmp(element.name(),
"raster_edition_last_correction")) {
287 raster_edition_last_correction =
288 wxString::FromUTF8(element.first_child().value());
289 }
else if (!strcmp(element.name(),
"ntm_edition_last_correction")) {
290 ntm_edition_last_correction =
291 wxString::FromUTF8(element.first_child().value());
297 number = wxEmptyString;
299 src_chart = wxEmptyString;
301 status = wxEmptyString;
304 uadt = wxInvalidDateTime;
305 isdt = wxInvalidDateTime;
308 element = element.next_sibling()) {
309 if (!strcmp(element.name(),
"name")) {
310 number = wxString::FromUTF8(element.first_child().value());
311 }
else if (!strcmp(element.name(),
"src_chart")) {
312 src_chart = wxString::FromUTF8(element.first_child().value());
313 }
else if (!strcmp(element.name(),
"cscale")) {
314 cscale = wxAtoi(wxString::FromUTF8(element.first_child().value()));
315 }
else if (!strcmp(element.name(),
"status")) {
316 status = wxString::FromUTF8(element.first_child().value());
317 }
else if (!strcmp(element.name(),
"edtn")) {
318 edtn = wxAtoi(wxString::FromUTF8(element.first_child().value()));
319 }
else if (!strcmp(element.name(),
"updn")) {
320 updn = wxAtoi(wxString::FromUTF8(element.first_child().value()));
321 }
else if (!strcmp(element.name(),
"uadt")) {
322 uadt.ParseDateTime(wxString::FromUTF8(element.first_child().value()));
323 }
else if (!strcmp(element.name(),
"isdt")) {
324 isdt.ParseDateTime(wxString::FromUTF8(element.first_child().value()));
331 number = wxEmptyString;
333 river_name = wxEmptyString;
336 edition = wxEmptyString;
342 element = element.next_sibling()) {
343 if (!strcmp(element.name(),
"name")) {
345 number = wxString::FromUTF8(element.first_child().value());
346 zipfile_location = wxString::Format(_T(
"%s.zip"), number.c_str());
347 }
else if (!strcmp(element.name(),
"location")) {
349 }
else if (!strcmp(element.name(),
"river_name")) {
350 river_name = wxString::FromUTF8(element.first_child().value());
351 }
else if (!strcmp(element.name(),
"river_miles")) {
353 }
else if (!strcmp(element.name(),
"river_miles")) {
355 }
else if (!strcmp(element.name(),
"area")) {
356 area =
new Area(element);
357 }
else if (!strcmp(element.name(),
"shp_file")) {
359 }
else if (!strcmp(element.name(),
"s57_file")) {
361 }
else if (!strcmp(element.name(),
"kml_file")) {
363 }
else if (!strcmp(element.name(),
"edition")) {
364 edition = wxString::FromUTF8(element.first_child().value());
369IEncCell::~IEncCell() {
371 wxDELETE(river_miles);
378wxString IEncCell::GetChartTitle()
382 if (river_name != wxEmptyString) {
385 return wxString::Format(_(
"%s (%s to %s), river miles %3.1f - %3.1f"),
386 river_name.c_str(), location->from.c_str(),
387 location->to.c_str(), river_miles->begin,
393 return wxString::Format(_(
"%s"), number.c_str());
397wxString IEncCell::GetDownloadLocation() {
return s57_file->location; }
399wxDateTime IEncCell::GetUpdateDatetime() {
return s57_file->date_posted; }
403 location = wxEmptyString;
404 date_posted = wxInvalidDateTime;
405 time_posted = wxInvalidDateTime;
408 element = element.next_sibling()) {
409 if (!strcmp(element.name(),
"location")) {
410 location = wxString::FromUTF8(element.first_child().value());
411 }
else if (!strcmp(element.name(),
"date_posted")) {
412 date_posted.ParseDate(wxString::FromUTF8(element.first_child().value()));
413 }
else if (!strcmp(element.name(),
"time_posted")) {
414 if (strlen(element.first_child().value()))
415 time_posted.ParseTime(
416 wxString::FromUTF8(element.first_child().value()));
418 time_posted.ParseTime(_T(
"00:00:00"));
419 }
else if (!strcmp(element.name(),
"file_size")) {
420 if (strlen(element.first_child().value()))
421 file_size = wxAtoi(wxString::FromUTF8(element.first_child().value()));
435 element = element.next_sibling()) {
436 if (!strcmp(element.name(),
"north")) {
437 north = wxAtof(wxString::FromUTF8(element.first_child().value()));
438 }
else if (!strcmp(element.name(),
"south")) {
439 south = wxAtof(wxString::FromUTF8(element.first_child().value()));
440 }
else if (!strcmp(element.name(),
"east")) {
441 east = wxAtof(wxString::FromUTF8(element.first_child().value()));
442 }
else if (!strcmp(element.name(),
"west")) {
443 west = wxAtof(wxString::FromUTF8(element.first_child().value()));
452 element = element.next_sibling()) {
453 if (!strcmp(element.name(),
"begin")) {
454 begin = wxAtof(wxString::FromUTF8(element.first_child().value()));
455 }
else if (!strcmp(element.name(),
"end")) {
456 end = wxAtof(wxString::FromUTF8(element.first_child().value()));
462 from = wxEmptyString;
465 element = element.next_sibling()) {
466 if (!strcmp(element.name(),
"from")) {
467 from = wxString::FromUTF8(element.first_child().value());
468 }
else if (!strcmp(element.name(),
"to")) {
469 to = wxString::FromUTF8(element.first_child().value());
475 agency = wxEmptyString;
477 date = wxInvalidDateTime;
480 element = element.next_sibling()) {
481 if (!strcmp(element.name(),
"nm_agency")) {
482 agency = wxString::FromUTF8(element.first_child().value());
483 }
else if (!strcmp(element.name(),
"lnm_agency")) {
484 agency = wxString::FromUTF8(element.first_child().value());
485 }
else if (!strcmp(element.name(),
"doc")) {
486 doc = wxString::FromUTF8(element.first_child().value());
487 }
else if (!strcmp(element.name(),
"date")) {
488 date.ParseDate(wxString::FromUTF8(element.first_child().value()));
497 element = element.next_sibling()) {
498 if (!strcmp(element.name(),
"panel_no")) {
499 panel_no = wxAtoi(wxString::FromUTF8(element.first_child().value()));
500 }
else if (!strcmp(element.name(),
"vertex")) {
510 panel_title = wxEmptyString;
511 file_name = wxEmptyString;
515 element = element.next_sibling()) {
516 if (!strcmp(element.name(),
"panel_title")) {
517 panel_title = wxString::FromUTF8(element.first_child().value());
518 }
else if (!strcmp(element.name(),
"file_name")) {
519 file_name = wxString::FromUTF8(element.first_child().value());
520 }
else if (!strcmp(element.name(),
"scale")) {
521 scale = wxAtoi(wxString::FromUTF8(element.first_child().value()));
527 type = wxEmptyString;
529 element = element.next_sibling()) {
530 if (!strcmp(element.name(),
"type")) {
531 type = wxString::FromUTF8(element.first_child().value());
541 element = element.next_sibling()) {
542 if (!strcmp(element.name(),
"lat")) {
543 wxString::FromUTF8(element.first_child().value()).ToDouble(&lat);
544 }
else if (!strcmp(element.name(),
"lon")) {
545 wxString::FromUTF8(element.first_child().value()).ToDouble(&lon);