/* * Copyright (c) 2019-2020 Adubbz, 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 #include #include namespace ams::ncm { enum class ContentInstallType : u8 { Full = 0, FragmentOnly = 1, Unknown = 7, }; struct ContentMetaKey { u64 id; u32 version; ContentMetaType type; ContentInstallType install_type; u8 padding[2]; bool operator<(const ContentMetaKey& other) const { if (this->id < other.id) { return true; } else if (this->id != other.id) { return false; } if (this->version < other.version) { return true; } else if (this->version != other.version) { return false; } if (this->type < other.type) { return true; } else if (this->type != other.type) { return false; } return this->install_type < other.install_type; } constexpr bool operator==(const ContentMetaKey& other) const { return this->id == other.id && this->version == other.version && this->type == other.type && this->install_type == other.install_type; } constexpr bool operator!=(const ContentMetaKey& other) const { return !(*this == other); } static constexpr ContentMetaKey MakeUnknownType(u64 id, u32 version) { return { .id = id, .version = version, .type = ContentMetaType::Unknown }; } static constexpr ContentMetaKey Make(u64 id, u32 version, ContentMetaType type) { return { .id = id, .version = version, .type = type }; } static constexpr ContentMetaKey Make(u64 id, u32 version, ContentMetaType type, ContentInstallType install_type) { return { .id = id, .version = version, .type = type, .install_type = install_type }; } static constexpr ContentMetaKey Make(SystemProgramId id, u32 version) { return { .id = id.value, .version = version, .type = ContentMetaType::SystemProgram }; } static constexpr ContentMetaKey Make(SystemDataId id, u32 version) { return { .id = id.value, .version = version, .type = ContentMetaType::SystemData }; } static constexpr ContentMetaKey Make(SystemUpdateId id, u32 version) { return { .id = id.value, .version = version, .type = ContentMetaType::SystemUpdate }; } static constexpr ContentMetaKey Make(ApplicationId id, u32 version) { return { .id = id.value, .version = version, .type = ContentMetaType::Application }; } static constexpr ContentMetaKey Make(PatchId id, u32 version) { return { .id = id.value, .version = version, .type = ContentMetaType::Patch }; } static constexpr ContentMetaKey Make(PatchId id, u32 version, ContentInstallType install_type) { return { .id = id.value, .version = version, .type = ContentMetaType::Patch, .install_type = install_type }; } static constexpr ContentMetaKey Make(DeltaId id, u32 version) { return { .id = id.value, .version = version, .type = ContentMetaType::Delta }; } }; static_assert(sizeof(ContentMetaKey) == 0x10); struct ApplicationContentMetaKey { ContentMetaKey key; ncm::ApplicationId application_id; }; static_assert(sizeof(ApplicationContentMetaKey) == 0x18); struct StorageContentMetaKey { ContentMetaKey key; StorageId storage_id; u8 reserved[7]; constexpr bool operator==(StorageContentMetaKey &rhs) const { return this->key == rhs.key && this->storage_id == rhs.storage_id; } constexpr bool operator<(StorageContentMetaKey &rhs) const { return this->key == rhs.key ? this->storage_id < rhs.storage_id : this->key < rhs.key; } }; static_assert(sizeof(StorageContentMetaKey) == 0x18); }