static void fill_settings( MythSettingList &settings, MSqlQuery &query, MythSetting::SettingType stype) { QMap<QString,QString> map; while (query.next()) map[query.value(0).toString()] = query.value(1).toString(); MythSettingList::const_iterator it = settings.begin(); for (; it != settings.end(); ++it) fill_setting(*it, map, stype); }
bool load_settings(MythSettingList &settings, const QString &hostname) { MSqlQuery query(MSqlQuery::InitCon()); QString list = extract_query_list(settings, MythSetting::kFile); if (!list.isEmpty()) { QMap<QString,QString> map = GetConfigFileSettingValues(); if (map.isEmpty()) return false; MythSettingList::const_iterator it = settings.begin(); for (; it != settings.end(); ++it) fill_setting(*it, map, MythSetting::kFile); } list = extract_query_list(settings, MythSetting::kHost); QString qstr = "SELECT value, data " "FROM settings " "WHERE hostname = '" + hostname + "' AND " " value in (" + list + ")"; if (!list.isEmpty()) { if (!query.exec(qstr)) { MythDB::DBError("HttpConfig::LoadMythSettings() 1", query); return false; } fill_settings(settings, query, MythSetting::kHost); } list = extract_query_list(settings, MythSetting::kGlobal); qstr = "SELECT value, data " "FROM settings " "WHERE hostname IS NULL AND " " value in (" + list + ")"; if (!list.isEmpty()) { if (!query.exec(qstr)) { MythDB::DBError("HttpConfig::LoadMythSettings() 2", query); return false; } fill_settings(settings, query, MythSetting::kGlobal); } return true; }
bool parse_settings(MythSettingList &settings, const QString &filename, const QString &group) { QDomDocument doc; QFile f(filename); if (!f.open(QIODevice::ReadOnly)) { LOG(VB_GENERAL, LOG_ERR, QString("parse_settings: Can't open: '%1'") .arg(filename)); return false; } QString errorMsg; int errorLine = 0; int errorColumn = 0; if (!doc.setContent(&f, false, &errorMsg, &errorLine, &errorColumn)) { LOG(VB_GENERAL, LOG_ERR, QString("parse_settings: ") + QString("Parsing: %1 at line: %2 column: %3") .arg(filename).arg(errorLine).arg(errorColumn) + QString("\n\t\t\t%1").arg(errorMsg)); f.close(); return false; } f.close(); settings.clear(); bool foundGroup = false; bool includeAllChildren = group.isEmpty(); return parse_dom(settings, doc.documentElement(), filename, group, includeAllChildren, foundGroup); }
static QString extract_query_list( const MythSettingList &settings, MythSetting::SettingType stype) { QString list; MythSettingList::const_iterator it = settings.begin(); for (; it != settings.end(); ++it) { const MythSettingGroup *group = dynamic_cast<const MythSettingGroup*>(*it); if (group) { list += extract_query_list(group->m_settings, stype); continue; } const MythSetting *setting = dynamic_cast<const MythSetting*>(*it); if (setting && (setting->m_stype == stype)) list += QString(",'%1'").arg(setting->m_value); } if (!list.isEmpty() && (list[0] == QChar(','))) list = list.mid(1); return list; }
bool parse_dom(MythSettingList &settings, const QDomElement &element, const QString &filename, const QString &group, bool includeAllChildren, bool &foundGroup) { #define LOC QString("parse_dom(%1@~%2), error: ") \ .arg(filename).arg(e.lineNumber()) bool mFoundGroup = false; QDomNode n = element.firstChild(); while (!n.isNull()) { const QDomElement e = n.toElement(); if (e.isNull()) { n = n.nextSibling(); continue; } if (e.tagName() == "group") { QString m_human_label = e.attribute("human_label"); QString m_unique_label = e.attribute("unique_label"); QString m_ecma_script = e.attribute("ecma_script"); bool tmpFoundGroup = false; bool tmpIncludeAllChildren = false || includeAllChildren; if (group.isEmpty() || m_unique_label == group) { mFoundGroup = true; tmpIncludeAllChildren = true; } MythSettingGroup *g = new MythSettingGroup( m_human_label, m_unique_label, m_ecma_script); if ((e.hasChildNodes()) && (!parse_dom(g->m_settings, e, filename, group, tmpIncludeAllChildren, tmpFoundGroup))) { delete g; return false; } if (tmpFoundGroup || tmpIncludeAllChildren) { settings.push_back(g); mFoundGroup = true; } else delete g; } else if (e.tagName() == "setting" && includeAllChildren) { QMap<QString,QString> m; m["value"] = e.attribute("value"); m["setting_type"] = e.attribute("setting_type"); m["label"] = e.attribute("label"); m["help_text"] = e.attribute("help_text"); m["data_type"] = e.attribute("data_type"); MythSetting::DataType dtype = parse_data_type(m["data_type"]); if (MythSetting::kInvalidDataType == dtype) { LOG(VB_GENERAL, LOG_ERR, LOC + "Setting has invalid or missing data_type attribute."); return false; } QStringList data_list; QStringList display_list; if ((MythSetting::kComboBox == dtype) || (MythSetting::kSelect == dtype)) { if (!e.hasChildNodes()) { LOG(VB_GENERAL, LOG_ERR, LOC + "Setting missing selection items."); return false; } QDomNode n2 = e.firstChild(); while (!n2.isNull()) { const QDomElement e2 = n2.toElement(); if (e2.tagName() != "option") { LOG(VB_GENERAL, LOG_ERR, LOC + "Setting selection contains invalid tags."); return false; } QString display = e2.attribute("display"); QString data = e2.attribute("data"); if (data.isEmpty()) { LOG(VB_GENERAL, LOG_ERR, LOC + "Setting selection item missing data."); return false; } display = (display.isEmpty()) ? data : display; data_list.push_back(data); display_list.push_back(display); n2 = n2.nextSibling(); } } if (MythSetting::kIntegerRange == dtype) { m["range_min"] = e.attribute("range_min"); m["range_max"] = e.attribute("range_max"); } QMap<QString,QString>::const_iterator it = m.begin(); for (; it != m.end(); ++it) { if ((*it).isEmpty()) { LOG(VB_GENERAL, LOG_ERR, LOC + QString("Setting has invalid or missing %1 attribute") .arg(it.key())); return false; } } m["default_data"] = e.attribute("default_data"); m["placeholder_text"] = e.attribute("placeholder_text"); MythSetting::SettingType stype = parse_setting_type(m["setting_type"]); if (MythSetting::kInvalidSettingType == stype) { LOG(VB_GENERAL, LOG_ERR, LOC + "Setting has invalid setting_type attribute."); return false; } long long range_min = m["range_min"].toLongLong(); long long range_max = m["range_max"].toLongLong(); if (range_max < range_min) { LOG(VB_GENERAL, LOG_ERR, LOC + "Setting has invalid range attributes"); return false; } MythSetting *s = new MythSetting( m["value"], m["default_data"], stype, m["label"], m["help_text"], dtype, data_list, display_list, range_min, range_max, m["placeholder_text"]); settings.push_back(s); } else if (group.isEmpty()) { LOG(VB_GENERAL, LOG_ERR, LOC + QString("Unknown element: %1").arg(e.tagName())); return false; } n = n.nextSibling(); } if (mFoundGroup) foundGroup = true; return true; #undef LOC }