14#include "lcf/ldb/reader.h"
15#include "lcf/ldb/chunks.h"
16#include "lcf/reader_util.h"
21void LDB_Reader::PrepareSave(rpg::Database& db) {
22 ++db.system.save_count;
25std::unique_ptr<lcf::rpg::Database> LDB_Reader::Load(StringView filename, StringView encoding) {
26 std::ifstream stream(ToString(filename), std::ios::binary);
27 if (!stream.is_open()) {
28 fprintf(stderr,
"Failed to open LDB file `%s' for reading : %s\n", ToString(filename).c_str(), strerror(errno));
31 return LDB_Reader::Load(stream, encoding);
34bool LDB_Reader::Save(StringView filename,
const lcf::rpg::Database& db, StringView encoding, SaveOpt opt) {
35 std::ofstream stream(ToString(filename), std::ios::binary);
36 if (!stream.is_open()) {
37 fprintf(stderr,
"Failed to open LDB file `%s' for writing : %s\n", ToString(filename).c_str(), strerror(errno));
40 return LDB_Reader::Save(stream, db, encoding, opt);
43bool LDB_Reader::SaveXml(StringView filename,
const lcf::rpg::Database& db) {
44 std::ofstream stream(ToString(filename), std::ios::binary);
45 if (!stream.is_open()) {
46 fprintf(stderr,
"Failed to open LDB XML file `%s' for writing : %s\n", ToString(filename).c_str(), strerror(errno));
49 return LDB_Reader::SaveXml(stream, db);
52std::unique_ptr<lcf::rpg::Database> LDB_Reader::LoadXml(StringView filename) {
53 std::ifstream stream(ToString(filename), std::ios::binary);
54 if (!stream.is_open()) {
55 fprintf(stderr,
"Failed to open LDB XML file `%s' for reading : %s\n", ToString(filename).c_str(), strerror(errno));
58 return LDB_Reader::LoadXml(stream);
61std::unique_ptr<lcf::rpg::Database> LDB_Reader::Load(std::istream& filestream, StringView encoding) {
62 LcfReader reader(filestream, ToString(encoding));
64 LcfReader::SetError(
"Couldn't parse database file.\n");
68 reader.ReadString(header, reader.ReadInt());
69 if (header.length() != 11) {
70 LcfReader::SetError(
"This is not a valid RPG2000 database.\n");
73 if (header !=
"LcfDataBase") {
74 fprintf(stderr,
"Warning: This header is not LcfDataBase and might not be a valid RPG2000 database.\n");
76 auto db = std::make_unique<lcf::rpg::Database>();
77 db->ldb_header = header;
83 for (
auto& actor: db->actors) {
84 actor.Setup(engine == EngineVersion::e2k3);
90bool LDB_Reader::Save(std::ostream& filestream,
const lcf::rpg::Database& db, StringView encoding, SaveOpt opt) {
92 LcfWriter writer(filestream, engine, ToString(encoding));
94 LcfReader::SetError(
"Couldn't parse database file.\n");
98 if ( db.ldb_header.empty() || !
bool(opt & SaveOpt::ePreserveHeader)) {
99 header =
"LcfDataBase";
101 header= db.ldb_header;
103 writer.WriteInt(header.size());
104 writer.Write(header);
109bool LDB_Reader::SaveXml(std::ostream& filestream,
const lcf::rpg::Database& db) {
111 XmlWriter writer(filestream, engine);
112 if (!writer.IsOk()) {
113 LcfReader::SetError(
"Couldn't parse database file.\n");
116 writer.BeginElement(
"LDB");
118 writer.EndElement(
"LDB");
122std::unique_ptr<lcf::rpg::Database> LDB_Reader::LoadXml(std::istream& filestream) {
123 XmlReader reader(filestream);
124 if (!reader.IsOk()) {
125 LcfReader::SetError(
"Couldn't parse database file.\n");
128 auto db = std::make_unique<lcf::rpg::Database>();
135 for (
auto& actor: db->actors) {
136 actor.Setup(engine == EngineVersion::e2k3);
EngineVersion GetEngineVersion(const lcf::rpg::Database &db)