29#if defined(__MINGW32__) && defined(Yield)
34#include "model/ocpn_utils.h"
39 const std::string& value) {
40 auto child = root.append_child(name.c_str());
41 child.append_child(pugi::node_pcdata).set_value(value.c_str());
46 auto root = doc.append_child(
"plugin");
47 root.append_attribute(
"version").set_value(
"1");
49 add_node(root,
"name", name);
50 add_node(root,
"version", version);
51 add_node(root,
"release", release);
52 add_node(root,
"summary", summary);
53 add_node(root,
"api-version", api_version);
54 add_node(root,
"open-source", openSource ?
"true" :
"false");
55 add_node(root,
"is-imported", is_imported ?
"true" :
"false");
56 add_node(root,
"author", author);
57 add_node(root,
"source", author);
58 add_node(root,
"info-url", info_url);
59 add_node(root,
"description", description);
60 add_node(root,
"target", target);
61 add_node(root,
"target-version", target_version);
62 add_node(root,
"target-arch", target_arch);
63 add_node(root,
"tarball-url", tarball_url);
64 add_node(root,
"tarball-checksum", checksum);
66 std::ostringstream ss;
71static void ParseValue(
pugi::xml_node node,
const std::string& name,
73 auto child = node.child(name.c_str());
74 if (child) value = ocpn::trim(child.first_child().value());
79 auto child = node.child(name.c_str());
81 auto text = ocpn::trim(child.first_child().value());
82 value = text ==
"yes" || text ==
"true";
87 ParseValue(root,
"name", plugin.name);
88 ParseValue(root,
"version", plugin.version);
89 ParseValue(root,
"release", plugin.release);
90 ParseValue(root,
"summary", plugin.summary);
91 ParseValue(root,
"api-version", plugin.api_version);
92 ParseValue(root,
"author", plugin.author);
93 ParseValue(root,
"description", plugin.description);
94 ParseValue(root,
"source", plugin.source);
95 ParseValue(root,
"tarball-url", plugin.tarball_url);
96 ParseValue(root,
"info-url", plugin.info_url);
97 ParseValue(root,
"target", plugin.target);
98 ParseValue(root,
"target-version", plugin.target_version);
99 ParseValue(root,
"target-arch", plugin.target_arch);
100 ParseValue(root,
"target-checksum", plugin.checksum);
101 ParseBool(root,
"open-source", plugin.openSource);
102 ParseBool(root,
"is-imported", plugin.is_imported);
103 return root.child(
"name") ? true :
false;
108 doc.load_string(xml.c_str());
109 auto node = doc.child(
"plugin");
111 wxLogWarning(
"Trying to parse plugin without root node");
114 return ParsePlugin(doc.child(
"plugin"), plugin);
117bool ParseCatalog(
const std::string xml,
CatalogCtx* ctx) {
121 doc.load_string(xml.c_str());
125 node = node.next_sibling()) {
126 if (!strcmp(node.name(),
"version") && ctx->version ==
"") {
127 ctx->version = ocpn::trim(node.first_child().value());
128 }
else if (strcmp(node.name(),
"date") == 0 && ctx->date ==
"") {
129 ctx->date = ocpn::trim(node.first_child().value());
130 }
else if (strcmp(node.name(),
"meta-url") == 0) {
131 ctx->meta_url = ocpn::trim(node.first_child().value());
132 }
else if (!strcmp(node.name(),
"plugin")) {
133 if (ctx->meta_url !=
"") {
134 ctx->meta_urls.push_back(ctx->meta_url);
138 ctx->plugins.push_back(*plugin);
143 auto meta_url = node.child(
"meta-url");
145 auto url = ocpn::trim(meta_url.first_child().value());
148 ParsePlugin(node, *plugin);
153 ctx->plugins.push_back(*plugin);
156 if (ctx->meta_url !=
"") {
157 ctx->meta_urls.push_back(ctx->meta_url);
Plugin catalog management: Build the runtime catalog, handling downloads as required.
Datatypes and methods to parse ocpn-plugins.xml XML data, either complete catalog or a single plugin.
The result from parsing the xml catalog i.