static Variant dynamic_to_variant(const folly::dynamic& v) { switch (v.type()) { case folly::dynamic::Type::NULLT: return init_null(); case folly::dynamic::Type::BOOL: return v.asBool(); case folly::dynamic::Type::DOUBLE: return v.asDouble(); case folly::dynamic::Type::INT64: return v.asInt(); case folly::dynamic::Type::STRING: return v.data(); case folly::dynamic::Type::ARRAY: case folly::dynamic::Type::OBJECT: ArrayInit arr_init(v.size(), ArrayInit::Mixed{}); for (auto& item : v.items()) { arr_init.add(dynamic_to_variant(item.first), dynamic_to_variant(item.second)); } Array ret = arr_init.toArray(); // Sort the array since folly::dynamic has a tendency to iterate from // back to front. This way a var_dump of the array, for example, looks // ordered. ret.sort(Array::SortNaturalAscending, true, false); return ret; } not_reached(); }
static Variant dynamic_to_variant(const folly::dynamic& v) { switch (v.type()) { case folly::dynamic::Type::NULLT: return init_null_variant; case folly::dynamic::Type::BOOL: return v.asBool(); case folly::dynamic::Type::DOUBLE: return v.asDouble(); case folly::dynamic::Type::INT64: return v.asInt(); case folly::dynamic::Type::STRING: return v.data(); case folly::dynamic::Type::ARRAY: case folly::dynamic::Type::OBJECT: ArrayInit ret(v.size(), ArrayInit::Mixed{}); for (auto& item : v.items()) { ret.add(dynamic_to_variant(item.first), dynamic_to_variant(item.second)); } return ret.toArray(); } not_reached(); }
Array IniSetting::GetAll(const String& ext_name, bool details) { Array r = Array::Create(); const Extension* ext = nullptr; if (!ext_name.empty()) { if (ext_name == s_core) { ext = IniSetting::CORE; } else { ext = Extension::GetExtension(ext_name); if (!ext) { raise_warning("Unable to find extension '%s'", ext_name.toCppString().c_str()); return r; } } } for (auto& iter: boost::join(s_system_ini_callbacks, *s_user_callbacks)) { if (ext && ext != iter.second.extension) { continue; } auto value = dynamic_to_variant(iter.second.getCallback()); // Cast all non-arrays to strings since that is what everything used ot be if (!value.isArray()) { value = value.toString(); } if (details) { Array item = Array::Create(); item.add(s_global_value, value); item.add(s_local_value, value); if (iter.second.mode == PHP_INI_ALL) { item.add( s_access, Variant(PHP_INI_USER | PHP_INI_SYSTEM | PHP_INI_PERDIR) ); } else if (iter.second.mode == PHP_INI_ONLY) { item.add(s_access, Variant(PHP_INI_SYSTEM)); } else { item.add(s_access, Variant(iter.second.mode)); } r.add(String(iter.first), item); } else { r.add(String(iter.first), value); } } return r; }
bool IniSetting::Get(const String& name, Variant& value) { folly::dynamic b = nullptr; auto ret = Get(name.toCppString(), b); value = dynamic_to_variant(b); return ret; }
bool ini_on_update(const folly::dynamic& value, Array& p) { INI_ASSERT_ARR(value); p = dynamic_to_variant(value).toArray(); return true; }