liblcf
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
lsd_reader.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014 liblcf authors
3  * This file is released under the MIT License
4  * http://opensource.org/licenses/MIT
5  */
6 
7 #include <cmath>
8 #include "lsd_reader.h"
9 #include "lsd_chunks.h"
10 #include "ldb_reader.h"
11 #include "rpg_save.h"
12 #include "reader_util.h"
13 #include "reader_struct.h"
14 
15 
16 double LSD_Reader::ToTDateTime(std::time_t const t) {
17  // 25569 is UnixDateDelta: number of days between 1970-01-01 and 1900-01-01
18  return(t / 86400.0 + 25569.0);
19 }
20 
21 std::time_t LSD_Reader::ToUnixTimestamp(double const ms) {
22  return(std::time_t(ms * 86400.0 - 25569.0 * 86400.0 + 0.5));
23 }
24 
25 double LSD_Reader::GenerateTimestamp(std::time_t const t) {
26  return ToTDateTime(t);
27 }
28 
29 std::auto_ptr<RPG::Save> LSD_Reader::Load(const std::string& filename, const std::string &encoding) {
30  LcfReader reader(filename, encoding);
31  if (!reader.IsOk()) {
32  LcfReader::SetError("Couldn't find %s save file.\n", filename.c_str());
33  return std::auto_ptr<RPG::Save>(NULL);
34  }
35  std::string header;
36  reader.ReadString(header, reader.ReadInt());
37  if (header.length() != 11) {
38  LcfReader::SetError("%s is not a valid RPG2000 save.\n", filename.c_str());
39  return std::auto_ptr<RPG::Save>(NULL);
40  }
41  if (header != "LcfSaveData") {
42  fprintf(stderr, "Warning: %s header is not LcfSaveData and might not be a valid RPG2000 save.\n", filename.c_str());
43  }
44  RPG::Save* save = new RPG::Save();
45  Struct<RPG::Save>::ReadLcf(*save, reader);
46  return std::auto_ptr<RPG::Save>(save);
47 }
48 
49 bool LSD_Reader::Save(const std::string& filename, const RPG::Save& save, const std::string &encoding) {
50  LcfWriter writer(filename, encoding);
51  if (!writer.IsOk()) {
52  LcfReader::SetError("Couldn't find %s save file.\n", filename.c_str());
53  return false;
54  }
55  const std::string header("LcfSaveData");
56  writer.WriteInt(header.size());
57  writer.Write(header);
58 
59  const_cast<RPG::Save&>(save).title.timestamp = GenerateTimestamp();
60 
61  Struct<RPG::Save>::WriteLcf(save, writer);
62  return true;
63 }
64 
65 bool LSD_Reader::SaveXml(const std::string& filename, const RPG::Save& save) {
66  XmlWriter writer(filename);
67  if (!writer.IsOk()) {
68  LcfReader::SetError("Couldn't find %s save file.\n", filename.c_str());
69  return false;
70  }
71 
72  writer.BeginElement("LSD");
73  Struct<RPG::Save>::WriteXml(save, writer);
74  writer.EndElement("LSD");
75  return true;
76 }
77 
78 std::auto_ptr<RPG::Save> LSD_Reader::LoadXml(const std::string& filename) {
79  XmlReader reader(filename);
80  if (!reader.IsOk()) {
81  LcfReader::SetError("Couldn't find %s save file.\n", filename.c_str());
82  return std::auto_ptr<RPG::Save>(NULL);
83  }
84 
85  RPG::Save* save = new RPG::Save();
86  reader.SetHandler(new RootXmlHandler<RPG::Save>(*save, "LSD"));
87  reader.Parse();
88  return std::auto_ptr<RPG::Save>(save);
89 }
bool IsOk() const
Definition: writer_xml.cpp:199
void SetHandler(XmlHandler *handler)
Definition: reader_xml.cpp:92
void BeginElement(const std::string &name)
Definition: writer_xml.cpp:163
void WriteInt(int val)
Definition: writer_lcf.cpp:58
void EndElement(const std::string &name)
Definition: writer_xml.cpp:177
bool SaveXml(const std::string &filename, const RPG::Save &save)
Definition: lsd_reader.cpp:65
std::auto_ptr< RPG::Save > LoadXml(const std::string &filename)
Definition: lsd_reader.cpp:78
bool IsOk() const
Definition: writer_lcf.cpp:117
bool IsOk() const
Definition: reader_xml.cpp:67
double GenerateTimestamp(std::time_t const t=std::time(NULL))
Definition: lsd_reader.cpp:25
bool IsOk() const
Definition: reader_lcf.cpp:170
void Write(const void *ptr, size_t size, size_t nmemb)
Definition: writer_lcf.cpp:33
int ReadInt()
Definition: reader_lcf.cpp:82
double ToTDateTime(std::time_t const t)
Definition: lsd_reader.cpp:16
void ReadString(std::string &ref, size_t size)
Definition: reader_lcf.cpp:162
bool Save(const std::string &filename, const RPG::Save &save, const std::string &encoding)
Definition: lsd_reader.cpp:49
static void ReadLcf(S &obj, LcfReader &stream)
bool Save(const std::string &filename, const std::string &encoding)
Definition: ldb_reader.cpp:40
std::auto_ptr< RPG::Save > Load(const std::string &filename, const std::string &encoding)
Definition: lsd_reader.cpp:29
static void SetError(const char *fmt,...)
Definition: reader_lcf.cpp:234
static void WriteLcf(const S &obj, LcfWriter &stream)
void Parse()
Definition: reader_xml.cpp:79
static void WriteXml(const S &obj, XmlWriter &stream)
std::time_t ToUnixTimestamp(double const ms)
Definition: lsd_reader.cpp:21