bool Load(const std::string& filename, const std::string& name, T& t, const bool fatal, format f) { if (f == format::autodetect) { std::string extension = Extension(filename); if (extension == "xml") f = format::xml; else if (extension == "bin") f = format::binary; else if (extension == "txt") f = format::text; else { if (fatal) Log::Fatal << "Unable to detect type of '" << filename << "'; incorrect" << " extension?" << std::endl; else Log::Warn << "Unable to detect type of '" << filename << "'; load " << "failed. Incorrect extension?" << std::endl; return false; } } // Now load the given format. std::ifstream ifs(filename); if (!ifs.is_open()) { if (fatal) Log::Fatal << "Unable to open file '" << filename << "'." << std::endl; else Log::Warn << "Unable to open file '" << filename << "'." << std::endl; return false; } try { if (f == format::xml) { boost::archive::xml_iarchive ar(ifs); ar >> CreateNVP(t, name); } else if (f == format::text) { boost::archive::text_iarchive ar(ifs); ar >> CreateNVP(t, name); }
bool Save(const std::string& filename, const std::string& name, T& t, const bool fatal, format f) { if (f == format::autodetect) { std::string extension = Extension(filename); if (extension == "xml") f = format::xml; else if (extension == "bin") f = format::binary; else if (extension == "txt") f = format::text; else { if (fatal) Log::Fatal << "Unable to detect type of '" << filename << "'; incorrect" << " extension? (allowed: xml/bin/txt)" << std::endl; else Log::Warn << "Unable to detect type of '" << filename << "'; save " << "failed. Incorrect extension? (allowed: xml/bin/txt)" << std::endl; return false; } } // Open the file to save to. std::ofstream ofs; #ifdef _WIN32 if (f == format::binary) // Open non-text types in binary mode on Windows. ofs.open(filename, std::ofstream::out | std::ofstream::binary); else ofs.open(filename, std::ofstream::out); #else ofs.open(filename, std::ofstream::out); #endif if (!ofs.is_open()) { if (fatal) Log::Fatal << "Unable to open file '" << filename << "' to save object '" << name << "'." << std::endl; else Log::Warn << "Unable to open file '" << filename << "' to save object '" << name << "'." << std::endl; return false; } try { if (f == format::xml) { boost::archive::xml_oarchive ar(ofs); ar << CreateNVP(t, name); } else if (f == format::text) { boost::archive::text_oarchive ar(ofs); ar << CreateNVP(t, name); } else if (f == format::binary) { boost::archive::binary_oarchive ar(ofs); ar << CreateNVP(t, name); } return true; } catch (boost::archive::archive_exception& e) { if (fatal) Log::Fatal << e.what() << std::endl; else Log::Warn << e.what() << std::endl; return false; } }