From f7ee16a45cde54051b7963b5c06a841d5c8fe411 Mon Sep 17 00:00:00 2001 From: Adubbz Date: Sat, 28 Mar 2020 13:37:22 +1100 Subject: [PATCH] ncm client: implement SubmissionPackageInstallTask --- .../include/stratosphere/ncm.hpp | 1 + .../ncm_submission_package_install_task.hpp | 34 +++++++++ .../source/ncm/ncm_install_task_data.cpp | 4 +- .../ncm_submission_package_install_task.cpp | 71 +++++++++++++++++++ 4 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 libraries/libstratosphere/include/stratosphere/ncm/ncm_submission_package_install_task.hpp create mode 100644 libraries/libstratosphere/source/ncm/ncm_submission_package_install_task.cpp diff --git a/libraries/libstratosphere/include/stratosphere/ncm.hpp b/libraries/libstratosphere/include/stratosphere/ncm.hpp index ed395444b..c89f5b907 100644 --- a/libraries/libstratosphere/include/stratosphere/ncm.hpp +++ b/libraries/libstratosphere/include/stratosphere/ncm.hpp @@ -34,5 +34,6 @@ #include #include #include +#include #include #include diff --git a/libraries/libstratosphere/include/stratosphere/ncm/ncm_submission_package_install_task.hpp b/libraries/libstratosphere/include/stratosphere/ncm/ncm_submission_package_install_task.hpp new file mode 100644 index 000000000..a335aea0c --- /dev/null +++ b/libraries/libstratosphere/include/stratosphere/ncm/ncm_submission_package_install_task.hpp @@ -0,0 +1,34 @@ +/* + * 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 + +namespace ams::ncm { + + class SubmissionPackageInstallTask : public PackageInstallTask { + private: + class Impl; + private: + Impl *impl; + public: + SubmissionPackageInstallTask() { /* ... */ } + ~SubmissionPackageInstallTask(); + + Result Initialize(fs::FileHandle handle, StorageId storage_id, void *buffer, size_t buffer_size, bool ignore_ticket); + }; + +} diff --git a/libraries/libstratosphere/source/ncm/ncm_install_task_data.cpp b/libraries/libstratosphere/source/ncm/ncm_install_task_data.cpp index 6a0dae554..7725d11b2 100644 --- a/libraries/libstratosphere/source/ncm/ncm_install_task_data.cpp +++ b/libraries/libstratosphere/source/ncm/ncm_install_task_data.cpp @@ -341,7 +341,7 @@ namespace ams::ncm { R_TRY(this->GetEntryInfo(std::addressof(entry_info), index)); /* Read the entry to the output buffer. */ - R_UNLESS(entry_info.size <= out_size, ncm::ResultBufferInsufficient()); + R_UNLESS(entry_info.size <= static_cast(out_size), ncm::ResultBufferInsufficient()); return this->Read(out, out_size, entry_info.offset); } @@ -351,7 +351,7 @@ namespace ams::ncm { R_TRY(this->GetEntryInfo(std::addressof(entry_info), index)); /* Data size must match existing data size. */ - R_UNLESS(entry_info.size == data_size, ncm::ResultBufferInsufficient()); + R_UNLESS(entry_info.size == static_cast(data_size), ncm::ResultBufferInsufficient()); return this->Write(data, data_size, entry_info.offset); } diff --git a/libraries/libstratosphere/source/ncm/ncm_submission_package_install_task.cpp b/libraries/libstratosphere/source/ncm/ncm_submission_package_install_task.cpp new file mode 100644 index 000000000..1488c0422 --- /dev/null +++ b/libraries/libstratosphere/source/ncm/ncm_submission_package_install_task.cpp @@ -0,0 +1,71 @@ +/* + * 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 . + */ +#include +#include "ncm_fs_utils.hpp" + +namespace ams::ncm { + + class SubmissionPackageInstallTask::Impl { + private: + fs::FileHandleStorage storage; + bool initialized; + impl::MountName mount_name; + public: + Impl(fs::FileHandle handle) : storage(handle), initialized(false) { /* ... */ } + ~Impl() { + if (this->initialized) { + fs::fsa::Unregister(this->mount_name.str); + } + } + + Result Initialize() { + /* Allocate a partition file system. */ + auto partition_file_system = std::make_unique(); + R_UNLESS(partition_file_system != nullptr, ncm::ResultAllocationFailed()); + + /* Create a mount name and register the file system. */ + auto mount_name = impl::CreateUniqueMountName(); + R_TRY(fs::fsa::Register(mount_name.str, std::move(partition_file_system))); + + /* Initialize members. */ + this->mount_name = mount_name; + this->initialized = true; + return ResultSuccess(); + } + + const impl::MountName &GetMountName() const { + return this->mount_name; + } + }; + + SubmissionPackageInstallTask::~SubmissionPackageInstallTask() { + delete impl; + } + + Result SubmissionPackageInstallTask::Initialize(fs::FileHandle handle, StorageId storage_id, void *buffer, size_t buffer_size, bool ignore_ticket) { + /* Allocate impl. */ + this->impl = new (std::nothrow) Impl(handle); + R_UNLESS(this->impl != nullptr, ncm::ResultAllocationFailed()); + + /* Initialize impl. */ + R_TRY(this->impl->Initialize()); + + /* Initialize parent. N doesn't check the result. */ + PackageInstallTask::Initialize(impl::GetRootDirectoryPath(this->impl->GetMountName()).str, storage_id, buffer, buffer_size, ignore_ticket); + return ResultSuccess(); + } + +}