void mod_manager::load_mod_info(std::string info_file_path) { // info_file_path is the fully qualified path to the information file for this mod std::ifstream infile(info_file_path.c_str(), std::ifstream::in | std::ifstream::binary); if (!infile) { // fail silently? return; } std::istringstream iss( std::string( (std::istreambuf_iterator<char>(infile)), std::istreambuf_iterator<char>() ) ); infile.close(); const std::string main_path = info_file_path.substr(0, info_file_path.find_last_of("/\\")); try { JsonIn jsin(iss); jsin.eat_whitespace(); char ch = jsin.peek(); if (ch == '{') { // find type and dispatch single object JsonObject jo = jsin.get_object(); load_modfile(jo, main_path); jo.finish(); } else if (ch == '[') { jsin.start_array(); // find type and dispatch each object until array close while (!jsin.end_array()) { jsin.eat_whitespace(); JsonObject jo = jsin.get_object(); load_modfile(jo, main_path); jo.finish(); } } else { // not an object or an array? std::stringstream err; err << jsin.line_number() << ": "; err << "expected object or array, but found '" << ch << "'"; throw err.str(); } } catch(std::string e) { debugmsg("%s", e.c_str()); } }
void mod_manager::load_mod_info(std::string info_file_path) { const std::string main_path = info_file_path.substr(0, info_file_path.find_last_of("/\\")); read_from_file_optional_json( info_file_path, [&]( JsonIn &jsin ) { if( jsin.test_object() ) { // find type and dispatch single object JsonObject jo = jsin.get_object(); load_modfile(jo, main_path); jo.finish(); } else if( jsin.test_array() ) { jsin.start_array(); // find type and dispatch each object until array close while (!jsin.end_array()) { JsonObject jo = jsin.get_object(); load_modfile(jo, main_path); jo.finish(); } } else { // not an object or an array? jsin.error( "expected array or object" ); } } ); }