void read_addons_list(const config& cfg, addons_list& dest) { dest.clear(); unsigned order = 0; /** @todo FIXME: get rid of this legacy "campaign"/"campaigns" silliness */ const config::const_child_itors &addon_cfgs = cfg.child_range("campaign"); for(const config& addon_cfg : addon_cfgs) { const std::string& id = addon_cfg["name"].str(); if(dest.find(id) != dest.end()) { ERR_AC << "add-ons list has multiple entries for '" << id << "', not good; ignoring them" << std::endl; continue; } dest[id].read(addon_cfg); dest[id].order = order++; } }
/** Warns the user about unresolved dependencies and installs them if they choose to do so. * Returns: outcome: ABORT in case the user chose to abort because of an issue * SUCCESS otherwise * wml_change: indicates if new wml content was installed */ addon_op_result do_resolve_addon_dependencies(display& disp, addons_client& client, const addons_list& addons, const addon_info& addon) { addon_op_result result; result.outcome = SUCCESS; result.wml_changed = false; boost::scoped_ptr<cursor::setter> cursor_setter(new cursor::setter(cursor::WAIT)); // TODO: We don't currently check for the need to upgrade. I'll probably // work on that when implementing dependency tiers later. const std::set<std::string>& deps = addon.resolve_dependencies(addons); std::vector<std::string> missing_deps; std::vector<std::string> broken_deps; BOOST_FOREACH(const std::string& dep, deps) { if(!is_addon_installed(dep)) { if(addons.find(dep) != addons.end()) { missing_deps.push_back(dep); } else { broken_deps.push_back(dep); } } } cursor_setter.reset(); if(!broken_deps.empty()) { std::string broken_deps_report; broken_deps_report = _n( "The selected add-on has the following dependency, which is not currently installed or available from the server. Do you wish to continue?", "The selected add-on has the following dependencies, which are not currently installed or available from the server. Do you wish to continue?", broken_deps.size()); broken_deps_report += "\n"; BOOST_FOREACH(const std::string& broken_dep_id, broken_deps) { broken_deps_report += "\n " + utils::unicode_bullet + " " + make_addon_title(broken_dep_id); }
std::string make_display_dependencies( const std::string& addon_id, const addons_list& addons_list, const addons_tracking_list& addon_states) { const addon_info& addon = const_at(addon_id, addons_list); std::string str; const std::set<std::string>& deps = addon.resolve_dependencies(addons_list); for(const auto& dep_id : deps) { addon_info dep; addon_tracking_info depstate; addons_list::const_iterator ali = addons_list.find(dep_id); addons_tracking_list::const_iterator tli = addon_states.find(dep_id); if(ali == addons_list.end()) { dep.id = dep_id; // Build dummy addon_info. } else { dep = ali->second; } if(tli == addon_states.end()) { depstate = get_addon_tracking_info(dep); } else { depstate = tli->second; } if(!str.empty()) { str += ", "; } str += addon_list::colorize_addon_state_string(dep.display_title(), depstate.state); } return str; }