diff --git a/libraries/libstratosphere/include/stratosphere/fs/fs_content_attributes.hpp b/libraries/libstratosphere/include/stratosphere/fs/fs_content_attributes.hpp
new file mode 100644
index 000000000..863ccce05
--- /dev/null
+++ b/libraries/libstratosphere/include/stratosphere/fs/fs_content_attributes.hpp
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+#include
+
+namespace ams::fs {
+
+ /* ACCURATE_TO_VERSION: Unknown */
+ enum ContentAttributes : u8 {
+ ContentAttributes_None = 0,
+ };
+
+}
diff --git a/libraries/libstratosphere/include/stratosphere/ncm.hpp b/libraries/libstratosphere/include/stratosphere/ncm.hpp
index 958496c95..896306225 100644
--- a/libraries/libstratosphere/include/stratosphere/ncm.hpp
+++ b/libraries/libstratosphere/include/stratosphere/ncm.hpp
@@ -21,6 +21,7 @@
#include
#include
#include
+#include
#include
#include
#include
diff --git a/libraries/libstratosphere/include/stratosphere/ncm/ncm_content_attributes.hpp b/libraries/libstratosphere/include/stratosphere/ncm/ncm_content_attributes.hpp
new file mode 100644
index 000000000..5bfd69485
--- /dev/null
+++ b/libraries/libstratosphere/include/stratosphere/ncm/ncm_content_attributes.hpp
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) Atmosphère-NX
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+#include
+#include
+
+namespace ams::ncm {
+
+ /* TODO: What is this struct, really? It is presumably not ContentAttributes/has more fields. */
+ struct ContentAttributes {
+ fs::ContentAttributes content_attributes;
+ u8 unknown[0xF];
+
+ static constexpr ALWAYS_INLINE ContentAttributes Make(fs::ContentAttributes attr) {
+ return { attr, };
+ }
+ };
+ static_assert(util::is_pod::value);
+ static_assert(sizeof(ContentAttributes) == 0x10);
+
+ constexpr inline const ContentAttributes DefaultContentAttributes = ContentAttributes::Make(fs::ContentAttributes_None);
+
+}
diff --git a/libraries/libstratosphere/include/stratosphere/ncm/ncm_content_info.hpp b/libraries/libstratosphere/include/stratosphere/ncm/ncm_content_info.hpp
index 95844b9bc..da104f075 100644
--- a/libraries/libstratosphere/include/stratosphere/ncm/ncm_content_info.hpp
+++ b/libraries/libstratosphere/include/stratosphere/ncm/ncm_content_info.hpp
@@ -14,15 +14,19 @@
* along with this program. If not, see .
*/
#pragma once
+#include
#include
#include
namespace ams::ncm {
struct ContentInfo {
+ static constexpr fs::ContentAttributes DefaultContentAttributes = fs::ContentAttributes_None;
+
ContentId content_id;
u32 size_low;
- u16 size_high;
+ u8 size_high;
+ u8 content_attributes;
ContentType content_type;
u8 id_offset;
@@ -34,6 +38,10 @@ namespace ams::ncm {
return (static_cast(this->size_high) << 32) | static_cast(this->size_low);
}
+ constexpr fs::ContentAttributes GetContentAttributes() const {
+ return static_cast(this->content_attributes & 0xF);
+ }
+
constexpr ContentType GetType() const {
return this->content_type;
}
@@ -42,15 +50,16 @@ namespace ams::ncm {
return this->id_offset;
}
- static constexpr ContentInfo Make(ContentId id, u64 size, ContentType type, u8 id_ofs = 0) {
- const u32 size_low = size & 0xFFFFFFFFu;
- const u16 size_high = static_cast(size >> 32);
+ static constexpr ContentInfo Make(ContentId id, u64 size, fs::ContentAttributes attr, ContentType type, u8 id_ofs = 0) {
+ const u32 size_low = size & 0xFFFFFFFFu;
+ const u8 size_high = static_cast(size >> 32);
return {
- .content_id = id,
- .size_low = size_low,
- .size_high = size_high,
- .content_type = type,
- .id_offset = id_ofs,
+ .content_id = id,
+ .size_low = size_low,
+ .size_high = size_high,
+ .content_attributes = attr,
+ .content_type = type,
+ .id_offset = id_ofs,
};
}
};
diff --git a/libraries/libstratosphere/include/stratosphere/ncm/ncm_content_info_data.hpp b/libraries/libstratosphere/include/stratosphere/ncm/ncm_content_info_data.hpp
index de7b8617f..12e3c08c8 100644
--- a/libraries/libstratosphere/include/stratosphere/ncm/ncm_content_info_data.hpp
+++ b/libraries/libstratosphere/include/stratosphere/ncm/ncm_content_info_data.hpp
@@ -40,6 +40,10 @@ namespace ams::ncm {
return this->info.GetId();
}
+ constexpr fs::ContentAttributes GetContentAttributes() const {
+ return this->info.GetContentAttributes();
+ }
+
constexpr ContentType GetType() const {
return this->info.GetType();
}
@@ -72,6 +76,10 @@ namespace ams::ncm {
return this->info.GetSize();
}
+ constexpr fs::ContentAttributes GetContentAttributes() const {
+ return this->info.GetContentAttributes();
+ }
+
constexpr ContentType GetType() const {
return this->info.GetType();
}
diff --git a/libraries/libstratosphere/include/stratosphere/ncm/ncm_content_meta.hpp b/libraries/libstratosphere/include/stratosphere/ncm/ncm_content_meta.hpp
index e660bb147..1397e24b9 100644
--- a/libraries/libstratosphere/include/stratosphere/ncm/ncm_content_meta.hpp
+++ b/libraries/libstratosphere/include/stratosphere/ncm/ncm_content_meta.hpp
@@ -97,6 +97,14 @@ namespace ams::ncm {
};
struct AddOnContentMetaExtendedHeader {
+ ApplicationId application_id;
+ u32 required_application_version;
+ u8 content_accessibilities;
+ u8 padding[3];
+ u64 data_patch_id; /* TODO: DataPatchId? */
+ };
+
+ struct LegacyAddOnContentMetaExtendedHeader {
ApplicationId application_id;
u32 required_application_version;
u32 padding;
diff --git a/libraries/libstratosphere/include/stratosphere/ncm/ncm_content_meta_database.hpp b/libraries/libstratosphere/include/stratosphere/ncm/ncm_content_meta_database.hpp
index c4cef77df..9ee093e9e 100644
--- a/libraries/libstratosphere/include/stratosphere/ncm/ncm_content_meta_database.hpp
+++ b/libraries/libstratosphere/include/stratosphere/ncm/ncm_content_meta_database.hpp
@@ -58,15 +58,25 @@ namespace ams::ncm {
R_SUCCEED();
}
- #define AMS_NCM_DEFINE_GETTERS(Kind, IdType) \
- Result Get##Kind(ContentId *out, IdType##Id id, u32 version) { \
- R_RETURN(m_interface->GetContentIdByType(out, ContentMetaKey::MakeUnknownType(id.value, version), ContentType::Kind)); \
- } \
- \
- Result GetLatest##Kind(ContentId *out, IdType##Id id) { \
- ContentMetaKey latest_key; \
- R_TRY(m_interface->GetLatestContentMetaKey(std::addressof(latest_key), id.value)); \
- R_RETURN(m_interface->GetContentIdByType(out, latest_key, ContentType::Kind)); \
+ #define AMS_NCM_DEFINE_GETTERS(Kind, IdType) \
+ Result Get##Kind(ContentId *out, IdType##Id id, u32 version) { \
+ R_RETURN(m_interface->GetContentIdByType(out, ContentMetaKey::MakeUnknownType(id.value, version), ContentType::Kind)); \
+ } \
+ \
+ Result Get##Kind(ContentInfo *out, IdType##Id id, u32 version) { \
+ R_RETURN(m_interface->GetContentInfoByType(out, ContentMetaKey::MakeUnknownType(id.value, version), ContentType::Kind)); \
+ } \
+ \
+ Result GetLatest##Kind(ContentId *out, IdType##Id id) { \
+ ContentMetaKey latest_key; \
+ R_TRY(m_interface->GetLatestContentMetaKey(std::addressof(latest_key), id.value)); \
+ R_RETURN(m_interface->GetContentIdByType(out, latest_key, ContentType::Kind)); \
+ } \
+ \
+ Result GetLatest##Kind(ContentInfo *out, IdType##Id id) { \
+ ContentMetaKey latest_key; \
+ R_TRY(m_interface->GetLatestContentMetaKey(std::addressof(latest_key), id.value)); \
+ R_RETURN(m_interface->GetContentInfoByType(out, latest_key, ContentType::Kind)); \
}
AMS_NCM_DEFINE_GETTERS(Program, Program)
@@ -189,6 +199,21 @@ namespace ams::ncm {
AMS_ASSERT(m_interface != nullptr);
R_RETURN(m_interface->GetRequiredApplicationVersion(out_version, key));
}
+
+ Result GetContentAccessibilities(u8 *out_accessibilities, const ContentMetaKey &key) {
+ AMS_ASSERT(m_interface != nullptr);
+ R_RETURN(m_interface->GetContentAccessibilities(out_accessibilities, key));
+ }
+
+ Result GetContentInfoByType(ContentInfo *out_content_info, const ContentMetaKey &key, ContentType type) {
+ AMS_ASSERT(m_interface != nullptr);
+ R_RETURN(m_interface->GetContentInfoByType(out_content_info, key, type));
+ }
+
+ Result GetContentInfoByTypeAndIdOffset(ContentInfo *out_content_info, const ContentMetaKey &key, ContentType type, u8 id_offset) {
+ AMS_ASSERT(m_interface != nullptr);
+ R_RETURN(m_interface->GetContentInfoByTypeAndIdOffset(out_content_info, key, type, id_offset));
+ }
};
}
diff --git a/libraries/libstratosphere/include/stratosphere/ncm/ncm_i_content_meta_database.hpp b/libraries/libstratosphere/include/stratosphere/ncm/ncm_i_content_meta_database.hpp
index 7bd096584..787b797df 100644
--- a/libraries/libstratosphere/include/stratosphere/ncm/ncm_i_content_meta_database.hpp
+++ b/libraries/libstratosphere/include/stratosphere/ncm/ncm_i_content_meta_database.hpp
@@ -17,29 +17,33 @@
#include
#include
-#define AMS_NCM_I_CONTENT_META_DATABASE_INTERFACE_INFO(C, H) \
- AMS_SF_METHOD_INFO(C, H, 0, Result, Set, (const ncm::ContentMetaKey &key, const sf::InBuffer &value), (key, value)) \
- AMS_SF_METHOD_INFO(C, H, 1, Result, Get, (sf::Out out_size, const ncm::ContentMetaKey &key, const sf::OutBuffer &out_value), (out_size, key, out_value)) \
- AMS_SF_METHOD_INFO(C, H, 2, Result, Remove, (const ncm::ContentMetaKey &key), (key)) \
- AMS_SF_METHOD_INFO(C, H, 3, Result, GetContentIdByType, (sf::Out out_content_id, const ncm::ContentMetaKey &key, ncm::ContentType type), (out_content_id, key, type)) \
- AMS_SF_METHOD_INFO(C, H, 4, Result, ListContentInfo, (sf::Out out_entries_written, const sf::OutArray &out_info, const ncm::ContentMetaKey &key, s32 offset), (out_entries_written, out_info, key, offset)) \
- AMS_SF_METHOD_INFO(C, H, 5, Result, List, (sf::Out out_entries_total, sf::Out out_entries_written, const sf::OutArray &out_info, ncm::ContentMetaType meta_type, ncm::ApplicationId application_id, u64 min, u64 max, ncm::ContentInstallType install_type), (out_entries_total, out_entries_written, out_info, meta_type, application_id, min, max, install_type)) \
- AMS_SF_METHOD_INFO(C, H, 6, Result, GetLatestContentMetaKey, (sf::Out out_key, u64 id), (out_key, id)) \
- AMS_SF_METHOD_INFO(C, H, 7, Result, ListApplication, (sf::Out out_entries_total, sf::Out out_entries_written, const sf::OutArray &out_keys, ncm::ContentMetaType meta_type), (out_entries_total, out_entries_written, out_keys, meta_type)) \
- AMS_SF_METHOD_INFO(C, H, 8, Result, Has, (sf::Out out, const ncm::ContentMetaKey &key), (out, key)) \
- AMS_SF_METHOD_INFO(C, H, 9, Result, HasAll, (sf::Out out, const sf::InArray &keys), (out, keys)) \
- AMS_SF_METHOD_INFO(C, H, 10, Result, GetSize, (sf::Out out_size, const ncm::ContentMetaKey &key), (out_size, key)) \
- AMS_SF_METHOD_INFO(C, H, 11, Result, GetRequiredSystemVersion, (sf::Out out_version, const ncm::ContentMetaKey &key), (out_version, key)) \
- AMS_SF_METHOD_INFO(C, H, 12, Result, GetPatchId, (sf::Out out_patch_id, const ncm::ContentMetaKey &key), (out_patch_id, key)) \
- AMS_SF_METHOD_INFO(C, H, 13, Result, DisableForcibly, (), ()) \
- AMS_SF_METHOD_INFO(C, H, 14, Result, LookupOrphanContent, (const sf::OutArray &out_orphaned, const sf::InArray &content_ids), (out_orphaned, content_ids)) \
- AMS_SF_METHOD_INFO(C, H, 15, Result, Commit, (), ()) \
- AMS_SF_METHOD_INFO(C, H, 16, Result, HasContent, (sf::Out out, const ncm::ContentMetaKey &key, const ncm::ContentId &content_id), (out, key, content_id)) \
- AMS_SF_METHOD_INFO(C, H, 17, Result, ListContentMetaInfo, (sf::Out out_entries_written, const sf::OutArray &out_meta_info, const ncm::ContentMetaKey &key, s32 offset), (out_entries_written, out_meta_info, key, offset)) \
- AMS_SF_METHOD_INFO(C, H, 18, Result, GetAttributes, (sf::Out out_attributes, const ncm::ContentMetaKey &key), (out_attributes, key)) \
- AMS_SF_METHOD_INFO(C, H, 19, Result, GetRequiredApplicationVersion, (sf::Out out_version, const ncm::ContentMetaKey &key), (out_version, key), hos::Version_2_0_0) \
- AMS_SF_METHOD_INFO(C, H, 20, Result, GetContentIdByTypeAndIdOffset, (sf::Out out_content_id, const ncm::ContentMetaKey &key, ncm::ContentType type, u8 id_offset), (out_content_id, key, type, id_offset), hos::Version_5_0_0) \
- AMS_SF_METHOD_INFO(C, H, 21, Result, GetCount, (sf::Out out_count), (out_count), hos::Version_10_0_0) \
- AMS_SF_METHOD_INFO(C, H, 22, Result, GetOwnerApplicationId, (sf::Out out_id, const ncm::ContentMetaKey &key), (out_id, key), hos::Version_10_0_0)
+#define AMS_NCM_I_CONTENT_META_DATABASE_INTERFACE_INFO(C, H) \
+ AMS_SF_METHOD_INFO(C, H, 0, Result, Set, (const ncm::ContentMetaKey &key, const sf::InBuffer &value), (key, value)) \
+ AMS_SF_METHOD_INFO(C, H, 1, Result, Get, (sf::Out out_size, const ncm::ContentMetaKey &key, const sf::OutBuffer &out_value), (out_size, key, out_value)) \
+ AMS_SF_METHOD_INFO(C, H, 2, Result, Remove, (const ncm::ContentMetaKey &key), (key)) \
+ AMS_SF_METHOD_INFO(C, H, 3, Result, GetContentIdByType, (sf::Out out_content_id, const ncm::ContentMetaKey &key, ncm::ContentType type), (out_content_id, key, type)) \
+ AMS_SF_METHOD_INFO(C, H, 4, Result, ListContentInfo, (sf::Out out_entries_written, const sf::OutArray &out_info, const ncm::ContentMetaKey &key, s32 offset), (out_entries_written, out_info, key, offset)) \
+ AMS_SF_METHOD_INFO(C, H, 5, Result, List, (sf::Out out_entries_total, sf::Out out_entries_written, const sf::OutArray &out_info, ncm::ContentMetaType meta_type, ncm::ApplicationId application_id, u64 min, u64 max, ncm::ContentInstallType install_type), (out_entries_total, out_entries_written, out_info, meta_type, application_id, min, max, install_type)) \
+ AMS_SF_METHOD_INFO(C, H, 6, Result, GetLatestContentMetaKey, (sf::Out out_key, u64 id), (out_key, id)) \
+ AMS_SF_METHOD_INFO(C, H, 7, Result, ListApplication, (sf::Out out_entries_total, sf::Out out_entries_written, const sf::OutArray &out_keys, ncm::ContentMetaType meta_type), (out_entries_total, out_entries_written, out_keys, meta_type)) \
+ AMS_SF_METHOD_INFO(C, H, 8, Result, Has, (sf::Out out, const ncm::ContentMetaKey &key), (out, key)) \
+ AMS_SF_METHOD_INFO(C, H, 9, Result, HasAll, (sf::Out out, const sf::InArray &keys), (out, keys)) \
+ AMS_SF_METHOD_INFO(C, H, 10, Result, GetSize, (sf::Out out_size, const ncm::ContentMetaKey &key), (out_size, key)) \
+ AMS_SF_METHOD_INFO(C, H, 11, Result, GetRequiredSystemVersion, (sf::Out out_version, const ncm::ContentMetaKey &key), (out_version, key)) \
+ AMS_SF_METHOD_INFO(C, H, 12, Result, GetPatchId, (sf::Out out_patch_id, const ncm::ContentMetaKey &key), (out_patch_id, key)) \
+ AMS_SF_METHOD_INFO(C, H, 13, Result, DisableForcibly, (), ()) \
+ AMS_SF_METHOD_INFO(C, H, 14, Result, LookupOrphanContent, (const sf::OutArray &out_orphaned, const sf::InArray &content_ids), (out_orphaned, content_ids)) \
+ AMS_SF_METHOD_INFO(C, H, 15, Result, Commit, (), ()) \
+ AMS_SF_METHOD_INFO(C, H, 16, Result, HasContent, (sf::Out out, const ncm::ContentMetaKey &key, const ncm::ContentId &content_id), (out, key, content_id)) \
+ AMS_SF_METHOD_INFO(C, H, 17, Result, ListContentMetaInfo, (sf::Out out_entries_written, const sf::OutArray &out_meta_info, const ncm::ContentMetaKey &key, s32 offset), (out_entries_written, out_meta_info, key, offset)) \
+ AMS_SF_METHOD_INFO(C, H, 18, Result, GetAttributes, (sf::Out out_attributes, const ncm::ContentMetaKey &key), (out_attributes, key)) \
+ AMS_SF_METHOD_INFO(C, H, 19, Result, GetRequiredApplicationVersion, (sf::Out out_version, const ncm::ContentMetaKey &key), (out_version, key), hos::Version_2_0_0) \
+ AMS_SF_METHOD_INFO(C, H, 20, Result, GetContentIdByTypeAndIdOffset, (sf::Out out_content_id, const ncm::ContentMetaKey &key, ncm::ContentType type, u8 id_offset), (out_content_id, key, type, id_offset), hos::Version_5_0_0) \
+ AMS_SF_METHOD_INFO(C, H, 21, Result, GetCount, (sf::Out out_count), (out_count), hos::Version_10_0_0) \
+ AMS_SF_METHOD_INFO(C, H, 22, Result, GetOwnerApplicationId, (sf::Out out_id, const ncm::ContentMetaKey &key), (out_id, key), hos::Version_10_0_0) \
+ AMS_SF_METHOD_INFO(C, H, 23, Result, GetContentAccessibilities, (sf::Out out_accessibilities, const ncm::ContentMetaKey &key), (out_accessibilities, key), hos::Version_15_0_0) \
+ AMS_SF_METHOD_INFO(C, H, 24, Result, GetContentInfoByType, (sf::Out out_content_info, const ncm::ContentMetaKey &key, ncm::ContentType type), (out_content_info, key, type), hos::Version_15_0_0) \
+ AMS_SF_METHOD_INFO(C, H, 25, Result, GetContentInfoByTypeAndIdOffset, (sf::Out out_content_info, const ncm::ContentMetaKey &key, ncm::ContentType type, u8 id_offset), (out_content_info, key, type, id_offset), hos::Version_15_0_0)
+
AMS_SF_DEFINE_INTERFACE(ams::ncm, IContentMetaDatabase, AMS_NCM_I_CONTENT_META_DATABASE_INTERFACE_INFO, 0x58021FEC)
diff --git a/libraries/libstratosphere/source/fs/impl/fs_id_string_impl.os.generic.cpp b/libraries/libstratosphere/source/fs/impl/fs_id_string_impl.os.generic.cpp
index fc72bbf6c..072fee676 100644
--- a/libraries/libstratosphere/source/fs/impl/fs_id_string_impl.os.generic.cpp
+++ b/libraries/libstratosphere/source/fs/impl/fs_id_string_impl.os.generic.cpp
@@ -21,7 +21,7 @@ namespace ams::fs::impl {
#define ADD_ENUM_CASE(v) case v: return #v
template<> const char *IdString::ToString(pkg1::KeyGeneration id) {
- static_assert(pkg1::KeyGeneration_Current == pkg1::KeyGeneration_14_0_0);
+ static_assert(pkg1::KeyGeneration_Current == pkg1::KeyGeneration_15_0_0);
switch (id) {
using enum pkg1::KeyGeneration;
case KeyGeneration_1_0_0: return "1.0.0-2.3.0";
@@ -37,7 +37,8 @@ namespace ams::fs::impl {
case KeyGeneration_9_1_0: return "9.1.0-12.0.3";
case KeyGeneration_12_1_0: return "12.1.0";
case KeyGeneration_13_0_0: return "13.0.0-13.2.1";
- case KeyGeneration_14_0_0: return "14.0.0-";
+ case KeyGeneration_14_0_0: return "14.0.0-14.1.2";
+ case KeyGeneration_15_0_0: return "15.0.0-";
default: return "Unknown";
}
}
diff --git a/libraries/libstratosphere/source/ncm/ncm_content_management_utils.cpp b/libraries/libstratosphere/source/ncm/ncm_content_management_utils.cpp
index ee79288d9..be098ea1e 100644
--- a/libraries/libstratosphere/source/ncm/ncm_content_management_utils.cpp
+++ b/libraries/libstratosphere/source/ncm/ncm_content_management_utils.cpp
@@ -114,7 +114,7 @@ namespace ams::ncm {
R_TRY(storage->GetSize(std::addressof(size), content_id));
/* Build. */
- R_TRY(this->BuildFromPackageContentMeta(package_meta.Get(), package_meta.GetSize(), ContentInfo::Make(content_id, size, ContentType::Meta)));
+ R_TRY(this->BuildFromPackageContentMeta(package_meta.Get(), package_meta.GetSize(), ContentInfo::Make(content_id, size, ContentInfo::DefaultContentAttributes, ContentType::Meta)));
}
}
@@ -144,7 +144,7 @@ namespace ams::ncm {
R_UNLESS(content_id, ncm::ResultInvalidPackageFormat());
/* Build using the meta. */
- R_RETURN(this->BuildFromPackageContentMeta(package_meta.Get(), package_meta.GetSize(), ContentInfo::Make(*content_id, entry.file_size, ContentType::Meta)));
+ R_RETURN(this->BuildFromPackageContentMeta(package_meta.Get(), package_meta.GetSize(), ContentInfo::Make(*content_id, entry.file_size, ContentInfo::DefaultContentAttributes, ContentType::Meta)));
}));
/* Commit our changes. */
diff --git a/libraries/libstratosphere/source/ncm/ncm_content_meta_database_impl.cpp b/libraries/libstratosphere/source/ncm/ncm_content_meta_database_impl.cpp
index e19f8fc99..647ba99e6 100644
--- a/libraries/libstratosphere/source/ncm/ncm_content_meta_database_impl.cpp
+++ b/libraries/libstratosphere/source/ncm/ncm_content_meta_database_impl.cpp
@@ -18,7 +18,7 @@
namespace ams::ncm {
- Result ContentMetaDatabaseImpl::GetContentIdImpl(ContentId *out, const ContentMetaKey &key, ContentType type, util::optional id_offset) const {
+ Result ContentMetaDatabaseImpl::GetContentInfoImpl(ContentInfo *out, const ContentMetaKey &key, ContentType type, util::optional id_offset) const {
R_TRY(this->EnsureEnabled());
/* Find the meta key. */
@@ -45,7 +45,7 @@ namespace ams::ncm {
R_UNLESS(content_info != nullptr, ncm::ResultContentNotFound());
/* Save output. */
- *out = content_info->content_id;
+ *out = *content_info;
R_SUCCEED();
}
@@ -481,4 +481,31 @@ namespace ams::ncm {
R_SUCCEED();
}
+ Result ContentMetaDatabaseImpl::GetContentAccessibilities(sf::Out out_accessibilities, const ContentMetaKey &key) {
+ R_TRY(this->EnsureEnabled());
+
+ /* Ensure this type of key is for an add-on content. */
+ R_UNLESS(key.type == ContentMetaType::AddOnContent, ncm::ResultInvalidContentMetaKey());
+
+ /* Obtain the content meta for the key. */
+ const void *meta;
+ size_t meta_size;
+ R_TRY(this->GetContentMetaPointer(&meta, &meta_size, key));
+
+ /* Create a reader. */
+ ContentMetaReader reader(meta, meta_size);
+
+ /* Set the ouput value. */
+ out_accessibilities.SetValue(reader.GetExtendedHeader()->content_accessibilities);
+ R_SUCCEED();
+ }
+
+ Result ContentMetaDatabaseImpl::GetContentInfoByType(sf::Out out_content_info, const ContentMetaKey &key, ContentType type) {
+ R_RETURN(this->GetContentInfoImpl(out_content_info.GetPointer(), key, type, util::nullopt));
+ }
+
+ Result ContentMetaDatabaseImpl::GetContentInfoByTypeAndIdOffset(sf::Out out_content_info, const ContentMetaKey &key, ContentType type, u8 id_offset) {
+ R_RETURN(this->GetContentInfoImpl(out_content_info.GetPointer(), key, type, util::make_optional(id_offset)));
+ }
+
}
diff --git a/libraries/libstratosphere/source/ncm/ncm_content_meta_database_impl.hpp b/libraries/libstratosphere/source/ncm/ncm_content_meta_database_impl.hpp
index c9e86181b..fddb30e2c 100644
--- a/libraries/libstratosphere/source/ncm/ncm_content_meta_database_impl.hpp
+++ b/libraries/libstratosphere/source/ncm/ncm_content_meta_database_impl.hpp
@@ -25,7 +25,17 @@ namespace ams::ncm {
ContentMetaDatabaseImpl(ContentMetaKeyValueStore *kvs) : ContentMetaDatabaseImplBase(kvs) { /* ... */ }
private:
/* Helpers. */
- Result GetContentIdImpl(ContentId *out, const ContentMetaKey &key, ContentType type, util::optional id_offset) const;
+ Result GetContentInfoImpl(ContentInfo *out, const ContentMetaKey &key, ContentType type, util::optional id_offset) const;
+
+ Result GetContentIdImpl(ContentId *out, const ContentMetaKey &key, ContentType type, util::optional id_offset) const {
+ /* Get the content info. */
+ ContentInfo content_info;
+ R_TRY(this->GetContentInfoImpl(std::addressof(content_info), key, type, id_offset));
+
+ /* Set the output id. */
+ *out = content_info.GetId();
+ R_SUCCEED();
+ }
public:
/* Actual commands. */
virtual Result Set(const ContentMetaKey &key, const sf::InBuffer &value) override;
@@ -51,6 +61,9 @@ namespace ams::ncm {
virtual Result GetContentIdByTypeAndIdOffset(sf::Out out_content_id, const ContentMetaKey &key, ContentType type, u8 id_offset) override;
virtual Result GetCount(sf::Out out_count) override;
virtual Result GetOwnerApplicationId(sf::Out out_id, const ContentMetaKey &key) override;
+ virtual Result GetContentAccessibilities(sf::Out out_accessibilities, const ContentMetaKey &key) override;
+ virtual Result GetContentInfoByType(sf::Out out_content_info, const ContentMetaKey &key, ContentType type) override;
+ virtual Result GetContentInfoByTypeAndIdOffset(sf::Out out_content_info, const ContentMetaKey &key, ContentType type, u8 id_offset) override;
};
}
diff --git a/libraries/libstratosphere/source/ncm/ncm_content_meta_database_impl_base.hpp b/libraries/libstratosphere/source/ncm/ncm_content_meta_database_impl_base.hpp
index d22fd18f5..96ecc178f 100644
--- a/libraries/libstratosphere/source/ncm/ncm_content_meta_database_impl_base.hpp
+++ b/libraries/libstratosphere/source/ncm/ncm_content_meta_database_impl_base.hpp
@@ -77,6 +77,9 @@ namespace ams::ncm {
virtual Result GetContentIdByTypeAndIdOffset(sf::Out out_content_id, const ContentMetaKey &key, ContentType type, u8 id_offset) = 0;
virtual Result GetCount(sf::Out out_count) = 0;
virtual Result GetOwnerApplicationId(sf::Out out_id, const ContentMetaKey &key) = 0;
+ virtual Result GetContentAccessibilities(sf::Out out_accessibilities, const ContentMetaKey &key) = 0;
+ virtual Result GetContentInfoByType(sf::Out out_content_info, const ContentMetaKey &key, ContentType type) = 0;
+ virtual Result GetContentInfoByTypeAndIdOffset(sf::Out out_content_info, const ContentMetaKey &key, ContentType type, u8 id_offset) = 0;
};
static_assert(ncm::IsIContentMetaDatabase);
diff --git a/libraries/libstratosphere/source/ncm/ncm_install_task_base.cpp b/libraries/libstratosphere/source/ncm/ncm_install_task_base.cpp
index 13edcb2e0..f44c27688 100644
--- a/libraries/libstratosphere/source/ncm/ncm_install_task_base.cpp
+++ b/libraries/libstratosphere/source/ncm/ncm_install_task_base.cpp
@@ -790,7 +790,7 @@ namespace ams::ncm {
R_TRY(tmp_buffer.Initialize(reader.CalculateConvertInstallContentMetaSize()));
/* Convert packaged content meta to install content meta. */
- reader.ConvertToInstallContentMeta(tmp_buffer.Get(), tmp_buffer.GetSize(), InstallContentInfo::Make(ContentInfo::Make(content_id, size, ContentType::Meta), meta_type));
+ reader.ConvertToInstallContentMeta(tmp_buffer.Get(), tmp_buffer.GetSize(), InstallContentInfo::Make(ContentInfo::Make(content_id, size, ContentInfo::DefaultContentAttributes, ContentType::Meta), meta_type));
/* Push the content meta. */
m_data->Push(tmp_buffer.Get(), tmp_buffer.GetSize());
@@ -1028,7 +1028,7 @@ namespace ams::ncm {
InstallContentInfo InstallTaskBase::MakeInstallContentInfoFrom(const InstallContentMetaInfo &info, const PlaceHolderId &placeholder_id, util::optional is_tmp) {
return {
.digest = info.digest,
- .info = ContentInfo::Make(info.content_id, info.content_size, ContentType::Meta, 0),
+ .info = ContentInfo::Make(info.content_id, info.content_size, ContentInfo::DefaultContentAttributes, ContentType::Meta, 0),
.placeholder_id = placeholder_id,
.meta_type = info.key.type,
.install_state = InstallState::Prepared,
diff --git a/libraries/libstratosphere/source/ncm/ncm_remote_content_meta_database_impl.hpp b/libraries/libstratosphere/source/ncm/ncm_remote_content_meta_database_impl.hpp
index 9107e7295..5281a3ac3 100644
--- a/libraries/libstratosphere/source/ncm/ncm_remote_content_meta_database_impl.hpp
+++ b/libraries/libstratosphere/source/ncm/ncm_remote_content_meta_database_impl.hpp
@@ -168,6 +168,24 @@ namespace ams::ncm {
AMS_UNUSED(out_id, key);
AMS_ABORT();
}
+
+ Result GetContentAccessibilities(sf::Out out_accessibilities, const ContentMetaKey &key) {
+ /* TODO: libnx bindings */
+ AMS_UNUSED(out_accessibilities, key);
+ AMS_ABORT();
+ }
+
+ Result GetContentInfoByType(sf::Out out_content_info, const ContentMetaKey &key, ContentType type) {
+ /* TODO: libnx bindings */
+ AMS_UNUSED(out_content_info, key, type);
+ AMS_ABORT();
+ }
+
+ Result GetContentInfoByTypeAndIdOffset(sf::Out out_content_info, const ContentMetaKey &key, ContentType type, u8 id_offset) {
+ /* TODO: libnx bindings */
+ AMS_UNUSED(out_content_info, key, type, id_offset);
+ AMS_ABORT();
+ }
};
static_assert(ncm::IsIContentMetaDatabase);
#endif