From a2f611edb7c5eeb16afaece8a030064401c1024e Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Tue, 2 Feb 2021 22:53:23 -0800 Subject: [PATCH] pf2: drv::IsInserted --- .../pdm/prfile2_pdm_upper_layer_api.hpp | 8 +++ .../include/vapours/prfile2/prfile2_drv.hpp | 2 + .../pdm/prfile2_pdm_upper_layer_disk_api.cpp | 53 +++++++++++++++++++ .../pdm/prfile2_pdm_upper_layer_part_api.cpp | 16 +++--- .../libvapours/source/prfile2/prfile2_drv.cpp | 8 +++ .../source/prfile2/prfile2_volume.cpp | 4 +- 6 files changed, 84 insertions(+), 7 deletions(-) create mode 100644 libraries/libvapours/source/prfile2/pdm/prfile2_pdm_upper_layer_disk_api.cpp diff --git a/libraries/libvapours/include/vapours/prfile2/pdm/prfile2_pdm_upper_layer_api.hpp b/libraries/libvapours/include/vapours/prfile2/pdm/prfile2_pdm_upper_layer_api.hpp index c2056aad9..48ec04f2b 100644 --- a/libraries/libvapours/include/vapours/prfile2/pdm/prfile2_pdm_upper_layer_api.hpp +++ b/libraries/libvapours/include/vapours/prfile2/pdm/prfile2_pdm_upper_layer_api.hpp @@ -23,6 +23,14 @@ namespace ams::prfile2::pdm { namespace part { pdm::Error CheckDataEraseRequest(HandleType part_handle, bool *out); + pdm::Error CheckMediaInsert(HandleType part_handle, bool *out); + + } + + namespace disk { + + pdm::Error CheckDataEraseRequest(HandleType disk_handle, bool *out); + pdm::Error CheckMediaInsert(HandleType disk_handle, bool *out); } diff --git a/libraries/libvapours/include/vapours/prfile2/prfile2_drv.hpp b/libraries/libvapours/include/vapours/prfile2/prfile2_drv.hpp index c093ae653..2130d4bf4 100644 --- a/libraries/libvapours/include/vapours/prfile2/prfile2_drv.hpp +++ b/libraries/libvapours/include/vapours/prfile2/prfile2_drv.hpp @@ -26,4 +26,6 @@ namespace ams::prfile2::drv { pf::Error Initialize(Volume *volume); + bool IsInserted(Volume *volume); + } diff --git a/libraries/libvapours/source/prfile2/pdm/prfile2_pdm_upper_layer_disk_api.cpp b/libraries/libvapours/source/prfile2/pdm/prfile2_pdm_upper_layer_disk_api.cpp new file mode 100644 index 000000000..75c666089 --- /dev/null +++ b/libraries/libvapours/source/prfile2/pdm/prfile2_pdm_upper_layer_disk_api.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2020 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 . + */ +#if defined(ATMOSPHERE_IS_STRATOSPHERE) +#include +#elif defined(ATMOSPHERE_IS_MESOSPHERE) +#include +#elif defined(ATMOSPHERE_IS_EXOSPHERE) +#include +#else +#include +#endif +#include "prfile2_pdm_disk_set.hpp" + +namespace ams::prfile2::pdm::disk { + + pdm::Error CheckDataEraseRequest(HandleType disk_handle, bool *out) { + /* Check parameters. */ + Disk *disk = GetDisk(disk_handle); + if (out == nullptr || disk == nullptr) { + return pdm::Error_InvalidParameter; + } + + /* Check for data erase function. */ + *out = disk->erase_callback != nullptr; + return pdm::Error_Ok; + } + + pdm::Error CheckMediaInsert(HandleType disk_handle, bool *out) { + /* Check parameters. */ + Disk *disk = GetDisk(disk_handle); + if (out == nullptr || disk == nullptr) { + return pdm::Error_InvalidParameter; + } + + /* Get whether the disk is inserted. */ + *out = disk->is_inserted; + return pdm::Error_Ok; + } + +} diff --git a/libraries/libvapours/source/prfile2/pdm/prfile2_pdm_upper_layer_part_api.cpp b/libraries/libvapours/source/prfile2/pdm/prfile2_pdm_upper_layer_part_api.cpp index 212c87e33..7e0a95f08 100644 --- a/libraries/libvapours/source/prfile2/pdm/prfile2_pdm_upper_layer_part_api.cpp +++ b/libraries/libvapours/source/prfile2/pdm/prfile2_pdm_upper_layer_part_api.cpp @@ -33,15 +33,19 @@ namespace ams::prfile2::pdm::part { return pdm::Error_InvalidParameter; } - /* Get the disk. */ - Disk *disk = GetDisk(part->disk_handle); - if (disk == nullptr) { + /* Check the disk. */ + return pdm::disk::CheckDataEraseRequest(part->disk_handle, out); + } + + pdm::Error CheckMediaInsert(HandleType part_handle, bool *out) { + /* Check parameters. */ + Partition *part = GetPartition(part_handle); + if (out == nullptr || part == nullptr) { return pdm::Error_InvalidParameter; } - /* Check for data erase function. */ - *out = disk->erase_callback != nullptr; - return pdm::Error_Ok; + /* Check if the disk is inserted. */ + return pdm::disk::CheckMediaInsert(part->disk_handle, out); } } diff --git a/libraries/libvapours/source/prfile2/prfile2_drv.cpp b/libraries/libvapours/source/prfile2/prfile2_drv.cpp index ddfd79611..7d00a2c2a 100644 --- a/libraries/libvapours/source/prfile2/prfile2_drv.cpp +++ b/libraries/libvapours/source/prfile2/prfile2_drv.cpp @@ -42,4 +42,12 @@ namespace ams::prfile2::drv { return pf::Error_Ok; } + bool IsInserted(Volume *volume) { + /* Check inserted. */ + /* NOTE: Error is not checked here. */ + bool inserted = false; + pdm::part::CheckMediaInsert(volume->partition_handle, std::addressof(inserted)); + return inserted; + } + } diff --git a/libraries/libvapours/source/prfile2/prfile2_volume.cpp b/libraries/libvapours/source/prfile2/prfile2_volume.cpp index 7ff09c2a5..d8be0bd5a 100644 --- a/libraries/libvapours/source/prfile2/prfile2_volume.cpp +++ b/libraries/libvapours/source/prfile2/prfile2_volume.cpp @@ -272,6 +272,8 @@ namespace ams::prfile2::vol { vol->tail_entry.tracker_size = util::size(vol->tail_entry.tracker_buf); vol->tail_entry.tracker_bits = vol->tail_entry.tracker_buf; + /* NOTE: Cluster link is cleared here, but we already memset vol to zero, so it's unnecessary. */ + /* Initialize driver for volume. */ if (auto err = drv::Initialize(vol); err != pf::Error_Ok) { return SetLastErrorAndReturn(err); @@ -310,7 +312,7 @@ namespace ams::prfile2::vol { /* Perform mount as appropriate. */ const auto check_mount_err = /* TODO vol::CheckMediaInsertForAttachMount(vol) */ pf::Error_Ok; - const bool inserted = /* TODO: drv::IsInserted(vol) */ false; + const bool inserted = drv::IsInserted(vol); if (check_mount_err != pf::Error_Ok) { if (inserted) { drive_table->SetDiskInserted(true);