ManifestJSONParser.cpp (4486B)
1 // Copyright (c) Microsoft Corporation. 2 // Licensed under the MIT License. 3 #include "pch.h" 4 #include "Public/winget/ManifestJSONParser.h" 5 #include "Rest/Schema/1_0/Json/ManifestDeserializer.h" 6 #include "Rest/Schema/1_1/Json/ManifestDeserializer.h" 7 #include "Rest/Schema/1_4/Json/ManifestDeserializer.h" 8 #include "Rest/Schema/1_5/Json/ManifestDeserializer.h" 9 #include "Rest/Schema/1_6/Json/ManifestDeserializer.h" 10 #include "Rest/Schema/1_7/Json/ManifestDeserializer.h" 11 #include "Rest/Schema/1_9/Json/ManifestDeserializer.h" 12 #include "Rest/Schema/1_10/Json/ManifestDeserializer.h" 13 #include "Rest/Schema/1_12/Json/ManifestDeserializer.h" 14 15 namespace AppInstaller::Repository::JSON 16 { 17 struct ManifestJSONParser::impl 18 { 19 // The deserializer. We only have one lineage (1.0+) right now. 20 std::unique_ptr<Rest::Schema::V1_0::Json::ManifestDeserializer> m_deserializer; 21 }; 22 23 ManifestJSONParser::ManifestJSONParser(const Utility::Version& responseSchemaVersion) 24 { 25 const auto& parts = responseSchemaVersion.GetParts(); 26 THROW_HR_IF(E_INVALIDARG, parts.empty()); 27 28 m_pImpl = std::make_unique<impl>(); 29 30 if (parts[0].Integer == 1) 31 { 32 if (parts.size() == 1 || parts[1].Integer == 0) 33 { 34 m_pImpl->m_deserializer = std::make_unique<Rest::Schema::V1_0::Json::ManifestDeserializer>(); 35 } 36 else if (parts.size() > 1 && parts[1].Integer < 4) 37 { 38 m_pImpl->m_deserializer = std::make_unique<Rest::Schema::V1_1::Json::ManifestDeserializer>(); 39 } 40 else if (parts.size() > 1 && parts[1].Integer < 5) 41 { 42 m_pImpl->m_deserializer = std::make_unique<Rest::Schema::V1_4::Json::ManifestDeserializer>(); 43 } 44 else if (parts.size() > 1 && parts[1].Integer < 6) 45 { 46 m_pImpl->m_deserializer = std::make_unique<Rest::Schema::V1_5::Json::ManifestDeserializer>(); 47 } 48 else if (parts.size() > 1 && parts[1].Integer < 7) 49 { 50 m_pImpl->m_deserializer = std::make_unique<Rest::Schema::V1_6::Json::ManifestDeserializer>(); 51 } 52 else if (parts.size() > 1 && parts[1].Integer < 9) 53 { 54 m_pImpl->m_deserializer = std::make_unique<Rest::Schema::V1_7::Json::ManifestDeserializer>(); 55 } 56 else if (parts.size() > 1 && parts[1].Integer < 10) 57 { 58 m_pImpl->m_deserializer = std::make_unique<Rest::Schema::V1_9::Json::ManifestDeserializer>(); 59 } 60 else if (parts.size() > 1 && parts[1].Integer < 12) 61 { 62 m_pImpl->m_deserializer = std::make_unique<Rest::Schema::V1_10::Json::ManifestDeserializer>(); 63 } 64 else 65 { 66 m_pImpl->m_deserializer = std::make_unique<Rest::Schema::V1_12::Json::ManifestDeserializer>(); 67 } 68 } 69 else 70 { 71 THROW_HR(HRESULT_FROM_WIN32(ERROR_UNSUPPORTED_TYPE)); 72 } 73 } 74 75 ManifestJSONParser::ManifestJSONParser(ManifestJSONParser&&) noexcept = default; 76 ManifestJSONParser& ManifestJSONParser::operator=(ManifestJSONParser&&) noexcept = default; 77 78 ManifestJSONParser::~ManifestJSONParser() = default; 79 80 std::vector<Manifest::Manifest> ManifestJSONParser::Deserialize(const web::json::value& response) const 81 { 82 return m_pImpl->m_deserializer->Deserialize(response); 83 } 84 85 std::vector<Manifest::Manifest> ManifestJSONParser::DeserializeData(const web::json::value& data) const 86 { 87 return m_pImpl->m_deserializer->DeserializeData(data); 88 } 89 90 std::vector<Manifest::AppsAndFeaturesEntry> ManifestJSONParser::DeserializeAppsAndFeaturesEntries(const web::json::array& data) const 91 { 92 return m_pImpl->m_deserializer->DeserializeAppsAndFeaturesEntries(data); 93 } 94 95 std::optional<Manifest::ManifestLocalization> ManifestJSONParser::DeserializeLocale(const web::json::value& locale) const 96 { 97 return m_pImpl->m_deserializer->DeserializeLocale(locale); 98 } 99 100 std::optional<Manifest::InstallationMetadataInfo> ManifestJSONParser::DeserializeInstallationMetadata(const web::json::value& installationMetadata) const 101 { 102 return m_pImpl->m_deserializer->DeserializeInstallationMetadata(installationMetadata); 103 } 104 }