| 140 | } |
| 141 | |
| 142 | void AsyncHandler::CreateRequestMapping(const std::string& file) { |
| 143 | #ifdef EMSCRIPTEN |
| 144 | auto f = FileFinder::Game().OpenInputStream(file); |
| 145 | if (!f) { |
| 146 | Output::Error("Emscripten: Reading index.json failed"); |
| 147 | return; |
| 148 | } |
| 149 | |
| 150 | json j = json::parse(f, nullptr, false); |
| 151 | if (j.is_discarded()) { |
| 152 | Output::Error("Emscripten: index.json is not a valid JSON file"); |
| 153 | return; |
| 154 | } |
| 155 | |
| 156 | if (j.contains("metadata") && j["metadata"].is_object()) { |
| 157 | const auto& metadata = j["metadata"]; |
| 158 | if (metadata.contains("version") && metadata["version"].is_number()) { |
| 159 | index_version = metadata["version"].get<int>(); |
| 160 | } |
| 161 | } |
| 162 | |
| 163 | Output::Debug("Parsing index.json version {}", index_version); |
| 164 | |
| 165 | if (index_version <= 1) { |
| 166 | // legacy format |
| 167 | for (const auto& value : j.items()) { |
| 168 | file_mapping[value.key()] = value.value().get<std::string>(); |
| 169 | } |
| 170 | } else { |
| 171 | using fn = std::function<void(const json&, const std::string&)>; |
| 172 | fn parse = [&] (const json& obj, const std::string& path) { |
| 173 | std::string dirname; |
| 174 | if (obj.contains("_dirname") && obj["_dirname"].is_string()) { |
| 175 | dirname = obj["_dirname"].get<std::string>(); |
| 176 | } |
| 177 | dirname = FileFinder::MakePath(path, dirname); |
| 178 | |
| 179 | for (const auto& value : obj.items()) { |
| 180 | const auto& second = value.value(); |
| 181 | if (second.is_object()) { |
| 182 | parse(second, dirname); |
| 183 | } else if (second.is_string()){ |
| 184 | file_mapping[FileFinder::MakePath(Utils::LowerCase(dirname), value.key())] = FileFinder::MakePath(dirname, second.get<std::string>()); |
| 185 | } |
| 186 | } |
| 187 | }; |
| 188 | |
| 189 | if (j.contains("cache") && j["cache"].is_object()) { |
| 190 | parse(j["cache"], ""); |
| 191 | } |
| 192 | |
| 193 | // Create some empty DLL files. Engine & patch detection depend on them. |
| 194 | for (const auto& s : {"harmony.dll", "ultimate_rt_eb.dll", "dynloader.dll", "accord.dll"}) { |
| 195 | auto it = file_mapping.find(s); |
| 196 | if (it != file_mapping.end()) { |
| 197 | FileFinder::Game().OpenOutputStream(s); |
| 198 | } |
| 199 | } |
nothing calls this directly
no test coverage detected