Tileson  1.3.0
A helpful json parser for Tiled maps
tileson_parser.hpp
Go to the documentation of this file.
1 //
2 // Created by robin on 22.03.2020.
3 //
4 
5 #ifndef TILESON_TILESON_PARSER_HPP
6 #define TILESON_TILESON_PARSER_HPP
7 
8 //RBP: FS-namespace is defined in tileson_parser now!
9 #if _MSC_VER && !__INTEL_COMPILER
10  #include <filesystem>
11  namespace fs = std::filesystem;
12 #elif __MINGW64__
13  #if __MINGW64_VERSION_MAJOR > 6
14  #include <filesystem>
15  namespace fs = std::filesystem;
16  #else
17  #include <experimental/filesystem>
18  namespace fs = std::experimental::filesystem;
19  #endif
20 #elif __clang__
21  #if __clang_major__ < 8
22  #include <experimental/filesystem>
23  namespace fs = std::experimental::filesystem;
24  #else
25  #include <filesystem>
26  namespace fs = std::filesystem;
27  #endif
28 #else //Linux
29  #if __GNUC__ < 8 //GCC major version less than 8
30  #include <experimental/filesystem>
31  namespace fs = std::experimental::filesystem;
32  #else
33  #include <filesystem>
34  namespace fs = std::filesystem;
35  #endif
36 #endif
37 
38 #include <fstream>
39 #include <sstream>
40 #include <memory>
41 
42 #include "common/Tools.hpp"
44 #include "common/Lzma.hpp"
46 #include "misc/MemoryStream.hpp"
47 #include "tiled/Map.hpp"
48 #include "tiled/Project.hpp"
49 
50 
51 namespace tson
52 {
53  class Tileson
54  {
55  public:
56  #ifdef JSON11_IS_DEFINED
57  inline explicit Tileson(std::unique_ptr<tson::IJson> jsonParser = std::make_unique<tson::Json11>(), bool includeBase64Decoder = true);
58  #else
59  inline explicit Tileson(std::unique_ptr<tson::IJson> jsonParser, bool includeBase64Decoder = true);
60  #endif
61 
62  inline std::unique_ptr<tson::Map> parse(const fs::path &path, std::unique_ptr<IDecompressor<std::vector<uint8_t>, std::vector<uint8_t>>> decompressor = nullptr);
63  inline std::unique_ptr<tson::Map> parse(const void * data, size_t size, std::unique_ptr<IDecompressor<std::vector<uint8_t>, std::vector<uint8_t>>> decompressor = nullptr);
65 
66  private:
67  inline std::unique_ptr<tson::Map> parseJson();
68  std::unique_ptr<tson::IJson> m_json;
69  tson::DecompressorContainer m_decompressors;
70  };
71 }
72 
78 tson::Tileson::Tileson(std::unique_ptr<tson::IJson> jsonParser, bool includeBase64Decoder) : m_json {std::move(jsonParser)}
79 {
80  if(includeBase64Decoder)
81  m_decompressors.add<Base64Decompressor>();
82 }
83 
89 std::unique_ptr<tson::Map> tson::Tileson::parse(const fs::path &path, std::unique_ptr<IDecompressor<std::vector<uint8_t>, std::vector<uint8_t>>> decompressor)
90 {
91 
92  bool result = false;
93 
94  if(decompressor != nullptr)
95  {
96  std::vector<uint8_t> decompressed = decompressor->decompressFile(path);
97  result = (decompressed.empty()) ? false : true;
98  if(!result)
99  return std::make_unique<tson::Map>(tson::ParseStatus::DecompressionError, "Error during decompression");
100  result = m_json->parse(&decompressed[0], decompressed.size());
101  if(result)
102  return std::move(parseJson());
103  }
104  else if(m_json->parse(path))
105  {
106  return std::move(parseJson());
107  }
108 
109  std::string msg = "File not found: ";
110  msg += std::string(path.u8string());
111  return std::make_unique<tson::Map>(tson::ParseStatus::FileNotFound, msg);
112 }
113 
120 std::unique_ptr<tson::Map> tson::Tileson::parse(const void *data, size_t size, std::unique_ptr<IDecompressor<std::vector<uint8_t>, std::vector<uint8_t>>> decompressor)
121 {
122  bool result = false;
123 
124  if(decompressor != nullptr)
125  {
126  std::vector<uint8_t> decompressed = decompressor->decompress(data, size);
127  result = (decompressed.empty()) ? false : true;
128  if(!result)
129  return std::make_unique<tson::Map>(tson::ParseStatus::DecompressionError, "Error during decompression");
130  result = m_json->parse(&decompressed[0], decompressed.size());
131  }
132  else
133  result = m_json->parse(data, size);
134 
135  if(!result)
136  return std::make_unique<tson::Map>(tson::ParseStatus::ParseError, "Memory error");
137 
138 
139  return std::move(parseJson());
140 }
141 
147 std::unique_ptr<tson::Map> tson::Tileson::parseJson()
148 {
149  std::unique_ptr<tson::Map> map = std::make_unique<tson::Map>();
150 
151  if(map->parse(*m_json, &m_decompressors))
152  return std::move(map);
153 
154  return std::make_unique<tson::Map> (tson::ParseStatus::MissingData, "Missing map data...");
155 }
156 
165 {
166  return &m_decompressors;
167 }
168 
169 
170 
171 #endif //TILESON_TILESON_PARSER_HPP
Definition: Base64Decompressor.hpp:15
Definition: DecompressorContainer.hpp:16
void add(Args &&... args)
Definition: DecompressorContainer.hpp:34
Definition: IDecompressor.hpp:14
Definition: tileson_parser.hpp:54
std::unique_ptr< tson::Map > parse(const fs::path &path, std::unique_ptr< IDecompressor< std::vector< uint8_t >, std::vector< uint8_t >>> decompressor=nullptr)
Definition: tileson_parser.hpp:89
tson::DecompressorContainer * decompressors()
Definition: tileson_parser.hpp:164
Tileson(std::unique_ptr< tson::IJson > jsonParser, bool includeBase64Decoder=true)
Definition: tileson_parser.hpp:78
Definition: Base64.hpp:12