14#include "lcf/ldb/reader.h"
15#include "lcf/ldb/chunks.h"
16#include "lcf/reader_util.h"
22void LDB_Reader::PrepareSave(rpg::Database& db) {
23 ++db.system.save_count;
26std::unique_ptr<lcf::rpg::Database> LDB_Reader::Load(std::string_view filename, std::string_view encoding) {
27 std::ifstream stream(ToString(filename), std::ios::binary);
28 if (!stream.is_open()) {
29 Log::Error(
"Failed to open LDB file '%s' for reading: %s", ToString(filename).c_str(), strerror(errno));
32 return LDB_Reader::Load(stream, encoding);
35bool LDB_Reader::Save(std::string_view filename,
const lcf::rpg::Database& db, std::string_view encoding, SaveOpt opt) {
36 std::ofstream stream(ToString(filename), std::ios::binary);
37 if (!stream.is_open()) {
38 Log::Error(
"Failed to open LDB file '%s' for writing: %s", ToString(filename).c_str(), strerror(errno));
41 return LDB_Reader::Save(stream, db, encoding, opt);
44bool LDB_Reader::SaveXml(std::string_view filename,
const lcf::rpg::Database& db) {
45 std::ofstream stream(ToString(filename), std::ios::binary);
46 if (!stream.is_open()) {
47 Log::Error(
"Failed to open LDB XML file '%s' for writing: %s", ToString(filename).c_str(), strerror(errno));
50 return LDB_Reader::SaveXml(stream, db);
53std::unique_ptr<lcf::rpg::Database> LDB_Reader::LoadXml(std::string_view filename) {
54 std::ifstream stream(ToString(filename), std::ios::binary);
55 if (!stream.is_open()) {
56 Log::Error(
"Failed to open LDB XML file '%s' for reading: %s", ToString(filename).c_str(), strerror(errno));
59 return LDB_Reader::LoadXml(stream);
62std::unique_ptr<lcf::rpg::Database> LDB_Reader::Load(std::istream& filestream, std::string_view encoding) {
63 LcfReader reader(filestream, ToString(encoding));
65 LcfReader::SetError(
"Couldn't parse database file.");
69 reader.ReadString(header, reader.ReadInt());
70 if (header.length() != 11) {
71 LcfReader::SetError(
"This is not a valid RPG2000 database.");
74 if (header !=
"LcfDataBase") {
75 Log::Warning(
"Header %s != LcfDataBase and might not be a valid RPG2000 database.", header.c_str());
77 auto db = std::make_unique<lcf::rpg::Database>();
78 db->ldb_header = header;
79 TypeReader<rpg::Database>::ReadLcf(*db, reader, 0);
84 for (
auto& actor: db->actors) {
85 actor.Setup(engine == EngineVersion::e2k3);
91bool LDB_Reader::Save(std::ostream& filestream,
const lcf::rpg::Database& db, std::string_view encoding, SaveOpt opt) {
93 LcfWriter writer(filestream, engine, ToString(encoding));
95 LcfReader::SetError(
"Couldn't parse database file.");
99 if ( db.ldb_header.empty() || !
bool(opt & SaveOpt::ePreserveHeader)) {
100 header =
"LcfDataBase";
102 header= db.ldb_header;
104 writer.WriteInt(header.size());
105 writer.Write(header);
106 TypeReader<rpg::Database>::WriteLcf(db, writer);
110bool LDB_Reader::SaveXml(std::ostream& filestream,
const lcf::rpg::Database& db) {
112 XmlWriter writer(filestream, engine);
113 if (!writer.IsOk()) {
114 LcfReader::SetError(
"Couldn't parse database file.\n");
117 writer.BeginElement(
"LDB");
118 TypeReader<rpg::Database>::WriteXml(db, writer);
119 writer.EndElement(
"LDB");
123std::unique_ptr<lcf::rpg::Database> LDB_Reader::LoadXml(std::istream& filestream) {
124 XmlReader reader(filestream);
125 if (!reader.IsOk()) {
126 LcfReader::SetError(
"Couldn't parse database file.\n");
129 auto db = std::make_unique<lcf::rpg::Database>();
130 reader.SetHandler(
new RootXmlHandler<rpg::Database>(*db,
"LDB"));
136 for (
auto& actor: db->actors) {
137 actor.Setup(engine == EngineVersion::e2k3);
void Warning(const char *fmt,...) LIKE_PRINTF
void Error(const char *fmt,...) LIKE_PRINTF
EngineVersion GetEngineVersion(const lcf::rpg::Database &db)