static std::string loadFile (boost::property_tree::ptree &config, const boost::filesystem::path &file) { boost::filesystem::path extension = file.extension(); boost::filesystem::path extension2 = file.stem().extension(); std::string fileName = file.filename().string(); boost::property_tree::ptree readConfig; if (extension2.string() == ".conf") { if (extension.string() == ".json") { boost::property_tree::read_json (file.string(), readConfig); } else if (extension.string() == ".info") { boost::property_tree::read_info (file.string(), readConfig); } else if (extension.string() == ".ini") { boost::property_tree::read_ini (file.string(), readConfig); } else if (extension.string() == ".xml") { boost::property_tree::read_xml (file.string(), readConfig); } else { throw ParseException ("Unknonw file format"); } } else { throw ParseException ("Unknonw file format"); } mergePropertyTrees (config, readConfig); config.put ("configPath", file.parent_path().string() ); fileName = fileName.substr (0, fileName.size() - extension.string().size() ); fileName = fileName.substr (0, fileName.size() - extension2.string().size() ); return fileName; }
static void loadModulesConfigFromDir (boost::property_tree::ptree &config, const boost::filesystem::path &dir, const boost::filesystem::path &parentDir) { GST_INFO ("Looking for config files in %s", dir.string().c_str() ); if (!boost::filesystem::is_directory (dir) ) { GST_WARNING ("Unable to load config files from: %s, it is not a directory", dir.string().c_str() ); return; } boost::filesystem::directory_iterator end_itr; for ( boost::filesystem::directory_iterator itr ( dir ); itr != end_itr; ++itr ) { if (boost::filesystem::is_regular (*itr) ) { try { boost::property_tree::ptree moduleConfig; std::string fileName = loadFile (moduleConfig, itr->path() ); std::string key = diffPathToKey (itr->path().parent_path(), parentDir); boost::property_tree::ptree loadedConfig; key = key.empty() ? "modules" : "modules." + key; key += "." + fileName; loadedConfig.put_child (key, moduleConfig); mergePropertyTrees (config, loadedConfig); GST_INFO ("Loaded module config from: %s", itr->path().string().c_str() ); } catch (ParseException &e) { GST_ERROR ("Error reading configuration: %s", e.what()); std::cerr << "Error reading configuration: " << e.what() << std::endl; } } else if (boost::filesystem::is_directory (*itr) ) { loadModulesConfigFromDir (config, itr->path(), parentDir); } } }
void mergePropertyTrees (boost::property_tree::ptree &ptMerged, const boost::property_tree::ptree &ptSecond, int level ) { // Value or object or array if (level > 0 && ptSecond.empty() ) { // Copy value ptMerged = ptSecond; } else if (level > 0 && ptSecond.count (std::string() ) == ptSecond.size() ) { // Copy array ptMerged = ptSecond; } else { auto it = ptSecond.begin(); for (; it != ptSecond.end(); ++it) { boost::property_tree::ptree child = ptMerged.get_child (it->first.data(), boost::property_tree::ptree() ); mergePropertyTrees (child, it->second, level + 1); ptMerged.erase (it->first.data() ); ptMerged.add_child (it->first.data(), child); } } }