mirror of https://github.com/odrling/Aegisub
Don't swallow errors when parsing json and make agi::json_util::file actually work
Originally committed to SVN as r5507.
This commit is contained in:
parent
dabcdb2e8b
commit
dd38e1f07f
|
@ -74,25 +74,7 @@ Hotkey::Hotkey(const std::string &file, const std::string &default_config)
|
||||||
{
|
{
|
||||||
LOG_D("hotkey/init") << "Generating hotkeys.";
|
LOG_D("hotkey/init") << "Generating hotkeys.";
|
||||||
|
|
||||||
std::istream *stream;
|
json::UnknownElement hotkey_root = agi::json_util::file(config_file, config_default);
|
||||||
|
|
||||||
try {
|
|
||||||
stream = agi::io::Open(config_file);
|
|
||||||
} catch (const acs::AcsNotFound&) {
|
|
||||||
stream = new std::istringstream(config_default);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
json::UnknownElement hotkey_root;
|
|
||||||
try {
|
|
||||||
hotkey_root = agi::json_util::parse(stream);
|
|
||||||
} catch (...) {
|
|
||||||
// There's definitely a better way to do this.
|
|
||||||
delete stream;
|
|
||||||
stream = new std::istringstream(config_default);
|
|
||||||
hotkey_root = agi::json_util::parse(stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
json::Object object = hotkey_root;
|
json::Object object = hotkey_root;
|
||||||
|
|
||||||
for (json::Object::const_iterator index(object.Begin()); index != object.End(); index++) {
|
for (json::Object::const_iterator index(object.Begin()); index != object.End(); index++) {
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include "libaegisub/access.h"
|
#include "libaegisub/access.h"
|
||||||
#include "libaegisub/io.h"
|
#include "libaegisub/io.h"
|
||||||
#include "libaegisub/json.h"
|
#include "libaegisub/json.h"
|
||||||
|
#include "libaegisub/log.h"
|
||||||
|
|
||||||
|
|
||||||
namespace agi {
|
namespace agi {
|
||||||
|
@ -38,36 +39,32 @@ json::UnknownElement parse(std::istream *stream) {
|
||||||
try {
|
try {
|
||||||
json::Reader::Read(root, *stream);
|
json::Reader::Read(root, *stream);
|
||||||
} catch (json::Reader::ParseException& e) {
|
} catch (json::Reader::ParseException& e) {
|
||||||
std::cout << "json::ParseException: " << e.what() << ", Line/offset: " << e.m_locTokenBegin.m_nLine + 1 << '/' << e.m_locTokenBegin.m_nLineOffset + 1 << std::endl << std::endl;
|
LOG_E("json/parse") << "json::ParseException: " << e.what() << ", Line/offset: " << e.m_locTokenBegin.m_nLine + 1 << '/' << e.m_locTokenBegin.m_nLineOffset + 1;
|
||||||
|
delete stream;
|
||||||
|
throw;
|
||||||
} catch (json::Exception& e) {
|
} catch (json::Exception& e) {
|
||||||
/// @todo Do something better here, maybe print the exact error
|
LOG_E("json/parse") << "json::Exception: " << e.what();
|
||||||
std::cout << "json::Exception: " << e.what() << std::endl;
|
delete stream;
|
||||||
|
throw;
|
||||||
}
|
}
|
||||||
|
|
||||||
delete stream;
|
delete stream;
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
json::UnknownElement file(const std::string &file) {
|
||||||
json::UnknownElement file(const std::string file) {
|
|
||||||
return parse(io::Open(file));
|
return parse(io::Open(file));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
json::UnknownElement file(const std::string &file, const std::string &default_config) {
|
||||||
json::UnknownElement file(const std::string file, const std::string &default_config) {
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return parse(io::Open(file));
|
return parse(io::Open(file));
|
||||||
|
|
||||||
// We only want to catch this single error as anything else could
|
// We only want to catch this single error as anything else could
|
||||||
// reflect a deeper problem. ie, failed i/o, wrong permissions etc.
|
// reflect a deeper problem. ie, failed i/o, wrong permissions etc.
|
||||||
} catch (const acs::AcsNotFound&) {
|
} catch (const acs::AcsNotFound&) {
|
||||||
|
return parse(new std::istringstream(default_config));
|
||||||
std::istringstream stream(default_config);
|
|
||||||
return parse(&stream);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
} // namespace json_util
|
} // namespace json_util
|
||||||
} // namespace agi
|
} // namespace agi
|
||||||
|
|
|
@ -32,13 +32,13 @@ json::UnknownElement parse(std::istream *stream);
|
||||||
/// Parse a JSON file.
|
/// Parse a JSON file.
|
||||||
/// @param file Path JSON to file
|
/// @param file Path JSON to file
|
||||||
/// @return json::UnknownElement
|
/// @return json::UnknownElement
|
||||||
json::UnknownElement file(const std::string file);
|
json::UnknownElement file(const std::string &file);
|
||||||
|
|
||||||
/// Parse a json stream, with default handler.
|
/// Parse a json stream, with default handler.
|
||||||
/// @param file Path to JSON file.
|
/// @param file Path to JSON file.
|
||||||
/// @param Default config file to load incase of nonexistent file
|
/// @param Default config file to load incase of nonexistent file
|
||||||
/// @return json::UnknownElement
|
/// @return json::UnknownElement
|
||||||
json::UnknownElement file(const std::string file, const std::string &default_config);
|
json::UnknownElement file(const std::string &file, const std::string &default_config);
|
||||||
|
|
||||||
|
|
||||||
} // namespace json_util
|
} // namespace json_util
|
||||||
|
|
Loading…
Reference in New Issue