Tileson 1.4.0
A helpful json parser for Tiled maps
Loading...
Searching...
No Matches
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/TiledEnum.hpp"
49#include "tiled/TiledClass.hpp"
50#include "tiled/Project.hpp"
51
52
53namespace tson
54{
55 class Tileson
56 {
57 public:
58 #ifdef JSON11_IS_DEFINED
59 inline explicit Tileson(std::unique_ptr<tson::IJson> jsonParser = std::make_unique<tson::Json11>(), bool includeBase64Decoder = true);
60 inline explicit Tileson(tson::Project *project, std::unique_ptr<tson::IJson> jsonParser = std::make_unique<tson::Json11>(), bool includeBase64Decoder = true);
61 #else
62 inline explicit Tileson(std::unique_ptr<tson::IJson> jsonParser, bool includeBase64Decoder = true);
63 inline explicit Tileson(tson::Project *project, std::unique_ptr<tson::IJson> jsonParser, bool includeBase64Decoder = true);
64 #endif
65
66 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);
67 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);
69
70 private:
71 inline std::unique_ptr<tson::Map> parseJson();
72 std::unique_ptr<tson::IJson> m_json;
73 tson::DecompressorContainer m_decompressors;
74 tson::Project *m_project {nullptr};
75 };
76}
77
83tson::Tileson::Tileson(std::unique_ptr<tson::IJson> jsonParser, bool includeBase64Decoder) : m_json {std::move(jsonParser)}
84{
85 if(includeBase64Decoder)
86 m_decompressors.add<Base64Decompressor>();
87}
88
89tson::Tileson::Tileson(tson::Project *project, std::unique_ptr<tson::IJson> jsonParser, bool includeBase64Decoder) : m_json {std::move(jsonParser)}
90{
91 m_project = project;
92 if(includeBase64Decoder)
93 m_decompressors.add<Base64Decompressor>();
94}
95
101std::unique_ptr<tson::Map> tson::Tileson::parse(const fs::path &path, std::unique_ptr<IDecompressor<std::vector<uint8_t>, std::vector<uint8_t>>> decompressor)
102{
103
104 bool result = false;
105
106 if(decompressor != nullptr)
107 {
108 std::vector<uint8_t> decompressed = decompressor->decompressFile(path);
109 result = (decompressed.empty()) ? false : true;
110 if(!result)
111 return std::make_unique<tson::Map>(tson::ParseStatus::DecompressionError, "Error during decompression");
112
113 result = m_json->parse(&decompressed[0], decompressed.size());
114
115 if(result)
116 return parseJson();
117 }
118 else if(m_json->parse(path))
119 {
120 return parseJson();
121 }
122
123 std::string msg = "File not found: ";
124 msg += std::string(path.generic_string());
125 return std::make_unique<tson::Map>(tson::ParseStatus::FileNotFound, msg);
126}
127
134std::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)
135{
136 bool result = false;
137
138 if(decompressor != nullptr)
139 {
140 std::vector<uint8_t> decompressed = decompressor->decompress(data, size);
141 result = (decompressed.empty()) ? false : true;
142 if(!result)
143 return std::make_unique<tson::Map>(tson::ParseStatus::DecompressionError, "Error during decompression");
144 result = m_json->parse(&decompressed[0], decompressed.size());
145 }
146 else
147 result = m_json->parse(data, size);
148
149 if(!result)
150 return std::make_unique<tson::Map>(tson::ParseStatus::ParseError, "Memory error");
151
152
153 return parseJson();
154}
155
161std::unique_ptr<tson::Map> tson::Tileson::parseJson()
162{
163 std::unique_ptr<tson::Map> map = std::make_unique<tson::Map>();
164
165 if(map->parse(*m_json, &m_decompressors, m_project))
166 return map;
167
168 return std::make_unique<tson::Map> (tson::ParseStatus::MissingData, "Missing map data...");
169}
170
179{
180 return &m_decompressors;
181}
182
183#endif //TILESON_TILESON_PARSER_HPP
Definition Base64Decompressor.hpp:15
std::string decompressFile(const fs::path &path) override
Definition Base64Decompressor.hpp:95
Definition DecompressorContainer.hpp:16
void add(Args &&... args)
Definition DecompressorContainer.hpp:34
Definition IDecompressor.hpp:14
Definition Project.hpp:20
Definition tileson_parser.hpp:56
tson::DecompressorContainer * decompressors()
Definition tileson_parser.hpp:178
Tileson(std::unique_ptr< tson::IJson > jsonParser, bool includeBase64Decoder=true)
Definition tileson_parser.hpp:83
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:101
Definition Base64.hpp:12